added test+fix for transparency group stacking
[swftools.git] / lib / pdf / xpdf-changes.patch
index 2247f5f..234952d 100644 (file)
@@ -39,24 +39,6 @@ diff -u -r1.9 -r1.10
  }
  
  Gfx::Gfx(XRef *xrefA, OutputDev *outA, Dict *resDict,
-@@ -3783,6 +3789,7 @@
-   pushResources(resDict);
-   // save current graphics state
-+  GfxState*mystate = state;
-   saveState();
-   // kill any pre-existing path
-@@ -3848,6 +3855,9 @@
-   // restore graphics state
-   restoreState();
-+  if(state!=mystate) {
-+      fprintf(stderr, "Invalid state nesting in PDF file- file broken?\n");
-+  }
-   // pop resource stack
-   popResources();
 Index: GfxFont.h
 ===================================================================
 RCS file: /home/kramm/cvs/swftools.cache.cvsroot/swftools.cache/pdf2swf/xpdf/GfxFont.h,v
@@ -492,7 +474,7 @@ Index: config.h
 @@ -53,9 +53,9 @@
  
  // user config file name, relative to the user's home directory
- #if defined(VMS) || defined(WIN32)
+ #if defined(VMS) || (defined(WIN32) && !defined(__CYGWIN32__))
 -#define xpdfUserConfigFile "xpdfrc"
 +#define xpdfUserConfigFile "pdf2swf.conf"
  #else
@@ -792,8 +774,8 @@ diff -u -r1.5 -r1.6
  }
  
  void SplashFont::initCache() {
---- xpdf/SplashFTFont.cc.orig  2008-09-09 21:31:01.000000000 +0200
-+++ xpdf/SplashFTFont.cc       2008-10-05 17:37:32.000000000 +0200
+--- xpdf/SplashFTFont.cc.orig  2009-03-08 17:19:08.000000000 +0100
++++ xpdf/SplashFTFont.cc       2009-03-15 19:18:11.000000000 +0100
 @@ -46,6 +46,7 @@
    int x, y;
  
@@ -835,7 +817,16 @@ diff -u -r1.5 -r1.6
    ff = (SplashFTFontFile *)fontFile;
    ff->face->size = sizeObj;
    FT_Set_Transform(ff->face, &textMatrix, NULL);
-@@ -268,6 +281,8 @@
+@@ -262,17 +275,24 @@
+     // skip the TrueType notdef glyph
+     return NULL;
+   }
+-  if (FT_Load_Glyph(ff->face, gid, FT_LOAD_NO_BITMAP)) {
++  int error = 0;
++  if ((error=FT_Load_Glyph(ff->face, gid, FT_LOAD_NO_BITMAP|FT_LOAD_NO_HINTING))) {
++      fprintf(stderr, "Truetype wasn't able to load glyph %d, error %d\n", gid, error);
+     return NULL;
+   }
    if (FT_Get_Glyph(slot, &glyph)) {
      return NULL;
    }
@@ -844,6 +835,15 @@ diff -u -r1.5 -r1.6
    path.path = new SplashPath();
    path.textScale = textScale;
    path.needClose = gFalse;
+-  FT_Outline_Decompose(&((FT_OutlineGlyph)glyph)->outline,
++  error = FT_Outline_Decompose(&((FT_OutlineGlyph)glyph)->outline,
+                      &outlineFuncs, &path);
++  if(error) {
++      fprintf(stderr, "Truetype wasn't able to read glyph %d, error %d\n", gid, error);
++  }
+   if (path.needClose) {
+     path.path->close();
+   }
 --- xpdf/SplashFTFont.h.orig   2008-09-09 21:31:01.000000000 +0200
 +++ xpdf/SplashFTFont.h        2008-10-04 17:39:57.000000000 +0200
 @@ -42,6 +42,9 @@
@@ -976,3 +976,37 @@ diff -u -r1.5 -r1.6
        return gFalse;
      }
      *name = new GString(s);
+--- xpdf/Gfx.cc.orig   2009-03-08 17:10:40.000000000 +0100
++++ xpdf/Gfx.cc        2009-03-08 17:18:23.000000000 +0100
+@@ -3188,8 +3188,11 @@
+                           u, (int)(sizeof(u) / sizeof(Unicode)), &uLen,
+                           &dx, &dy, &originX, &originY);
+       dx = dx * state->getFontSize() + state->getCharSpace();
+-      if (n == 1 && *p == ' ') {
+-      dx += state->getWordSpace();
++      if (n == 1 && (*p == ' ' || *p == 0)) {
++        double w=state->getWordSpace();
++        if (w==0 && dx==0)
++          w=state->getFontSize()/3; // workaround for zero word space
++        dx += w;
+       }
+       dx *= state->getHorizScaling();
+       dy *= state->getFontSize();
+@@ -3824,6 +3833,7 @@
+     out->beginTransparencyGroup(state, bbox, blendingColorSpace,
+                               isolated, knockout, softMask);
+   }
++  GfxState*old_state = state;
+   // set new base matrix
+   for (i = 0; i < 6; ++i) {
+@@ -3835,6 +3845,9 @@
+   display(str, gFalse);
+   if (softMask || transpGroup) {
++    // restore graphics state
++    while(state != old_state)
++      restoreState();
+     out->endTransparencyGroup(state);
+   }