shithub: freetype+ttf2subf

Download patch

ref: a959c3c960c433919e8b8f1c22a6702fa2664cd8
parent: d5553d35f3ca37e290b5eb5884de619baccf019a
author: Werner Lemberg <[email protected]>
date: Sat Jun 14 03:40:09 EDT 2003

* src/pfr/pfrobjs.c (pfr_slot_load): Apply font matrix.

* src/cid/cidload.c: Remove parse_font_bbox code (already enclosed
with #if 0 ... #endif).

* src/type1/t1tokens.h: Handle /FontName.
* src/type1/t1load.c (parse_font_name): Removed.
Remove parse_font_bbox code (already enclosed with #if 0 ...
#endif).

* src/type42/t42parse.c (t42_parse_font_name): Removed.
Remove t42_parse_font_bbox code (already enclosed with #if 0 ...
#endif).
(t42_keywords): Handle /FontName with T1_FIELD_KEY.

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2003-06-13  Detlef W�rkner  <[email protected]>
+
+	* src/pfr/pfrobjs.c (pfr_slot_load): Apply font matrix.
+
 2003-06-13  Werner Lemberg  <[email protected]>
 
 	* builds/dos/detect.mk: Test not only for `Dos' but for `DOS' also.
@@ -8,6 +12,19 @@
 
 	* builds/compiler/watcom.mk (LINK_LIBRARY): GNU Make for DOS doesn't
 	like a trailing semicolon; add a dummy command.
+
+	* src/cid/cidload.c: Remove parse_font_bbox code (already enclosed
+	with #if 0 ... #endif).
+
+	* src/type1/t1tokens.h: Handle /FontName.
+	* src/type1/t1load.c (parse_font_name): Removed.
+	Remove parse_font_bbox code (already enclosed with #if 0 ...
+	#endif).
+
+	* src/type42/t42parse.c (t42_parse_font_name): Removed.
+	Remove t42_parse_font_bbox code (already enclosed with #if 0 ...
+	#endif).
+	(t42_keywords): Handle /FontName with T1_FIELD_KEY.
 
 2003-06-12  Werner Lemberg  <[email protected]>
 
--- a/docs/TODO
+++ b/docs/TODO
@@ -9,5 +9,18 @@
   the quality of AA text, but Monochrome and LCD hinting still suck.  We
   need to do something about that.
 
+* Add CIDCMap support to the CID driver.
+
+* Add track kerning support to the Type1 and PFR driver and the API
+  (The degree of kerning, e.g. light, normal or tight, and
+  the glyph size has to be passed as parameter).
+
+* Add kerning (AFM file) support to the CID driver.
+
+* Possibly add support for reading PFM files.
+
+* Is the anti-aliased glyphs feature of BDF also available in PCF format?
+  If yes, add support to the PCF driver.
+
 
 --- end of TODO ---
--- a/include/freetype/freetype.h
+++ b/include/freetype/freetype.h
@@ -743,10 +743,11 @@
   /*    descender           :: The face's descender is the vertical        */
   /*                           distance from the baseline to the           */
   /*                           bottommost point of any glyph in the face.  */
-  /*                           This field's value is *negative*, expressed */
-  /*                           in font units.  Some font designs use a     */
-  /*                           value different from `bbox.yMin'.  Only     */
-  /*                           relevant for scalable formats.              */
+  /*                           This field's value is *negative* for values */
+  /*                           below the baseline.  It is expressed in     */
+  /*                           font units.  Some font designs use a value  */
+  /*                           different from `bbox.yMin'.  Only relevant  */
+  /*                           for scalable formats.                       */
   /*                                                                       */
   /*    height              :: The face's height is the vertical distance  */
   /*                           from one baseline to the next when writing  */
--- a/src/cid/cidload.c
+++ b/src/cid/cidload.c
@@ -142,28 +142,7 @@
   }
 
 
-#if 0
   FT_CALLBACK_DEF( FT_Error )
-  parse_font_bbox( CID_Face     face,
-                   CID_Parser*  parser )
-  {
-    FT_Fixed  temp[4];
-    FT_BBox*  bbox = &face->cid.font_bbox;
-
-
-    (void)cid_parser_to_fixed_array( parser, 4, temp, 0 );
-    bbox->xMin = FT_RoundFix( temp[0] );
-    bbox->yMin = FT_RoundFix( temp[1] );
-    bbox->xMax = FT_RoundFix( temp[2] );
-    bbox->yMax = FT_RoundFix( temp[3] );
-
-    return CID_Err_Ok;       /* this is a callback function; */
-                             /* we must return an error code */
-  }
-#endif
-
-
-  FT_CALLBACK_DEF( FT_Error )
   parse_font_matrix( CID_Face     face,
                      CID_Parser*  parser )
   {
@@ -261,10 +240,7 @@
 
 #include "cidtoken.h"
 
-#if 0
-    T1_FIELD_CALLBACK( "FontBBox", parse_font_bbox )
-#endif
-    T1_FIELD_CALLBACK( "FDArray", parse_fd_array )
+    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/pfr/pfrobjs.c
+++ b/src/pfr/pfrobjs.c
@@ -114,128 +114,128 @@
       goto Exit;
 
     /* now load the physical font descriptor */
-     error = pfr_phy_font_load( &face->phy_font, stream,
-                                 face->log_font.phys_offset,
-                                 face->log_font.phys_size );
-     if ( error )
-       goto Exit;
+    error = pfr_phy_font_load( &face->phy_font, stream,
+                               face->log_font.phys_offset,
+                               face->log_font.phys_size );
+    if ( error )
+      goto Exit;
 
-     /* now, set-up all root face fields */
-     {
-       FT_Face      root     = FT_FACE( face );
-       PFR_PhyFont  phy_font = &face->phy_font;
+    /* now, set-up all root face fields */
+    {
+      FT_Face      root     = FT_FACE( face );
+      PFR_PhyFont  phy_font = &face->phy_font;
 
 
-       root->face_index = face_index;
-       root->num_glyphs = phy_font->num_chars;
-       root->face_flags = FT_FACE_FLAG_SCALABLE;
+      root->face_index = face_index;
+      root->num_glyphs = phy_font->num_chars;
+      root->face_flags = FT_FACE_FLAG_SCALABLE;
 
-       if ( (phy_font->flags & PFR_PHY_PROPORTIONAL) == 0 )
-         root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
+      if ( (phy_font->flags & PFR_PHY_PROPORTIONAL) == 0 )
+        root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
 
-       if ( phy_font->flags & PFR_PHY_VERTICAL )
-         root->face_flags |= FT_FACE_FLAG_VERTICAL;
-       else
-         root->face_flags |= FT_FACE_FLAG_HORIZONTAL;
+      if ( phy_font->flags & PFR_PHY_VERTICAL )
+        root->face_flags |= FT_FACE_FLAG_VERTICAL;
+      else
+        root->face_flags |= FT_FACE_FLAG_HORIZONTAL;
 
-       if ( phy_font->num_strikes > 0 )
-         root->face_flags |= FT_FACE_FLAG_FIXED_SIZES;
+      if ( phy_font->num_strikes > 0 )
+        root->face_flags |= FT_FACE_FLAG_FIXED_SIZES;
 
-       if ( phy_font->num_kern_pairs > 0 )
-         root->face_flags |= FT_FACE_FLAG_KERNING;
+      if ( phy_font->num_kern_pairs > 0 )
+        root->face_flags |= FT_FACE_FLAG_KERNING;
 
-       /* If no family name was found in the "undocumented" auxiliary
-        * data, use the font ID instead.  This sucks but is better than
-        * nothing.
-        */
-       root->family_name = phy_font->family_name;
-       if ( root->family_name == NULL )
-         root->family_name = phy_font->font_id;
+      /* If no family name was found in the "undocumented" auxiliary
+       * data, use the font ID instead.  This sucks but is better than
+       * nothing.
+       */
+      root->family_name = phy_font->family_name;
+      if ( root->family_name == NULL )
+        root->family_name = phy_font->font_id;
 
-       /* note that the style name can be NULL in certain PFR fonts,
-        * probably meaning "Regular"
-        */
-       root->style_name = phy_font->style_name;
+      /* note that the style name can be NULL in certain PFR fonts,
+       * probably meaning "Regular"
+       */
+      root->style_name = phy_font->style_name;
 
-       root->num_fixed_sizes = 0;
-       root->available_sizes = 0;
+      root->num_fixed_sizes = 0;
+      root->available_sizes = 0;
 
-       root->bbox         = phy_font->bbox;
-       root->units_per_EM = (FT_UShort)phy_font->outline_resolution;
-       root->ascender     = (FT_Short) phy_font->bbox.yMax;
-       root->descender    = (FT_Short) phy_font->bbox.yMin;
-       root->height       = (FT_Short)
-                              ( ( ( root->ascender - root->descender ) * 12 )
-                                / 10 );
+      root->bbox         = phy_font->bbox;
+      root->units_per_EM = (FT_UShort)phy_font->outline_resolution;
+      root->ascender     = (FT_Short) phy_font->bbox.yMax;
+      root->descender    = (FT_Short) phy_font->bbox.yMin;
+      root->height       = (FT_Short)
+                             ( ( ( root->ascender - root->descender ) * 12 )
+                               / 10 );
 
-       if ( phy_font->num_strikes > 0 )
-       {
-         FT_UInt          n, count = phy_font->num_strikes;
-         FT_Bitmap_Size*  size;
-         PFR_Strike       strike;
-         FT_Memory        memory = root->stream->memory;
+      if ( phy_font->num_strikes > 0 )
+      {
+        FT_UInt          n, count = phy_font->num_strikes;
+        FT_Bitmap_Size*  size;
+        PFR_Strike       strike;
+        FT_Memory        memory = root->stream->memory;
          
          
-         if ( FT_NEW_ARRAY( root->available_sizes, count ) )
-           goto Exit;
+        if ( FT_NEW_ARRAY( root->available_sizes, count ) )
+          goto Exit;
          
-         size   = root->available_sizes;
-         strike = phy_font->strikes;
-         for ( n = 0; n < count; n++, size++, strike++ )
-         {
-           size->height = (FT_UShort)strike->y_ppm;
-           size->width  = (FT_UShort)strike->x_ppm;
-         }
-         root->num_fixed_sizes = count;
-       }
+        size   = root->available_sizes;
+        strike = phy_font->strikes;
+        for ( n = 0; n < count; n++, size++, strike++ )
+        {
+          size->height = (FT_UShort)strike->y_ppm;
+          size->width  = (FT_UShort)strike->x_ppm;
+        }
+        root->num_fixed_sizes = count;
+      }
 
-       /* now compute maximum advance width */
-       if ( ( phy_font->flags & PFR_PHY_PROPORTIONAL ) == 0 )
-         root->max_advance_width = (FT_Short)phy_font->standard_advance;
-       else
-       {
-         FT_Int    max = 0;
-         FT_UInt   count = phy_font->num_chars;
-         PFR_Char  gchar = phy_font->chars;
+      /* now compute maximum advance width */
+      if ( ( phy_font->flags & PFR_PHY_PROPORTIONAL ) == 0 )
+        root->max_advance_width = (FT_Short)phy_font->standard_advance;
+      else
+      {
+        FT_Int    max = 0;
+        FT_UInt   count = phy_font->num_chars;
+        PFR_Char  gchar = phy_font->chars;
 
 
-         for ( ; count > 0; count--, gchar++ )
-         {
-           if ( max < gchar->advance )
-             max = gchar->advance;
-         }
+        for ( ; count > 0; count--, gchar++ )
+        {
+          if ( max < gchar->advance )
+            max = gchar->advance;
+        }
 
-         root->max_advance_width = (FT_Short)max;
-       }
+        root->max_advance_width = (FT_Short)max;
+      }
 
-       root->max_advance_height = root->height;
+      root->max_advance_height = root->height;
 
-       root->underline_position  = (FT_Short)( - root->units_per_EM / 10 );
-       root->underline_thickness = (FT_Short)(   root->units_per_EM / 30 );
+      root->underline_position  = (FT_Short)( - root->units_per_EM / 10 );
+      root->underline_thickness = (FT_Short)(   root->units_per_EM / 30 );
 
-       /* create charmap */
-       {
-         FT_CharMapRec  charmap;
+      /* create charmap */
+      {
+        FT_CharMapRec  charmap;
 
 
-         charmap.face        = root;
-         charmap.platform_id = 3;
-         charmap.encoding_id = 1;
-         charmap.encoding    = FT_ENCODING_UNICODE;
+        charmap.face        = root;
+        charmap.platform_id = 3;
+        charmap.encoding_id = 1;
+        charmap.encoding    = FT_ENCODING_UNICODE;
 
-         FT_CMap_New( &pfr_cmap_class_rec, NULL, &charmap, NULL );
+        FT_CMap_New( &pfr_cmap_class_rec, NULL, &charmap, NULL );
 
 #if 0
-         /* Select default charmap */
-         if (root->num_charmaps)
-           root->charmap = root->charmaps[0];
+        /* Select default charmap */
+        if (root->num_charmaps)
+          root->charmap = root->charmaps[0];
 #endif
-       }
+      }
 
-       /* check whether we've loaded any kerning pairs */
-       if ( phy_font->num_kern_pairs )
-         root->face_flags |= FT_FACE_FLAG_KERNING;
-     }
+      /* check whether we've loaded any kerning pairs */
+      if ( phy_font->num_kern_pairs )
+        root->face_flags |= FT_FACE_FLAG_KERNING;
+    }
 
   Exit:
     return error;
@@ -353,6 +353,21 @@
       /* make-up vertical metrics(?) */
       metrics->vertBearingX = 0;
       metrics->vertBearingY = 0;
+
+      /* Apply the font matrix, if any.                 */
+      /* TODO: Test existing fonts with unusual matrix  */
+      /* whether we have to adjust Units per EM.        */
+      {
+        FT_Matrix font_matrix;
+
+
+        font_matrix.xx = face->log_font.matrix[0] << 8;
+        font_matrix.yx = face->log_font.matrix[1] << 8;
+        font_matrix.xy = face->log_font.matrix[2] << 8;
+        font_matrix.yy = face->log_font.matrix[3] << 8;
+
+        FT_Outline_Transform( outline, &font_matrix );
+      }
 
       /* scale when needed */
       if ( scaling )
--- a/src/type1/t1load.c
+++ b/src/type1/t1load.c
@@ -843,71 +843,6 @@
   /* dictionaries                                   */
 
   static void
-  parse_font_name( T1_Face    face,
-                   T1_Loader  loader )
-  {
-    T1_Parser   parser = &loader->parser;
-    FT_Error    error;
-    FT_Memory   memory = parser->root.memory;
-    FT_PtrDist  len;
-    FT_Byte*    cur;
-    FT_Byte*    cur2;
-    FT_Byte*    limit;
-
-
-    if ( face->type1.font_name )
-      /*  with synthetic fonts, it's possible we get here twice  */
-      return;
-
-    T1_Skip_Spaces( parser );
-
-    cur   = parser->root.cursor;
-    limit = parser->root.limit;
-
-    if ( cur >= limit - 1 || *cur != '/' )
-      return;
-
-    cur++;
-    cur2 = cur;
-    while ( cur2 < limit && is_name_char( *cur2 ) )
-      cur2++;
-
-    len = cur2 - cur;
-    if ( len > 0 )
-    {
-      if ( FT_ALLOC( face->type1.font_name, len + 1 ) )
-      {
-        parser->root.error = error;
-        return;
-      }
-
-      FT_MEM_COPY( face->type1.font_name, cur, len );
-      face->type1.font_name[len] = '\0';
-    }
-    parser->root.cursor = cur2;
-  }
-
-
-#if 0
-  static void
-  parse_font_bbox( T1_Face    face,
-                   T1_Loader  loader )
-  {
-    T1_Parser  parser = &loader->parser;
-    FT_Fixed   temp[4];
-    FT_BBox*   bbox   = &face->type1.font_bbox;
-
-
-    (void)T1_ToFixedArray( parser, 4, temp, 0 );
-    bbox->xMin = FT_RoundFix( temp[0] );
-    bbox->yMin = FT_RoundFix( temp[1] );
-    bbox->xMax = FT_RoundFix( temp[2] );
-    bbox->yMax = FT_RoundFix( temp[3] );
-  }
-#endif
-
-
-  static void
   parse_font_matrix( T1_Face    face,
                      T1_Loader  loader )
   {
@@ -1498,10 +1433,6 @@
 #include "t1tokens.h"
 
     /* now add the special functions... */
-    T1_FIELD_CALLBACK( "FontName", parse_font_name )
-#if 0
-    T1_FIELD_CALLBACK( "FontBBox", parse_font_bbox )
-#endif
     T1_FIELD_CALLBACK( "FontMatrix", parse_font_matrix )
     T1_FIELD_CALLBACK( "Encoding", parse_encoding )
     T1_FIELD_CALLBACK( "Subrs", parse_subrs )
--- a/src/type1/t1tokens.h
+++ b/src/type1/t1tokens.h
@@ -66,6 +66,7 @@
 #undef  T1CODE
 #define T1CODE        T1_FIELD_LOCATION_FONT_DICT
 
+  T1_FIELD_KEY    ( "FontName", font_name )
   T1_FIELD_NUM_P  ( "PaintType", paint_type )
   T1_FIELD_NUM    ( "FontType", font_type )
   T1_FIELD_FIXED_P( "StrokeWidth", stroke_width )
--- a/src/type42/t42parse.c
+++ b/src/type42/t42parse.c
@@ -34,16 +34,6 @@
 
 
   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,
                          T42_Loader  loader );
   static void
@@ -82,6 +72,7 @@
 #undef  T1CODE
 #define T1CODE        T1_FIELD_LOCATION_FONT_DICT
 
+    T1_FIELD_KEY    ( "FontName",    font_name )
     T1_FIELD_NUM_P  ( "PaintType",   paint_type )
     T1_FIELD_NUM    ( "FontType",    font_type )
     T1_FIELD_FIXED_P( "StrokeWidth", stroke_width )
@@ -93,10 +84,6 @@
 
     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 )
@@ -256,66 +243,6 @@
   {
     return ( c == ' ' || c == '\t' || c == '\r' || c == '\n' );
   }
-
-
-  static void
-  t42_parse_font_name( T42_Face    face,
-                       T42_Loader  loader )
-  {
-    T42_Parser  parser = &loader->parser;
-    FT_Error    error;
-    FT_Memory   memory = parser->root.memory;
-    FT_Int      len;
-    FT_Byte*    cur;
-    FT_Byte*    cur2;
-    FT_Byte*    limit;
-
-
-    T1_Skip_Spaces( parser );
-
-    cur   = parser->root.cursor;
-    limit = parser->root.limit;
-
-    if ( cur >= limit - 1              ||
-         ( *cur != '/' && *cur != '(') )
-      return;
-
-    cur++;
-    cur2 = cur;
-    while ( cur2 < limit && t42_is_alpha( *cur2 ) )
-      cur2++;
-
-    len = (FT_Int)( cur2 - cur );
-    if ( len > 0 )
-    {
-      if ( FT_ALLOC( face->type1.font_name, len + 1 ) )
-      {
-        parser->root.error = error;
-        return;
-      }
-
-      FT_MEM_COPY( face->type1.font_name, cur, len );
-      face->type1.font_name[len] = '\0';
-    }
-    parser->root.cursor = cur2;
-  }
-
-
-#if 0
-  static void
-  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