shithub: freetype+ttf2subf

Download patch

ref: fdc042b8a94e591d2d4405123cb6d9f9c6c990d8
parent: 6e9b3186b0782a9ddbc4909b363d4f3ad72c5ea2
author: Werner Lemberg <[email protected]>
date: Thu Jun 12 00:59:07 EDT 2003

* src/cid/cidobjs.c: Apply change 2003-05-31 from <[email protected]>.
Compute style flags.
Fix computation of root->height.
* src/cid/cidtoken.h: Handle FontBBox.
* src/cid/cidload.c (cid_load_keyword): Handle
T1_FIELD_LOCATION_BBOX.
(parse_font_bbox): Commented out.
(cid_field_record): Comment out element for parsing FontBBox.

* src/type42/t42parse.c (t42_parse_font_bbox): Commented out.
(t42_keywords): Handle FontBBox with T1_FIELD_BBOX, not with
T1_FIELD_CALLBACK.
(t42_parse_font_bbox): Commented out.
(t42_load_keyword): Handle T1_FIELD_LOCATION_BBOX.
* src/type42/t42objs.c (T42_Face_Init): Apply change 2003-05-31
from <[email protected]>.

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2003-06-11  Werner Lemberg  <[email protected]>
+
+	* src/cid/cidobjs.c: Apply change 2003-05-31 from <[email protected]>.
+	Compute style flags.
+	Fix computation of root->height.
+	* src/cid/cidtoken.h: Handle FontBBox.
+	* src/cid/cidload.c (cid_load_keyword): Handle
+	T1_FIELD_LOCATION_BBOX.
+	(parse_font_bbox): Commented out.
+	(cid_field_record): Comment out element for parsing FontBBox.
+
+	* src/type42/t42parse.c (t42_parse_font_bbox): Commented out.
+	(t42_keywords): Handle FontBBox with T1_FIELD_BBOX, not with
+	T1_FIELD_CALLBACK.
+	(t42_parse_font_bbox): Commented out.
+	(t42_load_keyword): Handle T1_FIELD_LOCATION_BBOX.
+	* src/type42/t42objs.c (T42_Face_Init): Apply change 2003-05-31
+	from <[email protected]>.
+
 2003-06-09  George Williams  <[email protected]>
 
 	* src/truetype/ttinterp.c (SetSuperRound) <0x30>: Follow Apple's
--- a/src/cid/cidload.c
+++ b/src/cid/cidload.c
@@ -115,6 +115,10 @@
       object = (FT_Byte*)&cid->font_info;
       break;
 
+    case T1_FIELD_LOCATION_BBOX:
+      object = (FT_Byte*)&cid->font_bbox;
+      break;
+
     default:
       {
         CID_FaceDict  dict;
@@ -156,6 +160,7 @@
   }
 
 
+#if 0
   FT_CALLBACK_DEF( FT_Error )
   parse_font_bbox( CID_Face     face,
                    CID_Parser*  parser )
@@ -171,8 +176,9 @@
     bbox->yMax = FT_RoundFix( temp[3] );
 
     return CID_Err_Ok;       /* this is a callback function; */
-                            /* we must return an error code */
+                             /* we must return an error code */
   }
+#endif
 
 
   FT_CALLBACK_DEF( FT_Error )
@@ -273,9 +279,12 @@
 
 #include "cidtoken.h"
 
+#if 0
     T1_FIELD_CALLBACK( "FontBBox", parse_font_bbox )
+#endif
     T1_FIELD_CALLBACK( "FDArray", parse_fd_array )
     T1_FIELD_CALLBACK( "FontMatrix", parse_font_matrix )
+
     { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0 }
   };
 
--- a/src/cid/cidobjs.c
+++ b/src/cid/cidobjs.c
@@ -19,8 +19,10 @@
 #include <ft2build.h>
 #include FT_INTERNAL_DEBUG_H
 #include FT_INTERNAL_STREAM_H
+
 #include "cidgload.h"
 #include "cidload.h"
+
 #include FT_INTERNAL_POSTSCRIPT_NAMES_H
 #include FT_INTERNAL_POSTSCRIPT_AUX_H
 #include FT_INTERNAL_POSTSCRIPT_HINTS_H
@@ -331,83 +333,108 @@
       goto Exit;
     }
 
-    /* Now, load the font program into the face object */
+    /* now load the font program into the face object */
+
+    /* initialize the face object fields */
+
+    /* set up root face fields */
     {
-      /* Init the face object fields */
-      /* Now set up root face fields */
-      {
-        FT_Face       root = (FT_Face)&face->root;
-        CID_FaceInfo  cid  = &face->cid;
-        PS_FontInfo   info = &cid->font_info;
+      FT_Face       root = (FT_Face)&face->root;
+      CID_FaceInfo  cid  = &face->cid;
+      PS_FontInfo   info = &cid->font_info;
 
 
-        root->num_glyphs   = cid->cid_count;
-        root->num_charmaps = 0;
+      root->num_glyphs   = cid->cid_count;
+      root->num_charmaps = 0;
 
-        root->face_index = face_index;
-        root->face_flags = FT_FACE_FLAG_SCALABLE;
+      root->face_index = face_index;
+      root->face_flags = FT_FACE_FLAG_SCALABLE;
 
-        root->face_flags |= FT_FACE_FLAG_HORIZONTAL;
+      root->face_flags |= FT_FACE_FLAG_HORIZONTAL;
 
-        if ( info->is_fixed_pitch && *info->is_fixed_pitch )
-          root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
+      if ( info->is_fixed_pitch && *info->is_fixed_pitch )
+        root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
 
-        /* XXX: TODO: add kerning with .afm support */
+      /* XXX: TODO: add kerning with .afm support */
 
-        /* get style name -- be careful, some broken fonts only */
-        /* have a /FontName dictionary entry!                   */
-        root->family_name = info->family_name;
-        if ( root->family_name )
-        {
-          char*  full   = info->full_name;
-          char*  family = root->family_name;
+      /* get style name -- be careful, some broken fonts only */
+      /* have a /FontName dictionary entry!                   */
+      root->family_name = info->family_name;
+      /* assume "Regular" style if we don't know better */
+      root->style_name = (char *)"Regular";
+      if ( root->family_name )
+      {
+        char*  full   = info->full_name;
+        char*  family = root->family_name;
 
-          while ( *family && *full == *family )
-          {
-            family++;
-            full++;
-          }
 
-          if ( *full == ' ' || *full == '-' )
-            root->style_name = full + 1;
-          else
-            root->style_name = (char *)"Regular";
-        }
-        else
+        if ( full )
         {
-          /* do we have a `/FontName'? */
-          if ( cid->cid_font_name )
+          while ( *full )
           {
-            root->family_name = cid->cid_font_name;
-            root->style_name  = (char *)"Regular";
+            if ( *full == *family )
+            {
+              family++;
+              full++;
+            }
+            else
+            {
+              if ( *full == ' ' || *full == '-' )
+                full++;
+              else if ( *family == ' ' || *family == '-' )
+                family++;
+              else
+              {
+                if ( !*family )
+                  root->style_name = full;
+                break;
+              }
+            }
           }
         }
+      }
+      else
+      {
+        /* do we have a `/FontName'? */
+        if ( cid->cid_font_name )
+          root->family_name = cid->cid_font_name;
+      }
 
-        /* no embedded bitmap support */
-        root->num_fixed_sizes = 0;
-        root->available_sizes = 0;
+      /* compute style flags */
+      root->style_flags = 0;
+      if ( info->italic_angle && *info->italic_angle )
+        root->style_flags |= FT_STYLE_FLAG_ITALIC;
+      if ( info->weight )
+      {
+        if ( !ft_strcmp( info->weight, "Bold"  ) ||
+             !ft_strcmp( info->weight, "Black" ) )
+          root->style_flags |= FT_STYLE_FLAG_BOLD;
+      }
 
-        root->bbox.xMin =   cid->font_bbox.xMin             >> 16;
-        root->bbox.yMin =   cid->font_bbox.yMin             >> 16;
-        root->bbox.xMax = ( cid->font_bbox.xMax + 0xFFFFU ) >> 16;
-        root->bbox.yMax = ( cid->font_bbox.yMax + 0xFFFFU ) >> 16;
+      /* no embedded bitmap support */
+      root->num_fixed_sizes = 0;
+      root->available_sizes = 0;
 
-        if ( !root->units_per_EM )
-          root->units_per_EM  = 1000;
+      root->bbox.xMin =   cid->font_bbox.xMin             >> 16;
+      root->bbox.yMin =   cid->font_bbox.yMin             >> 16;
+      root->bbox.xMax = ( cid->font_bbox.xMax + 0xFFFFU ) >> 16;
+      root->bbox.yMax = ( cid->font_bbox.yMax + 0xFFFFU ) >> 16;
 
-        root->ascender  = (FT_Short)( root->bbox.yMax );
-        root->descender = (FT_Short)( root->bbox.yMin );
-        root->height    = (FT_Short)(
-          ( ( root->ascender + root->descender ) * 12 ) / 10 );
+      if ( !root->units_per_EM )
+        root->units_per_EM = 1000;
 
-        if ( info->underline_position )
-          root->underline_position = *info->underline_position >> 16;
-        if ( info->underline_thickness )
-          root->underline_thickness = *info->underline_thickness >> 16;
+      root->ascender  = (FT_Short)( root->bbox.yMax );
+      root->descender = (FT_Short)( root->bbox.yMin );
+      root->height    = (FT_Short)(
+        ( ( root->ascender - root->descender ) * 12 ) / 10 );
 
-        root->internal->max_points   = 0;
-        root->internal->max_contours = 0;
-      }
+      if ( info->underline_position )
+        root->underline_position = *info->underline_position >> 16;
+      if ( info->underline_thickness )
+        root->underline_thickness = *info->underline_thickness >> 16;
+
+      root->internal->max_points   = 0;
+      root->internal->max_contours = 0;
     }
 
   Exit:
--- a/src/cid/cidtoken.h
+++ b/src/cid/cidtoken.h
@@ -92,5 +92,12 @@
   T1_FIELD_NUM_TABLE ( "StemSnapH", snap_widths, 12 )
   T1_FIELD_NUM_TABLE ( "StemSnapV", snap_heights, 12 )
 
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  FT_BBox
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_BBOX
+
+  T1_FIELD_BBOX( "FontBBox", xMin )
+  
 
 /* END */
--- a/src/type1/t1driver.c
+++ b/src/type1/t1driver.c
@@ -227,8 +227,6 @@
 #endif /* T1_CONFIG_OPTION_NO_AFM */
 
 
-
-
   FT_CALLBACK_TABLE_DEF
   const FT_Driver_ClassRec  t1_driver_class =
   {
--- a/src/type1/t1load.c
+++ b/src/type1/t1load.c
@@ -693,9 +693,9 @@
 
 
   static FT_Error
-  t1_load_keyword( T1_Face    face,
-                   T1_Loader  loader,
-                   T1_Field   field )
+  t1_load_keyword( T1_Face         face,
+                   T1_Loader       loader,
+                   const T1_Field  field )
   {
     FT_Error  error;
     void*     dummy_object;
--- a/src/type1/t1objs.c
+++ b/src/type1/t1objs.c
@@ -308,7 +308,7 @@
     face->pshinter = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
                                               "pshinter" );
 
-    /* open the tokenizer, this will also check the font format */
+    /* open the tokenizer; this will also check the font format */
     error = T1_Open_Face( face );
     if ( error )
       goto Exit;
@@ -325,10 +325,11 @@
       goto Exit;
     }
 
-    /* Now, load the font program into the face object */
+    /* now load the font program into the face object */
 
-    /* Init the face object fields */
-    /* Now set up root face fields */
+    /* initialize the face object fields */
+
+    /* set up root face fields */
     {
       FT_Face  root = (FT_Face)&face->root;
 
@@ -336,7 +337,7 @@
       root->num_glyphs = type1->num_glyphs;
       root->face_index = face_index;
 
-      root->face_flags = FT_FACE_FLAG_SCALABLE;
+      root->face_flags  = FT_FACE_FLAG_SCALABLE;
       root->face_flags |= FT_FACE_FLAG_HORIZONTAL;
       root->face_flags |= FT_FACE_FLAG_GLYPH_NAMES;
 
@@ -418,7 +419,7 @@
       root->ascender  = (FT_Short)( root->bbox.yMax );
       root->descender = (FT_Short)( root->bbox.yMin );
       root->height    = (FT_Short)(
-                          ( ( root->ascender - root->descender ) * 12 ) / 10 );
+        ( ( root->ascender - root->descender ) * 12 ) / 10 );
 
       /* now compute the maximum advance width */
       root->max_advance_width =
--- a/src/type42/t42objs.c
+++ b/src/type42/t42objs.c
@@ -211,6 +211,8 @@
     /* get style name -- be careful, some broken fonts only */
     /* have a `/FontName' dictionary entry!                 */
     root->family_name = info->family_name;
+    /* assume "Regular" style if we don't know better */
+    root->style_name = (char *)"Regular";
     if ( root->family_name )
     {
       char*  full   = info->full_name;
@@ -219,28 +221,34 @@
 
       if ( full )
       {
-        while ( *family && *full == *family )
+        while ( *full )
         {
-          family++;
-          full++;
+          if ( *full == *family )
+          {
+            family++;
+            full++;
+          }
+          else
+          {
+            if ( *full == ' ' || *full == '-' )
+              full++;
+            else if ( *family == ' ' || *family == '-' )
+              family++;
+            else
+            {
+              if ( !*family )
+                root->style_name = full;
+              break;
+            }
+          }
         }
-
-        if ( *full == ' ' || *full == '-' )
-          root->style_name = full + 1;
-        else
-          root->style_name = (char *)"Regular";
       }
-      else
-        root->style_name = (char *)"Regular";
     }
     else
     {
       /* do we have a `/FontName'? */
       if ( type1->font_name )
-      {
         root->family_name = type1->font_name;
-        root->style_name  = (char *)"Regular";
-      }
     }
 
     /* no embedded bitmap support */
--- a/src/type42/t42parse.c
+++ b/src/type42/t42parse.c
@@ -36,10 +36,12 @@
   static void
   t42_parse_font_name( T42_Face    face,
                        T42_Loader  loader );
-                       
+
+#if 0                       
   static void
   t42_parse_font_bbox( T42_Face    face,
                        T42_Loader  loader );
+#endif
                        
   static void
   t42_parse_font_matrix( T42_Face    face,
@@ -84,8 +86,17 @@
     T1_FIELD_NUM    ( "FontType",    font_type )
     T1_FIELD_FIXED_P( "StrokeWidth", stroke_width )
 
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  FT_BBox
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_BBOX
+
+    T1_FIELD_BBOX("FontBBox", xMin )
+
     T1_FIELD_CALLBACK( "FontName",    t42_parse_font_name )
+#if 0
     T1_FIELD_CALLBACK( "FontBBox",    t42_parse_font_bbox )
+#endif
     T1_FIELD_CALLBACK( "FontMatrix",  t42_parse_font_matrix )
     T1_FIELD_CALLBACK( "Encoding",    t42_parse_encoding )
     T1_FIELD_CALLBACK( "CharStrings", t42_parse_charstrings )
@@ -290,18 +301,21 @@
   }
 
 
+#if 0
   static void
-  t42_parse_font_bbox( T42_Face   face,
+  t42_parse_font_bbox( T42_Face    face,
                        T42_Loader  loader )
   {
     T42_Parser  parser = &loader->parser;
     FT_BBox*    bbox   = &face->type1.font_bbox;
 
+
     bbox->xMin = T1_ToInt( parser );
     bbox->yMin = T1_ToInt( parser );
     bbox->xMax = T1_ToInt( parser );
     bbox->yMax = T1_ToInt( parser );
   }
+#endif
 
 
   static void
@@ -837,13 +851,17 @@
     {
     case T1_FIELD_LOCATION_FONT_INFO:
       dummy_object = &face->type1.font_info;
-      objects      = &dummy_object;
       break;
 
+    case T1_FIELD_LOCATION_BBOX:
+      dummy_object = &face->type1.font_bbox;
+      break;
+
     default:
       dummy_object = &face->type1;
-      objects      = &dummy_object;
     }
+
+    objects = &dummy_object;
 
     if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY ||
          field->type == T1_FIELD_TYPE_FIXED_ARRAY   )