Herbert Voss wrote:

> clipping on original bounding boxes like 29 39 200 300
> is wrong, because LyX takes the first two values
> (lower left) in relation to (0,0) and crops the image
> with wrong values.
> 
> This was first mentioned by Rob.
> 
> The attached patch fixes this, so that lyx-view
> and latex view are the same..


2nd try with the suggestions from Lars


HErbert

-- 
http://www.lyx.org/help/
Index: src/frontends/controllers/ChangeLog
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/controllers/ChangeLog,v
retrieving revision 1.154
diff -u -r1.154 ChangeLog
--- src/frontends/controllers/ChangeLog 5 Apr 2002 09:18:25 -0000       1.154
+++ src/frontends/controllers/ChangeLog 7 Apr 2002 18:48:09 -0000
@@ -1,3 +1,7 @@
+2002-04-07  Herbert Voss  <[EMAIL PROTECTED]>
+
+       * ControlGraphics.[C]: move readBB as readBB_from_PSFile into filetools
+
 2002-04-05  Angus Leeming  <[EMAIL PROTECTED]>
 
        * ControlGraphics.C (readBB): sigh. Make sure that the correct path is
Index: src/frontends/controllers/ControlGraphics.C
===================================================================
RCS file: 
/usr/local/lyx/cvsroot/lyx-devel/src/frontends/controllers/ControlGraphics.C,v
retrieving revision 1.29
diff -u -r1.29 ControlGraphics.C
--- src/frontends/controllers/ControlGraphics.C 5 Apr 2002 09:18:25 -0000       1.29
+++ src/frontends/controllers/ControlGraphics.C 7 Apr 2002 18:48:09 -0000
@@ -104,37 +104,7 @@
 
 string const ControlGraphics::readBB(string const & file)
 {
-       // in a file it's an entry like %%BoundingBox:23 45 321 345
-       // The first number can following without a space, so we have
-       // to be a little careful.
-       // On the other hand some plot programs write the bb at the
-       // end of the file. Than we have in the header:
-       // %%BoundingBox: (atend)
-       // In this case we must check the end.
-       string file_ = MakeAbsPath(file, lv_.buffer()->filePath());
-       if (zippedFile(file_))
-               file_ = unzipFile(file_);
-
-       string const format = getExtFromContents(file_);
-       if (format != "eps" && format != "ps")
-               return string();
-
-       std::ifstream is(file_.c_str());
-       while (is) {
-               string s;
-               is >> s;
-               if (contains(s,"%%BoundingBox:")) {
-                       string a, b, c, d;
-                       is >> a >> b >> c >> d;
-                       if (is && !contains(a,"atend")) { // bb at the end?
-                               if (s != "%%BoundingBox:")
-                                   return (s.substr(14)+" "+a+" "+b+" "+c+" ");
-                               else
-                                   return (a+" "+b+" "+c+" "+d+" ");
-                       }
-               }
-       }
-       return string();
+       return readBB_from_PSFile(MakeAbsPath(file, lv_.buffer()->filePath()));
 }
 
 
Index: src/frontends/xforms/ChangeLog
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/xforms/ChangeLog,v
retrieving revision 1.345
diff -u -r1.345 ChangeLog
--- src/frontends/xforms/ChangeLog      6 Apr 2002 13:15:10 -0000       1.345
+++ src/frontends/xforms/ChangeLog      7 Apr 2002 18:48:10 -0000
@@ -1,3 +1,8 @@
+2002-04-07  Herbert Voss  <[EMAIL PROTECTED]>
+
+       * xformsGImage.C: use correct values for the bounding box when
+       clipping the image
+
 2002-04-06  Lars Gullik Bjønnes  <[EMAIL PROTECTED]>
 
        * forms/.cvsignore: add Makefile.in
Index: src/frontends/xforms/xformsGImage.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/xforms/xformsGImage.C,v
retrieving revision 1.4
diff -u -r1.4 xformsGImage.C
--- src/frontends/xforms/xformsGImage.C 4 Apr 2002 14:49:54 -0000       1.4
+++ src/frontends/xforms/xformsGImage.C 7 Apr 2002 18:48:11 -0000
@@ -20,6 +20,7 @@
 #include "frontends/GUIRunTime.h"   // x11Display, x11Screen
 #include "support/LAssert.h"
 #include "support/lyxfunctional.h"  // compare_memfun
+#include "support/filetools.h"
 
 using std::find_if;
 
@@ -248,6 +249,12 @@
                // No clipping is necessary.
                return;
 
+       //get the original bb from the file
+       string const bb_orig = readBB_from_PSFile(params.filename);
+       lyxerr[Debug::GRAPHICS] << "xFormsGImage::readBB: " << bb_orig << endl;
+       // we need only the lower left values
+       int const xl_orig = strToInt(token(bb_orig,' ',0));
+       int const yb_orig = strToInt(token(bb_orig,' ',1));
        int const new_width  = params.bb.xr - params.bb.xl;
        int const new_height = params.bb.yt - params.bb.yb;
 
@@ -260,10 +267,12 @@
                // Bounds are unchanged.
                return;
 
-       int const xoffset_l = params.bb.xl;
-       int const xoffset_r = image_->w - params.bb.xr;
-       int const yoffset_t = image_->h - params.bb.yt;
-       int const yoffset_b = params.bb.yb;
+       // correct the lower left if the original bb
+       // doesn't has a lower left(0,0)
+       int const xoffset_l = max(0, (int)params.bb.xl - xl_orig);
+       int const xoffset_r = max(0, image_->w - (int)params.bb.xr + xl_orig);
+       int const yoffset_t = max(0, image_->h - (int)params.bb.yt + yb_orig);
+       int const yoffset_b = max(0, (int)params.bb.yb - yb_orig);
 
        flimage_crop(image_, xoffset_l, yoffset_t, xoffset_r, yoffset_b);
 }
Index: src/support/ChangeLog
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/support/ChangeLog,v
retrieving revision 1.94
diff -u -r1.94 ChangeLog
--- src/support/ChangeLog       7 Apr 2002 15:31:16 -0000       1.94
+++ src/support/ChangeLog       7 Apr 2002 18:48:11 -0000
@@ -1,5 +1,10 @@
 2002-04-07  Herbert Voss  <[EMAIL PROTECTED]>
 
+       * filetools.[Ch]: add readBB_from_PSFile() to make bb available
+       for the lyx-view in graphics (moved from ControlGraphics)
+
+2002-04-07  Herbert Voss  <[EMAIL PROTECTED]>
+
        * filetools.C: fix bug for eps. scans now a whole line
 
 2002-04-06  Lars Gullik Bjønnes  <[EMAIL PROTECTED]>
Index: src/support/filetools.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/support/filetools.C,v
retrieving revision 1.114
diff -u -r1.114 filetools.C
--- src/support/filetools.C     7 Apr 2002 15:31:16 -0000       1.114
+++ src/support/filetools.C     7 Apr 2002 18:48:11 -0000
@@ -1344,3 +1344,30 @@
                }
        }
 }
+
+
+string const readBB_from_PSFile(string const & file)
+{
+       // in a (e)ps-file it's an entry like %%BoundingBox:23 45 321 345
+       // It seems that every command in the header has an own line,
+       // getline() should work for all files.
+       // On the other hand some plot programs write the bb at the
+       // end of the file. Than we have in the header:
+       // %%BoundingBox: (atend)
+       // In this case we must check the end.
+       string const file_ = zippedFile(file) ? 
+               string(unzipFile(file)) : string(file);
+       string const format = getExtFromContents(file_);
+       if (format != "eps" && format != "ps")
+               return string();
+
+       std::ifstream is(file_.c_str());
+       while (is) {
+               string s;
+               getline(is,s);
+               if (contains(s,"%%BoundingBox:") && !contains(s,"atend")) 
+                       return (frontStrip(s.substr(14)));
+       }
+       return string();
+}
+
Index: src/support/filetools.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/support/filetools.h,v
retrieving revision 1.33
diff -u -r1.33 filetools.h
--- src/support/filetools.h     27 Mar 2002 00:05:28 -0000      1.33
+++ src/support/filetools.h     7 Apr 2002 18:48:12 -0000
@@ -206,5 +206,8 @@
 /// remove the autosave-file and give a Message if it can't be done
 void removeAutosaveFile(string const & filename);
 
+/// read the BoundingBox entry from a ps/eps/pdf-file
+string const readBB_from_PSFile(string const & file);
+
 
 #endif

Reply via email to