shithub: freetype+ttf2subf

Download patch

ref: b79b5133803371d7db88135cdafd2af8da2b2d78
parent: ce34d122ba03b4a5b2c55a7ccb376dc1911caa37
author: Werner Lemberg <[email protected]>
date: Tue Dec 20 07:01:58 EST 2005

Formatting, improving comments.

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -18,33 +18,65 @@
 
 2005-12-13  David Turner  <[email protected]>
 
-	* src/autofit/aflatin.c, src/autofit/afhints.c: changed the
-        implementation of the LIGHT hinting mode to completely disable
-        horizontal hinting. This is an experimental effort to integrate
-        David Chester's latest patch without fucking the other hinting
-        modes as well.
+	Change the implementation of the LIGHT hinting mode to completely
+	disable horizontal hinting.  This is an experimental effort to
+	integrate David Chester's latest patch without affecting the other
+	hinting modes as well.
 
-        Note that this doesn't force auto-hinting for all fonts however.
+	Note that this doesn't force auto-hinting for all fonts, however.
 
-        * Jamfile: small fix to ensure that ftexport.sym is placed in the
-        same location than other generated objects (i.e. within the 'objs'
-        directory of the current dir)
+	* src/autofit/afhints.c (af_glyph_hints_reload): Don't set
+	scaler_fiags here but...
+	(af_glyph_hints_rescale): Here.
 
-        * include/freetype/config/ftoption.h,
-        include/freetype/config/ftstdlib.h,
-        include/freetype/internal/tttypes.h,
-        src/sfnt/Jamfile, src/sfnt/rules.mk, src/sfnt/sfdriver.c,
-        src/sfnt/ttbdf.h, src/sfnt/ttbdf.c, src/sfnt/sfobjs.c:
+	* src/autofit/aflatin.c (af_latin_hints_init): Disable horizontal
+	hinting for `light' hinting mode.
 
-        Added support for an embedded 'BDF ' table within SFNT-based
-        bitmap font files. This is used to store atoms & properties from
-        the original BDF fonts that were used to generate the font file.
 
-        the feature is controled by TT_CONFIG_OPTION_BDF within 'ftoption.h'
-        and is used to implement FT_Get_BDF_Property for these font files.
+	* Jamfile: Small fix to ensure that ftexport.sym is placed into the
+	same location as other generated objects (i.e., within the `objs'
+	directory of the current directory).
 
-        At the moment, this is still experimental, the BDF table format isn't
-        cast into stone yet.
+
+	Add support for an embedded `BDF ' table within SFNT-based bitmap
+	font files.  This is used to store atoms & properties from the
+	original BDF fonts that were used to generate the font file.
+
+	The feature is controlled by TT_CONFIG_OPTION_BDF within
+	`ftoption.h' and is used to implement FT_Get_BDF_Property for these
+	font files.
+
+	At the moment, this is still experimental, the BDF table format
+	isn't cast into stone yet.
+
+	* include/freetype/config/ftoption.h (TT_CONFIG_OPTION_BDF): New
+	macro.
+
+	* include/freetype/config/ftstdlib.h (ft_memchr): New macro.
+
+	* include/freetype/internal/tttypes.h (TT_BDFRec, TT_BDF)
+	[TT_CONFIG_OPTION_BDF]: New structure.
+	(TT_FaceRec) [TT_CONFIG_OPTION_BDF]: New member `bdf'.
+
+	* include/freetype/ttags.h (TTAG_BDF): New macro.
+
+	* src/sfnt/Jamfile (_sources): Add ttbdf.
+
+	* src/sfnt/rules.mk (SFNT_DRV_SRC): Add ttbdf.c.
+
+	* src/sfnt/sfdriver.c [TT_CONFIG_OPTION_BDF]: Include ttbdf.h and
+	FT_SERVICE_BDF_H.
+	(sfnt_get_charset_it) [TT_CONFIG_OPTION_BDF]: New function.
+	(sfnt_service_bdf) [TT_CONFIG_OPTION_BDF]: New service.
+	(sfnt_servives) [TT_CONFIG_OPTION_BDF]: Add sfnt_service_bdf.
+
+	* src/sfnt/sfnt.c [TT_CONFIG_OPTION_BDF]: Include ttbdf.c.
+
+	* src/sfnt/sfobjs.c [TT_CONFIG_OPTION_BDF]: Include ttbdf.h.
+	(sfnt_done_face) [TT_CONFIG_OPTION_BDF]: Call
+	tt_face_free_bdf_props.
+
+	* src/sfnt/ttbdf.h, src/sfnt/ttbdf.c: New files.
 
 2005-12-07  Werner Lemberg  <[email protected]>
 
--- a/docs/CHANGES
+++ b/docs/CHANGES
@@ -14,8 +14,8 @@
 
   II. IMPORTANT CHANGES
 
-    - Face metrics (face->size->metrics) and glyph metrics are no
-      longer rounded.  If you do not round in your applications too,
+    - Face  metrics  (face->size->metrics)  and glyph  metrics are  no
+      longer rounded.   If you do not round  in your applications too,
       you may find glyphs become blurry.
 
     - A  new API  `FT_TrueTypeGX_Validate'  (in FT_GX_VALIDATE_H)  has
--- a/include/freetype/config/ftoption.h
+++ b/include/freetype/config/ftoption.h
@@ -493,10 +493,11 @@
 
   /*************************************************************************/
   /*                                                                       */
-  /* Define TT_CONFIG_OPTION_BDF if upi want to include support for        */
-  /* an embedded 'BDF' table within SFNT-based bitmap formats.             */
+  /* Define TT_CONFIG_OPTION_BDF if you want to include support for        */
+  /* an embedded `BDF ' table within SFNT-based bitmap formats.            */
   /*                                                                       */
 #define TT_CONFIG_OPTION_BDF
+
 
   /*************************************************************************/
   /*************************************************************************/
--- a/include/freetype/config/ftstdlib.h
+++ b/include/freetype/config/ftstdlib.h
@@ -5,7 +5,7 @@
 /*    ANSI-specific library and header configuration file (specification   */
 /*    only).                                                               */
 /*                                                                         */
-/*  Copyright 2002, 2003, 2004 by                                          */
+/*  Copyright 2002, 2003, 2004, 2005 by                                    */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
--- a/include/freetype/internal/tttypes.h
+++ b/include/freetype/internal/tttypes.h
@@ -848,7 +848,7 @@
   /*************************************************************************/
   /***                                                                   ***/
   /***                                                                   ***/
-  /***       EMBEDDED BDF PROPERTIES TABLE SUPPORT                       ***/
+  /***              EMBEDDED BDF PROPERTIES TABLE SUPPORT                ***/
   /***                                                                   ***/
   /***                                                                   ***/
   /*************************************************************************/
@@ -855,52 +855,56 @@
   /*************************************************************************/
   /*************************************************************************/
 
-/* these types are used to support a 'BDF' table that isn't part of the
- * official TrueType specification. It is mainly used in SFNT-based bitmap
- * fonts that were generated from a set of BDF fonts
- *
- * the format of the table is the following:
- *
- *   USHORT   version      'BDF' table version number, should be 0x0001
- *   USHORT   strikeCount  number of strikes (bitmap sizes) in this table
- *   ULONG    stringTable  offset (froms start of BDF table) to string table
- *
- * followed by an array of 'strikeCount' descriptors that look like:
- *
- *   USHORT   ppem         vertical pixels per EM for this strike
- *   USHORT   numItems     number of items for this strike (properties and
- *                         atoms), max is 255
- *
- * this array is followed by 'strikeCount' value sets. Each "value set"
- * is an array of 'numItems' items that look like the following:
- *
- *   ULONG    item_name     offset in string table to item name
- *   USHORT   item_type     0 => string (e.g. COMMENT)
- *                          1 => atom   (e.g. FONT or even SIZE)
- *                          2 => int32
- *                          3 => uint32
- *                       0x10 => flag for properties, ored with above values
- *
- *   ULONG    item_value    for strings => offset in string table without
- *                                         the corresponding double quotes
- *
- *                              atoms   => offset in string table
- *
- *                              integers => direct value
- *
- * all strings in the string table are 8-bit, zero-terminated
- */
+  /*
+   * These types are used to support a `BDF ' table that isn't part of the
+   * official TrueType specification.  It is mainly used in SFNT-based
+   * bitmap fonts that were generated from a set of BDF fonts.
+   *
+   * The format of the table is as follows.
+   *
+   *   USHORT   version      `BDF ' table version number, should be 0x0001.
+   *   USHORT   strikeCount  Number of strikes (bitmap sizes) in this table.
+   *   ULONG    stringTable  Offset (froms start of BDF table) to string
+   *                         table.
+   *
+   * This is followed by an array of `strikeCount' descriptors, having the
+   * following format.
+   *
+   *   USHORT   ppem         Vertical pixels per EM for this strike.
+   *   USHORT   numItems     Number of items for this strike (properties and
+   *                         atoms).  Maximum is 255.
+   *
+   * This array in turn is followed by `strikeCount' value sets.  Each
+   * `value set' is an array of `numItems' items with the following format.
+   *
+   *   ULONG    item_name    Offset in string table to item name.
+   *   USHORT   item_type    The item type.  Possible values are
+   *                            0 => string (e.g., COMMENT)
+   *                            1 => atom   (e.g., FONT or even SIZE)
+   *                            2 => int32
+   *                            3 => uint32
+   *                         0x10 => A flag to indicate a properties.  This
+   *                                 is ORed with the above values.
+   *   ULONG    item_value   For strings  => Offset into string table without
+   *                                         the corresponding double quotes.
+   *                         For atoms    => Offset into string table.
+   *                         For integers => Direct value.
+   *
+   * All strings in the string table consist of bytes and are
+   * zero-terminated.
+   *
+   */
 
 #ifdef TT_CONFIG_OPTION_BDF
 
-  typedef struct TT_BDFRec_
+  typedef struct  TT_BDFRec_
   {
-    FT_Byte*       table;
-    FT_Byte*       table_end;
-    FT_Byte*       strings;
-    FT_UInt32      strings_size;
-    FT_UInt        num_strikes;
-    FT_Bool        loaded;
+    FT_Byte*   table;
+    FT_Byte*   table_end;
+    FT_Byte*   strings;
+    FT_UInt32  strings_size;
+    FT_UInt    num_strikes;
+    FT_Bool    loaded;
 
   } TT_BDFRec, *TT_BDF;
 
@@ -1405,7 +1409,7 @@
 #endif
 
 #ifdef TT_CONFIG_OPTION_BDF
-    TT_BDFRec        bdf;
+    TT_BDFRec             bdf;
 #endif /* TT_CONFIG_OPTION_BDF */
 
     /***********************************************************************/
--- a/src/autofit/aflatin.c
+++ b/src/autofit/aflatin.c
@@ -1308,7 +1308,7 @@
     hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale;
     hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta;
 
-    /* compute flags depending on render mode, etc... */
+    /* compute flags depending on render mode, etc. */
     mode = metrics->root.scaler.render_mode;
 
     scaler_flags = hints->scaler_flags;
@@ -1337,7 +1337,8 @@
     if ( mode == FT_RENDER_MODE_MONO )
       other_flags |= AF_LATIN_HINTS_MONO;
 
-    /* in 'light' hinting mode, we disable horizontal hinting completely
+    /*
+     *  In `light' hinting mode we disable horizontal hinting completely.
      */
     if ( mode == FT_RENDER_MODE_LIGHT )
       scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL;
--- a/src/sfnt/sfdriver.c
+++ b/src/sfnt/sfdriver.c
@@ -289,15 +289,15 @@
   };
 
 
- /*
-  *  TT CMAP INFO
-  *
-  */
+  /*
+   *  TT CMAP INFO
+   */
   static const FT_Service_TTCMapsRec  tt_service_get_cmap_info =
   {
     (TT_CMap_Info_GetFunc)tt_get_cmap_info
   };
 
+
 #ifdef TT_CONFIG_OPTION_BDF
 
   static FT_Error
@@ -305,15 +305,16 @@
                        const char*  *acharset_encoding,
                        const char*  *acharset_registry )
   {
-    BDF_PropertyRec   encoding, registry;
-    FT_Error          error;
+    BDF_PropertyRec  encoding, registry;
+    FT_Error         error;
 
-   /* XXX: I don't know if this is correct, since tt_face_find_bdf_prop
-    *      will only return something correct if we have previously
-    *      selected a size that is listed in the BDF table.
-    *      should we change the BDF table format to include single
-    *      offsets for "CHARSET_REGISTRY" and "CHARSET_ENCODING" ?
-    */
+
+    /* XXX: I don't know whether this is correct, since
+     *      tt_face_find_bdf_prop only returns something correct if we have
+     *      previously selected a size that is listed in the BDF table. 
+     *      Should we change the BDF table format to include single offsets
+     *      for `CHARSET_REGISTRY' and `CHARSET_ENCODING'?
+     */
     error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", &registry );
     if ( !error )
     {
@@ -344,10 +345,9 @@
 #endif /* TT_CONFIG_OPTION_BDF */
 
 
- /*
-  *  SERVICE LIST
-  *
-  */
+  /*
+   *  SERVICE LIST
+   */
 
   static const FT_ServiceDescRec  sfnt_services[] =
   {
--- a/src/sfnt/sfobjs.c
+++ b/src/sfnt/sfobjs.c
@@ -31,6 +31,7 @@
 #include "ttbdf.h"
 #endif
 
+
   /*************************************************************************/
   /*                                                                       */
   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
--- a/src/sfnt/ttbdf.c
+++ b/src/sfnt/ttbdf.c
@@ -24,6 +24,7 @@
 
 #include "sferrors.h"
 
+
 #ifdef TT_CONFIG_OPTION_BDF
 
   /*************************************************************************/
@@ -35,168 +36,176 @@
 #undef  FT_COMPONENT
 #define FT_COMPONENT  trace_ttbdf
 
-FT_LOCAL_DEF( void )
-tt_face_free_bdf_props( TT_Face  face )
-{
-  TT_BDF   bdf = &face->bdf;
 
-  if ( bdf->loaded )
+  FT_LOCAL_DEF( void )
+  tt_face_free_bdf_props( TT_Face  face )
   {
-    FT_Stream  stream = FT_FACE(face)->stream;
+    TT_BDF  bdf = &face->bdf;
 
-    if ( bdf->table != NULL )
-      FT_FRAME_RELEASE( bdf->table );
 
-    bdf->table_end    = NULL;
-    bdf->strings      = NULL;
-    bdf->strings_size = 0;
-  }
-}
+    if ( bdf->loaded )
+    {
+      FT_Stream  stream = FT_FACE(face)->stream;
 
 
-static FT_Error
-tt_face_load_bdf_props( TT_Face    face,
-                        FT_Stream  stream )
-{
-  TT_BDF    bdf = &face->bdf;
-  FT_ULong  length;
-  FT_Error  error;
+      if ( bdf->table != NULL )
+        FT_FRAME_RELEASE( bdf->table );
 
-  FT_ZERO( bdf );
-
-  error = tt_face_goto_table( face, TTAG_BDF, stream, &length );
-  if ( error                                  ||
-       length < 8                             ||
-       FT_FRAME_EXTRACT( length, bdf->table ) )
-  {
-    error = FT_Err_Invalid_Table;
-    goto Exit;
+      bdf->table_end    = NULL;
+      bdf->strings      = NULL;
+      bdf->strings_size = 0;
+    }
   }
 
-  bdf->table_end = bdf->table + length;
 
+  static FT_Error
+  tt_face_load_bdf_props( TT_Face    face,
+                          FT_Stream  stream )
   {
-    FT_Byte*  p           = bdf->table;
-    FT_UInt   version     = FT_NEXT_USHORT(p);
-    FT_UInt   num_strikes = FT_NEXT_USHORT(p);
-    FT_UInt32 strings     = FT_NEXT_ULONG(p);
+    TT_BDF    bdf = &face->bdf;
+    FT_ULong  length;
+    FT_Error  error;
 
-    if ( version != 0x0001           ||
-         strings < 8                 ||
-         (strings-8)/4 < num_strikes ||
-         strings+1 > length          )
+
+    FT_ZERO( bdf );
+
+    error = tt_face_goto_table( face, TTAG_BDF, stream, &length );
+    if ( error                                  ||
+         length < 8                             ||
+         FT_FRAME_EXTRACT( length, bdf->table ) )
     {
-    BadTable:
-      FT_FRAME_RELEASE( bdf->table );
-      FT_ZERO( bdf );
       error = FT_Err_Invalid_Table;
       goto Exit;
     }
 
-    bdf->num_strikes  = num_strikes;
-    bdf->strings      = bdf->table + strings;
-    bdf->strings_size = length - strings;
-  }
+    bdf->table_end = bdf->table + length;
 
- /* check the strike descriptors
-  */
-  {
-    FT_UInt   count  = bdf->num_strikes;
-    FT_Byte*  p      = bdf->table + 8;
-    FT_Byte*  strike = p + count*4;
-
-    for ( ; count > 0; count-- )
     {
-      FT_UInt  num_items = FT_PEEK_USHORT(p+2);
+      FT_Byte*   p           = bdf->table;
+      FT_UInt    version     = FT_NEXT_USHORT( p );
+      FT_UInt    num_strikes = FT_NEXT_USHORT( p );
+      FT_UInt32  strings     = FT_NEXT_ULONG ( p );
 
-     /* we don't need to check the value sets themselves, since this
-      * is done later
-      */
-      strike += 10*num_items;
 
-      p += 4;
+      if ( version != 0x0001                 ||
+           strings < 8                       ||
+           ( strings - 8 ) / 4 < num_strikes ||
+           strings + 1 > length              )
+      {
+      BadTable:
+        FT_FRAME_RELEASE( bdf->table );
+        FT_ZERO( bdf );
+        error = FT_Err_Invalid_Table;
+        goto Exit;
+      }
+
+      bdf->num_strikes  = num_strikes;
+      bdf->strings      = bdf->table + strings;
+      bdf->strings_size = length - strings;
     }
 
-    if ( strike > bdf->strings )
-      goto BadTable;
-  }
+    /* check the strike descriptors */
+    {
+      FT_UInt   count  = bdf->num_strikes;
+      FT_Byte*  p      = bdf->table + 8;
+      FT_Byte*  strike = p + count * 4;
 
-  bdf->loaded = 1;
 
-Exit:
-  return error;
-}
+      for ( ; count > 0; count-- )
+      {
+        FT_UInt  num_items = FT_PEEK_USHORT( p + 2 );
 
+        /*
+         *  We don't need to check the value sets themselves, since this
+         *  is done later.
+         */
+        strike += 10 * num_items;
 
-FT_LOCAL_DEF( FT_Error )
-tt_face_find_bdf_prop( TT_Face           face,
-                       const char*       property_name,
-                       BDF_PropertyRec  *aprop )
-{
-  TT_BDF    bdf   = &face->bdf;
-  FT_Size   size  = FT_FACE(face)->size;
-  FT_Error  error = 0;
-  FT_Byte*  p;
-  FT_UInt   count;
-  FT_Byte*  strike;
-  FT_UInt   property_len;
+        p += 4;
+      }
 
-  aprop->type = BDF_PROPERTY_TYPE_NONE;
+      if ( strike > bdf->strings )
+        goto BadTable;
+    }
 
-  if ( bdf->loaded == 0 )
-  {
-    error = tt_face_load_bdf_props( face, FT_FACE(face)->stream );
-    if ( error )
-      goto Exit;
+    bdf->loaded = 1;
+
+  Exit:
+    return error;
   }
 
-  count  = bdf->num_strikes;
-  p      = bdf->table + 8;
-  strike = p + 4*count;
 
-  error = FT_Err_Invalid_Argument;
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_find_bdf_prop( TT_Face           face,
+                         const char*       property_name,
+                         BDF_PropertyRec  *aprop )
+  {
+    TT_BDF    bdf   = &face->bdf;
+    FT_Size   size  = FT_FACE(face)->size;
+    FT_Error  error = 0;
+    FT_Byte*  p;
+    FT_UInt   count;
+    FT_Byte*  strike;
+    FT_UInt   property_len;
 
-  if ( size == NULL || property_name == NULL )
-    goto Exit;
 
-  property_len = ft_strlen( property_name );
-  if ( property_len == 0 )
-    goto Exit;
+    aprop->type = BDF_PROPERTY_TYPE_NONE;
 
-  for ( ; count > 0; count-- )
-  {
-    FT_UInt   _ppem  = FT_NEXT_USHORT(p);
-    FT_UInt   _count = FT_NEXT_USHORT(p);
-
-    if ( _ppem == size->metrics.y_ppem )
+    if ( bdf->loaded == 0 )
     {
-      count = _count;
-      goto FoundStrike;
+      error = tt_face_load_bdf_props( face, FT_FACE( face )->stream );
+      if ( error )
+        goto Exit;
     }
 
-    strike += 10*_count;
-  }
-  goto Exit;
+    count  = bdf->num_strikes;
+    p      = bdf->table + 8;
+    strike = p + 4 * count;
 
-FoundStrike:
-  p = strike;
-  for ( ; count > 0; count-- )
-  {
-    FT_UInt   type = FT_PEEK_USHORT(p+4);
+    error = FT_Err_Invalid_Argument;
 
-    if ( (type & 0x10) != 0 )
+    if ( size == NULL || property_name == NULL )
+      goto Exit;
+
+    property_len = ft_strlen( property_name );
+    if ( property_len == 0 )
+      goto Exit;
+
+    for ( ; count > 0; count-- )
     {
-      FT_UInt32  name_offset = FT_PEEK_ULONG(p);
-      FT_UInt32  value       = FT_PEEK_ULONG(p+6);
+      FT_UInt  _ppem  = FT_NEXT_USHORT( p );
+      FT_UInt  _count = FT_NEXT_USHORT( p );
 
-      /* be a bit paranoid for invalid entries here */
-      if ( name_offset < bdf->strings_size                        &&
-           property_len < bdf->strings_size - name_offset         &&
-           ft_strncmp( property_name, (const char*)bdf->strings + name_offset,
-                       bdf->strings_size - name_offset ) == 0     )
+      if ( _ppem == size->metrics.y_ppem )
       {
-        switch ( type & 0x0F )
+        count = _count;
+        goto FoundStrike;
+      }
+
+      strike += 10 * _count;
+    }
+    goto Exit;
+
+  FoundStrike:
+    p = strike;
+    for ( ; count > 0; count-- )
+    {
+      FT_UInt  type = FT_PEEK_USHORT( p + 4 );
+
+      if ( ( type & 0x10 ) != 0 )
+      {
+        FT_UInt32  name_offset = FT_PEEK_ULONG( p     );
+        FT_UInt32  value       = FT_PEEK_ULONG( p + 6 );
+
+        /* be a bit paranoid for invalid entries here */
+        if ( name_offset < bdf->strings_size                    &&
+             property_len < bdf->strings_size - name_offset     &&
+             ft_strncmp( property_name,
+                         (const char*)bdf->strings + name_offset,
+                         bdf->strings_size - name_offset ) == 0 )
         {
+          switch ( type & 0x0F )
+          {
           case 0x00:  /* string */
           case 0x01:  /* atoms */
             /* check that the content is really 0-terminated */
@@ -204,7 +213,7 @@
                  ft_memchr( bdf->strings + value, 0, bdf->strings_size ) )
             {
               aprop->type   = BDF_PROPERTY_TYPE_ATOM;
-              aprop->u.atom = (const char*) bdf->strings + value;
+              aprop->u.atom = (const char*)bdf->strings + value;
               error         = 0;
               goto Exit;
             }
@@ -224,14 +233,17 @@
 
           default:
             ;
+          }
         }
       }
+      p += 10;
     }
-    p += 10;
+
+  Exit:
+    return error;
   }
 
-Exit:
-  return error;
-}
-
 #endif /* TT_CONFIG_OPTION_BDF */
+
+
+/* END */
\ No newline at end of file