shithub: freetype+ttf2subf

Download patch

ref: 5290d2fb46f33d7cd7e4036216196a7f92b7daa1
parent: 8ef4183690ab7a8f5fef0eb9ae64b0958aecc6b8
author: David Turner <[email protected]>
date: Wed Jun 23 11:44:03 EDT 2004

performance optimizations regarding face opening

git/fs: mount .git/fs: mount/attach disallowed
--- a/include/freetype/config/ftmodule.h
+++ b/include/freetype/config/ftmodule.h
@@ -1,4 +1,6 @@
 FT_USE_MODULE(autohint_module_class)
+FT_USE_MODULE(tt_driver_class)
+FT_USE_MODULE(t1_driver_class)
 FT_USE_MODULE(cff_driver_class)
 FT_USE_MODULE(t1cid_driver_class)
 FT_USE_MODULE(pcf_driver_class)
@@ -11,8 +13,6 @@
 FT_USE_MODULE(ft_smooth_renderer_class)
 FT_USE_MODULE(ft_smooth_lcd_renderer_class)
 FT_USE_MODULE(ft_smooth_lcdv_renderer_class)
-FT_USE_MODULE(tt_driver_class)
-FT_USE_MODULE(t1_driver_class)
 FT_USE_MODULE(t42_driver_class)
 FT_USE_MODULE(pfr_driver_class)
 FT_USE_MODULE(winfnt_driver_class)
--- a/include/freetype/internal/ftmemory.h
+++ b/include/freetype/internal/ftmemory.h
@@ -108,6 +108,11 @@
             FT_Long    size,
             void*     *P );
 
+            
+  FT_BASE( FT_Error )
+  FT_QAlloc( FT_Memory  memory,
+             FT_Long    size,
+             void*     *p );            
 
   /*************************************************************************/
   /*                                                                       */
@@ -143,6 +148,12 @@
               FT_Long    size,
               void*     *P );
 
+              
+  FT_BASE( FT_Error )
+  FT_QRealloc( FT_Memory  memory,
+               FT_Long    current,
+               FT_Long    size,
+               void*     *p );              
 
   /*************************************************************************/
   /*                                                                       */
@@ -204,6 +215,14 @@
           FT_Realloc_Debug( memory, _current_, _size_,                 \
                             (void**)&(_pointer_), __FILE__, __LINE__ )
 
+#define FT_MEM_QALLOC( _pointer_, _size_ )                            \
+          FT_QAlloc_Debug( memory, _size_,                            \
+                          (void**)&(_pointer_), __FILE__, __LINE__ )
+
+#define FT_MEM_QREALLOC( _pointer_, _current_, _size_ )                 \
+          FT_QRealloc_Debug( memory, _current_, _size_,                 \
+                            (void**)&(_pointer_), __FILE__, __LINE__ )
+
 #define FT_MEM_FREE( _pointer_ )                                            \
           FT_Free_Debug( memory, (void**)&(_pointer_), __FILE__, __LINE__ )
 
@@ -220,7 +239,12 @@
 #define FT_MEM_REALLOC( _pointer_, _current_, _size_ )                  \
           FT_Realloc( memory, _current_, _size_, (void**)&(_pointer_) )
 
+#define FT_MEM_QALLOC( _pointer_, _size_ )                  \
+          FT_QAlloc( memory, _size_, (void**)&(_pointer_) )
 
+#define FT_MEM_QREALLOC( _pointer_, _current_, _size_ )                  \
+          FT_QRealloc( memory, _current_, _size_, (void**)&(_pointer_) )
+
 #endif /* !FT_DEBUG_MEMORY */
 
 
@@ -240,7 +264,17 @@
           FT_MEM_REALLOC( _pointer_, (_old_) * sizeof ( *(_pointer_) ),  \
                                      (_new_) * sizeof ( *(_pointer_) ) )
 
+#define FT_MEM_QNEW( _pointer_ )                               \
+          FT_MEM_QALLOC( _pointer_, sizeof ( *(_pointer_) ) )
 
+#define FT_MEM_QNEW_ARRAY( _pointer_, _count_ )                           \
+          FT_MEM_QALLOC( _pointer_, (_count_) * sizeof ( *(_pointer_) ) )
+
+#define FT_MEM_QRENEW_ARRAY( _pointer_, _old_, _new_ )                    \
+          FT_MEM_QREALLOC( _pointer_, (_old_) * sizeof ( *(_pointer_) ),  \
+                                      (_new_) * sizeof ( *(_pointer_) ) )
+
+
   /*************************************************************************/
   /*                                                                       */
   /* the following macros are obsolete but kept for compatibility reasons  */
@@ -270,6 +304,13 @@
 #define FT_FREE( _pointer_ )       \
           FT_MEM_FREE( _pointer_ )
 
+#define FT_QALLOC( _pointer_, _size_ )                       \
+          FT_SET_ERROR( FT_MEM_QALLOC( _pointer_, _size_ ) )
+
+#define FT_QREALLOC( _pointer_, _current_, _size_ )                       \
+          FT_SET_ERROR( FT_MEM_QREALLOC( _pointer_, _current_, _size_ ) )
+
+          
 #define FT_NEW( _pointer_ )  \
           FT_SET_ERROR( FT_MEM_NEW( _pointer_ ) )
 
@@ -279,6 +320,18 @@
 #define FT_RENEW_ARRAY( _pointer_, _old_, _new_ )   \
           FT_SET_ERROR( FT_MEM_RENEW_ARRAY( _pointer_, _old_, _new_ ) )
 
+#define FT_QNEW( _pointer_ )  \
+          FT_SET_ERROR( FT_MEM_QNEW( _pointer_ ) )
+
+#define FT_QNEW_ARRAY( _pointer_, _count_ )  \
+          FT_SET_ERROR( FT_MEM_QNEW_ARRAY( _pointer_, _count_ ) )
+
+#define FT_QRENEW_ARRAY( _pointer_, _old_, _new_ )   \
+          FT_SET_ERROR( FT_MEM_QRENEW_ARRAY( _pointer_, _old_, _new_ ) )
+
+          
+          
+          
 #define FT_ALLOC_ARRAY( _pointer_, _count_, _type_ )                    \
           FT_SET_ERROR( FT_MEM_ALLOC( _pointer_,                        \
                                       (_count_) * sizeof ( _type_ ) ) )
--- a/include/freetype/internal/ftstream.h
+++ b/include/freetype/internal/ftstream.h
@@ -269,6 +269,25 @@
   /*                                                                       */
   /* Each GET_xxxx() macro uses an implicit `stream' variable.             */
   /*                                                                       */
+#if 0
+#define FT_GET_MACRO( type )    FT_NEXT_ ## type ( stream->cursor )
+
+#define FT_GET_CHAR()       FT_GET_MACRO( CHAR )
+#define FT_GET_BYTE()       FT_GET_MACRO( BYTE )
+#define FT_GET_SHORT()      FT_GET_MACRO( SHORT )
+#define FT_GET_USHORT()     FT_GET_MACRO( USHORT )
+#define FT_GET_OFF3()       FT_GET_MACRO( OFF3 )
+#define FT_GET_UOFF3()      FT_GET_MACRO( UOFF3 )
+#define FT_GET_LONG()       FT_GET_MACRO( LONG )
+#define FT_GET_ULONG()      FT_GET_MACRO( ULONG )
+#define FT_GET_TAG4()       FT_GET_MACRO( ULONG )
+
+#define FT_GET_SHORT_LE()   FT_GET_MACRO( SHORT_LE )
+#define FT_GET_USHORT_LE()  FT_GET_MACRO( USHORT_LE )
+#define FT_GET_LONG_LE()    FT_GET_MACRO( LONG_LE )
+#define FT_GET_ULONG_LE()   FT_GET_MACRO( ULONG_LE )
+
+#else
 #define FT_GET_MACRO( func, type )        ( (type)func( stream ) )
 
 #define FT_GET_CHAR()       FT_GET_MACRO( FT_Stream_GetChar, FT_Char )
@@ -285,6 +304,7 @@
 #define FT_GET_USHORT_LE()  FT_GET_MACRO( FT_Stream_GetShortLE, FT_UShort )
 #define FT_GET_LONG_LE()    FT_GET_MACRO( FT_Stream_GetLongLE, FT_Long )
 #define FT_GET_ULONG_LE()   FT_GET_MACRO( FT_Stream_GetLongLE, FT_ULong )
+#endif
 
 #define FT_READ_MACRO( func, type, var )        \
           ( var = (type)func( stream, &error ), \
--- a/src/base/ftdbgmem.c
+++ b/src/base/ftdbgmem.c
@@ -694,6 +694,45 @@
   }
 
 
+  FT_BASE_DEF( FT_Error )
+  FT_QAlloc_Debug( FT_Memory    memory,
+                  FT_Long      size,
+                  void*       *P,
+                  const char*  file_name,
+                  FT_Long      line_no )
+  {
+    FT_MemTable  table = (FT_MemTable)memory->user;
+
+
+    if ( table )
+    {
+      table->file_name = file_name;
+      table->line_no   = line_no;
+    }
+    return FT_QAlloc( memory, size, P );
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_QRealloc_Debug( FT_Memory    memory,
+                    FT_Long      current,
+                    FT_Long      size,
+                    void*       *P,
+                    const char*  file_name,
+                    FT_Long      line_no )
+  {
+    FT_MemTable  table = (FT_MemTable)memory->user;
+
+
+    if ( table )
+    {
+      table->file_name = file_name;
+      table->line_no   = line_no;
+    }
+    return FT_QRealloc( memory, current, size, P );
+  }
+
+  
   FT_BASE_DEF( void )
   FT_Free_Debug( FT_Memory    memory,
                  FT_Pointer   block,
--- a/src/base/ftstream.c
+++ b/src/base/ftstream.c
@@ -210,7 +210,7 @@
       FT_Memory  memory = stream->memory;
 
 
-      if ( FT_ALLOC( stream->base, count ) )
+      if ( FT_QALLOC( stream->base, count ) )
         goto Exit;
 
       /* read it */
--- a/src/base/ftutil.c
+++ b/src/base/ftutil.c
@@ -77,6 +77,36 @@
   }
 
 
+  FT_BASE_DEF( FT_Error )
+  FT_QAlloc( FT_Memory  memory,
+             FT_Long    size,
+             void*     *P )
+  {
+    FT_ASSERT( P != 0 );
+
+    if ( size > 0 )
+    {
+      *P = memory->alloc( memory, size );
+      if ( !*P )
+      {
+        FT_ERROR(( "FT_Alloc:" ));
+        FT_ERROR(( " Out of memory? (%ld requested)\n",
+                   size ));
+
+        return FT_Err_Out_Of_Memory;
+      }
+    }
+    else
+      *P = NULL;
+
+    FT_TRACE7(( "FT_Alloc:" ));
+    FT_TRACE7(( " size = %ld, block = 0x%08p, ref = 0x%08p\n",
+                size, *P, P ));
+
+    return FT_Err_Ok;
+  }
+
+  
   /* documentation is in ftmemory.h */
 
   FT_BASE_DEF( FT_Error )
@@ -119,6 +149,42 @@
   }
 
 
+  FT_BASE_DEF( FT_Error )
+  FT_QRealloc( FT_Memory  memory,
+               FT_Long    current,
+               FT_Long    size,
+               void**     P )
+  {
+    void*  Q;
+
+
+    FT_ASSERT( P != 0 );
+
+    /* if the original pointer is NULL, call FT_Alloc() */
+    if ( !*P )
+      return FT_Alloc( memory, size, P );
+
+    /* if the new block if zero-sized, clear the current one */
+    if ( size <= 0 )
+    {
+      FT_Free( memory, P );
+      return FT_Err_Ok;
+    }
+
+    Q = memory->realloc( memory, current, size, *P );
+    if ( !Q )
+      goto Fail;
+
+    *P = Q;
+    return FT_Err_Ok;
+
+  Fail:
+    FT_ERROR(( "FT_Realloc:" ));
+    FT_ERROR(( " Failed (current %ld, requested %ld)\n",
+               current, size ));
+    return FT_Err_Out_Of_Memory;
+  }
+  
   /* documentation is in ftmemory.h */
 
   FT_BASE_DEF( void )
--- a/src/gzip/ftgzip.c
+++ b/src/gzip/ftgzip.c
@@ -565,7 +565,7 @@
     FT_ZERO( stream );
     stream->memory = memory;
 
-    if ( !FT_NEW( zip ) )
+    if ( !FT_QNEW( zip ) )
     {
       error = ft_gzip_file_init( zip, stream, source );
       if ( error )
--- a/src/sfnt/sfobjs.c
+++ b/src/sfnt/sfobjs.c
@@ -267,7 +267,7 @@
         FT_UNUSED( error );
 
 
-        if ( FT_NEW_ARRAY  ( rec->string, rec->stringLength ) ||
+        if ( FT_QNEW_ARRAY ( rec->string, rec->stringLength ) ||
              FT_STREAM_SEEK( rec->stringOffset )              ||
              FT_STREAM_READ( rec->string, rec->stringLength ) )
         {
--- a/src/sfnt/ttload.c
+++ b/src/sfnt/ttload.c
@@ -433,7 +433,7 @@
 
     face->num_tables = sfnt->num_tables;
 
-    if ( FT_NEW_ARRAY( face->dir_tables, face->num_tables ) )
+    if ( FT_QNEW_ARRAY( face->dir_tables, face->num_tables ) )
       goto Exit;
 
     if ( FT_STREAM_SEEK( sfnt->offset + 12 )      ||
@@ -888,8 +888,8 @@
       goto Exit;
     }
 
-    if ( FT_NEW_ARRAY( *longs,  num_longs  ) ||
-         FT_NEW_ARRAY( *shorts, num_shorts ) )
+    if ( FT_QNEW_ARRAY( *longs,  num_longs  ) ||
+         FT_QNEW_ARRAY( *shorts, num_shorts ) )
       goto Exit;
 
     if ( FT_FRAME_ENTER( table_len ) )
@@ -1586,7 +1586,7 @@
     num_ranges = face->gasp.numRanges;
     FT_TRACE3(( "number of ranges = %d\n", num_ranges ));
 
-    if ( FT_NEW_ARRAY( gaspranges, num_ranges ) ||
+    if ( FT_QNEW_ARRAY( gaspranges, num_ranges ) ||
          FT_FRAME_ENTER( num_ranges * 4L )      )
       goto Exit;
 
@@ -1635,6 +1635,11 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
+  
+#undef  TT_KERN_INDEX
+#define TT_KERN_INDEX( g1, g2 )  ( ( (FT_ULong)g1 << 16 ) | g2 )
+
+
   FT_LOCAL_DEF( FT_Error )
   tt_face_load_kern( TT_Face    face,
                      FT_Stream  stream )
@@ -1691,8 +1696,8 @@
         FT_FRAME_EXIT();
 
         /* allocate array of kerning pairs */
-        if ( FT_NEW_ARRAY( face->kern_pairs, num_pairs ) ||
-             FT_FRAME_ENTER( 6L * num_pairs )            )
+        if ( FT_QNEW_ARRAY( face->kern_pairs, num_pairs ) ||
+             FT_FRAME_ENTER( 6L * num_pairs )             )
           goto Exit;
 
         pair  = face->kern_pairs;
@@ -1711,16 +1716,35 @@
 
         /* ensure that the kerning pair table is sorted (yes, some */
         /* fonts have unsorted tables!)                            */
+#if 1
+        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 );
+        }
+#else        
+        {
+          TT_Kern0_Pair  pair0    = face->kern_pairs;
           FT_UInt        i;
-          TT_Kern0_Pair  pair0;
-
-
-          pair0 = face->kern_pairs;
-
+          
           for ( i = 1; i < num_pairs; i++, pair0++ )
           {
-            if ( tt_kern_pair_compare( pair0, pair0 + 1 ) != -1 )
+            if ( tt_kern_pair_compare( pair0, pair0+1 ) != -1 )
             {
               ft_qsort( (void*)face->kern_pairs, (int)num_pairs,
                         sizeof ( TT_Kern0_PairRec ), tt_kern_pair_compare );
@@ -1728,7 +1752,7 @@
             }
           }
         }
-
+#endif
         goto Exit;
       }
 
@@ -1746,10 +1770,6 @@
   }
 
 
-#undef  TT_KERN_INDEX
-#define TT_KERN_INDEX( g1, g2 )  ( ( (FT_ULong)g1 << 16 ) | g2 )
-
-
   FT_CALLBACK_DEF( int )
   tt_kern_pair_compare( const void*  a,
                         const void*  b )
@@ -1767,6 +1787,7 @@
 
 
 #undef TT_KERN_INDEX
+  
 
 
   /*************************************************************************/
@@ -1820,7 +1841,7 @@
     if ( hdmx->version != 0 )
       goto Exit;
 
-    if ( FT_NEW_ARRAY( hdmx->records, num_records ) )
+    if ( FT_QNEW_ARRAY( hdmx->records, num_records ) )
       goto Exit;
 
     hdmx->num_records = num_records;
@@ -1839,7 +1860,7 @@
              FT_READ_BYTE( cur->max_width ) )
           goto Exit;
 
-        if ( FT_ALLOC( cur->widths, num_glyphs )       ||
+        if ( FT_QALLOC( cur->widths, num_glyphs )       ||
              FT_STREAM_READ( cur->widths, num_glyphs ) )
           goto Exit;