shithub: freetype+ttf2subf

Download patch

ref: 8a6c44e67397711f10e9a0369b6737ba04b331c8
parent: a8cf42bb7a4f52f81969136fd4544ba8f58df12c
author: David Turner <[email protected]>
date: Thu Jan 4 12:03:11 EST 2007

Getting rid of the FT_OPTIMIZE_MEMORY macro, since the optimization
is no longer experimental

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2007-01-04  David Turner  <[email protected]>
 
+	* src/sfnt/sfobjs.c, src/sfnt/ttkern.c, src/sfnt/ttkern.h,
+	src/sfnt/ttmtx.c, src/sfnt/ttsbit.c, src/sfnt/ttsbit.h,
+	src/truetype/ttpload.c, include/freetype/config/ftoption.h:
+	remove FT_OPTIMIZE_MEMORY macro, since the optimization is
+	no longer experimental
+
 	* src/pshinter/pshalgo.c: remove a stupid typo that results in no
 	hinting and a memory leak with some large Asian CFF fonts
 
--- a/devel/ftoption.h
+++ b/devel/ftoption.h
@@ -594,11 +594,6 @@
 
   /* */
 
-  /*
-   * This temporary macro is used to control various optimizations for
-   * reducing the heap footprint of memory-mapped TrueType files.
-   */
-#define FT_OPTIMIZE_MEMORY
 
 
   /*
--- a/include/freetype/config/ftoption.h
+++ b/include/freetype/config/ftoption.h
@@ -594,12 +594,6 @@
 
   /* */
 
-  /*
-   * This temporary macro is used to control various optimizations for
-   * reducing the heap footprint of memory-mapped TrueType files.
-   */
-#define FT_OPTIMIZE_MEMORY
-
 
   /*
    * Define this variable if you want to keep the layout of internal
--- a/include/freetype/internal/tttypes.h
+++ b/include/freetype/internal/tttypes.h
@@ -1395,7 +1395,6 @@
 
     /* since version 2.2 */
 
-#ifdef FT_OPTIMIZE_MEMORY
     FT_Byte*              horz_metrics;
     FT_ULong              horz_metrics_size;
 
@@ -1420,7 +1419,6 @@
     FT_UInt               num_kern_tables;
     FT_UInt32             kern_avail_bits;
     FT_UInt32             kern_order_bits;
-#endif
 
 #ifdef TT_CONFIG_OPTION_BDF
     TT_BDFRec             bdf;
--- a/src/sfnt/sfobjs.c
+++ b/src/sfnt/sfobjs.c
@@ -901,7 +901,7 @@
         FT_UInt  i, count;
 
 
-#if defined FT_OPTIMIZE_MEMORY && !defined FT_CONFIG_OPTION_OLD_INTERNALS
+#if !defined FT_CONFIG_OPTION_OLD_INTERNALS
         count = face->sbit_num_strikes;
 #else
         count = (FT_UInt)face->num_sbit_strikes;
@@ -1008,7 +1008,7 @@
     }
 
     /* freeing the horizontal metrics */
-#if defined FT_OPTIMIZE_MEMORY && !defined FT_CONFIG_OPTION_OLD_INTERNALS
+#if !defined FT_CONFIG_OPTION_OLD_INTERNALS
     {
       FT_Stream  stream = FT_FACE_STREAM( face );
 
--- a/src/sfnt/ttkern.c
+++ b/src/sfnt/ttkern.c
@@ -41,8 +41,6 @@
 #define TT_KERN_INDEX( g1, g2 )  ( ( (FT_ULong)(g1) << 16 ) | (g2) )
 
 
-#ifdef FT_OPTIMIZE_MEMORY
-
   FT_LOCAL_DEF( FT_Error )
   tt_face_load_kern( TT_Face    face,
                      FT_Stream  stream )
@@ -288,206 +286,6 @@
 
     return result;
   }
-
-#else /* !OPTIMIZE_MEMORY */
-
-  FT_CALLBACK_DEF( int )
-  tt_kern_pair_compare( const void*  a,
-                        const void*  b );
-
-
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_kern( TT_Face    face,
-                     FT_Stream  stream )
-  {
-    FT_Error   error;
-    FT_Memory  memory = stream->memory;
-
-    FT_UInt    n, num_tables;
-
-
-    /* the kern table is optional; exit silently if it is missing */
-    error = face->goto_table( face, TTAG_kern, stream, 0 );
-    if ( error )
-      return SFNT_Err_Ok;
-
-    if ( FT_FRAME_ENTER( 4L ) )
-      goto Exit;
-
-    (void)FT_GET_USHORT();         /* version */
-    num_tables = FT_GET_USHORT();
-
-    FT_FRAME_EXIT();
-
-    for ( n = 0; n < num_tables; n++ )
-    {
-      FT_UInt  coverage;
-      FT_UInt  length;
-
-
-      if ( FT_FRAME_ENTER( 6L ) )
-        goto Exit;
-
-      (void)FT_GET_USHORT();           /* version                 */
-      length   = FT_GET_USHORT() - 6;  /* substract header length */
-      coverage = FT_GET_USHORT();
-
-      FT_FRAME_EXIT();
-
-      if ( coverage == 0x0001 )
-      {
-        FT_UInt        num_pairs;
-        TT_Kern0_Pair  pair;
-        TT_Kern0_Pair  limit;
-
-
-        /* found a horizontal format 0 kerning table! */
-        if ( FT_FRAME_ENTER( 8L ) )
-          goto Exit;
-
-        num_pairs = FT_GET_USHORT();
-
-        /* skip the rest */
-
-        FT_FRAME_EXIT();
-
-        /* allocate array of kerning pairs */
-        if ( FT_QNEW_ARRAY( face->kern_pairs, num_pairs ) ||
-             FT_FRAME_ENTER( 6L * num_pairs )             )
-          goto Exit;
-
-        pair  = face->kern_pairs;
-        limit = pair + num_pairs;
-        for ( ; pair < limit; pair++ )
-        {
-          pair->left  = FT_GET_USHORT();
-          pair->right = FT_GET_USHORT();
-          pair->value = FT_GET_USHORT();
-        }
-
-        FT_FRAME_EXIT();
-
-        face->num_kern_pairs   = num_pairs;
-        face->kern_table_index = n;
-
-        /* ensure that the kerning pair table is sorted (yes, some */
-        /* fonts have unsorted tables!)                            */
-
-        if ( num_pairs > 0 )
-        {
-          TT_Kern0_Pair  pair0 = face->kern_pairs;
-          FT_ULong       prev  = TT_KERN_INDEX( pair0->left, pair0->right );
-
-
-          for ( pair0++; pair0 < limit; pair0++ )
-          {
-            FT_ULong  next = TT_KERN_INDEX( pair0->left, pair0->right );
-
-
-            if ( next < prev )
-              goto SortIt;
-
-            prev = next;
-          }
-          goto Exit;
-
-        SortIt:
-          ft_qsort( (void*)face->kern_pairs, (int)num_pairs,
-                    sizeof ( TT_Kern0_PairRec ), tt_kern_pair_compare );
-        }
-
-        goto Exit;
-      }
-
-      if ( FT_STREAM_SKIP( length ) )
-        goto Exit;
-    }
-
-    /* no kern table found -- doesn't matter */
-    face->kern_table_index = -1;
-    face->num_kern_pairs   = 0;
-    face->kern_pairs       = NULL;
-
-  Exit:
-    return error;
-  }
-
-
-  FT_CALLBACK_DEF( int )
-  tt_kern_pair_compare( const void*  a,
-                        const void*  b )
-  {
-    TT_Kern0_Pair  pair1 = (TT_Kern0_Pair)a;
-    TT_Kern0_Pair  pair2 = (TT_Kern0_Pair)b;
-
-    FT_ULong  index1 = TT_KERN_INDEX( pair1->left, pair1->right );
-    FT_ULong  index2 = TT_KERN_INDEX( pair2->left, pair2->right );
-
-    return index1 < index2 ? -1
-                           : ( index1 > index2 ? 1
-                                               : 0 );
-  }
-
-
-  FT_LOCAL_DEF( void )
-  tt_face_done_kern( TT_Face  face )
-  {
-    FT_Memory  memory = face->root.stream->memory;
-
-
-    FT_FREE( face->kern_pairs );
-    face->num_kern_pairs = 0;
-  }
-
-
-  FT_LOCAL_DEF( FT_Int )
-  tt_face_get_kerning( TT_Face  face,
-                       FT_UInt  left_glyph,
-                       FT_UInt  right_glyph )
-  {
-    FT_Int         result = 0;
-    TT_Kern0_Pair  pair;
-
-
-    if ( face && face->kern_pairs )
-    {
-      /* there are some kerning pairs in this font file! */
-      FT_ULong  search_tag = TT_KERN_INDEX( left_glyph, right_glyph );
-      FT_Long   left, right;
-
-
-      left  = 0;
-      right = face->num_kern_pairs - 1;
-
-      while ( left <= right )
-      {
-        FT_Long   middle = left + ( ( right - left ) >> 1 );
-        FT_ULong  cur_pair;
-
-
-        pair     = face->kern_pairs + middle;
-        cur_pair = TT_KERN_INDEX( pair->left, pair->right );
-
-        if ( cur_pair == search_tag )
-          goto Found;
-
-        if ( cur_pair < search_tag )
-          left = middle + 1;
-        else
-          right = middle - 1;
-      }
-    }
-
-  Exit:
-    return result;
-
-  Found:
-    result = pair->value;
-    goto Exit;
-  }
-
-#endif /* !OPTIMIZE_MEMORY */
-
 
 #undef TT_KERN_INDEX
 
--- a/src/sfnt/ttkern.h
+++ b/src/sfnt/ttkern.h
@@ -41,11 +41,7 @@
                        FT_UInt     left_glyph,
                        FT_UInt     right_glyph );
 
-#ifdef FT_OPTIMIZE_MEMORY
 #  define TT_FACE_HAS_KERNING( face )  ( (face)->kern_avail_bits != 0 )
-#else
-#  define TT_FACE_HAS_KERNING( face )  ( (face)->kern_pairs != NULL )
-#endif
 
 
 FT_END_HEADER
--- a/src/sfnt/ttmtx.c
+++ b/src/sfnt/ttmtx.c
@@ -60,7 +60,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-#if defined FT_OPTIMIZE_MEMORY && !defined FT_CONFIG_OPTION_OLD_INTERNALS
+#if !defined FT_CONFIG_OPTION_OLD_INTERNALS
 
   FT_LOCAL_DEF( FT_Error )
   tt_face_load_hmtx( TT_Face    face,
@@ -334,7 +334,7 @@
   /*                                                                       */
   /*    advance :: The advance width resp. advance height.                 */
   /*                                                                       */
-#if defined FT_OPTIMIZE_MEMORY && !defined FT_CONFIG_OPTION_OLD_INTERNALS
+#if !defined FT_CONFIG_OPTION_OLD_INTERNALS
 
   FT_LOCAL_DEF( FT_Error )
   tt_face_get_metrics( TT_Face     face,
--- a/src/sfnt/ttsbit.c
+++ b/src/sfnt/ttsbit.c
@@ -24,7 +24,7 @@
    *  Alas, the memory-optimized sbit loader can't be used when implementing
    *  the `old internals' hack
    */
-#if defined FT_OPTIMIZE_MEMORY && !defined FT_CONFIG_OPTION_OLD_INTERNALS
+#if !defined FT_CONFIG_OPTION_OLD_INTERNALS
 
 #include "ttsbit0.c"
 
--- a/src/sfnt/ttsbit.h
+++ b/src/sfnt/ttsbit.h
@@ -45,7 +45,7 @@
                                FT_ULong          strike_index,
                                FT_Size_Metrics*  metrics );
 
-#if !defined FT_OPTIMIZE_MEMORY || defined FT_CONFIG_OPTION_OLD_INTERNALS
+#if defined FT_CONFIG_OPTION_OLD_INTERNALS
   FT_LOCAL( FT_Error )
   tt_find_sbit_image( TT_Face          face,
                       FT_UInt          glyph_index,
@@ -59,7 +59,7 @@
                         TT_SBit_Range    range,
                         TT_SBit_Metrics  metrics );
 
-#endif /* !FT_OPTIMIZE_MEMORY || FT_CONFIG_OPTION_OLD_INTERNALS */
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
 
   FT_LOCAL( FT_Error )
   tt_face_load_sbit_image( TT_Face              face,
--- a/src/truetype/ttpload.c
+++ b/src/truetype/ttpload.c
@@ -58,7 +58,6 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-#ifdef FT_OPTIMIZE_MEMORY
 
   FT_LOCAL_DEF( FT_Error )
   tt_face_load_loca( TT_Face    face,
@@ -183,136 +182,7 @@
   }
 
 
-#else /* !FT_OPTIMIZE_MEMORY */
 
-
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_loca( TT_Face    face,
-                     FT_Stream  stream )
-  {
-    FT_Error   error;
-    FT_Memory  memory = stream->memory;
-    FT_Short   LongOffsets;
-    FT_ULong   table_len;
-
-
-    /* we need the size of the `glyf' table for malformed `loca' tables */
-    error = face->goto_table( face, TTAG_glyf, stream, &face->glyf_len );
-    if ( error )
-      goto Exit;
-
-    FT_TRACE2(( "Locations " ));
-    LongOffsets = face->header.Index_To_Loc_Format;
-
-    error = face->goto_table( face, TTAG_loca, stream, &table_len );
-    if ( error )
-    {
-      error = TT_Err_Locations_Missing;
-      goto Exit;
-    }
-
-    if ( LongOffsets != 0 )
-    {
-      face->num_locations = (FT_UShort)( table_len >> 2 );
-
-      FT_TRACE2(( "(32bit offsets): %12d ", face->num_locations ));
-
-      if ( FT_NEW_ARRAY( face->glyph_locations, face->num_locations ) )
-        goto Exit;
-
-      if ( FT_FRAME_ENTER( face->num_locations * 4L ) )
-        goto Exit;
-
-      {
-        FT_Long*  loc   = face->glyph_locations;
-        FT_Long*  limit = loc + face->num_locations;
-
-
-        for ( ; loc < limit; loc++ )
-          *loc = FT_GET_LONG();
-      }
-
-      FT_FRAME_EXIT();
-    }
-    else
-    {
-      face->num_locations = (FT_UShort)( table_len >> 1 );
-
-      FT_TRACE2(( "(16bit offsets): %12d ", face->num_locations ));
-
-      if ( FT_NEW_ARRAY( face->glyph_locations, face->num_locations ) )
-        goto Exit;
-
-      if ( FT_FRAME_ENTER( face->num_locations * 2L ) )
-        goto Exit;
-
-      {
-        FT_Long*  loc   = face->glyph_locations;
-        FT_Long*  limit = loc + face->num_locations;
-
-
-        for ( ; loc < limit; loc++ )
-          *loc = (FT_Long)( (FT_ULong)FT_GET_USHORT() * 2 );
-      }
-
-      FT_FRAME_EXIT();
-    }
-
-    FT_TRACE2(( "loaded\n" ));
-
-  Exit:
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( FT_ULong )
-  tt_face_get_location( TT_Face   face,
-                        FT_UInt   gindex,
-                        FT_UInt  *asize )
-  {
-    FT_ULong  offset;
-    FT_UInt   count;
-
-
-    offset = face->glyph_locations[gindex];
-    count  = 0;
-
-    if ( gindex < (FT_UInt)face->num_locations - 1 )
-    {
-      FT_ULong  offset1 = face->glyph_locations[gindex + 1];
-
-
-      /* It isn't mentioned explicitly that the `loca' table must be  */
-      /* ordered, but implicitly it refers to the length of an entry  */
-      /* as the difference between the current and the next position. */
-      /* Anyway, there do exist (malformed) fonts which don't obey    */
-      /* this rule, so we are only able to provide an upper bound for */
-      /* the size.                                                    */
-      if ( offset1 >= offset )
-        count = (FT_UInt)( offset1 - offset );
-      else
-        count = (FT_UInt)( face->glyf_len - offset );
-    }
-
-    *asize = count;
-    return offset;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  tt_face_done_loca( TT_Face  face )
-  {
-    FT_Memory  memory = face->root.memory;
-
-
-    FT_FREE( face->glyph_locations );
-    face->num_locations = 0;
-  }
-
-
-#endif /* !FT_OPTIMIZE_MEMORY */
-
-
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
@@ -533,7 +403,6 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-#ifdef FT_OPTIMIZE_MEMORY
 
   FT_LOCAL_DEF( FT_Error )
   tt_face_load_hdmx( TT_Face    face,
@@ -621,115 +490,7 @@
     FT_FRAME_RELEASE( face->hdmx_table );
   }
 
-#else /* !FT_OPTIMIZE_MEMORY */
 
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_hdmx( TT_Face    face,
-                     FT_Stream  stream )
-  {
-    FT_Error   error;
-    FT_Memory  memory = stream->memory;
-
-    TT_Hdmx    hdmx = &face->hdmx;
-    FT_Short   num_records;
-    FT_Long    num_glyphs;
-    FT_Long    record_size;
-
-
-    hdmx->version     = 0;
-    hdmx->num_records = 0;
-    hdmx->records     = 0;
-
-    /* this table is optional */
-    error = face->goto_table( face, TTAG_hdmx, stream, 0 );
-    if ( error )
-      return TT_Err_Ok;
-
-    if ( FT_FRAME_ENTER( 8L ) )
-      goto Exit;
-
-    hdmx->version = FT_GET_USHORT();
-    num_records   = FT_GET_SHORT();
-    record_size   = FT_GET_LONG();
-
-    FT_FRAME_EXIT();
-
-    /* The maximum number of bytes in an hdmx device record is the */
-    /* maximum number of glyphs + 2; this is 0xFFFF + 2; this is   */
-    /* the reason why `record_size' is a long.  In practice, two   */
-    /* bytes sufficient to hold the size value.                    */
-    /*                                                             */
-    /* There are at least two fonts, HANNOM-A and HANNOM-B version */
-    /* 2.0 (2005), which get this wrong: The upper two bytes of    */
-    /* the size value are set to 0xFF instead of 0x00.  We catch   */
-    /* and fix this.                                               */
-
-    if ( (FT_ULong)record_size >= 0xFFFF0000UL )
-      record_size = (FT_Long)( (FT_ULong)record_size & 0xFFFFU );
-
-    if ( record_size < 0 || num_records < 0 )
-      return TT_Err_Invalid_File_Format;
-
-    /* Only recognize format 0 */
-    if ( hdmx->version != 0 )
-      return TT_Err_Invalid_File_Format;
-
-    /* we can't use FT_QNEW_ARRAY here; otherwise tt_face_free_hdmx */
-    /* could fail during deallocation                               */
-    if ( FT_NEW_ARRAY( hdmx->records, num_records ) )
-      goto Exit;
-
-    hdmx->num_records = num_records;
-    num_glyphs        = face->root.num_glyphs;
-    record_size      -= num_glyphs + 2;
-
-    {
-      TT_HdmxEntry  cur   = hdmx->records;
-      TT_HdmxEntry  limit = cur + hdmx->num_records;
-
-
-      for ( ; cur < limit; cur++ )
-      {
-        /* read record */
-        if ( FT_READ_BYTE( cur->ppem      ) ||
-             FT_READ_BYTE( cur->max_width ) )
-          goto Exit;
-
-        if ( FT_QALLOC( cur->widths, num_glyphs )      ||
-             FT_STREAM_READ( cur->widths, num_glyphs ) )
-          goto Exit;
-
-        /* skip padding bytes */
-        if ( record_size > 0 && FT_STREAM_SKIP( record_size ) )
-          goto Exit;
-      }
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  tt_face_free_hdmx( TT_Face  face )
-  {
-    if ( face )
-    {
-      FT_Int     n;
-      FT_Memory  memory = face->root.driver->root.memory;
-
-
-      for ( n = 0; n < face->hdmx.num_records; n++ )
-        FT_FREE( face->hdmx.records[n].widths );
-
-      FT_FREE( face->hdmx.records );
-      face->hdmx.num_records = 0;
-    }
-  }
-
-#endif /* !OPTIMIZE_MEMORY */
-
-
   /*************************************************************************/
   /*                                                                       */
   /* Return the advance width table for a given pixel size if it is found  */
@@ -740,8 +501,6 @@
                               FT_UInt  ppem,
                               FT_UInt  gindex )
   {
-#ifdef FT_OPTIMIZE_MEMORY
-
     FT_UInt   nn;
     FT_Byte*  result      = NULL;
     FT_ULong  record_size = face->hdmx_record_size;
@@ -758,19 +517,6 @@
       }
 
     return result;
-
-#else
-
-    FT_UShort  n;
-
-
-    for ( n = 0; n < face->hdmx.num_records; n++ )
-      if ( face->hdmx.records[n].ppem == ppem )
-        return &face->hdmx.records[n].widths[gindex];
-
-    return NULL;
-
-#endif
   }