While integrating FreeType2 v2.4.10 into our product, we found we needed to quick-patch t1load.c. I asked the developer who did it to elaborate, and he spake thus:

   That patch is to fix the problem that Freetype2 does not handle the
   3-axis MM font FontBBox correctly. What happens is freetype2 tries
   to read the 2nd FontBBox and freetype2 does not expect there are 8
   components for 3-axis MM font. So it chokes. In an earlier freetype2
   version, it does not have this issue because it does not read this
   2nd FontBBox. So the patch is to skip the 2nd time action and then
   freetype2 is happy. As far as I can see, such 2nd time FontBBox read
   is not needed for our usage.

   So can we make this into the main line? Maybe not... The real fix is
   deeper than this patch addresses. My 2 cents.

I am not currently in tune with the FreeType source, so I don't have a "deeper" fix at hand. But I offer this patch to illustrate our current workaround. Sorry if that's a tad lame - there's only so many hours in a day.

Thanks,
-Del


diff -Naur freetype-2.4.10/src/type1/t1load.c freetype-2.4.10-new/src/type1/t1load.c
--- freetype-2.4.10/src/type1/t1load.c	2012-06-14 01:35:59.000000000 -0400
+++ freetype-2.4.10-new/src/type1/t1load.c	2012-11-29 11:27:17.677308964 -0500
@@ -1840,6 +1840,10 @@
     FT_Byte   *limit, *start_binary = NULL;
     FT_Bool    have_integer = 0;
 
+    /* the flag for FontBBox to prevent from reading the second */
+    /* FontBBox. 0 means not got it. 1 means already had this    */
+    FT_Short fbbox_flag = 0;
+
 
     parser->root.cursor = base;
     parser->root.limit  = base + size;
@@ -1918,7 +1922,6 @@
       {
         FT_PtrDist  len;
 
-
         cur++;
 
         parser->root.cursor = cur;
@@ -1979,6 +1982,11 @@
                     ? T1_FIELD_DICT_PRIVATE
                     : T1_FIELD_DICT_FONTDICT;
 
+	      /* specifically skip the 2nd FontBBox */
+	      if (fbbox_flag == 1 &&  
+		  ft_strcmp( (const char*)name, "FontBBox" ) == 0 )
+		  break;
+
               if ( !( dict & keyword->dict ) )
               {
                 FT_TRACE1(( "parse_dict: found `%s' but ignoring it"
@@ -2001,6 +2009,13 @@
                   else
                     return parser->root.error;
                 }
+
+		if ( !(parser->root.error) )
+		{
+		  /* if this is FontBBox, set up the flag and later we do not read FontBBox again */
+		  if ( ft_strcmp( (const char*)name, "FontBBox" ) == 0 )
+		    fbbox_flag = 1;
+		}
               }
               break;
             }
_______________________________________________
Freetype-devel mailing list
Freetype-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/freetype-devel

Reply via email to