shithub: freetype+ttf2subf

Download patch

ref: ed54f28e4ac2ff2ed0016fe8b2d0f5d7b4689ef3
parent: fa77c87f64978546fd4c55866d21d7cbdbae1b02
author: David Turner <[email protected]>
date: Fri Mar 22 12:09:52 EST 2002

various fixes to the FT_CMaps support

git/fs: mount .git/fs: mount/attach disallowed
--- a/include/freetype/config/ftoption.h
+++ b/include/freetype/config/ftoption.h
@@ -76,7 +76,7 @@
   /*************************************************************************/
 
 
-#undef  FT_CONFIG_OPTION_USE_CMAPS
+#define FT_CONFIG_OPTION_USE_CMAPS
 #define TT_CONFIG_CMAP_FORMAT_0
 #define TT_CONFIG_CMAP_FORMAT_2
 #define TT_CONFIG_CMAP_FORMAT_4
--- a/include/freetype/internal/ftobjs.h
+++ b/include/freetype/internal/ftobjs.h
@@ -127,8 +127,8 @@
  /* validator structure */
   typedef struct FT_ValidatorRec_
   {
-    FT_Byte*            base;   /* address of table in memory           */
-    FT_Byte*            limit;  /* 'base' + sizeof(table) in memory     */
+    const FT_Byte*      base;   /* address of table in memory           */
+    const FT_Byte*      limit;  /* 'base' + sizeof(table) in memory     */
     FT_ValidationLevel  level;  /* validation level                     */
     FT_Error            error;  /* error returned. 0 means success      */
 
@@ -136,13 +136,17 @@
 
   } FT_ValidatorRec;
 
+#define FT_VALIDATOR(x)  ((FT_Validator)(x))
 
   FT_BASE( void )
   ft_validator_init( FT_Validator        valid,
-                     FT_Byte*            base,
-                     FT_Byte*            limit,
+                     const FT_Byte*      base,
+                     const FT_Byte*      limit,
                      FT_ValidationLevel  level );
 
+  FT_BASE( FT_Int )
+  ft_validator_run( FT_Validator  valid );
+
  /* sets the error field in a validator, then calls 'longjmp' to return */
  /* to high-level caller. Using 'setjmp/longjmp' avoids many stupid     */
  /* error checks within the validation routines..                       */
@@ -450,6 +454,7 @@
 #define FT_FACE_DRIVER( x )   FT_FACE( x )->driver
 #define FT_FACE_LIBRARY( x )  FT_FACE_DRIVER( x )->root.library
 #define FT_FACE_MEMORY( x )   FT_FACE( x )->memory
+#define FT_FACE_STREAM( x )   FT_FACE( x )->stream
 
 #define FT_SIZE_FACE( x )     FT_SIZE( x )->face
 #define FT_SLOT_FACE( x )     FT_SLOT( x )->face
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -26,8 +26,39 @@
 #include FT_OUTLINE_H
 
 #include <string.h>     /* for strcmp() */
+#include <setjmp.h>     /* for setjmp() and longjmp() */
 
+  FT_BASE_DEF( void )
+  ft_validator_init( FT_Validator        valid,
+                     const FT_Byte*      base,
+                     const FT_Byte*      limit,
+                     FT_ValidationLevel  level )
+  {
+    valid->base  = base;
+    valid->limit = limit;
+    valid->level = level;
+    valid->error = 0;
+  }
+                       
 
+  FT_BASE_DEF( FT_Int )
+  ft_validator_run( FT_Validator  valid )
+  {
+    int  result;
+    
+    result = setjmp( valid->jump_buffer );
+    return result;
+  }
+
+  FT_BASE_DEF( void )
+  ft_validator_error( FT_Validator  valid,
+                      FT_Error      error )
+  {
+    valid->error = error;
+    longjmp( valid->jump_buffer, 1 );
+  }                      
+
+
   /*************************************************************************/
   /*************************************************************************/
   /*************************************************************************/
@@ -1443,29 +1474,47 @@
 
   /* documentation is in freetype.h */
 
+#ifdef FT_CONFIG_OPTION_USE_CMAPS
+
   FT_EXPORT_DEF( FT_UInt )
   FT_Get_Char_Index( FT_Face   face,
                      FT_ULong  charcode )
   {
-    FT_UInt    result;
-    FT_Driver  driver;
+    FT_UInt  result = 0;
 
 
-    result = 0;
     if ( face && face->charmap )
     {
-#ifdef FT_CONFIG_OPTION_USE_CMAPS
       FT_CMap  cmap = FT_CMAP( face->charmap );
-
+      
       result = cmap->clazz->char_index( cmap, charcode );
+    }
+    return  result;
+  }
+
 #else /* !FT_CONFIG_OPTION_USE_CMAPS */
+
+
+
+  FT_EXPORT_DEF( FT_UInt )
+  FT_Get_Char_Index( FT_Face   face,
+                     FT_ULong  charcode )
+  {
+    FT_UInt    result = 0;
+    FT_Driver  driver;
+
+
+    if ( face && face->charmap )
+    {
       driver = face->driver;
       result = driver->clazz->get_char_index( face->charmap, charcode );
-#endif /* !FT_CONFIG_OPTION_USE_CMAPS */
     }
     return result;
   }
 
+#endif /* !FT_CONFIG_OPTION_USE_CMAPS */
+
+
   /* documentation is in freetype.h */
 
   FT_EXPORT_DEF( FT_ULong )
@@ -1490,6 +1539,9 @@
 
   /* documentation is in freetype.h */
 
+
+#ifdef FT_CONFIG_OPTION_USE_CMAPS
+
   FT_EXPORT_DEF( FT_ULong )
   FT_Get_Next_Char( FT_Face   face,
                     FT_ULong  charcode,
@@ -1497,17 +1549,37 @@
   {
     FT_ULong   result = 0;
     FT_UInt    gindex = 0;
-    FT_Driver  driver;
 
 
     if ( face && face->charmap )
     {
-#ifdef FT_CONFIG_OPTION_USE_CMAPS
-      FT_CMap  cmap = FT_CMAP( face->charmap );
+      FT_UInt32  code = (FT_UInt32)charcode;
+      FT_CMap    cmap = FT_CMAP( face->charmap );
 
-      gindex = cmap->clazz->char_next( cmap, &charcode );
-      result = ( gindex == 0 ) ? 0 : charcode;
+      gindex = cmap->clazz->char_next( cmap, &code );
+      result = ( gindex == 0 ) ? 0 : code;
+    }
+
+    if ( agindex )
+      *agindex = gindex;
+
+    return result;
+  }
+
 #else /* !FT_CONFIG_OPTION_USE_CMAPS */
+
+  FT_EXPORT_DEF( FT_ULong )
+  FT_Get_Next_Char( FT_Face   face,
+                    FT_ULong  charcode,
+                    FT_UInt  *agindex )
+  {
+    FT_ULong   result = 0;
+    FT_UInt    gindex = 0;
+    FT_Driver  driver;
+
+
+    if ( face && face->charmap )
+    {
       driver = face->driver;
       result = driver->clazz->get_next_char( face->charmap, charcode );
       if ( result != 0 )
@@ -1516,7 +1588,6 @@
         if ( gindex == 0 )
           result = 0;
       }
-#endif /* !FT_CONFIG_OPTION_USE_CMAPS */
     }
 
     if ( agindex )
@@ -1524,6 +1595,8 @@
 
     return result;
   }
+
+#endif /* !FT_CONFIG_OPTION_USE_CMAPS */
 
 
   /* documentation is in freetype.h */
--- a/src/cff/cffobjs.c
+++ b/src/cff/cffobjs.c
@@ -249,56 +249,6 @@
 
 
 
-
-  static FT_Encoding
-  find_encoding( int  platform_id,
-                 int  encoding_id )
-  {
-    typedef struct  TEncoding
-    {
-      int          platform_id;
-      int          encoding_id;
-      FT_Encoding  encoding;
-
-    } TEncoding;
-
-    static
-    const TEncoding  tt_encodings[] =
-    {
-      { TT_PLATFORM_ISO,           -1,                  ft_encoding_unicode },
-
-      { TT_PLATFORM_APPLE_UNICODE, -1,                  ft_encoding_unicode },
-
-      { TT_PLATFORM_MACINTOSH,     TT_MAC_ID_ROMAN,     ft_encoding_apple_roman },
-
-      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_UNICODE_CS, ft_encoding_unicode },
-      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_SJIS,       ft_encoding_sjis },
-      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_GB2312,     ft_encoding_gb2312 },
-      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_BIG_5,      ft_encoding_big5 },
-      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_WANSUNG,    ft_encoding_wansung },
-      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_JOHAB,      ft_encoding_johab }
-    };
-
-    const TEncoding  *cur, *limit;
-
-
-    cur   = tt_encodings;
-    limit = cur + sizeof ( tt_encodings ) / sizeof ( tt_encodings[0] );
-
-    for ( ; cur < limit; cur++ )
-    {
-      if ( cur->platform_id == platform_id )
-      {
-        if ( cur->encoding_id == encoding_id ||
-             cur->encoding_id == -1          )
-          return cur->encoding;
-      }
-    }
-
-    return ft_encoding_none;
-  }
-
-
   FT_LOCAL_DEF( FT_Error )
   CFF_Face_Init( FT_Stream      stream,
                  CFF_Face       face,
@@ -498,48 +448,8 @@
           flags |= FT_STYLE_FLAG_BOLD;
 
         root->style_flags = flags;
-
-        /* set the charmaps if any */
-        if ( sfnt_format )
-        {
-          /*****************************************************************/
-          /*                                                               */
-          /* Polish the charmaps.                                          */
-          /*                                                               */
-          /*   Try to set the charmap encoding according to the platform & */
-          /*   encoding ID of each charmap.                                */
-          /*                                                               */
-          TT_CharMap  charmap;
-          FT_Int      n;
-
-
-          charmap            = face->charmaps;
-          root->num_charmaps = face->num_charmaps;
-
-          /* allocate table of pointers */
-          if ( FT_NEW_ARRAY( root->charmaps, root->num_charmaps ) )
-            goto Exit;
-
-          for ( n = 0; n < root->num_charmaps; n++, charmap++ )
-          {
-            FT_Int  platform = charmap->cmap.platformID;
-            FT_Int  encoding = charmap->cmap.platformEncodingID;
-
-
-            charmap->root.face        = (FT_Face)face;
-            charmap->root.platform_id = (FT_UShort)platform;
-            charmap->root.encoding_id = (FT_UShort)encoding;
-            charmap->root.encoding    = find_encoding( platform, encoding );
-
-            /* now, set root->charmap with a unicode charmap */
-            /* wherever available                            */
-            if ( !root->charmap                                &&
-                 charmap->root.encoding == ft_encoding_unicode )
-              root->charmap = (FT_CharMap)charmap;
-
-            root->charmaps[n] = (FT_CharMap)charmap;
-          }
-        }
+        
+        /* XXX: no charmaps for pure CFF fonts for now !! */
       }
     }
 
--- a/src/pcf/pcfdriver.c
+++ b/src/pcf/pcfdriver.c
@@ -72,10 +72,10 @@
                  
 
   FT_CALLBACK_DEF( FT_UInt )
-  pcf_cmap_char_index( FT_CMap    cmap,
+  pcf_cmap_char_index( PCF_CMap   cmap,
                        FT_UInt32  charcode )
   {
-    PCF_Encoding  encoding = cmap->encodings;
+    PCF_Encoding  encodings = cmap->encodings;
     FT_UInt       min, max, mid;
     FT_UInt       result = 0;
     
@@ -140,7 +140,7 @@
     if ( ++min < cmap->num_encodings )
     {
       charcode = encodings[min].enc;
-      glyph    = encodings[min].glyph;
+      result   = encodings[min].glyph;
     }
     
   Exit:
--- a/src/sfnt/sfobjs.c
+++ b/src/sfnt/sfobjs.c
@@ -19,6 +19,7 @@
 #include <ft2build.h>
 #include "sfobjs.h"
 #include "ttload.h"
+#include "ttcmap0.h"
 #include FT_INTERNAL_SFNT_H
 #include FT_INTERNAL_POSTSCRIPT_NAMES_H
 #include FT_TRUETYPE_IDS_H
@@ -384,7 +385,6 @@
     {
       FT_Face     root = &face->root;
       FT_Int      flags = 0;
-      TT_CharMap  charmap;
       FT_Int      n;
       FT_Memory   memory;
 
@@ -456,12 +456,12 @@
       /*                                                                   */
 #ifdef FT_CONFIG_OPTION_USE_CMAPS
 
-      error = TT_Build_CMaps( face );
-      if (error) goto Exit;
+      TT_Build_CMaps( face );  /* ignore errors */
       
+      
       /* set the encoding fields */
       {
-        FT_UInt  n;
+        FT_Int  n;
         
         for ( n = 0; n < root->num_charmaps; n++ )
         {
@@ -480,32 +480,36 @@
       }
 
 #else /* !FT_CONFIG_OPTION_USE_CMAPS */
-
-      charmap            = face->charmaps;
-      root->num_charmaps = face->num_charmaps;
-
-      /* allocate table of pointers */
-      if ( FT_NEW_ARRAY( root->charmaps, root->num_charmaps ) )
-        goto Exit;
-
-      for ( n = 0; n < root->num_charmaps; n++, charmap++ )
+      
       {
-        FT_Int  platform = charmap->cmap.platformID;
-        FT_Int  encoding = charmap->cmap.platformEncodingID;
-
-
-        charmap->root.face        = (FT_Face)face;
-        charmap->root.platform_id = (FT_UShort)platform;
-        charmap->root.encoding_id = (FT_UShort)encoding;
-        charmap->root.encoding    = sfnt_find_encoding( platform, encoding );
-
-        /* now, set root->charmap with a unicode charmap */
-        /* wherever available                            */
-        if ( !root->charmap                                &&
-             charmap->root.encoding == ft_encoding_unicode )
-          root->charmap = (FT_CharMap)charmap;
-
-        root->charmaps[n] = (FT_CharMap)charmap;
+        TT_CharMap  charmap = face->charmaps;
+        
+        charmap            = face->charmaps;
+        root->num_charmaps = face->num_charmaps;
+  
+        /* allocate table of pointers */
+        if ( FT_NEW_ARRAY( root->charmaps, root->num_charmaps ) )
+          goto Exit;
+  
+        for ( n = 0; n < root->num_charmaps; n++, charmap++ )
+        {
+          FT_Int  platform = charmap->cmap.platformID;
+          FT_Int  encoding = charmap->cmap.platformEncodingID;
+  
+  
+          charmap->root.face        = (FT_Face)face;
+          charmap->root.platform_id = (FT_UShort)platform;
+          charmap->root.encoding_id = (FT_UShort)encoding;
+          charmap->root.encoding    = sfnt_find_encoding( platform, encoding );
+  
+          /* now, set root->charmap with a unicode charmap */
+          /* wherever available                            */
+          if ( !root->charmap                                &&
+               charmap->root.encoding == ft_encoding_unicode )
+            root->charmap = (FT_CharMap)charmap;
+  
+          root->charmaps[n] = (FT_CharMap)charmap;
+        }
       }
 
 #endif /* !FT_CONFIG_OPTION_USE_CMAPS */
--- a/src/sfnt/ttcmap0.c
+++ b/src/sfnt/ttcmap0.c
@@ -1549,15 +1549,12 @@
   FT_LOCAL_DEF( FT_Error )
   TT_Build_CMaps( TT_Face   face )
   {
-    TT_CMap_Class    clazz;
-    FT_ValidatorRec  valid;
     FT_UInt          num_cmaps;
     FT_Byte*         table = face->cmap_table;
     FT_Byte*         limit = table + face->cmap_size;
     FT_Byte*         p     = table;
-    FT_UInt          format;
 
-    if ( p + 4 < limit )
+    if ( p + 4 > limit )
       return FT_Err_Invalid_Table;
 
     /* only recognize format 0 */
@@ -1582,10 +1579,10 @@
 
       if ( offset && table + offset + 2 < limit )
       {
-        FT_Byte*         cmap   = table + offset;
-        FT_UInt          format = TT_PEEK_USHORT(cmap);
-        TT_CMap_Class*   pclazz = tt_cmap_classes;
-        TT_CMap_Class    clazz;
+        FT_Byte*              cmap   = table + offset;
+        FT_UInt               format = TT_PEEK_USHORT(cmap);
+        const TT_CMap_Class*  pclazz = tt_cmap_classes;
+        TT_CMap_Class         clazz;
 
         for ( ; *pclazz; pclazz++ )
         {
@@ -1592,19 +1589,21 @@
           clazz = *pclazz;
           if ( clazz->format == format )
           {
-            volatile TT_Validator  valid;
-
+            volatile TT_ValidatorRec  valid;
+            
+            ft_validator_init( FT_VALIDATOR(&valid), cmap, limit,
+                               FT_VALIDATE_DEFAULT );
+                               
             valid.num_glyphs = face->root.num_glyphs;
 
-            if ( ft_validator_init( FT_VALIDATOR(&valid), cmap, limit,
-                                    FT_VALIDATE_LEVEL_DEFAULT ) == 0 )
+            if ( setjmp( FT_VALIDATOR(&valid)->jump_buffer ) == 0 )
             {
               /* validate this cmap sub-table */
               clazz->validate( cmap, FT_VALIDATOR(&valid) );
             }
 
-            if ( valid.error == 0 )
-              (void)FT_CMap_New( clazz, cmap, face, NULL );
+            if ( valid.validator.error == 0 )
+              (void)FT_CMap_New( (FT_CMap_Class)clazz, cmap, &charmap, NULL );
             else
               FT_ERROR(( "%s: broken cmap sub-table ignored !!\n",
                          "TT_Build_CMaps" ));
--- a/src/sfnt/ttcmap0.h
+++ b/src/sfnt/ttcmap0.h
@@ -49,8 +49,8 @@
 
   typedef struct TT_ValidatorRec_
   {
-    FT_Validator   validator;
-    FT_UInt        num_glyphs;
+    FT_ValidatorRec  validator;
+    FT_UInt          num_glyphs;
     
   } TT_ValidatorRec, *TT_Validator;
 
--- a/src/sfnt/ttload.c
+++ b/src/sfnt/ttload.c
@@ -1128,9 +1128,6 @@
                 FT_Stream  stream )
   {
     FT_Error       error;
-    FT_Memory      memory = stream->memory;
-    FT_Long        table_start;
-    TT_CMapDirRec  cmap_dir;
 
     error = face->goto_table( face, TTAG_cmap, stream, &face->cmap_size );
     if ( error )
--- a/src/type1/t1objs.c
+++ b/src/type1/t1objs.c
@@ -436,7 +436,7 @@
       if ( psnames && psaux )
       {
         FT_CharMapRec    charmap;
-        FT_CMap_Classes  cmap_classes = psaux->cmap_classes;
+        T1_CMap_Classes  cmap_classes = psaux->t1_cmap_classes;
         FT_CMap_Class    clazz;
         
         charmap.face = root;
@@ -446,7 +446,7 @@
         charmap.encoding_id = 1;
         charmap.encoding    = ft_encoding_unicode;
         
-        FT_CMap_New( root, cmap_classes->unicode, &charmap, NULL );
+        FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL );
         
         /* now, generate an Adobe Standard encoding when appropriate */
         charmap.platform_id = 7;
@@ -473,9 +473,9 @@
             break;
             
           case T1_ENCODING_TYPE_ISOLATIN1:
-            charmap.encoding    = ft_encoding_adobe_latin_1;
+            charmap.encoding    = ft_encoding_latin_1;
             charmap.encoding_id = 3;
-            clazz               = cmap_classes->latin_1;
+            clazz               = cmap_classes->unicode;
             break;
             
           default:
@@ -483,7 +483,7 @@
         }
         
         if ( clazz )
-          FT_CMap_New( root, clazz, &charmap, NULL );
+          FT_CMap_New( clazz, NULL, &charmap, NULL );
       }
     }
 
--- a/src/winfonts/winfnt.c
+++ b/src/winfonts/winfnt.c
@@ -323,7 +323,7 @@
 
 
   static FT_Error
-  fnt_cmap_init( FT_CMap  cmap )
+  fnt_cmap_init( FNT_CMap  cmap )
   {
     FNT_Face  face = (FNT_Face) FT_CMAP_FACE(cmap);
     FNT_Font  font = face->fonts;
@@ -336,7 +336,7 @@
 
 
   static FT_UInt
-  fnt_cmap_char_index( FT_CMap    cmap,
+  fnt_cmap_char_index( FNT_CMap   cmap,
                        FT_UInt32  char_code )
   {
     FT_UInt  gindex = 0;
@@ -350,7 +350,7 @@
 
 
   static FT_UInt
-  fnt_cmap_char_next( FT_CMap    cmap,
+  fnt_cmap_char_next( FNT_CMap   cmap,
                       FT_UInt32 *pchar_code )
   {
     FT_UInt    gindex = 0;
@@ -734,20 +734,29 @@
     (FT_Face_DoneFunc)     FNT_Face_Done,
     (FT_Size_InitFunc)     0,
     (FT_Size_DoneFunc)     0,
-    (FT_Slot_InitFunc)0,
-    (FT_Slot_DoneFunc)0,
+    (FT_Slot_InitFunc)     0,
+    (FT_Slot_DoneFunc)     0,
 
     (FT_Size_ResetPointsFunc) FNT_Size_Set_Pixels,
     (FT_Size_ResetPixelsFunc)FNT_Size_Set_Pixels,
-
     (FT_Slot_LoadFunc)    FNT_Load_Glyph,
+
+#ifdef FT_CONFIG_OPTION_USE_CMAPS
+    (FT_CharMap_CharIndexFunc) 0,
+#else
     (FT_CharMap_CharIndexFunc) FNT_Get_Char_Index,
+#endif
+    
 
     (FT_Face_GetKerningFunc)   0,
     (FT_Face_AttachFunc)   0,
     (FT_Face_GetAdvancesFunc)  0,
 
+#ifdef FT_CONFIG_OPTION_USE_CMAPS
+    (FT_CharMap_CharNextFunc)  0
+#else
     (FT_CharMap_CharNextFunc)  FNT_Get_Next_Char
+#endif    
   };