shithub: freetype+ttf2subf

Download patch

ref: bc82f1bbefa90c649a9ad2c28938d55b4acbf380
parent: 041889e763fa84eee20f15ef850fccc790294b67
author: David Turner <[email protected]>
date: Thu Feb 28 21:26:22 EST 2002

* include/freetype/ftconfig.h: changed FT_LOCAL xxxx to FT_LOCAL( xxxx )
        everywhere in the source. Sames goes for FT_LOCAL_DEF xxxx translated
        into FT_LOCAL_DEF( xxxxx )

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,24 +1,28 @@
 2002-02-28  David Turner   <[email protected]>
 
+        * include/freetype/ftconfig.h: changed FT_LOCAL xxxx to FT_LOCAL( xxxx )
+        everywhere in the source. Sames goes for FT_LOCAL_DEF xxxx translated
+        into FT_LOCAL_DEF( xxxxx )
+
         * include/freetype/freetype.h: changing version to 2.1.0 to indicate
         an unstable branch. Added the declarations of FT_Get_First_Char and
         FT_Get_Next_Char
-        
+
         * src/base/ftobjs.c: implemented FT_Get_First_Char and FT_Get_Next_Char
 
         * include/freetype/t1tables.h: re-naming structure types. This done
         basically:
-        
+
           typedef T1_Struct_
           {
           } T1_Struct;
-          
+
         becomes:
-        
+
           typedef PS_StructRec_
           {
           } PS_StructRec, *PS_Struct;
-          
+
           typedef PS_StructRec  T1_Struct;  /* backwards-compatibility */
 
 
--- a/include/freetype/config/ftconfig.h
+++ b/include/freetype/config/ftconfig.h
@@ -205,17 +205,17 @@
 
 #ifdef FT_MAKE_OPTION_SINGLE_OBJECT
 
-#define FT_LOCAL      static
-#define FT_LOCAL_DEF  static
+#define FT_LOCAL(x)      static  x
+#define FT_LOCAL_DEF(x)  static  x
 
 #else
 
 #ifdef __cplusplus
-#define FT_LOCAL      extern "C"
-#define FT_LOCAL_DEF  extern "C"
+#define FT_LOCAL(x)      extern "C" x
+#define FT_LOCAL_DEF(x)  extern "C" x
 #else
-#define FT_LOCAL      extern
-#define FT_LOCAL_DEF  extern
+#define FT_LOCAL(x)      extern x
+#define FT_LOCAL_DEF(x)  extern x
 #endif
 
 #endif /* FT_MAKE_OPTION_SINGLE_OBJECT */
--- a/include/freetype/config/ftoption.h
+++ b/include/freetype/config/ftoption.h
@@ -76,6 +76,15 @@
   /*************************************************************************/
 
 
+#undef  FT_CONFIG_OPTION_USE_CMAPS
+#define TT_CONFIG_CMAP_FORMAT_0
+#define TT_CONFIG_CMAP_FORMAT_2
+#define TT_CONFIG_CMAP_FORMAT_4
+#define TT_CONFIG_CMAP_FORMAT_6
+#define TT_CONFIG_CMAP_FORMAT_8
+#define TT_CONFIG_CMAP_FORMAT_10
+#define TT_CONFIG_CMAP_FORMAT_12
+
   /*************************************************************************/
   /*                                                                       */
   /* Convenience functions support                                         */
--- a/include/freetype/internal/ftmemory.h
+++ b/include/freetype/internal/ftmemory.h
@@ -218,16 +218,22 @@
 
 #define MEM_Free( _pointer_ )                                               \
           FT_Free_Debug( memory, (void**)&(_pointer_), __FILE__, __LINE__ )
-  
+
 #else  /* !FT_DEBUG_MEMORY */
 
 #define MEM_Alloc( _pointer_, _size_ )                     \
           FT_Alloc( memory, _size_, (void**)&(_pointer_) )
 
+#define MEM_New( _pointer_ )   MEM_Alloc( _pointer_, sizeof(*(_pointer_)) )
+
+
 #define MEM_Alloc_Array( _pointer_, _count_, _type_ )    \
           FT_Alloc( memory, (_count_)*sizeof ( _type_ ), \
                     (void**)&(_pointer_) )
 
+#define MEM_New_Array( _pointer_, _count_ )     \
+          MEM_Alloc_Array( _pointer_, _count_, sizeof(*(_pointer_)) )
+
 #define MEM_Realloc( _pointer_, _current_, _size_ )                     \
           FT_Realloc( memory, _current_, _size_, (void**)&(_pointer_) )
 
@@ -235,6 +241,9 @@
           FT_Realloc( memory, (_current_)*sizeof ( _type_ ),            \
                       (_new_)*sizeof ( _type_ ), (void**)&(_pointer_) )
 
+#define MEM_Renew_Array( _pointer_, _current_, _new_ )  \
+          MEM_Realloc_Array( _pointer_, _current_, _new_, *(_pointer_) )
+
 #define MEM_Free( _pointer_ )                     \
           FT_Free( memory, (void**)&(_pointer_) )
 
@@ -244,6 +253,9 @@
 #define ALLOC( _pointer_, _size_ )                       \
           FT_SET_ERROR( MEM_Alloc( _pointer_, _size_ ) )
 
+#define NEW( _pointer_ )  \
+          FT_SET_ERROR( MEM_New( _pointer_ ) )
+
 #define REALLOC( _pointer_, _current_, _size_ )                       \
           FT_SET_ERROR( MEM_Realloc( _pointer_, _current_, _size_ ) )
 
@@ -251,10 +263,16 @@
           FT_SET_ERROR( MEM_Alloc( _pointer_,                      \
                                    (_count_)*sizeof ( _type_ ) ) )
 
+#define NEW_ARRAY( _pointer_, _count_ )  \
+          FT_SET_ERROR( MEM_New_Array( _pointer_, _count_ ) )
+
 #define REALLOC_ARRAY( _pointer_, _current_, _count_, _type_ )       \
           FT_SET_ERROR( MEM_Realloc( _pointer_,                      \
                                      (_current_)*sizeof ( _type_ ),  \
                                      (_count_)*sizeof ( _type_ ) ) )
+
+#define RENEW_ARRAY( _pointer_, _current_, _new_ )   \
+          FT_SET_ERROR( MEM_Renew_Array( _pointer_, _current_, _new_ ) )
 
 #define FREE( _pointer_ )       \
           MEM_Free( _pointer_ )
--- a/include/freetype/internal/ftobjs.h
+++ b/include/freetype/internal/ftobjs.h
@@ -102,7 +102,7 @@
   *  FT_VALIDATE_TIGHT ::
   *    a table that passes this validation level can be used reliably and
   *    doesn't contain invalid data. For example, a charmap table that
-  *    returns invalid glyph indices will not pass, even though it can 
+  *    returns invalid glyph indices will not pass, even though it can
   *    be used with FreeType in default mode (the library will simply
   *    return an error later when trying to load the glyph)
   *
@@ -120,7 +120,7 @@
     FT_VALIDATE_DEFAULT = 0,
     FT_VALIDATE_TIGHT,
     FT_VALIDATE_PARANOID
-  
+
   } FT_ValidationLevel;
 
 
@@ -131,9 +131,9 @@
     FT_Byte*            limit;  /* 'base' + sizeof(table) in memory     */
     FT_ValidationLevel  level;  /* validation level                     */
     FT_Error            error;  /* error returned. 0 means success      */
-    
+
     jmp_buf             jump_buffer;  /* used for exception handling */
-    
+
   } FT_ValidatorRec;
 
 
@@ -183,7 +183,7 @@
 
  /* handle to internal charmap object */
   typedef struct FT_CMapRec_*              FT_CMap;
-  
+
  /* handle to charmap class structure */
   typedef const struct FT_CMap_ClassRec_*   FT_CMap_Class;
 
@@ -192,8 +192,7 @@
   {
     FT_CharMapRec  charmap;
     FT_CMap_Class  clazz;
-    FT_Pointer     data;
-    
+
   } FT_CMapRec;
 
  /* typecase any pointer to a charmap handle */
@@ -208,15 +207,16 @@
 
  /* class method definitions */
   typedef FT_Error  (*FT_CMap_InitFunc)( FT_CMap     cmap,
-                                         FT_Pointer  data );
+                                         FT_Pointer  init_data );
 
   typedef void      (*FT_CMap_DoneFunc)( FT_CMap     cmap );
 
-  typedef FT_UInt   (*FT_CMap_CharIndexFunc)( FT_Pointer   cmap_data,
-                                              FT_ULong     char_code );
+  typedef FT_UInt   (*FT_CMap_CharIndexFunc)( FT_CMap      cmap,
+                                              FT_UInt32    char_code );
 
-  typedef FT_UInt   (*FT_CMap_CharNextFunc)( FT_Pointer  cmap_data,
-                                             FT_ULong   *achar_code );
+  typedef FT_UInt32 (*FT_CMap_CharNextFunc)( FT_CMap     cmap,
+                                             FT_UInt32   char_code,
+                                             FT_UInt    *agindex );
 
   typedef struct FT_CMap_ClassRec_
   {
@@ -225,7 +225,7 @@
     FT_CMap_DoneFunc       done;
     FT_CMap_CharIndexFunc  char_index;
     FT_CMap_CharNextFunc   char_next;
-  
+
   } FT_CMap_ClassRec;
 
 
@@ -232,7 +232,7 @@
  /* create a new charmap and add it to charmap->face */
   FT_BASE( FT_Error )
   FT_CMap_New( FT_CMap_Class  clazz,
-               FT_Pointer     data,
+               FT_Pointer     init_data,
                FT_CharMap     charmap,
                FT_CMap       *acmap );
 
--- a/include/freetype/internal/tttypes.h
+++ b/include/freetype/internal/tttypes.h
@@ -1101,20 +1101,8 @@
   } TT_CharMapRec;
 
 
-  
-  typedef const struct TT_CMap_ClassRec_*   TT_CMap_Class;
 
-  typedef FT_Error  (*TT_CMap_ValidateFunc)( FT_Byte*      data,
-                                             FT_Validator  valid );
 
-  typedef struct TT_CMap_ClassRec_
-  {
-    FT_CMap_ClassRec      clazz;
-    TT_CMap_ValidateFunc  validate;
-  
-  } TT_CMap_ClassRec;                                             
-
-
   /*************************************************************************/
   /*************************************************************************/
   /*************************************************************************/
@@ -1485,8 +1473,17 @@
     TT_OS2             os2;          /* TrueType OS/2 table            */
     TT_Postscript      postscript;   /* TrueType Postscript table      */
 
+#ifdef FT_CONFIG_OPTION_USE_CMAPS
+
+    FT_Byte*           cmap_table;   /* extracted 'cmap' table */
+    FT_ULong           cmap_size;
+
+#else /* !FT_CONFIG_OPTION_USE_CMAPS */
+
     FT_Int             num_charmaps;
     TT_CharMap         charmaps;     /* array of TT_CharMapRec */
+
+#endif /* !FT_CONFIG_OPTION_USE_CMAPS */
 
     TT_Goto_Table_Func          goto_table;
 
--- a/src/autohint/ahangles.c
+++ b/src/autohint/ahangles.c
@@ -64,7 +64,7 @@
   };
 
 
-  FT_LOCAL_DEF AH_Angle
+  FT_LOCAL_DEF( AH_Angle )
   ah_angle( FT_Vector*  v )
   {
     FT_Pos    dx, dy;
--- a/src/autohint/ahangles.h
+++ b/src/autohint/ahangles.h
@@ -47,7 +47,7 @@
   const AH_Angle  ah_arctan[1L << AH_ATAN_BITS];
 
 
-  FT_LOCAL AH_Angle
+  FT_LOCAL( AH_Angle )
   ah_angle( FT_Vector*  v );
 
 
--- a/src/autohint/ahglobal.c
+++ b/src/autohint/ahglobal.c
@@ -384,7 +384,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   ah_hinter_compute_globals( AH_Hinter*  hinter )
   {
     return ah_hinter_compute_widths( hinter ) ||
--- a/src/autohint/ahglobal.h
+++ b/src/autohint/ahglobal.h
@@ -37,8 +37,7 @@
 
 
   /* compute global metrics automatically */
-  FT_LOCAL
-  FT_Error  ah_hinter_compute_globals( AH_Hinter*  hinter );
+  FT_LOCAL( FT_Error )  ah_hinter_compute_globals( AH_Hinter*  hinter );
 
 
 FT_END_HEADER
--- a/src/autohint/ahglyph.c
+++ b/src/autohint/ahglyph.c
@@ -299,7 +299,7 @@
   /* <Description>                                                         */
   /*    Creates a new and empty AH_Outline object.                         */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   ah_outline_new( FT_Memory     memory,
                   AH_Outline**  aoutline )
   {
@@ -325,7 +325,7 @@
   /* <Description>                                                         */
   /*    Destroys a given AH_Outline object.                                */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   ah_outline_done( AH_Outline*  outline )
   {
     FT_Memory memory = outline->memory;
@@ -349,7 +349,7 @@
   /*    Saves the content of a given AH_Outline object into a face's glyph */
   /*    slot.                                                              */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   ah_outline_save( AH_Outline*  outline,
                    AH_Loader    gloader )
   {
@@ -384,7 +384,7 @@
   /*    Loads an unscaled outline from a glyph slot into an AH_Outline     */
   /*    object.                                                            */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   ah_outline_load( AH_Outline*  outline,
                    FT_Face      face )
   {
@@ -622,7 +622,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   ah_setup_uv( AH_Outline*  outline,
                AH_UV        source )
   {
@@ -676,7 +676,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   ah_outline_compute_segments( AH_Outline*  outline )
   {
     int           dimension;
@@ -918,7 +918,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   ah_outline_link_segments( AH_Outline*  outline )
   {
     AH_Segment*  segments;
@@ -1286,7 +1286,7 @@
   /* <Description>                                                         */
   /*    Performs feature detection on a given AH_Outline object.           */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   ah_outline_detect_features( AH_Outline*  outline )
   {
     ah_outline_compute_segments( outline );
@@ -1304,7 +1304,7 @@
   /*    Computes the `blue edges' in a given outline (i.e. those that must */
   /*    be snapped to a blue zone edge (top or bottom).                    */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   ah_outline_compute_blue_edges( AH_Outline*       outline,
                                  AH_Face_Globals*  face_globals )
   {
@@ -1438,7 +1438,7 @@
   /*    the contents of the detected edges (basically change the `blue     */
   /*    edge' pointer from `design units' to `scaled ones').               */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   ah_outline_scale_blue_edges( AH_Outline*       outline,
                                AH_Face_Globals*  globals )
   {
--- a/src/autohint/ahglyph.h
+++ b/src/autohint/ahglyph.h
@@ -45,7 +45,7 @@
   } AH_UV;
 
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   ah_setup_uv( AH_Outline*  outline,
                AH_UV        source );
 
@@ -52,36 +52,36 @@
 
   /* AH_Outline functions - they should be typically called in this order */
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   ah_outline_new( FT_Memory     memory,
                   AH_Outline**  aoutline );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   ah_outline_load( AH_Outline*  outline,
                    FT_Face      face );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   ah_outline_compute_segments( AH_Outline*  outline );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   ah_outline_link_segments( AH_Outline*  outline );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   ah_outline_detect_features( AH_Outline*  outline );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   ah_outline_compute_blue_edges( AH_Outline*       outline,
                                  AH_Face_Globals*  globals );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   ah_outline_scale_blue_edges( AH_Outline*       outline,
                                AH_Face_Globals*  globals );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   ah_outline_save( AH_Outline*  outline,
                    AH_Loader    loader );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   ah_outline_done( AH_Outline*  outline );
 
 
--- a/src/autohint/ahhint.c
+++ b/src/autohint/ahhint.c
@@ -378,7 +378,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   ah_hinter_hint_edges( AH_Hinter*  hinter,
                         FT_Bool     no_horz_edges,
                         FT_Bool     no_vert_edges )
@@ -807,7 +807,7 @@
 #endif /* !AH_OPTION_NO_WEAK_INTERPOLATION */
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   ah_hinter_align_points( AH_Hinter*  hinter )
   {
     ah_hinter_align_edge_points( hinter );
@@ -896,7 +896,7 @@
 
 
   /* finalize a hinter object */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   ah_hinter_done( AH_Hinter*  hinter )
   {
     if ( hinter )
@@ -919,7 +919,7 @@
 
 
   /* create a new empty hinter object */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   ah_hinter_new( FT_Library   library,
                  AH_Hinter**  ahinter )
   {
@@ -955,7 +955,7 @@
 
 
   /* create a face's autohint globals */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   ah_hinter_new_face_globals( AH_Hinter*   hinter,
                               FT_Face      face,
                               AH_Globals*  globals )
@@ -987,7 +987,7 @@
 
 
   /* discard a face's autohint globals */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   ah_hinter_done_face_globals( AH_Face_Globals*  globals )
   {
     FT_Face    face   = globals->face;
@@ -1327,7 +1327,7 @@
 
 
   /* load and hint a given glyph */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   ah_hinter_load_glyph( AH_Hinter*    hinter,
                         FT_GlyphSlot  slot,
                         FT_Size       size,
@@ -1381,7 +1381,7 @@
 
 
   /* retrieve a face's autohint globals for client applications */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   ah_hinter_get_global_hints( AH_Hinter*  hinter,
                               FT_Face     face,
                               void**      global_hints,
@@ -1418,7 +1418,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   ah_hinter_done_global_hints( AH_Hinter*  hinter,
                                void*       global_hints )
   {
--- a/src/autohint/ahhint.h
+++ b/src/autohint/ahhint.h
@@ -37,12 +37,12 @@
 
 
   /* create a new empty hinter object */
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   ah_hinter_new( FT_Library   library,
                  AH_Hinter**  ahinter );
 
   /* Load a hinted glyph in the hinter */
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   ah_hinter_load_glyph( AH_Hinter*    hinter,
                         FT_GlyphSlot  slot,
                         FT_Size       size,
@@ -50,19 +50,19 @@
                         FT_Int        load_flags );
 
   /* finalize a hinter object */
-  FT_LOCAL void
+  FT_LOCAL( void )
   ah_hinter_done( AH_Hinter*  hinter );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   ah_hinter_done_face_globals( AH_Face_Globals*  globals );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   ah_hinter_get_global_hints( AH_Hinter*  hinter,
                               FT_Face     face,
                               void**      global_hints,
                               long*       global_len );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   ah_hinter_done_global_hints( AH_Hinter*  hinter,
                                void*       global_hints );
 
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -1382,9 +1382,9 @@
       FT_CMap_Class  clazz  = cmap->clazz;
       FT_Face        face   = cmap->charmap.face;
       FT_Memory      memory = FT_FACE_MEMORY(face);
-      
+
       if ( clazz->done )
-        clazz->done( cmap->data );
+        clazz->done( cmap );
 
       FREE( cmap );
     }
@@ -1393,15 +1393,15 @@
 
   FT_BASE_DEF( FT_Error )
   FT_CMap_New( FT_CMap_Class   clazz,
-               FT_Pointer      data,
+               FT_Pointer      init_data,
                FT_CharMap      charmap,
                FT_CMap        *acmap )
-  { 
+  {
     FT_Error   error = 0;
     FT_Face    face;
     FT_Memory  memory;
     FT_CMap    cmap;
-    
+
     if ( clazz == NULL || charmap == NULL || charmap->face == NULL )
       return FT_Err_Invalid_Argument;
 
@@ -1412,15 +1412,14 @@
     {
       cmap->charmap = *charmap;
       cmap->clazz   = clazz;
-      cmap->data    = data;
-      
+
       if ( clazz->init )
       {
-        error = clazz->init( cmap, data );
+        error = clazz->init( cmap, init_data );
         if (error)
           goto Fail;
       }
-      
+
       /* add it to our list of charmaps */
       if ( REALLOC_ARRAY( face->charmaps,
                           face->num_charmaps,
@@ -1427,21 +1426,21 @@
                           face->num_charmaps+1,
                           FT_CharMap* ) )
         goto Fail;
-      
+
       face->charmaps[ face->num_charmaps++ ] = (FT_CharMap) cmap;
     }
-    
+
   Exit:
     if ( acmap )
       *acmap = cmap;
 
     return error;
-  
+
   Fail:
     FT_CMap_Done( cmap );
     cmap = NULL;
     goto Exit;
-  }               
+  }
 
 
   /* documentation is in freetype.h */
@@ -1457,8 +1456,14 @@
     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 );
+#else /* !FT_CONFIG_OPTION_USE_CMAPS */
       driver = face->driver;
       result = driver->clazz->get_char_index( face->charmap, charcode );
+#endif /* !FT_CONFIG_OPTION_USE_CMAPS */
     }
     return result;
   }
@@ -1471,7 +1476,7 @@
   {
     FT_ULong   result = 0;
     FT_UInt    gindex = 0;
-    
+
     if ( face && face->charmap )
     {
       gindex = FT_Get_Char_Index( face, 0 );
@@ -1478,10 +1483,10 @@
       if ( gindex == 0 )
         result = FT_Get_Next_Char( face, 0, &gindex );
     }
-    
+
     if ( agindex  )
       *agindex = gindex;
-      
+
     return result;
   }
 
@@ -1499,6 +1504,13 @@
 
     if ( face && face->charmap )
     {
+#ifdef FT_CONFIG_OPTION_USE_CMAPS
+      FT_CMap  cmap = FT_CMAP( face->charmap );
+
+      result = cmap->clazz->char_next( cmap, charcode, &gindex );
+      if ( gindex == 0 )
+        result = 0;
+#else /* !FT_CONFIG_OPTION_USE_CMAPS */
       driver = face->driver;
       result = driver->clazz->get_next_char( face->charmap, charcode );
       if ( result != 0 )
@@ -1507,11 +1519,12 @@
         if ( gindex == 0 )
           result = 0;
       }
+#endif /* !FT_CONFIG_OPTION_USE_CMAPS */
     }
-    
+
     if ( agindex )
       *agindex = gindex;
-      
+
     return result;
   }
 
--- a/src/cff/cffgload.c
+++ b/src/cff/cffgload.c
@@ -345,7 +345,7 @@
   /*                                                                       */
   /*    slot    :: The current glyph object.                               */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   CFF_Init_Decoder( CFF_Decoder*   decoder,
                     TT_Face        face,
                     CFF_Size       size,
@@ -369,7 +369,7 @@
 
 
   /* this function is used to select the locals subrs array */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   CFF_Prepare_Decoder( CFF_Decoder*  decoder,
                        FT_UInt       glyph_index )
   {
@@ -699,7 +699,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   CFF_Parse_CharStrings( CFF_Decoder*  decoder,
                          FT_Byte*      charstring_base,
                          FT_Int        charstring_len )
@@ -2108,7 +2108,7 @@
 #if 0 /* unused until we support pure CFF fonts */
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   CFF_Compute_Max_Advance( TT_Face  face,
                            FT_Int*  max_advance )
   {
@@ -2175,7 +2175,7 @@
   /*************************************************************************/
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   CFF_Load_Glyph( CFF_GlyphSlot  glyph,
                   CFF_Size       size,
                   FT_Int         glyph_index,
--- a/src/cff/cffgload.h
+++ b/src/cff/cffgload.h
@@ -167,7 +167,7 @@
   } CFF_Decoder;
 
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   CFF_Init_Decoder( CFF_Decoder*   decoder,
                     TT_Face        face,
                     CFF_Size       size,
@@ -174,7 +174,7 @@
                     CFF_GlyphSlot  slot,
                     FT_Bool        hinting );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   CFF_Prepare_Decoder( CFF_Decoder*  decoder,
                        FT_UInt       glyph_index );
 
@@ -181,18 +181,18 @@
 #if 0  /* unused until we support pure CFF fonts */
 
   /* Compute the maximum advance width of a font through quick parsing */
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   CFF_Compute_Max_Advance( TT_Face  face,
                            FT_Int*  max_advance );
 
 #endif /* 0 */
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   CFF_Parse_CharStrings( CFF_Decoder*  decoder,
                          FT_Byte*      charstring_base,
                          FT_Int        charstring_len );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   CFF_Load_Glyph( CFF_GlyphSlot  glyph,
                   CFF_Size       size,
                   FT_Int         glyph_index,
--- a/src/cff/cffload.c
+++ b/src/cff/cffload.c
@@ -1046,7 +1046,7 @@
 #endif
 
 
-  FT_LOCAL_DEF FT_UShort
+  FT_LOCAL_DEF( FT_UShort )
   CFF_Get_Standard_Encoding( FT_UInt  charcode )
   {
     return  (FT_UShort)(charcode < 256 ? cff_standard_encoding[charcode] : 0);
@@ -1204,7 +1204,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   CFF_Access_Element( CFF_Index  index,
                       FT_UInt     element,
                       FT_Byte**   pbytes,
@@ -1269,7 +1269,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   CFF_Forget_Element( CFF_Index  index,
                       FT_Byte**   pbytes )
   {
@@ -1283,7 +1283,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_String*
+  FT_LOCAL_DEF( FT_String* )
   CFF_Get_Name( CFF_Index  index,
                 FT_UInt     element )
   {
@@ -1310,7 +1310,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_String*
+  FT_LOCAL_DEF( FT_String* )
   CFF_Get_String( CFF_Index          index,
                   FT_UInt             sid,
                   PSNames_Service  interface )
@@ -1413,7 +1413,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Byte
+  FT_LOCAL_DEF( FT_Byte )
   CFF_Get_FD( CFF_FD_Select*  select,
               FT_UInt         glyph_index )
   {
@@ -2056,7 +2056,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   CFF_Load_Font( FT_Stream  stream,
                  FT_Int     face_index,
                  CFF_Font*  font )
@@ -2239,7 +2239,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   CFF_Done_Font( CFF_Font*  font )
   {
     FT_Memory  memory = font->memory;
--- a/src/cff/cffload.h
+++ b/src/cff/cffload.h
@@ -27,41 +27,41 @@
 
 FT_BEGIN_HEADER
 
-  FT_LOCAL FT_UShort
+  FT_LOCAL( FT_UShort )
   CFF_Get_Standard_Encoding( FT_UInt  charcode );
 
 
-  FT_LOCAL FT_String*
+  FT_LOCAL( FT_String* )
   CFF_Get_Name( CFF_Index  index,
                 FT_UInt     element );
 
-  FT_LOCAL FT_String*
+  FT_LOCAL( FT_String* )
   CFF_Get_String( CFF_Index          index,
                   FT_UInt             sid,
                   PSNames_Service  interface );
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   CFF_Access_Element( CFF_Index  index,
                       FT_UInt     element,
                       FT_Byte**   pbytes,
                       FT_ULong*   pbyte_len );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   CFF_Forget_Element( CFF_Index  index,
                       FT_Byte**   pbytes );
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   CFF_Load_Font( FT_Stream  stream,
                  FT_Int     face_index,
                  CFF_Font*  font );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   CFF_Done_Font( CFF_Font*  font );
 
 
-  FT_LOCAL FT_Byte
+  FT_LOCAL( FT_Byte )
   CFF_Get_FD( CFF_FD_Select*  select,
               FT_UInt         glyph_index );
 
--- a/src/cff/cffobjs.c
+++ b/src/cff/cffobjs.c
@@ -73,7 +73,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   CFF_Size_Done( CFF_Size  size )
   {
     if ( size->internal )
@@ -90,7 +90,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   CFF_Size_Init( CFF_Size  size )
   {
     FT_Error           error = 0;
@@ -163,7 +163,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   CFF_Size_Reset( CFF_Size  size )
   {
     PSH_Globals_Funcs  funcs = CFF_Size_Get_Globals_Funcs( size );
@@ -185,7 +185,7 @@
   /*                                                                       */
   /*************************************************************************/
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   CFF_GlyphSlot_Done( CFF_GlyphSlot  slot )
   {
     slot->root.internal->glyph_hints = 0;
@@ -192,7 +192,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   CFF_GlyphSlot_Init( CFF_GlyphSlot  slot )
   {
     CFF_Face             face     = (CFF_Face)slot->root.face;
@@ -441,7 +441,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   CFF_Face_Init( FT_Stream      stream,
                  CFF_Face       face,
                  FT_Int         face_index,
@@ -700,7 +700,7 @@
   /* <Input>                                                               */
   /*    face :: A pointer to the face object to destroy.                   */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   CFF_Face_Done( CFF_Face  face )
   {
     FT_Memory        memory = face->root.memory;
@@ -737,7 +737,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   CFF_Driver_Init( CFF_Driver  driver )
   {
     /* init extension registry if needed */
@@ -767,7 +767,7 @@
   /* <Input>                                                               */
   /*    driver :: A handle to the target OpenType driver.                  */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   CFF_Driver_Done( CFF_Driver  driver )
   {
     /* destroy extensions registry if needed */
--- a/src/cff/cffobjs.h
+++ b/src/cff/cffobjs.h
@@ -109,19 +109,19 @@
   } CFF_DriverRec;
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   CFF_Size_Init( CFF_Size  size );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   CFF_Size_Done( CFF_Size  size );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   CFF_Size_Reset( CFF_Size  size );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   CFF_GlyphSlot_Done( CFF_GlyphSlot  slot );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   CFF_GlyphSlot_Init( CFF_GlyphSlot   slot );
 
   /*************************************************************************/
@@ -128,7 +128,7 @@
   /*                                                                       */
   /* Face functions                                                        */
   /*                                                                       */
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   CFF_Face_Init( FT_Stream      stream,
                  CFF_Face       face,
                  FT_Int         face_index,
@@ -135,7 +135,7 @@
                  FT_Int         num_params,
                  FT_Parameter*  params );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   CFF_Face_Done( CFF_Face  face );
 
 
@@ -143,10 +143,10 @@
   /*                                                                       */
   /* Driver functions                                                      */
   /*                                                                       */
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   CFF_Driver_Init( CFF_Driver  driver );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   CFF_Driver_Done( CFF_Driver  driver );
 
 
--- a/src/cff/cffparse.c
+++ b/src/cff/cffparse.c
@@ -63,7 +63,7 @@
   } CFF_Field_Handler;
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   CFF_Parser_Init( CFF_Parser*  parser,
                    FT_UInt      code,
                    void*        object )
@@ -479,7 +479,7 @@
   };
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   CFF_Parser_Run( CFF_Parser*  parser,
                   FT_Byte*     start,
                   FT_Byte*     limit )
--- a/src/cff/cffparse.h
+++ b/src/cff/cffparse.h
@@ -49,12 +49,12 @@
   } CFF_Parser;
 
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   CFF_Parser_Init( CFF_Parser*  parser,
                    FT_UInt      code,
                    void*        object );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   CFF_Parser_Run( CFF_Parser*  parser,
                   FT_Byte*     start,
                   FT_Byte*     limit );
--- a/src/cid/cidgload.c
+++ b/src/cid/cidgload.c
@@ -138,7 +138,7 @@
   /*************************************************************************/
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   CID_Compute_Max_Advance( CID_Face  face,
                            FT_Int*   max_advance )
   {
@@ -201,7 +201,7 @@
   /*************************************************************************/
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   CID_Load_Glyph( CID_GlyphSlot  glyph,
                   CID_Size       size,
                   FT_Int         glyph_index,
--- a/src/cid/cidgload.h
+++ b/src/cid/cidgload.h
@@ -30,13 +30,13 @@
 #if 0
 
   /* Compute the maximum advance width of a font through quick parsing */
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   CID_Compute_Max_Advance( CID_Face  face,
                            FT_Int*   max_advance );
 
 #endif /* 0 */
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   CID_Load_Glyph( CID_GlyphSlot  glyph,
                   CID_Size       size,
                   FT_Int         glyph_index,
--- a/src/cid/cidload.c
+++ b/src/cid/cidload.c
@@ -41,7 +41,7 @@
 
 
   /* read a single offset */
-  FT_LOCAL_DEF FT_Long
+  FT_LOCAL_DEF( FT_Long )
   cid_get_offset( FT_Byte**  start,
                   FT_Byte    offsize )
   {
@@ -60,7 +60,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   cid_decrypt( FT_Byte*   buffer,
                FT_Offset  length,
                FT_UShort  seed )
@@ -515,7 +515,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   CID_Open_Face( CID_Face  face )
   {
     CID_Loader  loader;
--- a/src/cid/cidload.h
+++ b/src/cid/cidload.h
@@ -36,16 +36,16 @@
   } CID_Loader;
 
 
-  FT_LOCAL FT_Long
+  FT_LOCAL( FT_Long )
   cid_get_offset( FT_Byte**  start,
                   FT_Byte    offsize );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   cid_decrypt( FT_Byte*   buffer,
                FT_Offset  length,
                FT_UShort  seed );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   CID_Open_Face( CID_Face  face );
 
 
--- a/src/cid/cidobjs.c
+++ b/src/cid/cidobjs.c
@@ -44,7 +44,7 @@
   /*                                                                       */
   /*************************************************************************/
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   CID_GlyphSlot_Done( CID_GlyphSlot  slot )
   {
     slot->root.internal->glyph_hints = 0;
@@ -51,7 +51,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   CID_GlyphSlot_Init( CID_GlyphSlot   slot )
   {
     CID_Face             face;
@@ -105,7 +105,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   CID_Size_Done( CID_Size  size )
   {
     if ( size->root.internal )
@@ -122,7 +122,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   CID_Size_Init( CID_Size  size )
   {
     FT_Error           error = 0;
@@ -146,7 +146,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   CID_Size_Reset( CID_Size  size )
   {
     PSH_Globals_Funcs  funcs = CID_Size_Get_Globals_Funcs( size );
@@ -182,7 +182,7 @@
   /* <Input>                                                               */
   /*    face :: A pointer to the face object to destroy.                   */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   CID_Face_Done( CID_Face  face )
   {
     FT_Memory  memory;
@@ -262,7 +262,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   CID_Face_Init( FT_Stream      stream,
                  CID_Face       face,
                  FT_Int         face_index,
@@ -511,7 +511,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   CID_Driver_Init( CID_Driver  driver )
   {
     FT_UNUSED( driver );
@@ -531,7 +531,7 @@
   /* <Input>                                                               */
   /*    driver :: A handle to the target CID driver.                       */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   CID_Driver_Done( CID_Driver  driver )
   {
     FT_UNUSED( driver );
--- a/src/cid/cidobjs.h
+++ b/src/cid/cidobjs.h
@@ -111,26 +111,26 @@
   } CID_GlyphSlotRec;
 
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   CID_GlyphSlot_Done( CID_GlyphSlot  slot );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   CID_GlyphSlot_Init( CID_GlyphSlot   slot );
 
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   CID_Size_Done( CID_Size  size );
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   CID_Size_Init( CID_Size  size );
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   CID_Size_Reset( CID_Size  size );
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   CID_Face_Init( FT_Stream      stream,
                  CID_Face       face,
                  FT_Int         face_index,
@@ -138,15 +138,15 @@
                  FT_Parameter*  params );
 
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   CID_Face_Done( CID_Face  face );
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   CID_Driver_Init( CID_Driver  driver );
 
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   CID_Driver_Done( CID_Driver  driver );
 
 
--- a/src/cid/cidparse.c
+++ b/src/cid/cidparse.c
@@ -50,7 +50,7 @@
   /*************************************************************************/
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   CID_New_Parser( CID_Parser*       parser,
                   FT_Stream         stream,
                   FT_Memory         memory,
@@ -139,7 +139,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   CID_Done_Parser( CID_Parser*  parser )
   {
     /* always free the private dictionary */
--- a/src/cid/cidparse.h
+++ b/src/cid/cidparse.h
@@ -71,13 +71,13 @@
   } CID_Parser;
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   CID_New_Parser( CID_Parser*       parser,
                   FT_Stream         stream,
                   FT_Memory         memory,
                   PSAux_Service  psaux );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   CID_Done_Parser( CID_Parser*  parser );
 
 
--- a/src/pcf/pcf.h
+++ b/src/pcf/pcf.h
@@ -221,7 +221,7 @@
 
 #define GLYPHPADOPTIONS  4 /* I'm not sure about this */
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   pcf_load_font( FT_Stream,
                  PCF_Face );
 
--- a/src/pcf/pcfread.c
+++ b/src/pcf/pcfread.c
@@ -855,7 +855,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   pcf_load_font( FT_Stream  stream,
                  PCF_Face   face )
   {
--- a/src/psaux/psobjs.c
+++ b/src/psaux/psobjs.c
@@ -53,7 +53,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   PS_Table_New( PS_Table  table,
                 FT_Int     count,
                 FT_Memory  memory )
@@ -149,7 +149,7 @@
   /*    FreeType error code.  0 means success.  An error is returned if a  */
   /*    reallocation fails.                                                */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   PS_Table_Add( PS_Table  table,
                 FT_Int     index,
                 void*      object,
@@ -209,7 +209,7 @@
   /*    This function does NOT release the heap's memory block.  It is up  */
   /*    to the caller to clean it, or reference it in its own structures.  */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   PS_Table_Done( PS_Table  table )
   {
     FT_Memory  memory = table->memory;
@@ -233,7 +233,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   PS_Table_Release( PS_Table  table )
   {
     FT_Memory  memory = table->memory;
@@ -264,7 +264,7 @@
 #define IS_T1_SPACE( c )  ( IS_T1_WHITESPACE( c ) || IS_T1_LINESPACE( c ) )
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   PS_Parser_SkipSpaces( PS_Parser  parser )
   {
     FT_Byte* cur   = parser->cursor;
@@ -284,7 +284,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   PS_Parser_SkipAlpha( PS_Parser  parser )
   {
     FT_Byte* cur   = parser->cursor;
@@ -304,7 +304,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   PS_Parser_ToToken( PS_Parser  parser,
               T1_Token   token )
   {
@@ -387,7 +387,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   PS_Parser_ToTokenArray( PS_Parser  parser,
                    T1_Token   tokens,
                    FT_UInt     max_tokens,
@@ -783,7 +783,7 @@
 
 
   /* Load a simple field (i.e. non-table) into the current list of objects */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   PS_Parser_LoadField( PS_Parser       parser,
                  const T1_Field  field,
                  void**           objects,
@@ -904,7 +904,7 @@
 #define T1_MAX_TABLE_ELEMENTS  32
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   PS_Parser_LoadFieldTable( PS_Parser       parser,
                        const T1_Field  field,
                        void**           objects,
@@ -968,7 +968,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Long
+  FT_LOCAL_DEF( FT_Long )
   PS_Parser_ToInt( PS_Parser  parser )
   {
     return t1_toint( &parser->cursor, parser->limit );
@@ -975,7 +975,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Fixed
+  FT_LOCAL_DEF( FT_Fixed )
   PS_Parser_ToFixed( PS_Parser  parser,
               FT_Int      power_ten )
   {
@@ -983,7 +983,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Int
+  FT_LOCAL_DEF( FT_Int )
   PS_Parser_ToCoordArray( PS_Parser  parser,
                    FT_Int      max_coords,
                    FT_Short*   coords )
@@ -993,7 +993,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Int
+  FT_LOCAL_DEF( FT_Int )
   PS_Parser_ToFixedArray( PS_Parser  parser,
                    FT_Int      max_values,
                    FT_Fixed*   values,
@@ -1006,7 +1006,7 @@
 
 #if 0
 
-  FT_LOCAL_DEF FT_String*
+  FT_LOCAL_DEF( FT_String* )
   T1_ToString( PS_Parser  parser )
   {
     return t1_tostring( &parser->cursor, parser->limit, parser->memory );
@@ -1013,7 +1013,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Bool
+  FT_LOCAL_DEF( FT_Bool )
   T1_ToBool( PS_Parser  parser )
   {
     return t1_tobool( &parser->cursor, parser->limit );
@@ -1022,7 +1022,7 @@
 #endif /* 0 */
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   PS_Parser_Init( PS_Parser  parser,
                   FT_Byte*    base,
                   FT_Byte*    limit,
@@ -1037,7 +1037,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   PS_Parser_Done( PS_Parser  parser )
   {
     FT_UNUSED( parser );
@@ -1070,7 +1070,7 @@
   /*                                                                       */
   /*    glyph   :: The current glyph object.                               */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   T1_Builder_Init( T1_Builder*   builder,
                    FT_Face       face,
                    FT_Size       size,
@@ -1132,7 +1132,7 @@
   /* <Input>                                                               */
   /*    builder :: A pointer to the glyph builder to finalize.             */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   T1_Builder_Done( T1_Builder*  builder )
   {
     FT_GlyphSlot  glyph = builder->glyph;
@@ -1144,7 +1144,7 @@
 
 
   /* check that there is enough room for `count' more points */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   T1_Builder_Check_Points( T1_Builder*  builder,
                            FT_Int       count )
   {
@@ -1153,7 +1153,7 @@
 
 
   /* add a new point, do not check space */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   T1_Builder_Add_Point( T1_Builder*  builder,
                         FT_Pos       x,
                         FT_Pos       y,
@@ -1184,7 +1184,7 @@
 
 
   /* check space for a new on-curve point, then add it */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   T1_Builder_Add_Point1( T1_Builder*  builder,
                          FT_Pos       x,
                          FT_Pos       y )
@@ -1201,7 +1201,7 @@
 
 
   /* check room for a new contour, then add it */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   T1_Builder_Add_Contour( T1_Builder*  builder )
   {
     FT_Outline*  outline = builder->current;
@@ -1229,7 +1229,7 @@
 
 
   /* if a path was begun, add its first on-curve point */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   T1_Builder_Start_Point( T1_Builder*  builder,
                           FT_Pos       x,
                           FT_Pos       y )
@@ -1250,7 +1250,7 @@
 
 
   /* close the current contour */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   T1_Builder_Close_Contour( T1_Builder*  builder )
   {
     FT_Outline*  outline = builder->current;
@@ -1293,7 +1293,7 @@
   /*************************************************************************/
   /*************************************************************************/
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   T1_Decrypt( FT_Byte*   buffer,
               FT_Offset  length,
               FT_UShort  seed )
--- a/src/psaux/psobjs.h
+++ b/src/psaux/psobjs.h
@@ -46,22 +46,22 @@
   const T1_Builder_Funcs    t1_builder_funcs;
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   PS_Table_New( PS_Table  table,
                 FT_Int     count,
                 FT_Memory  memory );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   PS_Table_Add( PS_Table  table,
                 FT_Int     index,
                 void*      object,
                 FT_Int     length );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   PS_Table_Done( PS_Table  table );
 
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   PS_Table_Release( PS_Table  table );
 
 
@@ -74,23 +74,23 @@
   /*************************************************************************/
 
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   PS_Parser_SkipSpaces( PS_Parser  parser );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   PS_Parser_SkipAlpha( PS_Parser  parser );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   PS_Parser_ToToken( PS_Parser  parser,
               T1_Token   token );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   PS_Parser_ToTokenArray( PS_Parser  parser,
                    T1_Token   tokens,
                    FT_UInt     max_tokens,
                    FT_Int*     pnum_tokens );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   PS_Parser_LoadField( PS_Parser       parser,
                  const T1_Field  field,
                  void**           objects,
@@ -97,7 +97,7 @@
                  FT_UInt          max_objects,
                  FT_ULong*        pflags );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   PS_Parser_LoadFieldTable( PS_Parser       parser,
                        const T1_Field  field,
                        void**           objects,
@@ -104,21 +104,21 @@
                        FT_UInt          max_objects,
                        FT_ULong*        pflags );
 
-  FT_LOCAL FT_Long
+  FT_LOCAL( FT_Long )
   PS_Parser_ToInt( PS_Parser  parser );
 
 
-  FT_LOCAL FT_Fixed
+  FT_LOCAL( FT_Fixed )
   PS_Parser_ToFixed( PS_Parser  parser,
               FT_Int      power_ten );
 
 
-  FT_LOCAL FT_Int
+  FT_LOCAL( FT_Int )
   PS_Parser_ToCoordArray( PS_Parser  parser,
                    FT_Int      max_coords,
                    FT_Short*   coords );
 
-  FT_LOCAL FT_Int
+  FT_LOCAL( FT_Int )
   PS_Parser_ToFixedArray( PS_Parser  parser,
                    FT_Int      max_values,
                    FT_Fixed*   values,
@@ -125,13 +125,13 @@
                    FT_Int      power_ten );
 
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   PS_Parser_Init( PS_Parser  parser,
                   FT_Byte*    base,
                   FT_Byte*    limit,
                   FT_Memory   memory );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   PS_Parser_Done( PS_Parser  parser );
 
 
@@ -143,7 +143,7 @@
   /*************************************************************************/
   /*************************************************************************/
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   T1_Builder_Init( T1_Builder*   builder,
                    FT_Face       face,
                    FT_Size       size,
@@ -150,35 +150,35 @@
                    FT_GlyphSlot  glyph,
                    FT_Bool       hinting );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   T1_Builder_Done( T1_Builder*  builder );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   T1_Builder_Check_Points( T1_Builder*  builder,
                            FT_Int       count );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   T1_Builder_Add_Point( T1_Builder*  builder,
                         FT_Pos       x,
                         FT_Pos       y,
                         FT_Byte      flag );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   T1_Builder_Add_Point1( T1_Builder*  builder,
                          FT_Pos       x,
                          FT_Pos       y );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   T1_Builder_Add_Contour( T1_Builder*  builder );
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   T1_Builder_Start_Point( T1_Builder*  builder,
                           FT_Pos       x,
                           FT_Pos       y );
 
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   T1_Builder_Close_Contour( T1_Builder*  builder );
 
 
@@ -190,7 +190,7 @@
   /*************************************************************************/
   /*************************************************************************/
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   T1_Decrypt( FT_Byte*   buffer,
               FT_Offset  length,
               FT_UShort  seed );
--- a/src/psaux/t1decode.c
+++ b/src/psaux/t1decode.c
@@ -330,7 +330,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   T1_Decoder_Parse_Charstrings( T1_Decoder  decoder,
                                 FT_Byte*     charstring_base,
                                 FT_UInt      charstring_len )
@@ -1097,7 +1097,7 @@
 
 
   /* parse a single Type 1 glyph */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   T1_Decoder_Parse_Glyph( T1_Decoder  decoder,
                           FT_UInt      glyph )
   {
@@ -1106,7 +1106,7 @@
 
 
   /* initialise T1 decoder */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   T1_Decoder_Init( T1_Decoder          decoder,
                    FT_Face              face,
                    FT_Size              size,
@@ -1148,7 +1148,7 @@
 
 
   /* finalize T1 decoder */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   T1_Decoder_Done( T1_Decoder  decoder )
   {
     T1_Builder_Done( &decoder->builder );
--- a/src/psaux/t1decode.h
+++ b/src/psaux/t1decode.h
@@ -33,16 +33,16 @@
   const T1_Decoder_FuncsRec  t1_decoder_funcs;
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   T1_Decoder_Parse_Glyph( T1_Decoder  decoder,
                           FT_UInt      glyph_index );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   T1_Decoder_Parse_Charstrings( T1_Decoder  decoder,
                                 FT_Byte*     base,
                                 FT_UInt      len );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   T1_Decoder_Init( T1_Decoder          decoder,
                    FT_Face              face,
                    FT_Size              size,
@@ -52,7 +52,7 @@
                    FT_Bool              hinting,
                    T1_Decoder_Callback  parse_glyph );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   T1_Decoder_Done( T1_Decoder  decoder );
 
 
--- a/src/pshinter/pshalgo1.c
+++ b/src/pshinter/pshalgo1.c
@@ -356,7 +356,7 @@
 #endif
 
 
-  FT_LOCAL_DEF  FT_Error
+  FT_LOCAL_DEF( FT_Error )
   psh1_hint_table_optimize( PSH1_Hint_Table  table,
                             PSH_Globals      globals,
                             FT_Outline*      outline,
--- a/src/pshinter/pshglob.c
+++ b/src/pshinter/pshglob.c
@@ -57,7 +57,7 @@
 
 
   /* org_width is is font units, result in device pixels, 26.6 format */
-  FT_LOCAL_DEF FT_Pos
+  FT_LOCAL_DEF( FT_Pos )
   psh_dimension_snap_width( PSH_Dimension  dimension,
                             FT_Int         org_width )
   {
@@ -480,7 +480,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   psh_blues_snap_stem( PSH_Blues      blues,
                        FT_Int         stem_top,
                        FT_Int         stem_bot,
@@ -701,7 +701,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   psh_globals_funcs_init( PSH_Globals_FuncsRec*  funcs )
   {
     funcs->create    = psh_globals_new;
--- a/src/pshinter/pshglob.h
+++ b/src/pshinter/pshglob.h
@@ -159,18 +159,18 @@
   } PSH_AlignmentRec, *PSH_Alignment;
 
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   psh_globals_funcs_init( PSH_Globals_FuncsRec*  funcs );
 
 
   /* snap a stem width to fitter coordinates.  `org_width' is in font */
   /* units.  The result is in device pixels (26.6 format).            */
-  FT_LOCAL FT_Pos
+  FT_LOCAL( FT_Pos )
   psh_dimension_snap_width( PSH_Dimension  dimension,
                             FT_Int         org_width );
 
   /* snap a stem to one or two blue zones */
-  FT_LOCAL void
+  FT_LOCAL( void )
   psh_blues_snap_stem( PSH_Blues      blues,
                        FT_Int         stem_top,
                        FT_Int         stem_bot,
--- a/src/pshinter/pshrec.c
+++ b/src/pshinter/pshrec.c
@@ -779,7 +779,7 @@
 
 
   /* destroy hints */
-  FT_LOCAL void
+  FT_LOCAL( void )
   ps_hints_done( PS_Hints  hints )
   {
     FT_Memory  memory = hints->memory;
@@ -793,7 +793,7 @@
   }
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   ps_hints_init( PS_Hints   hints,
                  FT_Memory  memory )
   {
@@ -1129,7 +1129,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   t1_hints_funcs_init( T1_Hints_FuncsRec*  funcs )
   {
     memset( (char*)funcs, 0, sizeof ( *funcs ) );
@@ -1194,7 +1194,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   t2_hints_funcs_init( T2_Hints_FuncsRec*  funcs )
   {
     memset( funcs, 0, sizeof ( *funcs ) );
--- a/src/pshinter/pshrec.h
+++ b/src/pshinter/pshrec.h
@@ -145,20 +145,20 @@
   /* */
 
   /* initialize hints recorder */
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   ps_hints_init( PS_Hints   hints,
                  FT_Memory  memory );
 
   /* finalize hints recorder */
-  FT_LOCAL void
+  FT_LOCAL( void )
   ps_hints_done( PS_Hints  hints );
 
   /* initialize Type1 hints recorder interface */
-  FT_LOCAL void
+  FT_LOCAL( void )
   t1_hints_funcs_init( T1_Hints_FuncsRec*  funcs );
 
   /* initialize Type2 hints recorder interface */
-  FT_LOCAL void
+  FT_LOCAL( void )
   t2_hints_funcs_init( T2_Hints_FuncsRec*  funcs );
 
 
--- a/src/raster/ftraster.c
+++ b/src/raster/ftraster.c
@@ -2965,7 +2965,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   Render_Glyph( RAS_ARG )
   {
     FT_Error  error;
@@ -3028,7 +3028,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   Render_Gray_Glyph( RAS_ARG )
   {
     Long      pixel_width;
@@ -3086,10 +3086,10 @@
     return Raster_Err_Ok;
   }
 
-#else /* FT_RASTER_OPTION_ANTI_ALIASING */
+#else /* !FT_RASTER_OPTION_ANTI_ALIASING */
 
-  FT_LOCAL_DEF
-  FT_Error  Render_Gray_Glyph( RAS_ARG )
+  FT_LOCAL_DEF( FT_Error )
+  Render_Gray_Glyph( RAS_ARG )
   {
     FT_UNUSED_RASTER;
 
@@ -3096,7 +3096,7 @@
     return Raster_Err_Cannot_Render_Glyph;
   }
 
-#endif /* FT_RASTER_OPTION_ANTI_ALIASING */
+#endif /* !FT_RASTER_OPTION_ANTI_ALIASING */
 
 
   static void
--- a/src/sfnt/sfobjs.c
+++ b/src/sfnt/sfobjs.c
@@ -179,7 +179,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   SFNT_Init_Face( FT_Stream      stream,
                   TT_Face        face,
                   FT_Int         face_index,
@@ -242,7 +242,7 @@
                       != SFNT_Err_Ok )
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   SFNT_Load_Face( FT_Stream      stream,
                   TT_Face        face,
                   FT_Int         face_index,
@@ -592,7 +592,7 @@
 #undef LOAD_
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   SFNT_Done_Face( TT_Face  face )
   {
     FT_Memory        memory = face->root.memory;
--- a/src/sfnt/sfobjs.h
+++ b/src/sfnt/sfobjs.h
@@ -28,7 +28,7 @@
 FT_BEGIN_HEADER
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   SFNT_Init_Face( FT_Stream      stream,
                   TT_Face        face,
                   FT_Int         face_index,
@@ -35,7 +35,7 @@
                   FT_Int         num_params,
                   FT_Parameter*  params );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   SFNT_Load_Face( FT_Stream      stream,
                   TT_Face        face,
                   FT_Int         face_index,
@@ -42,7 +42,7 @@
                   FT_Int         num_params,
                   FT_Parameter*  params );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   SFNT_Done_Face( TT_Face  face );
 
 
--- a/src/sfnt/ttcmap.c
+++ b/src/sfnt/ttcmap.c
@@ -106,7 +106,7 @@
   /*    opened).  In case of error, all partially allocated tables are     */
   /*    released.                                                          */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_CharMap_Load( TT_Face        face,
                    TT_CMapTable*  cmap,
                    FT_Stream      stream )
@@ -414,7 +414,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_CharMap_Free( TT_Face        face,
                    TT_CMapTable*  cmap )
   {
--- a/src/sfnt/ttcmap.h
+++ b/src/sfnt/ttcmap.h
@@ -27,12 +27,12 @@
 FT_BEGIN_HEADER
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_CharMap_Load( TT_Face        face,
                    TT_CMapTable*  cmap,
                    FT_Stream      input );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_CharMap_Free( TT_Face        face,
                    TT_CMapTable*  cmap );
 
--- a/src/sfnt/ttcmap0.c
+++ b/src/sfnt/ttcmap0.c
@@ -45,32 +45,13 @@
 #define  TT_NEXT_ULong   FT_NEXT_ULONG_BE
 
 
-  typedef struct TT_CMap_InfoRec_
-  {
-    FT_ByteP            base;
-    FT_ByteP            limit;
-    FT_ValidationLevel  level;
-
-  } TT_CMap_InfoRec, *TT_CMap_Info;
-
-
   FT_CALLBACK_DEF  FT_Error
-  tt_cmap_init( FT_CMap       cmap,
-                TT_CMap_Info  info )
+  tt_cmap_init( TT_CMap   cmap,
+                FT_Byte*  data )
   {
-    FT_Error         error;
-    TT_CMap_Class    clazz = (TT_CMap_Class) FT_CMAP_CLASS(cmap);
-    FT_ValidatorRec  valid;
-    
-    cmap->data = info->base;
-    
-    ft_validator_init( &valid, info->base, info->limit, info->level );
-    
-    if ( setjmp( valid->jump_buffer, 0 ) == 0 )
-      clazz->validate( info->base, &valid );
-      
-    return valid.error;
-  }                
+    cmap->data = data;
+    return 0;
+  }
 
 
  /************************************************************************/
@@ -124,19 +105,22 @@
 
 
   FT_CALLBACK_DEF FT_UInt
-  tt_cmap0_char_index( FT_Byte*   table,
-                       FT_ULong   char_code )
+  tt_cmap0_char_index( TT_CMap    cmap,
+                       FT_UInt32  char_code )
   {
+    FT_Byte*  table = cmap->data;
+
     return  ( char_code < 256 ? table[6+char_code] : 0 );
   }
 
 
-  FT_CALLBACK_DEF FT_ULong
-  tt_cmap0_char_next( FT_Byte*  table,
-                      FT_ULong  char_code,
+  FT_CALLBACK_DEF FT_UInt32
+  tt_cmap0_char_next( TT_CMap    cmap,
+                      FT_UInt32  char_code,
                       FT_UInt   *agindex )
   {
-    FT_ULong  result = 0;
+    FT_Byte*  table  = cmap->data;
+    FT_UInt32 result = 0;
     FT_UInt   gindex = 0;
 
     table += 6;  /* go to glyph ids */
@@ -157,20 +141,21 @@
   }
 
 
-  FT_CALLBACK_TABLE const TT_Cmap_ClassRec  tt_cmap0_class_rec =
+  FT_CALLBACK_TABLE const TT_CMap_ClassRec  tt_cmap0_class_rec =
   {
     {
       sizeof( FT_CMapRec ),
-      
+
       (FT_CMap_InitFunc)      tt_cmap_init,
       (FT_CMap_DoneFunc)      NULL,
       (FT_CMap_CharIndexFunc) tt_cmap0_char_index,
       (FT_CMap_CharNextFunc)  tt_cmap0_char_next
     },
+    0,
     (TT_CMap_ValidateFunc)    tt_cmap0_validate
   };
 
-  FT_LOCAL_DEF  TT_CMap_Class tt_cmap0_class = &tt_cmap0_class_rec;
+  FT_LOCAL_DEF( TT_CMap_Class ) tt_cmap0_class = &tt_cmap0_class_rec;
 
 #endif /* TT_CONFIG_CMAP_FORMAT_0 */
 
@@ -354,8 +339,8 @@
   /* return sub header corresponding to a given character code */
   /* NULL on invalid charcode..                                */
   static FT_Byte*
-  tt_cmap2_get_subheader( FT_Byte*  table,
-                          FT_ULong  char_code )
+  tt_cmap2_get_subheader( FT_Byte*   table,
+                          FT_UInt32  char_code )
   {
     FT_Byte*  result = NULL;
 
@@ -401,9 +386,10 @@
 
 
   FT_CALLBACK_DEF FT_UInt
-  tt_cmap2_char_index( FT_Byte*   table,
-                       FT_ULong   char_code )
+  tt_cmap2_char_index( TT_CMap    cmap,
+                       FT_UInt32  char_code )
   {
+    FT_Byte*  table   = cmap->data;
     FT_UInt   result  = 0;
     FT_Byte*  subheader;
 
@@ -437,10 +423,11 @@
 
 
   FT_CALLBACK_DEF FT_UInt
-  tt_cmap2_char_next( FT_Byte*  table,
-                      FT_ULong  char_code,
+  tt_cmap2_char_next( TT_CMap    cmap,
+                      FT_UInt32  char_code,
                       FT_UInt   *agindex )
   {
+    FT_Byte*  table     = cmap->data;
     FT_UInt   result    = 0;
     FT_UInt   n, gindex = 0;
     FT_Byte*  subheader;
@@ -502,20 +489,21 @@
     return result;
   }
 
-  FT_CALLBACK_TABLE const TT_Cmap_ClassRec  tt_cmap2_class_rec =
+  FT_CALLBACK_TABLE const TT_CMap_ClassRec  tt_cmap2_class_rec =
   {
     {
       sizeof( FT_CMapRec ),
-      
+
       (FT_CMap_InitFunc)      tt_cmap_init,
       (FT_CMap_DoneFunc)      NULL,
       (FT_CMap_CharIndexFunc) tt_cmap2_char_index,
       (FT_CMap_CharNextFunc)  tt_cmap2_char_next
     },
+    2,
     (TT_CMap_ValidateFunc)    tt_cmap2_validate
   };
 
-  FT_LOCAL_DEF  TT_CMap_Class tt_cmap2_class = &tt_cmap2_class_rec;
+  FT_LOCAL_DEF( TT_CMap_Class )  tt_cmap2_class = &tt_cmap2_class_rec;
 
 #endif /* TT_CONFIG_CMAP_FORMAT_2 */
 
@@ -700,9 +688,10 @@
 
 
   FT_CALLBACK_DEF FT_UInt
-  tt_cmap4_char_index( FT_Byte*  table,
-                       FT_ULong  char_code )
+  tt_cmap4_char_index( TT_CMap    cmap,
+                       FT_UInt32  char_code )
   {
+    FT_Byte*  table  = cmap->data;
     FT_UInt   result = 0;
 
     if ( char_code < 0x10000U )
@@ -749,12 +738,13 @@
 
 
 
-  FT_CALLBACK_DEF FT_ULong
-  tt_cmap4_char_next( FT_Byte*  table,
-                      FT_ULong  char_code,
-                      FT_UInt  *agindex )
+  FT_CALLBACK_DEF FT_UInt32
+  tt_cmap4_char_next( TT_CMap    cmap,
+                      FT_UInt32  char_code,
+                      FT_UInt   *agindex )
   {
-    FT_ULong  result = 0;
+    FT_Byte*  table  = cmap->data;
+    FT_UInt32 result = 0;
     FT_UInt   gindex = 0;
     FT_Byte*  p;
     FT_UInt   code, num_segs2;
@@ -830,20 +820,21 @@
     return result;
   }
 
-  FT_CALLBACK_TABLE const TT_Cmap_ClassRec  tt_cmap4_class_rec =
+  FT_CALLBACK_TABLE const TT_CMap_ClassRec  tt_cmap4_class_rec =
   {
     {
       sizeof( FT_CMapRec ),
-      
+
       (FT_CMap_InitFunc)      tt_cmap_init,
       (FT_CMap_DoneFunc)      NULL,
       (FT_CMap_CharIndexFunc) tt_cmap4_char_index,
       (FT_CMap_CharNextFunc)  tt_cmap4_char_next
     },
+    4,
     (TT_CMap_ValidateFunc)    tt_cmap4_validate
   };
 
-  FT_LOCAL_DEF  TT_CMap_Class tt_cmap4_class = &tt_cmap4_class_rec;
+  static TT_CMap_Class tt_cmap4_class = &tt_cmap4_class_rec;
 
 #endif /* TT_CONFIG_CMAP_FORMAT_4 */
 
@@ -912,9 +903,10 @@
 
 
   FT_CALLBACK_DEF FT_UInt
-  tt_cmap6_char_index( FT_Byte*   table,
-                       FT_ULong   char_code )
+  tt_cmap6_char_index( TT_CMap    cmap,
+                       FT_UInt32  char_code )
   {
+    FT_Byte*  table  = cmap->data;
     FT_UInt   result = 0;
     FT_Byte*  p      = table + 6;
     FT_UInt   start  = TT_NEXT_USHORT(p);
@@ -930,12 +922,13 @@
   }
 
 
-  FT_CALLBACK_DEF FT_ULong
-  tt_cmap6_char_next( FT_Byte*    table,
-                      FT_ULong    char_code,
+  FT_CALLBACK_DEF FT_UInt32
+  tt_cmap6_char_next( TT_CMap     cmap,
+                      FT_UInt32   char_code,
                       FT_UInt    *agindex )
   {
-    FT_ULong  result = 0;
+    FT_Byte*  table  = cmap->data;
+    FT_UInt32 result = 0;
     FT_UInt   gindex = 0;
     FT_Byte*  p      = table + 6;
     FT_UInt   start  = TT_NEXT_USHORT(p);
@@ -971,20 +964,21 @@
   }
 
 
-  FT_CALLBACK_TABLE const TT_Cmap_ClassRec  tt_cmap6_class_rec =
+  FT_CALLBACK_TABLE const TT_CMap_ClassRec  tt_cmap6_class_rec =
   {
     {
       sizeof( FT_CMapRec ),
-      
+
       (FT_CMap_InitFunc)      tt_cmap_init,
       (FT_CMap_DoneFunc)      NULL,
       (FT_CMap_CharIndexFunc) tt_cmap6_char_index,
       (FT_CMap_CharNextFunc)  tt_cmap6_char_next
     },
+    6,
     (TT_CMap_ValidateFunc)    tt_cmap6_validate
   };
 
-  FT_LOCAL_DEF  TT_CMap_Class tt_cmap6_class = &tt_cmap6_class_rec;
+  FT_LOCAL_DEF( TT_CMap_Class )  tt_cmap6_class = &tt_cmap6_class_rec;
 
 #endif /* TT_CONFIG_CMAP_FORMAT_6 */
 
@@ -1054,8 +1048,8 @@
   {
     FT_Byte*   p = table + 4;
     FT_Byte*   is32;
-    FT_ULong   length;
-    FT_ULong   num_groups;
+    FT_UInt32  length;
+    FT_UInt32  num_groups;
 
     if ( table + 16 + 8192 > valid->limit )
       INVALID_TOO_SHORT;
@@ -1073,7 +1067,7 @@
 
     /* check groups, they must be in increasing order */
     {
-      FT_ULong  n, start, end, start_id, count, last = 0;
+      FT_UInt32  n, start, end, start_id, count, last = 0;
 
       for ( n = 0; n < num_groups; n++ )
       {
@@ -1095,7 +1089,7 @@
           if ( start_id + end - start >= valid->num_glyphs )
             INVALID_GLYPH_ID;
 
-          count = (FT_ULong)(end - start + 1);
+          count = (FT_UInt32)(end - start + 1);
 
           if ( start & ~0xFFFFU )
           {
@@ -1139,13 +1133,14 @@
 
 
   FT_CALLBACK_DEF FT_UInt
-  tt_cmap8_char_index( FT_Byte*   table,
-                       FT_ULong   char_code )
+  tt_cmap8_char_index( TT_CMap     cmap,
+                       FT_UInt32   char_code )
   {
-    FT_UInt   result     = 0;
-    FT_Byte*  p          = table + 8204;
-    FT_ULong  num_groups = TT_NEXT_ULONG(p);
-    FT_ULong  n, start, end, start_id;
+    FT_Byte*   table      = cmap->data;
+    FT_UInt    result     = 0;
+    FT_Byte*   p          = table + 8204;
+    FT_UInt32  num_groups = TT_NEXT_ULONG(p);
+    FT_UInt32  n, start, end, start_id;
 
     for ( ; num_groups > 0; num_groups-- )
     {
@@ -1166,16 +1161,16 @@
   }
 
 
-  FT_CALLBACK_DEF FT_ULong
-  tt_cmap8_char_next( FT_Byte*   table,
-                      FT_ULong   char_code,
+  FT_CALLBACK_DEF FT_UInt32
+  tt_cmap8_char_next( TT_CMap    cmap,
+                      FT_UInt32  char_code,
                       FT_UInt   *agindex )
   {
-    FT_ULong   result     = 0;
+    FT_UInt32  result     = 0;
     FT_UInt    gindex     = 0;
     FT_Byte*   p          = table + 8204;
-    FT_ULong   num_groups = TT_NEXT_ULONG(p);
-    FT_ULong   n, start, end, start_id;
+    FT_UInt32  num_groups = TT_NEXT_ULONG(p);
+    FT_UInt32  n, start, end, start_id;
 
     ++char_code;
     p = table + 8208;
@@ -1208,20 +1203,21 @@
   }
 
 
-  FT_CALLBACK_TABLE const TT_Cmap_ClassRec  tt_cmap8_class_rec =
+  FT_CALLBACK_TABLE const TT_CMap_ClassRec  tt_cmap8_class_rec =
   {
     {
       sizeof( FT_CMapRec ),
-      
+
       (FT_CMap_InitFunc)      tt_cmap_init,
       (FT_CMap_DoneFunc)      NULL,
       (FT_CMap_CharIndexFunc) tt_cmap8_char_index,
       (FT_CMap_CharNextFunc)  tt_cmap8_char_next
     },
+    8,
     (TT_CMap_ValidateFunc)    tt_cmap8_validate
   };
 
-  FT_LOCAL_DEF  TT_CMap_Class tt_cmap8_class = &tt_cmap8_class_rec;
+  FT_LOCAL_DEF( TT_CMap_Class )  tt_cmap8_class = &tt_cmap8_class_rec;
 
 #endif /* TT_CONFIG_CMAP_FORMAT_8 */
 
@@ -1286,14 +1282,15 @@
 
 
   FT_CALLBACK_DEF FT_UInt
-  tt_cmap10_char_index( FT_Byte*   table,
-                        FT_ULong   char_code )
+  tt_cmap10_char_index( TT_CMap    cmap,
+                        FT_UInt32  char_code )
   {
-    FT_UInt   result = 0;
-    FT_Byte*  p      = table + 12;
-    FT_ULong  start  = TT_NEXT_ULONG(p);
-    FT_ULong  count  = TT_NEXT_ULONG(p);
-    FT_ULong  index  = (FT_ULong)( char_code - start );
+    FT_Byte*   table  = cmap->data;
+    FT_UInt    result = 0;
+    FT_Byte*   p      = table + 12;
+    FT_UInt32  start  = TT_NEXT_ULONG(p);
+    FT_UInt32  count  = TT_NEXT_ULONG(p);
+    FT_UInt32  index  = (FT_ULong)( char_code - start );
 
     if ( index < count )
     {
@@ -1304,23 +1301,24 @@
   }
 
 
-  FT_CALLBACK_DEF FT_ULong
-  tt_cmap10_char_next( FT_Byte*    table,
-                       FT_ULong    char_code,
+  FT_CALLBACK_DEF FT_UInt32
+  tt_cmap10_char_next( TT_CMap     cmap,
+                       FT_UInt32   char_code,
                        FT_UInt    *agindex )
   {
-    FT_ULong  result = 0;
-    FT_UInt   gindex = 0;
-    FT_Byte*  p      = table + 12;
-    FT_ULong  start  = TT_NEXT_ULONG(p);
-    FT_ULong  count  = TT_NEXT_ULONG(p);
-    FT_ULong  index;
+    FT_Byte*   table  = cmap->data;
+    FT_UInt32  result = 0;
+    FT_UInt    gindex = 0;
+    FT_Byte*   p      = table + 12;
+    FT_UInt32  start  = TT_NEXT_ULONG(p);
+    FT_UInt32  count  = TT_NEXT_ULONG(p);
+    FT_UInt32  index;
 
     char_code++;
     if ( char_code < start )
       char_code = start;
 
-    index = (FT_ULong)( char_code - start );
+    index = (FT_UInt32)( char_code - start );
     p    += 2*index;
 
     for ( ; index < count; index++ )
@@ -1342,20 +1340,21 @@
   }
 
 
-  FT_CALLBACK_TABLE const TT_Cmap_ClassRec  tt_cmap10_class_rec =
+  FT_CALLBACK_TABLE const TT_CMap_ClassRec  tt_cmap10_class_rec =
   {
     {
       sizeof( FT_CMapRec ),
-      
+
       (FT_CMap_InitFunc)      tt_cmap_init,
       (FT_CMap_DoneFunc)      NULL,
       (FT_CMap_CharIndexFunc) tt_cmap10_char_index,
       (FT_CMap_CharNextFunc)  tt_cmap10_char_next
     },
+    10,
     (TT_CMap_ValidateFunc)    tt_cmap10_validate
   };
 
-  FT_LOCAL_DEF  TT_CMap_Class tt_cmap10_class = &tt_cmap10_class_rec;
+  FT_LOCAL_DEF( TT_CMap_Class )  tt_cmap10_class = &tt_cmap10_class_rec;
 
 #endif /* TT_CONFIG_CMAP_FORMAT_10 */
 
@@ -1445,13 +1444,13 @@
 
 
   FT_CALLBACK_DEF FT_UInt
-  tt_cmap12_char_index( FT_Byte*   table,
-                        FT_ULong   char_code )
+  tt_cmap12_char_index( TT_CMap    cmap,
+                        FT_UInt32  char_code )
   {
-    FT_UInt   result     = 0;
-    FT_Byte*  p          = table + 12;
-    FT_ULong  num_groups = TT_NEXT_ULONG(p);
-    FT_ULong  n, start, end, start_id;
+    FT_UInt    result     = 0;
+    FT_Byte*   p          = table + 12;
+    FT_UInt32  num_groups = TT_NEXT_ULONG(p);
+    FT_UInt32  n, start, end, start_id;
 
     for ( ; num_groups > 0; num_groups-- )
     {
@@ -1472,16 +1471,17 @@
   }
 
 
-  FT_CALLBACK_DEF FT_ULong
-  tt_cmap12_char_next( FT_Byte*   table,
-                       FT_ULong   char_code,
+  FT_CALLBACK_DEF FT_UInt32
+  tt_cmap12_char_next( TT_CMap    cmap,
+                       FT_UInt32  char_code,
                        FT_UInt   *agindex )
   {
-    FT_ULong   result     = 0;
+    FT_Byte*   table      = cmap->data;
+    FT_UInt32  result     = 0;
     FT_UInt    gindex     = 0;
     FT_Byte*   p          = table + 12;
-    FT_ULong   num_groups = TT_NEXT_ULONG(p);
-    FT_ULong   n, start, end, start_id;
+    FT_UInt32  num_groups = TT_NEXT_ULONG(p);
+    FT_UInt32  n, start, end, start_id;
 
     ++char_code;
     p = table + 8208;
@@ -1514,21 +1514,124 @@
   }
 
 
-  FT_CALLBACK_TABLE const TT_Cmap_ClassRec  tt_cmap12_class_rec =
+  FT_CALLBACK_TABLE const TT_CMap_ClassRec  tt_cmap12_class_rec =
   {
     {
       sizeof( FT_CMapRec ),
-      
+
       (FT_CMap_InitFunc)      tt_cmap_init,
       (FT_CMap_DoneFunc)      NULL,
       (FT_CMap_CharIndexFunc) tt_cmap12_char_index,
       (FT_CMap_CharNextFunc)  tt_cmap12_char_next
     },
+    12,
     (TT_CMap_ValidateFunc)    tt_cmap12_validate
   };
 
-  FT_LOCAL_DEF  TT_CMap_Class tt_cmap12_class = &tt_cmap12_class_rec;
+  FT_LOCAL_DEF( TT_CMap_Class )  tt_cmap12_class = &tt_cmap12_class_rec;
 
 #endif /* TT_CONFIG_CMAP_FORMAT_12 */
+
+
+
+  static TT_CMap_Class  tt_cmap_classes[] =
+  {
+#ifdef TT_CONFIG_CMAP_FORMAT_0
+    tt_cmap0_class,
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_2
+    tt_cmap2_class,
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_4
+    tt_cmap4_class,
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_6
+    tt_cmap6_class,
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_8
+    tt_cmap8_class,
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_10
+    tt_cmap10_class,
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_12
+    tt_cmap12_class,
+#endif
+
+    NULL,
+  };
+
+
+ /* parse the 'cmap' table and build the corresponding TT_CMap objects */
+ /* in the current face..                                              */
+ /*                                                                    */
+  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 )
+      return FT_Err_Invalid_Table;
+
+    /* only recognize format 0 */
+    if ( NEXT_UShort(p) != 0 )
+      return FT_Err_Invalid_Table;
+
+    num_cmaps = NEXT_UShort(p);
+
+    for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- )
+    {
+      FT_CharMapRec  charmap;
+      FT_UInt32      offset;
+
+      charmap.platform_id = NEXT_UShort(p);
+      charmap.encoding_id = NEXT_UShort(p);
+      offset              = NEXT_ULong(p);
+
+      if ( offset && table + offset + 2 < limit )
+      {
+        FT_Byte*         cmap   = table + offset;
+        FT_UInt          format = PEEK_UShort(cmap);
+        TT_CMap_Class*   pclazz = tt_cmap_classes;
+        TT_CMap_Class    clazz;
+
+        for ( ; *pclazz; pclazz++ )
+        {
+          clazz = *pclazz;
+          if ( clazz->format == format )
+          {
+            volatile FT_Validator  valid;
+
+            ft_validator_init( &valid, cmap, limit,
+                               FT_VALIDATE_LEVEL_DEFAULT );
+
+            if ( setjmp( valid.jump_buffer ) == 0 )
+              clazz->validate( cmap, &valid );
+
+            if ( valid.error == 0 )
+              (void)FT_CMap_New( clazz, cmap, face, NULL );
+            else
+              FT_ERROR(( "TT_Build_CMaps: broken cmap sub-table ignored !!\n" ));
+          }
+        }
+      }
+    }
+
+    return 0;
+  }
+
+
 
 /* END */
--- a/src/sfnt/ttcmap0.h
+++ b/src/sfnt/ttcmap0.h
@@ -27,14 +27,29 @@
 
 FT_BEGIN_HEADER
 
-  FT_LOCAL FT_Error
-  TT_CharMap_Load( TT_Face        face,
-                   TT_CMapTable*  cmap,
-                   FT_Stream      input );
+  typedef struct TT_CMapRec_
+  {
+    FT_CMapRec  cmap;
+    FT_Byte*    data;
 
-  FT_LOCAL FT_Error
-  TT_CharMap_Free( TT_Face        face,
-                   TT_CMapTable*  cmap );
+  } TT_CMapRec, *TT_CMap;
+
+  typedef const struct TT_CMap_ClassRec_*   TT_CMap_Class;
+
+  typedef FT_Error  (*TT_CMap_ValidateFunc)( FT_Byte*      data,
+                                             FT_Validator  valid );
+
+  typedef struct TT_CMap_ClassRec_
+  {
+    FT_CMap_ClassRec      clazz;
+    FT_UInt               format;
+    TT_CMap_ValidateFunc  validate;
+
+  } TT_CMap_ClassRec;
+
+
+  FT_LOCAL( FT_Error )
+  TT_Build_CMaps( TT_Face   face )
 
 
 FT_END_HEADER
--- a/src/sfnt/ttload.c
+++ b/src/sfnt/ttload.c
@@ -53,7 +53,7 @@
   /* <Return>                                                              */
   /*    A pointer to the table directory entry.  0 if not found.           */
   /*                                                                       */
-  FT_LOCAL_DEF TT_Table*
+  FT_LOCAL_DEF( TT_Table* )
   TT_LookUp_Table( TT_Face   face,
                    FT_ULong  tag  )
   {
@@ -104,7 +104,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Goto_Table( TT_Face    face,
                  FT_ULong   tag,
                  FT_Stream  stream,
@@ -159,7 +159,7 @@
   /*    The header will be checked whether it is valid by looking at the   */
   /*    values of `search_range', `entry_selector', and `range_shift'.     */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_SFNT_Header( TT_Face       face,
                        FT_Stream     stream,
                        FT_Long       face_index,
@@ -294,7 +294,7 @@
   /* <Note>                                                                */
   /*    The stream cursor must be at the font file's origin.               */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_Directory( TT_Face       face,
                      FT_Stream     stream,
                      SFNT_Header*  sfnt )
@@ -388,7 +388,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_Any( TT_Face    face,
                FT_ULong   tag,
                FT_Long    offset,
@@ -519,7 +519,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_Header( TT_Face    face,
                   FT_Stream  stream )
   {
@@ -529,7 +529,7 @@
 
 #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_Bitmap_Header( TT_Face    face,
                          FT_Stream  stream )
   {
@@ -554,7 +554,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_MaxProfile( TT_Face    face,
                       FT_Stream  stream )
   {
@@ -816,7 +816,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_Metrics_Header( TT_Face    face,
                           FT_Stream  stream,
                           FT_Bool    vertical )
@@ -915,7 +915,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_Names( TT_Face    face,
                  FT_Stream  stream )
   {
@@ -1080,7 +1080,7 @@
   /* <Input>                                                               */
   /*    face :: A handle to the target face object.                        */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   TT_Free_Names( TT_Face  face )
   {
     FT_Memory      memory = face->root.driver->root.memory;
@@ -1115,7 +1115,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_CMap( TT_Face    face,
                 FT_Stream  stream )
   {
@@ -1229,7 +1229,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_OS2( TT_Face    face,
                FT_Stream  stream )
   {
@@ -1371,7 +1371,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_PostScript( TT_Face    face,
                       FT_Stream  stream )
   {
@@ -1429,7 +1429,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_PCLT( TT_Face    face,
                 FT_Stream  stream )
   {
@@ -1496,7 +1496,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_Gasp( TT_Face    face,
                 FT_Stream  stream )
   {
@@ -1573,7 +1573,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_Kern( TT_Face    face,
                 FT_Stream  stream )
   {
@@ -1720,7 +1720,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_Hdmx( TT_Face    face,
                 FT_Stream  stream )
   {
@@ -1798,7 +1798,7 @@
   /* <Input>                                                               */
   /*    face :: A handle to the target face object.                        */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   TT_Free_Hdmx( TT_Face  face )
   {
     if ( face )
--- a/src/sfnt/ttload.h
+++ b/src/sfnt/ttload.h
@@ -29,11 +29,11 @@
 FT_BEGIN_HEADER
 
 
-  FT_LOCAL TT_Table*
+  FT_LOCAL( TT_Table* )
   TT_LookUp_Table( TT_Face   face,
                    FT_ULong  tag );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Goto_Table( TT_Face    face,
                  FT_ULong   tag,
                  FT_Stream  stream,
@@ -40,18 +40,18 @@
                  FT_ULong*  length );
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_SFNT_Header( TT_Face       face,
                        FT_Stream     stream,
                        FT_Long       face_index,
                        SFNT_Header*  sfnt );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_Directory( TT_Face       face,
                      FT_Stream     stream,
                      SFNT_Header*  sfnt );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_Any( TT_Face    face,
                FT_ULong   tag,
                FT_Long    offset,
@@ -59,70 +59,70 @@
                FT_ULong*  length );
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_Header( TT_Face    face,
                   FT_Stream  stream );
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_Metrics_Header( TT_Face    face,
                           FT_Stream  stream,
                           FT_Bool    vertical );
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_CMap( TT_Face    face,
                 FT_Stream  stream );
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_MaxProfile( TT_Face    face,
                       FT_Stream  stream );
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_Names( TT_Face    face,
                  FT_Stream  stream );
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_OS2( TT_Face    face,
                FT_Stream  stream );
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_PostScript( TT_Face    face,
                       FT_Stream  stream );
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_Hdmx( TT_Face    face,
                 FT_Stream  stream );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_PCLT( TT_Face    face,
                 FT_Stream  stream );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   TT_Free_Names( TT_Face  face );
 
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   TT_Free_Hdmx ( TT_Face  face );
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_Kern( TT_Face    face,
                 FT_Stream  stream );
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_Gasp( TT_Face    face,
                 FT_Stream  stream );
 
 #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_Bitmap_Header( TT_Face    face,
                          FT_Stream  stream );
 
--- a/src/sfnt/ttpost.c
+++ b/src/sfnt/ttpost.c
@@ -377,7 +377,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   TT_Free_Post_Names( TT_Face  face )
   {
     FT_Memory       memory = face->root.memory;
@@ -441,7 +441,7 @@
   /* <Output>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Get_PS_Name( TT_Face      face,
                   FT_UInt      index,
                   FT_String**  PSname )
--- a/src/sfnt/ttpost.h
+++ b/src/sfnt/ttpost.h
@@ -29,12 +29,12 @@
 FT_BEGIN_HEADER
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Get_PS_Name( TT_Face      face,
                   FT_UInt      index,
                   FT_String**  PSname );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   TT_Free_Post_Names( TT_Face  face );
 
 
--- a/src/sfnt/ttsbit.c
+++ b/src/sfnt/ttsbit.c
@@ -391,7 +391,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_SBit_Strikes( TT_Face    face,
                         FT_Stream  stream )
   {
@@ -588,7 +588,7 @@
   /* <Input>                                                               */
   /*    face :: The target face object.                                    */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   TT_Free_SBit_Strikes( TT_Face  face )
   {
     FT_Memory        memory       = face->root.memory;
@@ -623,7 +623,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Set_SBit_Strike( TT_Face    face,
                       FT_Int     x_ppem,
                       FT_Int     y_ppem,
@@ -1395,7 +1395,7 @@
   /*  <Note>                                                               */
   /*    The `map.buffer' field is always freed before the glyph is loaded. */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_SBit_Image( TT_Face           face,
                       FT_ULong          strike_index,
                       FT_UInt           glyph_index,
--- a/src/sfnt/ttsbit.h
+++ b/src/sfnt/ttsbit.h
@@ -27,21 +27,21 @@
 FT_BEGIN_HEADER
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_SBit_Strikes( TT_Face    face,
                         FT_Stream  stream );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   TT_Free_SBit_Strikes( TT_Face  face );
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Set_SBit_Strike( TT_Face    face,
                       FT_Int     x_ppem,
                       FT_Int     y_ppem,
                       FT_ULong  *astrike_index );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_SBit_Image( TT_Face           face,
                       FT_ULong          strike_index,
                       FT_UInt           glyph_index,
--- a/src/truetype/ttgload.c
+++ b/src/truetype/ttgload.c
@@ -81,7 +81,7 @@
   /*    This function will much probably move to another component in the  */
   /*    near future, but I haven't decided which yet.                      */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   TT_Get_Metrics( TT_HoriHeader*  header,
                   FT_UInt         index,
                   FT_Short*       bearing,
@@ -581,7 +581,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   TT_Init_Glyph_Loading( TT_Face  face )
   {
     face->access_glyph_frame   = TT_Access_Glyph_Frame;
@@ -1416,7 +1416,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_Glyph( TT_Size       size,
                  TT_GlyphSlot  glyph,
                  FT_UShort     glyph_index,
--- a/src/truetype/ttgload.h
+++ b/src/truetype/ttgload.h
@@ -31,16 +31,16 @@
 FT_BEGIN_HEADER
 
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   TT_Get_Metrics( TT_HoriHeader*  header,
                   FT_UInt         index,
                   FT_Short*       bearing,
                   FT_UShort*      advance );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   TT_Init_Glyph_Loading( TT_Face  face );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_Glyph( TT_Size       size,
                  TT_GlyphSlot  glyph,
                  FT_UShort     glyph_index,
--- a/src/truetype/ttinterp.c
+++ b/src/truetype/ttinterp.c
@@ -256,7 +256,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Goto_CodeRange( TT_ExecContext  exec,
                      FT_Int          range,
                      FT_Long         IP )
@@ -306,7 +306,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Set_CodeRange( TT_ExecContext  exec,
                     FT_Int          range,
                     void*           base,
@@ -341,7 +341,7 @@
   /* <Note>                                                                */
   /*    Does not set the Error variable.                                   */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Clear_CodeRange( TT_ExecContext  exec,
                       FT_Int          range )
   {
@@ -380,7 +380,7 @@
   /* <Note>                                                                */
   /*    Only the glyph loader and debugger should call this function.      */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Destroy_Context( TT_ExecContext  exec,
                       FT_Memory       memory )
   {
@@ -544,7 +544,7 @@
   /* <Note>                                                                */
   /*    Only the glyph loader and debugger should call this function.      */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_Context( TT_ExecContext  exec,
                    TT_Face         face,
                    TT_Size         size )
@@ -647,7 +647,7 @@
   /* <Note>                                                                */
   /*    Only the glyph loader and debugger should call this function.      */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Save_Context( TT_ExecContext  exec,
                    TT_Size         size )
   {
@@ -694,7 +694,7 @@
   /* <Note>                                                                */
   /*    Only the glyph loader and debugger should call this function.      */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Run_Context( TT_ExecContext  exec,
                   FT_Bool         debug )
   {
@@ -815,7 +815,7 @@
   /* <Note>                                                                */
   /*    Only the glyph loader and debugger should call this function.      */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Done_Context( TT_ExecContext  exec )
   {
     /* Nothing at all for now */
--- a/src/truetype/ttinterp.h
+++ b/src/truetype/ttinterp.h
@@ -224,18 +224,18 @@
   extern const TT_GraphicsState  tt_default_graphics_state;
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Goto_CodeRange( TT_ExecContext  exec,
                      FT_Int          range,
                      FT_Long         IP );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Set_CodeRange( TT_ExecContext  exec,
                     FT_Int          range,
                     void*           base,
                     FT_Long         length );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Clear_CodeRange( TT_ExecContext  exec,
                       FT_Int          range );
 
@@ -263,23 +263,23 @@
   TT_New_Context( TT_Face  face );
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Done_Context( TT_ExecContext  exec );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Destroy_Context( TT_ExecContext  exec,
                       FT_Memory       memory );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_Context( TT_ExecContext  exec,
                    TT_Face         face,
                    TT_Size         size );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Save_Context( TT_ExecContext  exec,
                    TT_Size         ins );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Run_Context( TT_ExecContext  exec,
                   FT_Bool         debug );
 
--- a/src/truetype/ttobjs.c
+++ b/src/truetype/ttobjs.c
@@ -65,7 +65,7 @@
   /* <Input>                                                               */
   /*    zone :: A pointer to the target glyph zone.                        */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   TT_Done_GlyphZone( TT_GlyphZone*  zone )
   {
     FT_Memory  memory = zone->memory;
@@ -102,7 +102,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_New_GlyphZone( FT_Memory      memory,
                     FT_UShort      maxPoints,
                     FT_Short       maxContours,
@@ -153,7 +153,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Init_Face( FT_Stream      stream,
                 TT_Face        face,
                 FT_Int         face_index,
@@ -224,7 +224,7 @@
   /* <Input>                                                               */
   /*    face :: A pointer to the face object to destroy.                   */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   TT_Done_Face( TT_Face  face )
   {
     FT_Memory  memory = face->root.memory;
@@ -277,7 +277,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Init_Size( TT_Size  size )
   {
     FT_Error  error = TT_Err_Ok;
@@ -464,7 +464,7 @@
   /* <Input>                                                               */
   /*    size :: A handle to the target size object.                        */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   TT_Done_Size( TT_Size  size )
   {
 
@@ -756,7 +756,7 @@
   /* <Input>                                                               */
   /*    size :: A handle to the target size object.                        */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Reset_Size( TT_Size  size )
   {
     FT_Face   face;
@@ -808,7 +808,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Init_Driver( TT_Driver  driver )
   {
     FT_Error  error;
@@ -839,7 +839,7 @@
   /* <Input>                                                               */
   /*    driver :: A handle to the target TrueType driver.                  */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   TT_Done_Driver( TT_Driver  driver )
   {
     /* destroy extensions registry if needed */
--- a/src/truetype/ttobjs.h
+++ b/src/truetype/ttobjs.h
@@ -107,10 +107,10 @@
 
 #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   TT_Done_GlyphZone( TT_GlyphZone*  zone );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_New_GlyphZone( FT_Memory      memory,
                     FT_UShort      maxPoints,
                     FT_Short       maxContours,
@@ -378,7 +378,7 @@
   /*                                                                       */
   /* Face functions                                                        */
   /*                                                                       */
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Init_Face( FT_Stream      stream,
                 TT_Face        face,
                 FT_Int         face_index,
@@ -385,7 +385,7 @@
                 FT_Int         num_params,
                 FT_Parameter*  params );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   TT_Done_Face( TT_Face  face );
 
 
@@ -393,13 +393,13 @@
   /*                                                                       */
   /* Size functions                                                        */
   /*                                                                       */
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Init_Size( TT_Size  size );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   TT_Done_Size( TT_Size  size );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Reset_Size( TT_Size  size );
 
 
@@ -407,10 +407,10 @@
   /*                                                                       */
   /* Driver functions                                                      */
   /*                                                                       */
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Init_Driver( TT_Driver  driver );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   TT_Done_Driver( TT_Driver  driver );
 
 
--- a/src/truetype/ttpload.c
+++ b/src/truetype/ttpload.c
@@ -54,7 +54,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_Locations( TT_Face    face,
                      FT_Stream  stream )
   {
@@ -147,7 +147,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_CVT( TT_Face    face,
                FT_Stream  stream )
   {
@@ -214,7 +214,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   TT_Load_Programs( TT_Face    face,
                     FT_Stream  stream )
   {
--- a/src/truetype/ttpload.h
+++ b/src/truetype/ttpload.h
@@ -27,15 +27,15 @@
 FT_BEGIN_HEADER
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_Locations( TT_Face    face,
                      FT_Stream  stream );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_CVT( TT_Face    face,
                FT_Stream  stream );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   TT_Load_Programs( TT_Face    face,
                     FT_Stream  stream );
 
--- a/src/type1/t1afm.c
+++ b/src/type1/t1afm.c
@@ -35,7 +35,7 @@
 #define FT_COMPONENT  trace_t1afm
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   T1_Done_AFM( FT_Memory  memory,
                T1_AFM*    afm )
   {
@@ -156,7 +156,7 @@
 
 
   /* parse an AFM file -- for now, only read the kerning pairs */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   T1_Read_AFM( FT_Face    t1_face,
                FT_Stream  stream )
   {
@@ -244,7 +244,7 @@
 
 
   /* find the kerning for a given glyph pair */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   T1_Get_Kerning( T1_AFM*     afm,
                   FT_UInt     glyph1,
                   FT_UInt     glyph2,
--- a/src/type1/t1afm.h
+++ b/src/type1/t1afm.h
@@ -43,15 +43,15 @@
   } T1_AFM;
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   T1_Read_AFM( FT_Face    face,
                FT_Stream  stream );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   T1_Done_AFM( FT_Memory  memory,
                T1_AFM*    afm );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   T1_Get_Kerning( T1_AFM*     afm,
                   FT_UInt     glyph1,
                   FT_UInt     glyph2,
--- a/src/type1/t1cmap.c
+++ b/src/type1/t1cmap.c
@@ -112,7 +112,7 @@
   };
 
 
-  FT_LOCAL_DEF T1_CMap_Class
+  FT_LOCAL_DEF( T1_CMap_Class )
   t1_cmap_standard_class = &t1_cmap_standard_class_rec;
 
 
@@ -138,7 +138,7 @@
   };
 
 
-  FT_LOCAL_DEF T1_CMap_Class
+  FT_LOCAL_DEF( T1_CMap_Class )
   t1_cmap_expert_class = &t1_cmap_expert_class_rec;
 
 
@@ -232,7 +232,7 @@
   };
 
 
-  FT_LOCAL_DEF FT_CMap_Class
+  FT_LOCAL_DEF( FT_CMap_Class )
   t1_cmap_custom_class = &t1_cmap_custom_class_rec;
 
 
@@ -301,7 +301,7 @@
                  new_count,
                  sizeof(T1_CMapUniPairRec),
                  t1_cmap_uni_pair_compare );
-          
+
           cmap->num_pairs = new_count;
         }
       }
@@ -316,7 +316,7 @@
   {
     FT_Face    face = FT_CMAP_FACE(cmap);
     FT_Memory  memory = FT_FACE_MEMORY(face);
-    
+
     FREE( cmap->pairs );
     cmap->num_pairs = 0;
   }
@@ -330,15 +330,15 @@
     FT_UInt         max = cmap->num_pairs;
     FT_UInt         mid;
     T1_CMapUniPair  pair;
-    
+
     while ( min < max )
     {
       mid  = min + (max - min)/2;
       pair = cmap->pairs + mid;
-      
+
       if ( pair->unicode == char_code )
         return pair->gindex;
-        
+
       if ( pair->unicode < char_code )
         min = mid+1;
       else
@@ -365,26 +365,26 @@
       {
         mid  = min + (max - min)/2;
         pair = cmap->pairs + mid;
-        
+
         if ( pair->unicode == char_code )
         {
           result = pair->gindex;
           if ( result != 0 )
             goto Exit;
-          
+
           char_code++;
           goto Restart;
         }
-        
+
         if ( pair->unicode < char_code )
           min = mid+1;
         else
           max = mid;
       }
-    
+
       /* we didn't find it, but we have a pair just above it */
       char_code = 0;
-      
+
       if ( min < cmap->num_pairs )
       {
         pair   = cmap->num_pairs + min;
--- a/src/type1/t1gload.c
+++ b/src/type1/t1gload.c
@@ -73,7 +73,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   T1_Compute_Max_Advance( T1_Face  face,
                           FT_Int*  max_advance )
   {
@@ -136,7 +136,7 @@
   /*************************************************************************/
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   T1_Load_Glyph( T1_GlyphSlot  glyph,
                  T1_Size       size,
                  FT_Int        glyph_index,
--- a/src/type1/t1gload.h
+++ b/src/type1/t1gload.h
@@ -27,11 +27,11 @@
 FT_BEGIN_HEADER
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   T1_Compute_Max_Advance( T1_Face  face,
                           FT_Int*  max_advance );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   T1_Load_Glyph( T1_GlyphSlot  glyph,
                  T1_Size       size,
                  FT_Int        glyph_index,
--- a/src/type1/t1load.c
+++ b/src/type1/t1load.c
@@ -180,7 +180,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   T1_Get_Multi_Master( T1_Face           face,
                        FT_Multi_Master*  master )
   {
@@ -212,7 +212,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   T1_Set_MM_Blend( T1_Face    face,
                    FT_UInt    num_coords,
                    FT_Fixed*  coords )
@@ -258,7 +258,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   T1_Set_MM_Design( T1_Face   face,
                     FT_UInt   num_coords,
                     FT_Long*  coords )
@@ -328,7 +328,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   T1_Done_Blend( T1_Face  face )
   {
     FT_Memory  memory = face->root.memory;
@@ -1637,7 +1637,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   T1_Open_Face( T1_Face  face )
   {
     T1_Loader  loader;
--- a/src/type1/t1load.h
+++ b/src/type1/t1load.h
@@ -51,26 +51,26 @@
   } T1_Loader;
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   T1_Open_Face( T1_Face  face );
 
 #ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   T1_Get_Multi_Master( T1_Face           face,
                        FT_Multi_Master*  master );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   T1_Set_MM_Blend( T1_Face    face,
                    FT_UInt    num_coords,
                    FT_Fixed*  coords );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   T1_Set_MM_Design( T1_Face   face,
                     FT_UInt   num_coords,
                     FT_Long*  coords );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   T1_Done_Blend( T1_Face  face );
 
 #endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */
--- a/src/type1/t1objs.c
+++ b/src/type1/t1objs.c
@@ -71,7 +71,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   T1_Size_Done( T1_Size  size )
   {
     if ( size->root.internal )
@@ -88,7 +88,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   T1_Size_Init( T1_Size  size )
   {
     FT_Error           error = 0;
@@ -111,7 +111,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   T1_Size_Reset( T1_Size  size )
   {
     PSH_Globals_Funcs  funcs = T1_Size_Get_Globals_Funcs( size );
@@ -133,7 +133,7 @@
   /*                                                                       */
   /*************************************************************************/
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   T1_GlyphSlot_Done( T1_GlyphSlot  slot )
   {
     slot->root.internal->glyph_hints = 0;
@@ -140,7 +140,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   T1_GlyphSlot_Init( T1_GlyphSlot   slot )
   {
     T1_Face              face;
@@ -183,7 +183,7 @@
   /* <Input>                                                               */
   /*    face :: A typeless pointer to the face object to destroy.          */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   T1_Face_Done( T1_Face  face )
   {
     FT_Memory  memory;
@@ -267,7 +267,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   T1_Face_Init( FT_Stream      stream,
                 T1_Face        face,
                 FT_Int         face_index,
@@ -530,7 +530,7 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   T1_Driver_Init( T1_Driver  driver )
   {
     FT_UNUSED( driver );
@@ -550,7 +550,7 @@
   /* <Input>                                                               */
   /*    driver  :: A handle to the target Type 1 driver.                   */
   /*                                                                       */
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   T1_Driver_Done( T1_Driver  driver )
   {
     FT_UNUSED( driver );
--- a/src/type1/t1objs.h
+++ b/src/type1/t1objs.h
@@ -105,13 +105,13 @@
   } T1_SizeRec;
 
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   T1_Size_Done( T1_Size  size );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   T1_Size_Reset( T1_Size  size );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   T1_Size_Init( T1_Size  size );
 
 
@@ -139,7 +139,7 @@
   } T1_GlyphSlotRec;
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   T1_Face_Init( FT_Stream      stream,
                 T1_Face        face,
                 FT_Int         face_index,
@@ -146,19 +146,19 @@
                 FT_Int         num_params,
                 FT_Parameter*  params );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   T1_Face_Done( T1_Face  face );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   T1_GlyphSlot_Init( T1_GlyphSlot  slot );
   
-  FT_LOCAL void
+  FT_LOCAL( void )
   T1_GlyphSlot_Done( T1_GlyphSlot  slot );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   T1_Driver_Init( T1_Driver  driver );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   T1_Driver_Done( T1_Driver  driver );
 
 
--- a/src/type1/t1parse.c
+++ b/src/type1/t1parse.c
@@ -118,7 +118,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   T1_New_Parser( T1_Parser      parser,
                  FT_Stream      stream,
                  FT_Memory      memory,
@@ -227,7 +227,7 @@
   }
 
 
-  FT_LOCAL_DEF void
+  FT_LOCAL_DEF( void )
   T1_Finalize_Parser( T1_Parser  parser )
   {
     FT_Memory   memory = parser->root.memory;
@@ -267,7 +267,7 @@
   }
 
 
-  FT_LOCAL_DEF FT_Error
+  FT_LOCAL_DEF( FT_Error )
   T1_Get_Private_Dict( T1_Parser      parser,
                        PSAux_Service  psaux )
   {
--- a/src/type1/t1parse.h
+++ b/src/type1/t1parse.h
@@ -113,17 +113,17 @@
           (p)->root.funcs.load_field_table( &(p)->root, f, o, m, pf )
 
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   T1_New_Parser( T1_Parser      parser,
                  FT_Stream      stream,
                  FT_Memory      memory,
                  PSAux_Service  psaux );
 
-  FT_LOCAL FT_Error
+  FT_LOCAL( FT_Error )
   T1_Get_Private_Dict( T1_Parser      parser,
                        PSAux_Service  psaux );
 
-  FT_LOCAL void
+  FT_LOCAL( void )
   T1_Finalize_Parser( T1_Parser  parser );
 
 
--- a/src/winfonts/winfnt.c
+++ b/src/winfonts/winfnt.c
@@ -310,6 +310,141 @@
   }
 
 
+
+#ifdef FT_CONFIG_OPTION_USE_CMAPS
+
+  typedef struct FNT_CMapRec_
+  {
+    FT_CMapRec  cmap;
+    FT_UInt32   first;
+    FT_UInt32   count;
+
+  } FNT_CMapRec, *FNT_CMap;
+
+
+  static FT_Error
+  fnt_cmap_init( FT_CMap  cmap )
+  {
+    FNT_Face   face = (FNT_Face) FT_CMAP_FACE(cmap);
+    FNT_Font*  font = face->fonts;
+
+    cmap->first = (FT_UInt32) font->header.first_char;
+    cmap->count = (FT_UInt32)(font->header.last_char - cmap->first + 1);
+
+    return 0;
+  }
+
+
+  static FT_UInt
+  fnt_cmap_char_index( FT_CMap    cmap,
+                       FT_UInt32  char_code )
+  {
+    FT_UInt    gindex = 0;
+
+    char_code -= cmap->first;
+    if ( char_code < cmap->count )
+      gindex = char_code + 1;
+
+    return gindex;
+  }
+
+
+  static FT_UInt32
+  fnt_cmap_char_next( FT_CMap    cmap,
+                      FT_UInt32  char_code,
+                      FT_UInt   *agindex )
+  {
+    FT_UInt    gindex = 0;
+    FT_UInt32  result = 0;
+
+    char_code ++;
+    if ( char_code <= cmap->first )
+    {
+      result = cmap->first;
+      gindex = 1;
+    }
+    else
+    {
+      char_code -= cmap->first;
+      if ( char_code < cmap->count )
+      {
+        result = cmap->first + char_code;
+        gindex = char_code + 1;
+      }
+    }
+
+    *agindex = gindex;
+    return result;
+  }
+
+  static FT_CMap_ClassRec  fnt_cmap_class_rec =
+  {
+    sizeof( FNT_CMapRec ),
+    (FT_CMap_InitFunc)        fnt_cmap_init,
+    (FT_CMap_DoneFunc)        NULL,
+    (FT_CMap_CharIndexFunc)   fnt_cmap_char_index,
+    (FT_CMap_CharNextFunc)    fnt_cmap_char_next
+  };
+
+  static FT_CMap_Class   fnt_cmap_class = &fnt_cmap_class_rec;
+
+#else /* !FT_CONFIG_OPTION_USE_CMAPS */
+
+  static FT_UInt
+  FNT_Get_Char_Index( FT_CharMap  charmap,
+                      FT_Long     char_code )
+  {
+    FT_Long  result = char_code;
+
+
+    if ( charmap )
+    {
+      FNT_Font*  font  = ((FNT_Face)charmap->face)->fonts;
+      FT_Long    first = font->header.first_char;
+      FT_Long    count = font->header.last_char - first + 1;
+
+
+      char_code -= first;
+      if ( char_code < count )
+        result = char_code + 1;
+      else
+        result = 0;
+    }
+
+    return result;
+  }
+
+  static FT_Long
+  FNT_Get_Next_Char( FT_CharMap  charmap,
+                     FT_Long     char_code )
+  {
+    FT_ULong  result = 0;
+    FT_UInt   gindex = 0;
+
+    char_code++;
+    if ( charmap )
+    {
+      FNT_Font*  font  = ((FNT_Face)charmap->face)->fonts;
+      FT_Long    first = font->header.first_char;
+
+
+      if ( char_code < first )
+        char_code = first;
+      if ( char_code <= font->header.last_char )
+        return char_code;
+    }
+    else
+      return char_code;
+    return 0;
+  }
+
+#endif /* !FT_CONFIG_OPTION_USE_CMAPS */
+
+
+
+
+
+
   static void
   FNT_Face_Done( FNT_Face  face )
   {
@@ -399,6 +534,25 @@
         }
       }
 
+#ifdef FT_CONFIG_OPTION_USE_CMAPS
+
+      {
+        FT_CharMapRec  charmap;
+
+        charmap.encoding    = ft_encoding_unicode;
+        charmap.platform_id = 3;
+        charmap.encoding_id = 1;
+        charmap.face        = root;
+
+        error = FT_CMap_New( fnt_cmap_class,
+                             NULL,
+                             &charmap,
+                             NULL );
+        if (error) goto Fail;
+      }
+
+#else /* !FT_CONFIG_OPTION_USE_CMAPS */
+
       /* Setup the `charmaps' array */
       root->charmaps     = &face->charmap_handle;
       root->num_charmaps = 1;
@@ -412,6 +566,8 @@
 
       root->charmap = face->charmap_handle;
 
+#endif /* !FT_CONFIG_OPTION_USE_CMAPS */
+
       /* setup remaining flags */
       root->num_glyphs = fonts->header.last_char -
                          fonts->header.first_char + 1;
@@ -467,52 +623,6 @@
     }
 
     return ( size->font ? FNT_Err_Ok : FNT_Err_Invalid_Pixel_Size );
-  }
-
-
-  static FT_UInt
-  FNT_Get_Char_Index( FT_CharMap  charmap,
-                      FT_Long     char_code )
-  {
-    FT_Long  result = char_code;
-
-
-    if ( charmap )
-    {
-      FNT_Font*  font  = ((FNT_Face)charmap->face)->fonts;
-      FT_Long    first = font->header.first_char;
-      FT_Long    count = font->header.last_char - first + 1;
-
-
-      char_code -= first;
-      if ( char_code < count )
-        result = char_code + 1;
-      else
-        result = 0;
-    }
-
-    return result;
-  }
-
-  static FT_Long
-  FNT_Get_Next_Char( FT_CharMap  charmap,
-                     FT_Long     char_code )
-  {
-    char_code++;
-    if ( charmap )
-    {
-      FNT_Font*  font  = ((FNT_Face)charmap->face)->fonts;
-      FT_Long    first = font->header.first_char;
-
-
-      if ( char_code < first )
-        char_code = first;
-      if ( char_code <= font->header.last_char )
-        return char_code;
-    }
-    else
-      return char_code;
-    return 0;
   }