[poppler] [PATCH] Allow CairoFont creation to fail

Jeff Muizelaar jeff at infidigm.net
Sat May 27 14:42:54 PDT 2006


This patch allows CairoFont creation to fail and deals with failure much
more gracefully. Kristian it looked like you had done something similar
in your type3 work, any comments? It should also fix bug #4030.

Index: poppler/CairoFontEngine.cc
===================================================================
RCS file: /cvs/poppler/poppler/poppler/CairoFontEngine.cc,v
retrieving revision 1.22
diff -u -r1.22 CairoFontEngine.cc
--- poppler/CairoFontEngine.cc	21 May 2006 23:26:45 -0000	1.22
+++ poppler/CairoFontEngine.cc	27 May 2006 21:34:50 -0000
@@ -38,7 +38,7 @@
   delete font;
 }
 
-CairoFont::CairoFont(GfxFont *gfxFont, XRef *xref, FT_Library lib, GBool useCIDs) {
+CairoFont *CairoFont::Create(GfxFont *gfxFont, XRef *xref, FT_Library lib, GBool useCIDs) {
   Ref embRef;
   Object refObj, strObj;
   GooString *tmpFileName, *fileName, *substName,*tmpFileName2;
@@ -52,7 +52,13 @@
   FoFiType1C *ff1c;
   CharCodeToUnicode *ctu;
   Unicode uBuf[8];
+  Ref ref;
   static cairo_user_data_key_t cairo_font_face_key;
+  cairo_font_face_t *cairo_font_face;
+  FT_Face face;
+
+  Gushort *codeToGID;
+  int codeToGIDLen;
   
   dfp = NULL;
   codeToGID = NULL;
@@ -160,6 +166,7 @@
         error(-1, "Couldn't find a mapping to Unicode for font '%s'",
               gfxFont->getName() ? gfxFont->getName()->getCString()
                         : "(unnamed)");
+	goto err2;
       }
     } else {
       if (((GfxCIDFont *)gfxFont)->getCIDToGID()) {
@@ -241,19 +248,26 @@
     error(-1, "could not create cairo font\n");
     goto err2; /* this doesn't do anything, but it looks like we're
 		* handling the error */
-  }
-
+  } {
+  CairoFont *ret = new CairoFont(ref, cairo_font_face, face, codeToGID, codeToGIDLen);
   cairo_font_face_set_user_data (cairo_font_face, 
 				 &cairo_font_face_key,
-				 this,
+				 ret,
 				 cairo_font_face_destroy);
 
-  return;
+  return ret;
+  }
  err2:
   /* hmm? */
   printf ("some font thing failed\n");
+  return NULL;
 }
 
+CairoFont::CairoFont(Ref ref, cairo_font_face_t *cairo_font_face, FT_Face face,
+    Gushort *codeToGID, int codeToGIDLen) : ref(ref), cairo_font_face(cairo_font_face),
+					    face(face), codeToGID(codeToGID),
+					    codeToGIDLen(codeToGIDLen) { }
+
 CairoFont::~CairoFont() {
   FT_Done_Face (face);
   gfree(codeToGID);
@@ -336,7 +350,8 @@
     }
   }
   
-  font = new CairoFont (gfxFont, xref, lib, useCIDs);
+  font = CairoFont::Create (gfxFont, xref, lib, useCIDs);
+  //XXX: if font is null should we still insert it into the cache?
   if (fontCache[cairoFontCacheSize - 1]) {
     delete fontCache[cairoFontCacheSize - 1];
   }
Index: poppler/CairoFontEngine.h
===================================================================
RCS file: /cvs/poppler/poppler/poppler/CairoFontEngine.h,v
retrieving revision 1.9
diff -u -r1.9 CairoFontEngine.h
--- poppler/CairoFontEngine.h	21 May 2006 23:26:45 -0000	1.9
+++ poppler/CairoFontEngine.h	27 May 2006 21:34:50 -0000
@@ -18,13 +18,15 @@
 
 class CairoFont {
 public:
-  CairoFont(GfxFont *gfxFont, XRef *xref, FT_Library lib, GBool useCIDs);
+  static CairoFont *Create(GfxFont *gfxFont, XRef *xref, FT_Library lib, GBool useCIDs);
   ~CairoFont();
 
   GBool matches(Ref &other);
   cairo_font_face_t *getFontFace(void);
   unsigned long getGlyph(CharCode code, Unicode *u, int uLen);
 private:
+  CairoFont(Ref ref, cairo_font_face_t *cairo_font_face, FT_Face face,
+      Gushort *codeToGID, int codeToGIDLen);
   Ref ref;
   cairo_font_face_t *cairo_font_face;
   FT_Face face;
Index: poppler/CairoOutputDev.cc
===================================================================
RCS file: /cvs/poppler/poppler/poppler/CairoOutputDev.cc,v
retrieving revision 1.37
diff -u -r1.37 CairoOutputDev.cc
--- poppler/CairoOutputDev.cc	27 May 2006 17:27:37 -0000	1.37
+++ poppler/CairoOutputDev.cc	27 May 2006 21:34:50 -0000
@@ -263,6 +263,8 @@
 
   currentFont = fontEngine->getFont (state->getFont(), xref);
 
+  if (!currentFont)
+    return;
   state->getFontTransMat(&m11, &m12, &m21, &m22);
   m11 *= state->getHorizScaling();
   m12 *= state->getHorizScaling();
@@ -374,6 +376,9 @@
 {
   double tx, ty;
 
+  if (!currentFont)
+    return;
+  
   glyphs[glyphCount].index = currentFont->getGlyph (code, u, uLen);
   state->transform(x - originX, y - originY, &tx, &ty);
   glyphs[glyphCount].x = tx;


More information about the poppler mailing list