shithub: freetype+ttf2subf

Download patch

ref: b9b2cac6343caca35e3f8f5818b4f1018e8f44c5
parent: ee06410b0aabc0ae466fd8919b4e4850056ae679
author: David Turner <[email protected]>
date: Wed Jul 10 12:52:06 EDT 2002

* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
    to support charmaps for CFF fonts

    * src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
    src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
    src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
    sources, and removing some bugs in the Encoding and Charset loaders

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2002-07-10  David Turner  <[email protected]>
+
+    * src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
+    to support charmaps for CFF fonts
+
+    * src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
+    src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
+    src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
+    sources, and removing some bugs in the Encoding and Charset loaders
+
 2002-07-09  Owen Taylor   <[email protected]>
 
     * src/pshinter/pshglob.c: fixed a bug that prevented the hinter from using
--- a/include/freetype/internal/cfftypes.h
+++ b/include/freetype/internal/cfftypes.h
@@ -68,8 +68,9 @@
     FT_UInt     format;
     FT_ULong    offset;
 
-    FT_UShort*  sids;
-    FT_UShort*  codes;
+    FT_UInt     count;
+    FT_UShort   sids [256];  /* avoid dynamic allocations */
+    FT_UShort   codes[256];
 
   } CFF_EncodingRec, *CFF_Encoding;
 
@@ -240,6 +241,9 @@
 
     /* interface to PostScript hinter */
     void*            pshinter;
+
+    /* interface to Postscript Names service */
+    void*            psnames;
 
   } CFF_FontRec, *CFF_Font;
 
--- a/src/cff/Jamfile
+++ b/src/cff/Jamfile
@@ -10,7 +10,7 @@
 
   if $(FT2_MULTI)
   {
-    _sources = cffdrivr cffgload cffload cffobjs cffparse ;
+    _sources = cffdrivr cffgload cffload cffobjs cffparse cffcmap ;
   }
   else
   {
--- a/src/cff/cff.c
+++ b/src/cff/cff.c
@@ -24,6 +24,6 @@
 #include "cffload.c"
 #include "cffobjs.c"
 #include "cffgload.c"
-
+#include "cffcmap.c"
 
 /* END */
--- /dev/null
+++ b/src/cff/cffcmap.c
@@ -1,0 +1,301 @@
+#include "cffcmap.h"
+#include "cffload.h"
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****           CFF  STANDARD (AND EXPERT) ENCODING CMAPS           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_CALLBACK_DEF( FT_Error )
+  cff_cmap_encoding_init( CFF_CMapStd  cmap )
+  {
+    TT_Face          face     = (TT_Face)FT_CMAP_FACE( cmap );
+    CFF_Font         cff      = face->extra.data;
+    CFF_Encoding     encoding = &cff->encoding;
+    PSNames_Service  psnames  = cff->psnames;
+
+    cmap->count = encoding->count;
+    cmap->gids  = encoding->codes;
+    
+    return 0;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  cff_cmap_encoding_done( CFF_CMapStd  cmap )
+  {
+    cmap->count = 0;
+    cmap->gids  = NULL;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  cff_cmap_encoding_char_index( CFF_CMapStd  cmap,
+                                FT_UInt32    char_code )
+  {
+    FT_UInt  result = 0;
+
+    if ( char_code < cmap->count )
+      result = cmap->gids[ char_code ];
+    
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  cff_cmap_encoding_char_next( CFF_CMapStd   cmap,
+                               FT_UInt32   *pchar_code )
+  {
+    FT_UInt    result    = 0;
+    FT_UInt32  char_code = *pchar_code;
+    
+    *pchar_code = 0;
+
+    if ( char_code < cmap->count )
+    {
+      FT_UInt  code = (FT_UInt)(char_code+1);
+      
+      for (;;)
+      {
+        if ( code >= cmap->count )
+          break;
+          
+        result = cmap->gids[ code ];
+        if ( result != 0 )
+        {
+          *pchar_code = code;
+          break;
+        }
+          
+        code++;
+      }
+    }
+    return result;
+  }
+
+
+
+  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
+  cff_cmap_encoding_class_rec =
+  {
+    sizeof ( CFF_CMapStdRec ),
+
+    (FT_CMap_InitFunc)     cff_cmap_encoding_init,
+    (FT_CMap_DoneFunc)     cff_cmap_encoding_done,
+    (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index,
+    (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next
+  };
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****              CFF SYNTHETIC UNICODE ENCODING CMAP              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_CALLBACK_DEF( FT_Int )
+  cff_cmap_uni_pair_compare( const void*  pair1,
+                             const void*  pair2 )
+  {
+    FT_UInt32  u1 = ((CFF_CMapUniPair)pair1)->unicode;
+    FT_UInt32  u2 = ((CFF_CMapUniPair)pair2)->unicode;
+    
+
+    if ( u1 < u2 )
+      return -1;
+      
+    if ( u1 > u2 )
+      return +1;
+      
+    return 0;
+  }                            
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  cff_cmap_unicode_init( CFF_CMapUnicode  cmap )
+  {
+    FT_Error         error;
+    FT_UInt          count;
+    TT_Face          face    = (TT_Face)FT_CMAP_FACE( cmap );
+    FT_Memory        memory  = FT_FACE_MEMORY( face );
+    CFF_Font         cff     = face->extra.data;
+    CFF_Charset      charset = &cff->charset;
+    PSNames_Service  psnames = cff->psnames;
+
+
+    cmap->num_pairs = 0;
+    cmap->pairs     = NULL;
+
+    count = face->root.num_glyphs;
+
+    if ( !FT_NEW_ARRAY( cmap->pairs, count ) )
+    {
+      FT_UInt          n, new_count;
+      CFF_CMapUniPair  pair;
+      FT_UInt32        uni_code;
+
+
+      pair = cmap->pairs;
+      for ( n = 0; n < count; n++ )
+      {
+        FT_UInt      sid   = charset->sids[n];
+        const char*  gname;
+
+        gname = cff_index_get_sid_string( &cff->string_index, sid, psnames );
+         
+        /* build unsorted pair table by matching glyph names */
+        if ( gname )
+        {
+          uni_code = psnames->unicode_value( gname );
+
+          if ( uni_code != 0 )
+          {
+            pair->unicode = uni_code;
+            pair->gindex  = n;
+            pair++;
+          }
+          
+          FT_FREE( gname );
+        }
+      }
+
+      new_count = (FT_UInt)( pair - cmap->pairs );
+      if ( new_count == 0 )
+      {
+        /* there are no unicode characters in here! */
+        FT_FREE( cmap->pairs );
+        error = FT_Err_Invalid_Argument;
+      }
+      else
+      {
+        /* re-allocate if the new array is much smaller than the original */
+        /* one                                                            */
+        if ( new_count != count && new_count < count / 2 )
+        {
+          (void)FT_RENEW_ARRAY( cmap->pairs, count, new_count );
+          error = 0;
+        }
+
+        /* sort the pairs table to allow efficient binary searches */
+        ft_qsort( cmap->pairs,
+                  new_count,
+                  sizeof ( CFF_CMapUniPairRec ),
+                  cff_cmap_uni_pair_compare );
+
+        cmap->num_pairs = new_count;
+      }
+    }
+
+    return error;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  cff_cmap_unicode_done( CFF_CMapUnicode  cmap )
+  {
+    FT_Face    face   = FT_CMAP_FACE(cmap);
+    FT_Memory  memory = FT_FACE_MEMORY(face);
+
+    FT_FREE( cmap->pairs );
+    cmap->num_pairs = 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  cff_cmap_unicode_char_index( CFF_CMapUnicode  cmap,
+                              FT_UInt32       char_code )
+  {
+    FT_UInt         min = 0;
+    FT_UInt         max = cmap->num_pairs;
+    FT_UInt         mid;
+    CFF_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
+        max = mid;
+    }
+    return 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  cff_cmap_unicode_char_next( CFF_CMapUnicode  cmap,
+                             FT_UInt32      *pchar_code )
+  {
+    FT_UInt    result    = 0;
+    FT_UInt32  char_code = *pchar_code + 1;
+
+
+  Restart:
+    {
+      FT_UInt         min = 0;
+      FT_UInt         max = cmap->num_pairs;
+      FT_UInt         mid;
+      CFF_CMapUniPair  pair;
+
+
+      while ( min < max )
+      {
+        mid  = min + ( ( max - min ) >> 1 );
+        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->pairs + min;
+        result = pair->gindex;
+        if ( result != 0 )
+          char_code = pair->unicode;
+      }
+    }
+
+  Exit:
+    *pchar_code = char_code;
+    return result;
+  }
+
+
+  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
+  cff_cmap_unicode_class_rec =
+  {
+    sizeof ( CFF_CMapUnicodeRec ),
+
+    (FT_CMap_InitFunc)     cff_cmap_unicode_init,
+    (FT_CMap_DoneFunc)     cff_cmap_unicode_done,
+    (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index,
+    (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next
+  };
+
--- /dev/null
+++ b/src/cff/cffcmap.h
@@ -1,0 +1,66 @@
+#ifndef __CFF_CMAP_H__
+#define __CFF_CMAP_H__
+
+#include "cffobjs.h"
+
+FT_BEGIN_HEADER
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****          TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* standard (and expert) encoding cmaps */
+  typedef struct CFF_CMapStdRec_*  CFF_CMapStd;
+
+  typedef struct  CFF_CMapStdRec_
+  {
+    FT_CMapRec    cmap;
+    FT_UInt       count;
+    FT_UShort*    gids;   /* up to 256 elements */
+    
+  } CFF_CMapStdRec;
+
+
+  FT_CALLBACK_TABLE const FT_CMap_ClassRec
+  cff_cmap_encoding_class_rec;
+
+  
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****               CFF SYNTHETIC UNICODE ENCODING CMAP             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* unicode (synthetic) cmaps */
+  typedef struct CFF_CMapUnicodeRec_*  CFF_CMapUnicode;
+
+  typedef struct  CFF_CMapUniPairRec_
+  {
+    FT_UInt32  unicode;
+    FT_UInt    gindex;
+  
+  } CFF_CMapUniPairRec, *CFF_CMapUniPair;
+
+
+  typedef struct  CFF_CMapUnicodeRec_
+  {
+    FT_CMapRec       cmap;
+    FT_UInt          num_pairs;
+    CFF_CMapUniPair  pairs;
+
+  } CFF_CMapUnicodeRec;
+
+
+  FT_CALLBACK_TABLE const FT_CMap_ClassRec
+  cff_cmap_unicode_class_rec;
+
+
+FT_END_HEADER
+
+#endif /* __CFF_CMAP_H__ */
--- a/src/cff/cffdrivr.c
+++ b/src/cff/cffdrivr.c
@@ -201,7 +201,7 @@
     }
 
     /* now load the glyph outline if necessary */
-    error = CFF_Load_Glyph( slot, size, glyph_index, load_flags );
+    error = cff_slot_load( slot, size, glyph_index, load_flags );
 
     /* force drop-out mode to 2 - irrelevant now */
     /* slot->outline.dropout_mode = 2; */
@@ -253,7 +253,7 @@
     sid = font->charset.sids[glyph_index];
 
     /* now, lookup the name itself */
-    gname = CFF_Get_String( &font->string_index, sid, psnames );
+    gname = cff_index_get_sid_string( &font->string_index, sid, psnames );
 
     if ( buffer_max > 0 )
     {
@@ -406,7 +406,7 @@
       sid = charset->sids[i];
 
       if ( sid > 390 )
-        name = CFF_Get_Name( &cff->string_index, sid - 391 );
+        name = cff_index_get_name( &cff->string_index, sid - 391 );
       else
         name = (FT_String *)psnames->adobe_std_strings( sid );
 
@@ -477,8 +477,8 @@
 
       0,   /* module-specific interface */
 
-      (FT_Module_Constructor)CFF_Driver_Init,
-      (FT_Module_Destructor) CFF_Driver_Done,
+      (FT_Module_Constructor)cff_driver_init,
+      (FT_Module_Destructor) cff_driver_done,
       (FT_Module_Requester)  cff_get_interface,
     },
 
@@ -487,15 +487,15 @@
     sizeof( FT_SizeRec ),
     sizeof( CFF_GlyphSlotRec ),
 
-    (FT_Face_InitFunc)        CFF_Face_Init,
-    (FT_Face_DoneFunc)        CFF_Face_Done,
-    (FT_Size_InitFunc)        CFF_Size_Init,
-    (FT_Size_DoneFunc)        CFF_Size_Done,
-    (FT_Slot_InitFunc)        CFF_GlyphSlot_Init,
-    (FT_Slot_DoneFunc)        CFF_GlyphSlot_Done,
+    (FT_Face_InitFunc)        cff_face_init,
+    (FT_Face_DoneFunc)        cff_face_done,
+    (FT_Size_InitFunc)        cff_size_init,
+    (FT_Size_DoneFunc)        cff_size_done,
+    (FT_Slot_InitFunc)        cff_slot_init,
+    (FT_Slot_DoneFunc)        cff_slot_done,
 
-    (FT_Size_ResetPointsFunc) CFF_Size_Reset,
-    (FT_Size_ResetPixelsFunc) CFF_Size_Reset,
+    (FT_Size_ResetPointsFunc) cff_size_reset,
+    (FT_Size_ResetPixelsFunc) cff_size_reset,
 
     (FT_Slot_LoadFunc)        Load_Glyph,
     (FT_CharMap_CharIndexFunc)cff_get_char_index,
--- a/src/cff/cffgload.c
+++ b/src/cff/cffgload.c
@@ -207,7 +207,7 @@
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
-  /*    CFF_Builder_Init                                                   */
+  /*    cff_builder_init                                                   */
   /*                                                                       */
   /* <Description>                                                         */
   /*    Initializes a given glyph builder.                                 */
@@ -223,7 +223,7 @@
   /*    glyph   :: The current glyph object.                               */
   /*                                                                       */
   static void
-  CFF_Builder_Init( CFF_Builder*   builder,
+  cff_builder_init( CFF_Builder*   builder,
                     TT_Face        face,
                     CFF_Size       size,
                     CFF_GlyphSlot  glyph,
@@ -276,7 +276,7 @@
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
-  /*    CFF_Builder_Done                                                   */
+  /*    cff_builder_done                                                   */
   /*                                                                       */
   /* <Description>                                                         */
   /*    Finalizes a given glyph builder.  Its contents can still be used   */
@@ -287,7 +287,7 @@
   /*    builder :: A pointer to the glyph builder to finalize.             */
   /*                                                                       */
   static void
-  CFF_Builder_Done( CFF_Builder*  builder )
+  cff_builder_done( CFF_Builder*  builder )
   {
     CFF_GlyphSlot  glyph = builder->glyph;
 
@@ -331,7 +331,7 @@
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
-  /*    CFF_Init_Decoder                                                   */
+  /*    cff_decoder_init                                                   */
   /*                                                                       */
   /* <Description>                                                         */
   /*    Initializes a given glyph decoder.                                 */
@@ -347,7 +347,7 @@
   /*    slot    :: The current glyph object.                               */
   /*                                                                       */
   FT_LOCAL_DEF( void )
-  CFF_Init_Decoder( CFF_Decoder*   decoder,
+  cff_decoder_init( CFF_Decoder*   decoder,
                     TT_Face        face,
                     CFF_Size       size,
                     CFF_GlyphSlot  slot,
@@ -360,7 +360,7 @@
     FT_MEM_SET( decoder, 0, sizeof ( *decoder ) );
 
     /* initialize builder */
-    CFF_Builder_Init( &decoder->builder, face, size, slot, hinting );
+    cff_builder_init( &decoder->builder, face, size, slot, hinting );
 
     /* initialize Type2 decoder */
     decoder->num_globals  = cff->num_global_subrs;
@@ -371,7 +371,7 @@
 
   /* this function is used to select the locals subrs array */
   FT_LOCAL_DEF( void )
-  CFF_Prepare_Decoder( CFF_Decoder*  decoder,
+  cff_decoder_prepare( CFF_Decoder*  decoder,
                        FT_UInt       glyph_index )
   {
     CFF_Font     cff = (CFF_Font)decoder->builder.face->extra.data;
@@ -381,7 +381,7 @@
     /* manage CID fonts */
     if ( cff->num_subfonts >= 1 )
     {
-      FT_Byte  fd_index = CFF_Get_FD( &cff->fd_select, glyph_index );
+      FT_Byte  fd_index = cff_fd_select_get( &cff->fd_select, glyph_index );
 
 
       sub = cff->subfonts[fd_index];
@@ -407,10 +407,10 @@
 
   /* add a new point, do not check space */
   static void
-  add_point( CFF_Builder*  builder,
-             FT_Pos        x,
-             FT_Pos        y,
-             FT_Byte       flag )
+  cff_builder_add_point( CFF_Builder*  builder,
+                         FT_Pos        x,
+                         FT_Pos        y,
+                         FT_Byte       flag )
   {
     FT_Outline*  outline = builder->current;
 
@@ -434,9 +434,9 @@
 
   /* check space for a new on-curve point, then add it */
   static FT_Error
-  add_point1( CFF_Builder*  builder,
-              FT_Pos        x,
-              FT_Pos        y )
+  cff_builder_cff_builder_add_point1( CFF_Builder*  builder,
+                          FT_Pos        x,
+                          FT_Pos        y )
   {
     FT_Error  error;
 
@@ -443,7 +443,7 @@
 
     error = check_points( builder, 1 );
     if ( !error )
-      add_point( builder, x, y, 1 );
+      cff_builder_add_point( builder, x, y, 1 );
 
     return error;
   }
@@ -451,7 +451,7 @@
 
   /* check room for a new contour, then add it */
   static FT_Error
-  add_contour( CFF_Builder*  builder )
+  cff_builder_add_contour( CFF_Builder*  builder )
   {
     FT_Outline*  outline = builder->current;
     FT_Error     error;
@@ -479,9 +479,9 @@
 
   /* if a path was begun, add its first on-curve point */
   static FT_Error
-  start_point( CFF_Builder*  builder,
-               FT_Pos        x,
-               FT_Pos        y )
+  cff_builder_start_point( CFF_Builder*  builder,
+                           FT_Pos        x,
+                           FT_Pos        y )
   {
     FT_Error  error = 0;
 
@@ -490,9 +490,9 @@
     if ( !builder->path_begun )
     {
       builder->path_begun = 1;
-      error = add_contour( builder );
+      error = cff_builder_add_contour( builder );
       if ( !error )
-        error = add_point1( builder, x, y );
+        error = cff_builder_cff_builder_add_point1( builder, x, y );
     }
 
     return error;
@@ -501,7 +501,7 @@
 
   /* close the current contour */
   static void
-  close_contour( CFF_Builder*  builder )
+  cff_builder_close_contour( CFF_Builder*  builder )
   {
     FT_Outline*  outline = builder->current;
 
@@ -548,7 +548,7 @@
       return -1;
 
     /* Get code to SID mapping from `cff_standard_encoding'. */
-    glyph_sid = CFF_Get_Standard_Encoding( (FT_UInt)charcode );
+    glyph_sid = cff_get_standard_encoding( (FT_UInt)charcode );
 
     for ( n = 0; n < cff->num_glyphs; n++ )
     {
@@ -626,16 +626,16 @@
     }
 
     /* First load `bchar' in builder */
-    error = CFF_Access_Element( &cff->charstrings_index, bchar_index,
+    error = cff_index_access_element( &cff->charstrings_index, bchar_index,
                                 &charstring, &charstring_len );
     if ( !error )
     {
-      error = CFF_Parse_CharStrings( decoder, charstring, charstring_len );
+      error = cff_decoder_parse_charstrings( decoder, charstring, charstring_len );
 
       if ( error )
         goto Exit;
 
-      CFF_Forget_Element( &cff->charstrings_index, &charstring );
+      cff_index_forget_element( &cff->charstrings_index, &charstring );
     }
 
     n_base_points = base->n_points;
@@ -650,16 +650,16 @@
     decoder->builder.left_bearing.y = 0;
 
     /* Now load `achar' on top of the base outline. */
-    error = CFF_Access_Element( &cff->charstrings_index, achar_index,
+    error = cff_index_access_element( &cff->charstrings_index, achar_index,
                                 &charstring, &charstring_len );
     if ( !error )
     {
-      error = CFF_Parse_CharStrings( decoder, charstring, charstring_len );
+      error = cff_decoder_parse_charstrings( decoder, charstring, charstring_len );
 
       if ( error )
         goto Exit;
 
-      CFF_Forget_Element( &cff->charstrings_index, &charstring );
+      cff_index_forget_element( &cff->charstrings_index, &charstring );
     }
 
     /* Restore the left side bearing and advance width */
@@ -687,7 +687,7 @@
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
-  /*    CFF_Parse_CharStrings                                              */
+  /*    cff_decoder_parse_charstrings                                      */
   /*                                                                       */
   /* <Description>                                                         */
   /*    Parses a given Type 2 charstrings program.                         */
@@ -704,7 +704,7 @@
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
   FT_LOCAL_DEF( FT_Error )
-  CFF_Parse_CharStrings( CFF_Decoder*  decoder,
+  cff_decoder_parse_charstrings( CFF_Decoder*  decoder,
                          FT_Byte*      charstring_base,
                          FT_Int        charstring_len )
   {
@@ -1147,7 +1147,7 @@
         case cff_op_rmoveto:
           FT_TRACE4(( " rmoveto" ));
 
-          close_contour( builder );
+          cff_builder_close_contour( builder );
           builder->path_begun = 0;
           x   += args[0];
           y   += args[1];
@@ -1157,7 +1157,7 @@
         case cff_op_vmoveto:
           FT_TRACE4(( " vmoveto" ));
 
-          close_contour( builder );
+          cff_builder_close_contour( builder );
           builder->path_begun = 0;
           y   += args[0];
           args = stack;
@@ -1166,7 +1166,7 @@
         case cff_op_hmoveto:
           FT_TRACE4(( " hmoveto" ));
 
-          close_contour( builder );
+          cff_builder_close_contour( builder );
           builder->path_begun = 0;
           x   += args[0];
           args = stack;
@@ -1175,7 +1175,7 @@
         case cff_op_rlineto:
           FT_TRACE4(( " rlineto" ));
 
-          if ( start_point ( builder, x, y )         ||
+          if ( cff_builder_start_point ( builder, x, y )         ||
                check_points( builder, num_args / 2 ) )
             goto Memory_Error;
 
@@ -1187,7 +1187,7 @@
           {
             x += args[0];
             y += args[1];
-            add_point( builder, x, y, 1 );
+            cff_builder_add_point( builder, x, y, 1 );
             args += 2;
           }
           args = stack;
@@ -1202,7 +1202,7 @@
             FT_TRACE4(( op == cff_op_hlineto ? " hlineto"
                                              : " vlineto" ));
 
-            if ( start_point ( builder, x, y )     ||
+            if ( cff_builder_start_point ( builder, x, y )     ||
                  check_points( builder, num_args ) )
               goto Memory_Error;
 
@@ -1214,7 +1214,7 @@
               else
                 y += args[0];
 
-              if ( add_point1( builder, x, y ) )
+              if ( cff_builder_cff_builder_add_point1( builder, x, y ) )
                 goto Memory_Error;
 
               args++;
@@ -1231,7 +1231,7 @@
           if ( num_args % 6 != 0 )
             goto Stack_Underflow;
 
-          if ( start_point ( builder, x, y )         ||
+          if ( cff_builder_start_point ( builder, x, y )         ||
                check_points( builder, num_args / 2 ) )
             goto Memory_Error;
 
@@ -1240,13 +1240,13 @@
           {
             x += args[0];
             y += args[1];
-            add_point( builder, x, y, 0 );
+            cff_builder_add_point( builder, x, y, 0 );
             x += args[2];
             y += args[3];
-            add_point( builder, x, y, 0 );
+            cff_builder_add_point( builder, x, y, 0 );
             x += args[4];
             y += args[5];
-            add_point( builder, x, y, 1 );
+            cff_builder_add_point( builder, x, y, 1 );
             args += 6;
           }
           args = stack;
@@ -1255,7 +1255,7 @@
         case cff_op_vvcurveto:
           FT_TRACE4(( " vvcurveto" ));
 
-          if ( start_point ( builder, x, y ) )
+          if ( cff_builder_start_point ( builder, x, y ) )
             goto Memory_Error;
 
           args = stack;
@@ -1275,12 +1275,12 @@
           while ( args < decoder->top )
           {
             y += args[0];
-            add_point( builder, x, y, 0 );
+            cff_builder_add_point( builder, x, y, 0 );
             x += args[1];
             y += args[2];
-            add_point( builder, x, y, 0 );
+            cff_builder_add_point( builder, x, y, 0 );
             y += args[3];
-            add_point( builder, x, y, 1 );
+            cff_builder_add_point( builder, x, y, 1 );
             args += 4;
           }
           args = stack;
@@ -1289,7 +1289,7 @@
         case cff_op_hhcurveto:
           FT_TRACE4(( " hhcurveto" ));
 
-          if ( start_point ( builder, x, y ) )
+          if ( cff_builder_start_point ( builder, x, y ) )
             goto Memory_Error;
 
           args = stack;
@@ -1309,12 +1309,12 @@
           while ( args < decoder->top )
           {
             x += args[0];
-            add_point( builder, x, y, 0 );
+            cff_builder_add_point( builder, x, y, 0 );
             x += args[1];
             y += args[2];
-            add_point( builder, x, y, 0 );
+            cff_builder_add_point( builder, x, y, 0 );
             x += args[3];
-            add_point( builder, x, y, 1 );
+            cff_builder_add_point( builder, x, y, 1 );
             args += 4;
           }
           args = stack;
@@ -1329,7 +1329,7 @@
             FT_TRACE4(( op == cff_op_vhcurveto ? " vhcurveto"
                                                : " hvcurveto" ));
 
-            if ( start_point ( builder, x, y ) )
+            if ( cff_builder_start_point ( builder, x, y ) )
               goto Memory_Error;
 
             args = stack;
@@ -1347,26 +1347,26 @@
               if ( phase )
               {
                 x += args[0];
-                add_point( builder, x, y, 0 );
+                cff_builder_add_point( builder, x, y, 0 );
                 x += args[1];
                 y += args[2];
-                add_point( builder, x, y, 0 );
+                cff_builder_add_point( builder, x, y, 0 );
                 y += args[3];
                 if ( num_args == 1 )
                   x += args[4];
-                add_point( builder, x, y, 1 );
+                cff_builder_add_point( builder, x, y, 1 );
               }
               else
               {
                 y += args[0];
-                add_point( builder, x, y, 0 );
+                cff_builder_add_point( builder, x, y, 0 );
                 x += args[1];
                 y += args[2];
-                add_point( builder, x, y, 0 );
+                cff_builder_add_point( builder, x, y, 0 );
                 x += args[3];
                 if ( num_args == 1 )
                   y += args[4];
-                add_point( builder, x, y, 1 );
+                cff_builder_add_point( builder, x, y, 1 );
               }
               args  += 4;
               phase ^= 1;
@@ -1385,7 +1385,7 @@
             if ( num_args < 8 || ( num_args - 6 ) & 1 )
               goto Stack_Underflow;
 
-            if ( start_point( builder, x, y )           ||
+            if ( cff_builder_start_point( builder, x, y )           ||
                  check_points( builder, num_lines + 3 ) )
               goto Memory_Error;
 
@@ -1396,7 +1396,7 @@
             {
               x += args[0];
               y += args[1];
-              add_point( builder, x, y, 1 );
+              cff_builder_add_point( builder, x, y, 1 );
               args += 2;
               num_lines--;
             }
@@ -1404,13 +1404,13 @@
             /* then the curve */
             x += args[0];
             y += args[1];
-            add_point( builder, x, y, 0 );
+            cff_builder_add_point( builder, x, y, 0 );
             x += args[2];
             y += args[3];
-            add_point( builder, x, y, 0 );
+            cff_builder_add_point( builder, x, y, 0 );
             x += args[4];
             y += args[5];
-            add_point( builder, x, y, 1 );
+            cff_builder_add_point( builder, x, y, 1 );
             args = stack;
           }
           break;
@@ -1425,7 +1425,7 @@
             if ( num_args < 8 || ( num_args - 2 ) % 6 )
               goto Stack_Underflow;
 
-            if ( start_point ( builder, x, y )             ||
+            if ( cff_builder_start_point ( builder, x, y )             ||
                  check_points( builder, num_curves*3 + 2 ) )
               goto Memory_Error;
 
@@ -1436,13 +1436,13 @@
             {
               x += args[0];
               y += args[1];
-              add_point( builder, x, y, 0 );
+              cff_builder_add_point( builder, x, y, 0 );
               x += args[2];
               y += args[3];
-              add_point( builder, x, y, 0 );
+              cff_builder_add_point( builder, x, y, 0 );
               x += args[4];
               y += args[5];
-              add_point( builder, x, y, 1 );
+              cff_builder_add_point( builder, x, y, 1 );
               args += 6;
               num_curves--;
             }
@@ -1450,7 +1450,7 @@
             /* then the final line */
             x += args[0];
             y += args[1];
-            add_point( builder, x, y, 1 );
+            cff_builder_add_point( builder, x, y, 1 );
             args = stack;
           }
           break;
@@ -1467,7 +1467,7 @@
             /* adding five more points; 4 control points, 1 on-curve point */
             /* make sure we have enough space for the start point if it    */
             /* needs to be added..                                         */
-            if ( start_point( builder, x, y ) ||
+            if ( cff_builder_start_point( builder, x, y ) ||
                  check_points( builder, 6 )   )
               goto Memory_Error;
 
@@ -1477,32 +1477,32 @@
             /* first control point */
             x += args[0];
             y += args[1];
-            add_point( builder, x, y, 0 );
+            cff_builder_add_point( builder, x, y, 0 );
 
             /* second control point */
             x += args[2];
             y += args[3];
-            add_point( builder, x, y, 0 );
+            cff_builder_add_point( builder, x, y, 0 );
 
             /* join point; on curve, with y-value the same as the last */
             /* control point's y-value                                 */
             x += args[4];
-            add_point( builder, x, y, 1 );
+            cff_builder_add_point( builder, x, y, 1 );
 
             /* third control point, with y-value the same as the join */
             /* point's y-value                                        */
             x += args[5];
-            add_point( builder, x, y, 0 );
+            cff_builder_add_point( builder, x, y, 0 );
 
             /* fourth control point */
             x += args[6];
             y += args[7];
-            add_point( builder, x, y, 0 );
+            cff_builder_add_point( builder, x, y, 0 );
 
             /* ending point, with y-value the same as the start   */
             x += args[8];
             y  = start_y;
-            add_point( builder, x, y, 1 );
+            cff_builder_add_point( builder, x, y, 1 );
 
             args = stack;
             break;
@@ -1518,7 +1518,7 @@
             args = stack;
 
             /* adding six more points; 4 control points, 2 on-curve points */
-            if ( start_point( builder, x, y ) ||
+            if ( cff_builder_start_point( builder, x, y ) ||
                  check_points ( builder, 6 )  )
               goto Memory_Error;
 
@@ -1527,32 +1527,32 @@
 
             /* first control point */
             x += args[0];
-            add_point( builder, x, y, 0 );
+            cff_builder_add_point( builder, x, y, 0 );
 
             /* second control point */
             x += args[1];
             y += args[2];
-            add_point( builder, x, y, 0 );
+            cff_builder_add_point( builder, x, y, 0 );
 
             /* join point; on curve, with y-value the same as the last */
             /* control point's y-value                                 */
             x += args[3];
-            add_point( builder, x, y, 1 );
+            cff_builder_add_point( builder, x, y, 1 );
 
             /* third control point, with y-value the same as the join */
             /* point's y-value                                        */
             x += args[4];
-            add_point( builder, x, y, 0 );
+            cff_builder_add_point( builder, x, y, 0 );
 
             /* fourth control point */
             x += args[5];
             y  = start_y;
-            add_point( builder, x, y, 0 );
+            cff_builder_add_point( builder, x, y, 0 );
 
             /* ending point, with y-value the same as the start point's */
             /* y-value -- we don't add this point, though               */
             x += args[6];
-            add_point( builder, x, y, 1 );
+            cff_builder_add_point( builder, x, y, 1 );
 
             args = stack;
             break;
@@ -1570,7 +1570,7 @@
             FT_TRACE4(( " flex1" ));
 
             /* adding six more points; 4 control points, 2 on-curve points */
-            if ( start_point( builder, x, y ) ||
+            if ( cff_builder_start_point( builder, x, y ) ||
                  check_points( builder, 6 )   )
                goto Memory_Error;
 
@@ -1604,7 +1604,7 @@
             {
               x += args[0];
               y += args[1];
-              add_point( builder, x, y, (FT_Bool)( count == 3 ) );
+              cff_builder_add_point( builder, x, y, (FT_Bool)( count == 3 ) );
               args += 2;
             }
 
@@ -1620,7 +1620,7 @@
               y += args[0];
             }
 
-            add_point( builder, x, y, 1 );
+            cff_builder_add_point( builder, x, y, 1 );
 
             args = stack;
             break;
@@ -1633,7 +1633,7 @@
 
             FT_TRACE4(( " flex" ));
 
-            if ( start_point( builder, x, y ) ||
+            if ( cff_builder_start_point( builder, x, y ) ||
                  check_points( builder, 6 )   )
               goto Memory_Error;
 
@@ -1642,7 +1642,7 @@
             {
               x += args[0];
               y += args[1];
-              add_point( builder, x, y,
+              cff_builder_add_point( builder, x, y,
                          (FT_Bool)( count == 3 || count == 0 ) );
               args += 2;
             }
@@ -1666,7 +1666,7 @@
           if ( !error )
             error = CFF_Err_Ok;
 
-          close_contour( builder );
+          cff_builder_close_contour( builder );
 
           /* close hints recording session */
           if ( hinter )
@@ -1967,7 +1967,7 @@
 
             if ( idx >= decoder->num_locals )
             {
-              FT_ERROR(( "CFF_Parse_CharStrings:" ));
+              FT_ERROR(( "cff_decoder_parse_charstrings:" ));
               FT_ERROR(( "  invalid local subr index\n" ));
               goto Syntax_Error;
             }
@@ -1974,7 +1974,7 @@
 
             if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )
             {
-              FT_ERROR(( "CFF_Parse_CharStrings: too many nested subrs\n" ));
+              FT_ERROR(( "cff_decoder_parse_charstrings: too many nested subrs\n" ));
               goto Syntax_Error;
             }
 
@@ -1987,7 +1987,7 @@
 
             if ( !zone->base )
             {
-              FT_ERROR(( "CFF_Parse_CharStrings: invoking empty subrs!\n" ));
+              FT_ERROR(( "cff_decoder_parse_charstrings: invoking empty subrs!\n" ));
               goto Syntax_Error;
             }
 
@@ -2007,7 +2007,7 @@
 
             if ( idx >= decoder->num_globals )
             {
-              FT_ERROR(( "CFF_Parse_CharStrings:" ));
+              FT_ERROR(( "cff_decoder_parse_charstrings:" ));
               FT_ERROR(( " invalid global subr index\n" ));
               goto Syntax_Error;
             }
@@ -2014,7 +2014,7 @@
 
             if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )
             {
-              FT_ERROR(( "CFF_Parse_CharStrings: too many nested subrs\n" ));
+              FT_ERROR(( "cff_decoder_parse_charstrings: too many nested subrs\n" ));
               goto Syntax_Error;
             }
 
@@ -2027,7 +2027,7 @@
 
             if ( !zone->base )
             {
-              FT_ERROR(( "CFF_Parse_CharStrings: invoking empty subrs!\n" ));
+              FT_ERROR(( "cff_decoder_parse_charstrings: invoking empty subrs!\n" ));
               goto Syntax_Error;
             }
 
@@ -2042,7 +2042,7 @@
 
           if ( decoder->zone <= decoder->zones )
           {
-            FT_ERROR(( "CFF_Parse_CharStrings: unexpected return\n" ));
+            FT_ERROR(( "cff_decoder_parse_charstrings: unexpected return\n" ));
             goto Syntax_Error;
           }
 
@@ -2074,15 +2074,15 @@
     return error;
 
   Syntax_Error:
-    FT_TRACE4(( "CFF_Parse_CharStrings: syntax error!" ));
+    FT_TRACE4(( "cff_decoder_parse_charstrings: syntax error!" ));
     return CFF_Err_Invalid_File_Format;
 
   Stack_Underflow:
-    FT_TRACE4(( "CFF_Parse_CharStrings: stack underflow!" ));
+    FT_TRACE4(( "cff_decoder_parse_charstrings: stack underflow!" ));
     return CFF_Err_Too_Few_Arguments;
 
   Stack_Overflow:
-    FT_TRACE4(( "CFF_Parse_CharStrings: stack overflow!" ));
+    FT_TRACE4(( "cff_decoder_parse_charstrings: stack overflow!" ));
     return CFF_Err_Stack_Overflow;
 
   Memory_Error:
@@ -2112,7 +2112,7 @@
 
 
   FT_LOCAL_DEF( FT_Error )
-  CFF_Compute_Max_Advance( TT_Face  face,
+  cff_compute_max_advance( TT_Face  face,
                            FT_Int*  max_advance )
   {
     FT_Error     error = 0;
@@ -2124,7 +2124,7 @@
     *max_advance = 0;
 
     /* Initialize load decoder */
-    CFF_Init_Decoder( &decoder, face, 0, 0, 0 );
+    cff_decoder_init( &decoder, face, 0, 0, 0 );
 
     decoder.builder.metrics_only = 1;
     decoder.builder.load_points  = 0;
@@ -2139,14 +2139,14 @@
 
 
       /* now get load the unscaled outline */
-      error = CFF_Access_Element( &cff->charstrings_index, glyph_index,
+      error = cff_index_access_element( &cff->charstrings_index, glyph_index,
                                   &charstring, &charstring_len );
       if ( !error )
       {
-        CFF_Prepare_Decoder( &decoder, glyph_index );
-        error = CFF_Parse_CharStrings( &decoder, charstring, charstring_len );
+        cff_decoder_prepare( &decoder, glyph_index );
+        error = cff_decoder_parse_charstrings( &decoder, charstring, charstring_len );
 
-        CFF_Forget_Element( &cff->charstrings_index, &charstring );
+        cff_index_forget_element( &cff->charstrings_index, &charstring );
       }
 
       /* ignore the error if one has occurred -- skip to next glyph */
@@ -2179,10 +2179,10 @@
 
 
   FT_LOCAL_DEF( FT_Error )
-  CFF_Load_Glyph( CFF_GlyphSlot  glyph,
-                  CFF_Size       size,
-                  FT_Int         glyph_index,
-                  FT_Int         load_flags )
+  cff_slot_load( CFF_GlyphSlot  glyph,
+                 CFF_Size       size,
+                 FT_Int         glyph_index,
+                 FT_Int         load_flags )
   {
     FT_Error     error;
     CFF_Decoder  decoder;
@@ -2218,13 +2218,13 @@
       FT_ULong  charstring_len;
 
 
-      CFF_Init_Decoder( &decoder, face, size, glyph, hinting );
+      cff_decoder_init( &decoder, face, size, glyph, hinting );
 
       decoder.builder.no_recurse =
         (FT_Bool)( ( load_flags & FT_LOAD_NO_RECURSE ) != 0 );
 
       /* now load the unscaled outline */
-      error = CFF_Access_Element( &cff->charstrings_index, glyph_index,
+      error = cff_index_access_element( &cff->charstrings_index, glyph_index,
                                   &charstring, &charstring_len );
       if ( !error )
       {
@@ -2231,13 +2231,13 @@
         CFF_IndexRec csindex = cff->charstrings_index;
 
 
-        CFF_Prepare_Decoder( &decoder, glyph_index );
-        error = CFF_Parse_CharStrings( &decoder, charstring, charstring_len );
+        cff_decoder_prepare( &decoder, glyph_index );
+        error = cff_decoder_parse_charstrings( &decoder, charstring, charstring_len );
 
-        CFF_Forget_Element( &cff->charstrings_index, &charstring );
+        cff_index_forget_element( &cff->charstrings_index, &charstring );
 
         /* We set control_data and control_len if charstrings is loaded.  */
-        /* See how charstring loads at CFF_Access_Element() in cffload.c. */
+        /* See how charstring loads at cff_index_access_element() in cffload.c. */
 
         glyph->root.control_data =
           csindex.bytes + csindex.offsets[glyph_index] - 1;
@@ -2246,7 +2246,7 @@
       }
 
       /* save new glyph tables */
-      CFF_Builder_Done( &decoder.builder );
+      cff_builder_done( &decoder.builder );
     }
 
     font_matrix = cff->top_font.font_dict.font_matrix;
--- a/src/cff/cffgload.h
+++ b/src/cff/cffgload.h
@@ -172,7 +172,7 @@
 
 
   FT_LOCAL( void )
-  CFF_Init_Decoder( CFF_Decoder*   decoder,
+  cff_decoder_init( CFF_Decoder*   decoder,
                     TT_Face        face,
                     CFF_Size       size,
                     CFF_GlyphSlot  slot,
@@ -179,7 +179,7 @@
                     FT_Bool        hinting );
 
   FT_LOCAL( void )
-  CFF_Prepare_Decoder( CFF_Decoder*  decoder,
+  cff_decoder_prepare( CFF_Decoder*  decoder,
                        FT_UInt       glyph_index );
 
 #if 0  /* unused until we support pure CFF fonts */
@@ -186,21 +186,21 @@
 
   /* Compute the maximum advance width of a font through quick parsing */
   FT_LOCAL( FT_Error )
-  CFF_Compute_Max_Advance( TT_Face  face,
+  cff_compute_max_advance( TT_Face  face,
                            FT_Int*  max_advance );
 
 #endif /* 0 */
 
   FT_LOCAL( FT_Error )
-  CFF_Parse_CharStrings( CFF_Decoder*  decoder,
-                         FT_Byte*      charstring_base,
-                         FT_Int        charstring_len );
+  cff_decoder_parse_charstrings( CFF_Decoder*  decoder,
+                                 FT_Byte*      charstring_base,
+                                 FT_Int        charstring_len );
 
   FT_LOCAL( FT_Error )
-  CFF_Load_Glyph( CFF_GlyphSlot  glyph,
-                  CFF_Size       size,
-                  FT_Int         glyph_index,
-                  FT_Int         load_flags );
+  cff_slot_load( CFF_GlyphSlot  glyph,
+                 CFF_Size       size,
+                 FT_Int         glyph_index,
+                 FT_Int         load_flags );
 
 
 FT_END_HEADER
--- a/src/cff/cffload.c
+++ b/src/cff/cffload.c
@@ -1047,7 +1047,7 @@
 
 
   FT_LOCAL_DEF( FT_UShort )
-  CFF_Get_Standard_Encoding( FT_UInt  charcode )
+  cff_get_standard_encoding( FT_UInt  charcode )
   {
     return  (FT_UShort)(charcode < 256 ? cff_standard_encoding[charcode] : 0);
   }
@@ -1172,9 +1172,10 @@
   }
 
 
+ /* allocate a table containing pointers to an index's elements */
   static FT_Error
-  cff_explicit_index( CFF_Index   idx,
-                      FT_Byte***  table )
+  cff_index_get_pointers( CFF_Index   idx,
+                          FT_Byte***  table )
   {
     FT_Error   error  = 0;
     FT_Memory  memory = idx->stream->memory;
@@ -1205,10 +1206,10 @@
 
 
   FT_LOCAL_DEF( FT_Error )
-  CFF_Access_Element( CFF_Index  idx,
-                      FT_UInt    element,
-                      FT_Byte**  pbytes,
-                      FT_ULong*  pbyte_len )
+  cff_index_access_element( CFF_Index  idx,
+                            FT_UInt    element,
+                            FT_Byte**  pbytes,
+                            FT_ULong*  pbyte_len )
   {
     FT_Error  error = 0;
 
@@ -1270,8 +1271,8 @@
 
 
   FT_LOCAL_DEF( void )
-  CFF_Forget_Element( CFF_Index  idx,
-                      FT_Byte**  pbytes )
+  cff_index_forget_element( CFF_Index  idx,
+                            FT_Byte**  pbytes )
   {
     if ( idx->bytes == 0 )
     {
@@ -1284,8 +1285,8 @@
 
 
   FT_LOCAL_DEF( FT_String* )
-  CFF_Get_Name( CFF_Index  idx,
-                FT_UInt    element )
+  cff_index_get_name( CFF_Index  idx,
+                      FT_UInt    element )
   {
     FT_Memory   memory = idx->stream->memory;
     FT_Byte*    bytes;
@@ -1294,7 +1295,7 @@
     FT_String*  name = 0;
 
 
-    error = CFF_Access_Element( idx, element, &bytes, &byte_len );
+    error = cff_index_access_element( idx, element, &bytes, &byte_len );
     if ( error )
       goto Exit;
 
@@ -1303,7 +1304,7 @@
       FT_MEM_COPY( name, bytes, byte_len );
       name[byte_len] = 0;
     }
-    CFF_Forget_Element( idx, &bytes );
+    cff_index_forget_element( idx, &bytes );
 
   Exit:
     return name;
@@ -1311,18 +1312,18 @@
 
 
   FT_LOCAL_DEF( FT_String* )
-  CFF_Get_String( CFF_Index        idx,
-                  FT_UInt          sid,
-                  PSNames_Service  psnames_interface )
+  cff_index_get_sid_string( CFF_Index        idx,
+                            FT_UInt          sid,
+                            PSNames_Service  psnames_service )
   {
     /* if it is not a standard string, return it */
     if ( sid > 390 )
-      return CFF_Get_Name( idx, sid - 391 );
+      return cff_index_get_name( idx, sid - 391 );
 
     /* that's a standard string, fetch a copy from the PSName module */
     {
       FT_String*   name       = 0;
-      const char*  adobe_name = psnames_interface->adobe_std_strings( sid );
+      const char*  adobe_name = psnames_service->adobe_std_strings( sid );
       FT_UInt      len;
 
 
@@ -1414,8 +1415,8 @@
 
 
   FT_LOCAL_DEF( FT_Byte )
-  CFF_Get_FD( CFF_FDSelect  select,
-              FT_UInt       glyph_index )
+  cff_fd_select_get( CFF_FDSelect  select,
+                     FT_UInt       glyph_index )
   {
     FT_Byte  fd = 0;
 
@@ -1484,23 +1485,7 @@
   /*************************************************************************/
 
   static void
-  CFF_Done_Encoding( CFF_Encoding  encoding,
-                     FT_Stream     stream )
-  {
-    FT_Memory  memory = stream->memory;
-
-
-    FT_FREE( encoding->codes );
-    FT_FREE( encoding->sids  );
-    encoding->format = 0;
-    encoding->offset = 0;
-    encoding->codes  = 0;
-    encoding->sids   = 0;
-  }
-
-
-  static void
-  CFF_Done_Charset( CFF_Charset  charset,
+  cff_charset_done( CFF_Charset  charset,
                     FT_Stream    stream )
   {
     FT_Memory  memory = stream->memory;
@@ -1509,12 +1494,11 @@
     FT_FREE( charset->sids );
     charset->format = 0;
     charset->offset = 0;
-    charset->sids   = 0;
   }
 
 
   static FT_Error
-  CFF_Load_Charset( CFF_Charset  charset,
+  cff_charset_load( CFF_Charset  charset,
                     FT_UInt      num_glyphs,
                     FT_Stream    stream,
                     FT_ULong     base_offset,
@@ -1525,13 +1509,6 @@
     FT_UShort  glyph_sid;
 
 
-    charset->offset = base_offset + offset;
-
-    /* Get the format of the table. */
-    if ( FT_STREAM_SEEK( charset->offset ) ||
-         FT_READ_BYTE( charset->format )   )
-      goto Exit;
-
     /* If the the offset is greater than 2, we have to parse the */
     /* charset table.                                            */
     if ( offset > 2 )
@@ -1539,6 +1516,13 @@
       FT_UInt  j;
 
 
+      charset->offset = base_offset + offset;
+
+      /* Get the format of the table. */
+      if ( FT_STREAM_SEEK( charset->offset ) ||
+           FT_READ_BYTE( charset->format )   )
+        goto Exit;
+
       /* Allocate memory for sids. */
       if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
         goto Exit;
@@ -1549,12 +1533,15 @@
       switch ( charset->format )
       {
       case 0:
-        for ( j = 1; j < num_glyphs; j++ )
+        if ( num_glyphs > 0 )
         {
-          if ( FT_READ_USHORT( glyph_sid ) )
+          if ( FT_FRAME_ENTER( (num_glyphs-1)*2 ) )
             goto Exit;
-
-          charset->sids[j] = glyph_sid;
+            
+          for ( j = 1; j < num_glyphs; j++ )
+            charset->sids[j] = FT_GET_USHORT();
+          
+          FT_FRAME_EXIT();
         }
         break;
 
@@ -1587,7 +1574,7 @@
             }
 
             /* Fill in the range of sids -- `nleft + 1' glyphs. */
-            for ( i = 0; i <= nleft; i++, j++, glyph_sid++ )
+            for ( i = 0; j < num_glyphs && i <= nleft; i++, j++, glyph_sid++ )
               charset->sids[j] = glyph_sid;
           }
         }
@@ -1594,7 +1581,7 @@
         break;
 
       default:
-        FT_ERROR(( "CFF_Load_Charset: invalid table format!\n" ));
+        FT_ERROR(( "cff_charset_load: invalid table format!\n" ));
         error = CFF_Err_Invalid_File_Format;
         goto Exit;
       }
@@ -1610,12 +1597,14 @@
       /* the first num_glyphs, and hence must match the predefined    */
       /* charset *exactly*.                                           */
 
+      charset->offset = offset;  /* record charset type */
+
       switch ( offset )
       {
       case 0:
         if ( num_glyphs != 229 )
         {
-          FT_ERROR(("CFF_Load_Charset: implicit charset not equal to\n"
+          FT_ERROR(("cff_charset_load: implicit charset not equal to\n"
                     "predefined charset (Adobe ISO-Latin)!\n" ));
           error = CFF_Err_Invalid_File_Format;
           goto Exit;
@@ -1634,7 +1623,7 @@
       case 1:
         if ( num_glyphs != 166 )
         {
-          FT_ERROR(( "CFF_Load_Charset: implicit charset not equal to\n"
+          FT_ERROR(( "cff_charset_load: implicit charset not equal to\n"
                      "predefined charset (Adobe Expert)!\n" ));
           error = CFF_Err_Invalid_File_Format;
           goto Exit;
@@ -1653,7 +1642,7 @@
       case 2:
         if ( num_glyphs != 87 )
         {
-          FT_ERROR(( "CFF_Load_Charset: implicit charset not equal to\n"
+          FT_ERROR(( "cff_charset_load: implicit charset not equal to\n"
                      "predefined charset (Adobe Expert Subset)!\n" ));
           error = CFF_Err_Invalid_File_Format;
           goto Exit;
@@ -1681,8 +1670,7 @@
     if ( error )
       if ( charset->sids )
       {
-        if ( charset->sids )
-          FT_FREE( charset->sids );
+        FT_FREE( charset->sids );
         charset->format = 0;
         charset->offset = 0;
         charset->sids   = 0;
@@ -1692,8 +1680,19 @@
   }
 
 
+
+  static void
+  cff_encoding_done( CFF_Encoding  encoding )
+  {
+    encoding->format = 0;
+    encoding->offset = 0;
+    encoding->count  = 0;
+  }
+
+
+
   static FT_Error
-  CFF_Load_Encoding( CFF_Encoding  encoding,
+  cff_encoding_load( CFF_Encoding  encoding,
                      CFF_Charset   charset,
                      FT_UInt       num_glyphs,
                      FT_Stream     stream,
@@ -1705,7 +1704,7 @@
     FT_UInt     count;
     FT_UInt     j;
     FT_UShort   glyph_sid;
-    FT_Byte     glyph_code;
+    FT_UInt     glyph_code;
 
 
     /* Check for charset->sids.  If we do not have this, we fail. */
@@ -1715,14 +1714,8 @@
       goto Exit;
     }
 
-    /* Allocate memory for sids/codes -- there are at most 256 sids/codes */
-    /* for an encoding.                                                   */
-    if ( FT_NEW_ARRAY( encoding->sids,  256 ) ||
-         FT_NEW_ARRAY( encoding->codes, 256 ) )
-      goto Exit;
-
     /* Zero out the code to gid/sid mappings. */
-    for ( j = 0; j < 255; j++ )
+    for ( j = 0; j < 256; j++ )
     {
       encoding->sids [j] = 0;
       encoding->codes[j] = 0;
@@ -1751,32 +1744,43 @@
            FT_READ_BYTE( count )              )
         goto Exit;
 
+      encoding->count = (count+1);
+
       switch ( encoding->format & 0x7F )
       {
       case 0:
-        for ( j = 1; j <= count; j++ )
         {
-          if ( FT_READ_BYTE( glyph_code ) )
+          FT_Byte*  p;
+          
+          if ( FT_FRAME_ENTER( count ) )
             goto Exit;
 
-          /* Make sure j is not too big. */
-          if ( j > num_glyphs )
-            goto Exit;
+          p = (FT_Byte*) stream->cursor;
+          
+          for ( j = 1; j <= count; j++ )
+          {
+            glyph_code = *p++;
 
-          /* Assign code to GID mapping. */
-          encoding->codes[glyph_code] = (FT_UShort)j;
+            /* Make sure j is not too big. */
+            if ( (FT_UInt) glyph_code < num_glyphs )
+            {
+              /* Assign code to GID mapping. */
+              encoding->codes[glyph_code] = (FT_UShort)j;
 
-          /* Assign code to SID mapping. */
-          encoding->sids[glyph_code] = charset->sids[j];
+              /* Assign code to SID mapping. */
+              encoding->sids[glyph_code] = charset->sids[j];
+            }
+          }
+          
+          FT_FRAME_EXIT();
         }
-
         break;
 
       case 1:
         {
-          FT_Byte  nleft;
-          FT_UInt  i = 1;
-          FT_UInt  k;
+          FT_Byte   nleft;
+          FT_UInt   i = 1;
+          FT_UInt   k;
 
 
           /* Parse the Format1 ranges. */
@@ -1797,14 +1801,14 @@
             for ( k = i; k < nleft + i; k++, glyph_code++ )
             {
               /* Make sure k is not too big. */
-              if ( k > num_glyphs )
-                goto Exit;
+              if ( k < num_glyphs && glyph_code < 256 )
+              {
+                /* Assign code to GID mapping. */
+                encoding->codes[glyph_code] = (FT_UShort)k;
 
-              /* Assign code to GID mapping. */
-              encoding->codes[glyph_code] = (FT_UShort)k;
-
-              /* Assign code to SID mapping. */
-              encoding->sids[glyph_code] = charset->sids[k];
+                /* Assign code to SID mapping. */
+                encoding->sids[glyph_code] = charset->sids[k];
+              }
             }
           }
         }
@@ -1811,7 +1815,7 @@
         break;
 
       default:
-        FT_ERROR(( "CFF_Load_Encoding: invalid table format!\n" ));
+        FT_ERROR(( "cff_encoding_load: invalid table format!\n" ));
         error = CFF_Err_Invalid_File_Format;
         goto Exit;
       }
@@ -1819,7 +1823,7 @@
       /* Parse supplemental encodings, if any. */
       if ( encoding->format & 0x80 )
       {
-        FT_UInt glyph_id;
+        FT_UInt  gindex;
 
 
         /* count supplements */
@@ -1841,14 +1845,14 @@
 
           /* First, lookup GID which has been assigned to */
           /* SID glyph_sid.                               */
-          for ( glyph_id = 0; glyph_id < num_glyphs; glyph_id++ )
+          for ( gindex = 0; gindex < num_glyphs; gindex++ )
           {
-            if ( charset->sids[glyph_id] == glyph_sid )
+            if ( charset->sids[gindex] == glyph_sid )
+            {
+              encoding->codes[glyph_code] = (FT_UShort) gindex;
               break;
+            }
           }
-
-          /* Now, make the assignment. */
-          encoding->codes[glyph_code] = (FT_UShort)glyph_id;
         }
       }
     }
@@ -1862,6 +1866,8 @@
       /* encoding (see the note at the end of section 12 in the CFF     */
       /* specification).                                                */
 
+      encoding->count = 256;
+
       switch ( offset )
       {
       case 0:
@@ -1869,37 +1875,14 @@
         FT_MEM_COPY( encoding->sids, cff_standard_encoding,
                      256 * sizeof ( FT_UShort ) );
 
-        /* Construct code to GID mapping from code */
-        /* to SID mapping and charset.             */
-        for ( j = 0; j < 256; j++ )
-        {
-          /* If j is encoded, find the GID for it. */
-          if ( encoding->sids[j] )
-          {
-            for ( i = 1; i < num_glyphs; i++ )
-              /* We matched, so break. */
-              if ( charset->sids[i] == encoding->sids[j] )
-                break;
+        goto Populate;
 
-            /* i will be equal to num_glyphs if we exited the above */
-            /* loop without a match.  In this case, we also have to */
-            /* fix the code to SID mapping.                         */
-            if ( i == num_glyphs )
-            {
-              encoding->codes[j] = 0;
-              encoding->sids [j] = 0;
-            }
-            else
-              encoding->codes[j] = (FT_UShort)i;
-          }
-        }
-        break;
-
       case 1:
         /* First, copy the code to SID mapping. */
         FT_MEM_COPY( encoding->sids, cff_expert_encoding,
                      256 * sizeof ( FT_UShort ) );
 
+      Populate:
         /* Construct code to GID mapping from code to SID mapping */
         /* and charset.                                           */
         for ( j = 0; j < 256; j++ )
@@ -1927,7 +1910,7 @@
         break;
 
       default:
-        FT_ERROR(( "CFF_Load_Encoding: invalid table format!\n" ));
+        FT_ERROR(( "cff_encoding_load: invalid table format!\n" ));
         error = CFF_Err_Invalid_File_Format;
         goto Exit;
       }
@@ -1936,28 +1919,12 @@
   Exit:
 
     /* Clean up if there was an error. */
-    if ( error )
-    {
-      if ( encoding->sids || encoding->codes )
-      {
-        if ( encoding->sids )
-          FT_FREE( encoding->sids );
-
-        if ( encoding->codes )
-          FT_FREE( encoding->codes );
-
-        charset->format = 0;
-        charset->offset = 0;
-        charset->sids   = 0;
-      }
-    }
-
     return error;
   }
 
 
   static FT_Error
-  CFF_Load_SubFont( CFF_SubFont  font,
+  cff_subfont_load( CFF_SubFont  font,
                     CFF_Index    idx,
                     FT_UInt      font_index,
                     FT_Stream    stream,
@@ -1971,7 +1938,7 @@
     CFF_Private      priv = &font->private_dict;
 
 
-    CFF_Parser_Init( &parser, CFF_CODE_TOPDICT, &font->font_dict );
+    cff_parser_init( &parser, CFF_CODE_TOPDICT, &font->font_dict );
 
     /* set defaults */
     FT_MEM_SET( top, 0, sizeof ( *top ) );
@@ -1983,10 +1950,10 @@
     top->font_matrix.yy      = 0x10000L;
     top->cid_count           = 8720;
 
-    error = CFF_Access_Element( idx, font_index, &dict, &dict_len ) ||
-            CFF_Parser_Run( &parser, dict, dict + dict_len );
+    error = cff_index_access_element( idx, font_index, &dict, &dict_len ) ||
+            cff_parser_run( &parser, dict, dict + dict_len );
 
-    CFF_Forget_Element( idx, &dict );
+    cff_index_forget_element( idx, &dict );
 
     if ( error )
       goto Exit;
@@ -2007,13 +1974,13 @@
       priv->expansion_factor = (FT_Fixed)0.06 * 0x10000L;
       priv->blue_scale       = (FT_Fixed)0.039625 * 0x10000L;
 
-      CFF_Parser_Init( &parser, CFF_CODE_PRIVATE, priv );
+      cff_parser_init( &parser, CFF_CODE_PRIVATE, priv );
 
       if ( FT_STREAM_SEEK( base_offset + font->font_dict.private_offset ) ||
            FT_FRAME_ENTER( font->font_dict.private_size )                 )
         goto Exit;
 
-      error = CFF_Parser_Run( &parser,
+      error = cff_parser_run( &parser,
                              (FT_Byte*)stream->cursor,
                              (FT_Byte*)stream->limit );
       FT_FRAME_EXIT();
@@ -2033,7 +2000,7 @@
         goto Exit;
 
       font->num_local_subrs = font->local_subrs_index.count;
-      error = cff_explicit_index( &font->local_subrs_index,
+      error = cff_index_get_pointers( &font->local_subrs_index,
                                   &font->local_subrs );
       if ( error )
         goto Exit;
@@ -2045,7 +2012,7 @@
 
 
   static void
-  CFF_Done_SubFont( FT_Memory    memory,
+  cff_subfont_done( FT_Memory    memory,
                     CFF_SubFont  subfont )
   {
     if ( subfont )
@@ -2057,7 +2024,7 @@
 
 
   FT_LOCAL_DEF( FT_Error )
-  CFF_Load_Font( FT_Stream  stream,
+  cff_font_load( FT_Stream  stream,
                  FT_Int     face_index,
                  CFF_Font   font )
   {
@@ -2080,7 +2047,7 @@
     CFF_FontRecDict  dict;
 
 
-    FT_MEM_SET( font, 0, sizeof ( *font ) );
+    FT_ZERO( font );
 
     font->stream = stream;
     font->memory = memory;
@@ -2116,7 +2083,7 @@
     font->num_faces = font->name_index.count;
     if ( face_index >= (FT_Int)font->num_faces )
     {
-      FT_ERROR(( "CFF_Load_Font: incorrect face index = %d\n",
+      FT_ERROR(( "cff_font_load: incorrect face index = %d\n",
                  face_index ));
       error = CFF_Err_Invalid_Argument;
     }
@@ -2126,7 +2093,7 @@
       goto Exit;
 
     /* now, parse the top-level font dictionary */
-    error = CFF_Load_SubFont( &font->top_font,
+    error = cff_subfont_load( &font->top_font,
                               &font->font_dict_index,
                               face_index,
                               stream,
@@ -2153,7 +2120,7 @@
 
       if ( fd_index.count > CFF_MAX_CID_FONTS )
       {
-        FT_ERROR(( "CFF_Load_Font: FD array too large in CID font\n" ));
+        FT_ERROR(( "cff_font_load: FD array too large in CID font\n" ));
         goto Fail_CID;
       }
 
@@ -2170,7 +2137,7 @@
       for ( idx = 0; idx < fd_index.count; idx++ )
       {
         sub = font->subfonts[idx];
-        error = CFF_Load_SubFont( sub, &fd_index, idx,
+        error = cff_subfont_load( sub, &fd_index, idx,
                                   stream, base_offset );
         if ( error )
           goto Fail_CID;
@@ -2194,7 +2161,7 @@
     /* read the charstrings index now */
     if ( dict->charstrings_offset == 0 )
     {
-      FT_ERROR(( "CFF_Load_Font: no charstrings offset!\n" ));
+      FT_ERROR(( "cff_font_load: no charstrings offset!\n" ));
       error = CFF_Err_Unknown_File_Format;
       goto Exit;
     }
@@ -2210,7 +2177,7 @@
     font->num_global_subrs = font->global_subrs_index.count;
     font->num_glyphs       = font->charstrings_index.count;
 
-    error = cff_explicit_index( &font->global_subrs_index,
+    error = cff_index_get_pointers( &font->global_subrs_index,
                                 &font->global_subrs ) ;
 
     if ( error )
@@ -2217,12 +2184,12 @@
       goto Exit;
 
     /* read the Charset and Encoding tables when available */
-    error = CFF_Load_Charset( &font->charset, font->num_glyphs, stream,
+    error = cff_charset_load( &font->charset, font->num_glyphs, stream,
                               base_offset, dict->charset_offset );
     if ( error )
       goto Exit;
 
-    error = CFF_Load_Encoding( &font->encoding,
+    error = cff_encoding_load( &font->encoding,
                                &font->charset,
                                font->num_glyphs,
                                stream,
@@ -2232,7 +2199,7 @@
       goto Exit;
 
     /* get the font name */
-    font->font_name = CFF_Get_Name( &font->name_index, face_index );
+    font->font_name = cff_index_get_name( &font->name_index, face_index );
 
   Exit:
     return error;
@@ -2240,7 +2207,7 @@
 
 
   FT_LOCAL_DEF( void )
-  CFF_Done_Font( CFF_Font  font )
+  cff_font_done( CFF_Font  font )
   {
     FT_Memory  memory = font->memory;
     FT_UInt    idx;
@@ -2257,15 +2224,15 @@
     if ( font->num_subfonts > 0 )
     {
       for ( idx = 0; idx < font->num_subfonts; idx++ )
-        CFF_Done_SubFont( memory, font->subfonts[idx] );
+        cff_subfont_done( memory, font->subfonts[idx] );
 
       FT_FREE( font->subfonts );
     }
 
-    CFF_Done_Encoding( &font->encoding, font->stream );
-    CFF_Done_Charset( &font->charset, font->stream );
+    cff_encoding_done( &font->encoding );
+    cff_charset_done( &font->charset, font->stream );
 
-    CFF_Done_SubFont( memory, &font->top_font );
+    cff_subfont_done( memory, &font->top_font );
 
     CFF_Done_FD_Select( &font->fd_select, font->stream );
 
--- a/src/cff/cffload.h
+++ b/src/cff/cffload.h
@@ -28,42 +28,42 @@
 FT_BEGIN_HEADER
 
   FT_LOCAL( FT_UShort )
-  CFF_Get_Standard_Encoding( FT_UInt  charcode );
+  cff_get_standard_encoding( FT_UInt  charcode );
 
 
   FT_LOCAL( FT_String* )
-  CFF_Get_Name( CFF_Index  idx,
-                FT_UInt    element );
+  cff_index_get_name( CFF_Index  idx,
+                      FT_UInt    element );
 
   FT_LOCAL( FT_String* )
-  CFF_Get_String( CFF_Index        idx,
-                  FT_UInt          sid,
-                  PSNames_Service  psnames_interface );
+  cff_index_get_sid_string( CFF_Index        idx,
+                            FT_UInt          sid,
+                            PSNames_Service  psnames_interface );
 
 
   FT_LOCAL( FT_Error )
-  CFF_Access_Element( CFF_Index  idx,
-                      FT_UInt    element,
-                      FT_Byte**  pbytes,
-                      FT_ULong*  pbyte_len );
+  cff_index_access_element( CFF_Index  idx,
+                            FT_UInt    element,
+                            FT_Byte**  pbytes,
+                            FT_ULong*  pbyte_len );
 
   FT_LOCAL( void )
-  CFF_Forget_Element( CFF_Index  idx,
-                      FT_Byte**  pbytes );
+  cff_index_forget_element( CFF_Index  idx,
+                            FT_Byte**  pbytes );
 
 
   FT_LOCAL( FT_Error )
-  CFF_Load_Font( FT_Stream  stream,
+  cff_font_load( FT_Stream  stream,
                  FT_Int     face_index,
                  CFF_Font   font );
 
   FT_LOCAL( void )
-  CFF_Done_Font( CFF_Font  font );
+  cff_font_done( CFF_Font  font );
 
 
   FT_LOCAL( FT_Byte )
-  CFF_Get_FD( CFF_FDSelect  select,
-              FT_UInt       glyph_index );
+  cff_fd_select_get( CFF_FDSelect  select,
+                     FT_UInt       glyph_index );
 
 
 FT_END_HEADER
--- a/src/cff/cffobjs.c
+++ b/src/cff/cffobjs.c
@@ -28,7 +28,7 @@
 #include FT_INTERNAL_POSTSCRIPT_HINTS_H
 #include "cffobjs.h"
 #include "cffload.h"
-
+#include "cffcmap.h"
 #include "cfferrs.h"
 
 
@@ -53,7 +53,7 @@
 
 
   static PSH_Globals_Funcs
-  CFF_Size_Get_Globals_Funcs( CFF_Size  size )
+  cff_size_get_globals_funcs( CFF_Size  size )
   {
     CFF_Face          face     = (CFF_Face)size->face;
     CFF_Font          font     = (CFF_FontRec *)face->extra.data;
@@ -70,7 +70,7 @@
 
 
   FT_LOCAL_DEF( void )
-  CFF_Size_Done( CFF_Size  size )
+  cff_size_done( CFF_Size  size )
   {
     if ( size->internal )
     {
@@ -77,7 +77,7 @@
       PSH_Globals_Funcs  funcs;
 
 
-      funcs = CFF_Size_Get_Globals_Funcs( size );
+      funcs = cff_size_get_globals_funcs( size );
       if ( funcs )
         funcs->destroy( (PSH_Globals)size->internal );
 
@@ -87,10 +87,10 @@
 
 
   FT_LOCAL_DEF( FT_Error )
-  CFF_Size_Init( CFF_Size  size )
+  cff_size_init( CFF_Size  size )
   {
     FT_Error           error = 0;
-    PSH_Globals_Funcs  funcs = CFF_Size_Get_Globals_Funcs( size );
+    PSH_Globals_Funcs  funcs = cff_size_get_globals_funcs( size );
 
 
     if ( funcs )
@@ -160,9 +160,9 @@
 
 
   FT_LOCAL_DEF( FT_Error )
-  CFF_Size_Reset( CFF_Size  size )
+  cff_size_reset( CFF_Size  size )
   {
-    PSH_Globals_Funcs  funcs = CFF_Size_Get_Globals_Funcs( size );
+    PSH_Globals_Funcs  funcs = cff_size_get_globals_funcs( size );
     FT_Error           error = 0;
 
 
@@ -182,7 +182,7 @@
   /*************************************************************************/
 
   FT_LOCAL_DEF( void )
-  CFF_GlyphSlot_Done( CFF_GlyphSlot  slot )
+  cff_slot_done( CFF_GlyphSlot  slot )
   {
     slot->root.internal->glyph_hints = 0;
   }
@@ -189,7 +189,7 @@
 
 
   FT_LOCAL_DEF( FT_Error )
-  CFF_GlyphSlot_Init( CFF_GlyphSlot  slot )
+  cff_slot_init( CFF_GlyphSlot  slot )
   {
     CFF_Face          face     = (CFF_Face)slot->root.face;
     CFF_Font          font     = (CFF_FontRec *)face->extra.data;
@@ -224,7 +224,7 @@
   /*************************************************************************/
 
   static FT_String*
-  CFF_StrCopy( FT_Memory         memory,
+  cff_strcpy( FT_Memory         memory,
                const FT_String*  source )
   {
     FT_Error    error;
@@ -245,8 +245,9 @@
 
 
 
+
   FT_LOCAL_DEF( FT_Error )
-  CFF_Face_Init( FT_Stream      stream,
+  cff_face_init( FT_Stream      stream,
                  CFF_Face       face,
                  FT_Int         face_index,
                  FT_Int         num_params,
@@ -341,11 +342,12 @@
         goto Exit;
 
       face->extra.data = cff;
-      error = CFF_Load_Font( stream, face_index, cff );
+      error = cff_font_load( stream, face_index, cff );
       if ( error )
         goto Exit;
 
       cff->pshinter = pshinter;
+      cff->psnames  = psnames;
 
       /* Complement the root flags with some interesting information. */
       /* Note that this is only necessary for pure CFF and CEF fonts. */
@@ -361,7 +363,7 @@
         /* we need the `PSNames' module for pure-CFF and CEF formats */
         if ( !psnames )
         {
-          FT_ERROR(( "CFF_Face_Init:" ));
+          FT_ERROR(( "cff_face_init:" ));
           FT_ERROR(( " cannot open CFF & CEF fonts\n" ));
           FT_ERROR(( "              " ));
           FT_ERROR(( " without the `PSNames' module\n" ));
@@ -395,11 +397,11 @@
           root->units_per_EM = 1000;
 
         /* retrieve font family & style name */
-        root->family_name  = CFF_Get_Name( &cff->name_index, face_index );
+        root->family_name  = cff_index_get_name( &cff->name_index, face_index );
         if ( dict->cid_registry )
-          root->style_name = CFF_StrCopy( memory, "Regular" );  /* XXXX */
+          root->style_name = cff_strcpy( memory, "Regular" );  /* XXXX */
         else
-          root->style_name = CFF_Get_String( &cff->string_index,
+          root->style_name = cff_index_get_sid_string( &cff->string_index,
                                              dict->weight,
                                              psnames );
 
@@ -445,7 +447,82 @@
 
         root->style_flags = flags;
         
-        /* XXX: no charmaps for pure CFF fonts currently! */
+        /*******************************************************************/
+        /*                                                                 */
+        /* Compute char maps.                                              */
+        /*                                                                 */
+        
+        /* try to synthetize a Unicode charmap if there is none available */
+        /* already. If an OpenType font contains a Unicode "cmap", we     */
+        /* will use it, wathever be in the CFF part of the file..         */
+        {
+          FT_CharMapRec  cmaprec;
+          FT_CharMap     cmap;
+          FT_UInt        nn;
+          CFF_Encoding   encoding = &cff->encoding;
+          
+          for ( nn = 0; nn < (FT_UInt) root->num_charmaps; nn++ )
+          {
+            cmap = root->charmaps[nn];
+            
+            /* Windows Unicode (3,1) ? */
+            if ( cmap->platform_id == 3 && cmap->platform_id == 1 )
+              goto Skip_Unicode;
+              
+            /* Deprecated Unicode platform id  ?? */
+            if ( cmap->platform_id == 0 )
+              break; /* Standard Unicode (deprecated) */
+          }
+          
+          /* we didn't find a Unicode charmap, synthetize one */
+#ifdef FT_CONFIG_OPTION_USE_CMAPS
+
+          cmaprec.face        = root;
+          cmaprec.platform_id = 3;
+          cmaprec.encoding_id = 1;
+          cmaprec.encoding    = ft_encoding_unicode;
+
+          FT_CMap_New( &cff_cmap_unicode_class_rec, NULL, &cmaprec, NULL );
+
+        Skip_Unicode:
+          if ( encoding->count > 0 )
+          {
+            FT_CMap_Class  clazz;
+            
+            cmaprec.face        = root;
+            cmaprec.platform_id = 7;  /* Adobe platform id */
+
+            switch( encoding->offset )
+            {
+              case 0:
+                cmaprec.encoding_id = 0;
+                cmaprec.encoding    = ft_encoding_adobe_standard;
+                clazz               = &cff_cmap_encoding_class_rec;
+                break;
+              
+              case 1:
+                cmaprec.encoding_id = 1;
+                cmaprec.encoding    = ft_encoding_adobe_expert;
+                clazz               = &cff_cmap_encoding_class_rec;
+                break;
+              
+              default:
+                cmaprec.encoding_id = 3;
+                cmaprec.encoding    = ft_encoding_adobe_custom;
+                clazz               = &cff_cmap_encoding_class_rec;
+            }
+            
+            FT_CMap_New( clazz, NULL, &cmaprec, NULL );
+
+#else  /* !FT_CONFIG_OPTION_USE_CMAPS */
+
+          /* unimplemented !! */
+          
+#endif /* !FT_CONFIG_OPTION_USE_CMAPS */
+          
+          }
+        }
+        
       }
     }
 
@@ -459,7 +536,7 @@
 
 
   FT_LOCAL_DEF( void )
-  CFF_Face_Done( CFF_Face  face )
+  cff_face_done( CFF_Face  face )
   {
     FT_Memory     memory = face->root.memory;
     SFNT_Service  sfnt   = (SFNT_Service)face->sfnt;
@@ -474,7 +551,7 @@
 
       if ( cff )
       {
-        CFF_Done_Font( cff );
+        cff_font_done( cff );
         FT_FREE( face->extra.data );
       }
     }
@@ -482,7 +559,7 @@
 
 
   FT_LOCAL_DEF( FT_Error )
-  CFF_Driver_Init( CFF_Driver  driver )
+  cff_driver_init( CFF_Driver  driver )
   {
     FT_UNUSED( driver );
 
@@ -491,7 +568,7 @@
 
 
   FT_LOCAL_DEF( void )
-  CFF_Driver_Done( CFF_Driver  driver )
+  cff_driver_done( CFF_Driver  driver )
   {
     FT_UNUSED( driver );
   }
--- a/src/cff/cffobjs.h
+++ b/src/cff/cffobjs.h
@@ -23,6 +23,7 @@
 #include <ft2build.h>
 #include FT_INTERNAL_OBJECTS_H
 #include FT_INTERNAL_CFF_TYPES_H
+#include FT_INTERNAL_TRUETYPE_TYPES_H
 #include FT_INTERNAL_POSTSCRIPT_NAMES_H
 
 
@@ -110,19 +111,19 @@
 
 
   FT_LOCAL( FT_Error )
-  CFF_Size_Init( CFF_Size  size );
+  cff_size_init( CFF_Size  size );
 
   FT_LOCAL( void )
-  CFF_Size_Done( CFF_Size  size );
+  cff_size_done( CFF_Size  size );
 
   FT_LOCAL( FT_Error )
-  CFF_Size_Reset( CFF_Size  size );
+  cff_size_reset( CFF_Size  size );
 
   FT_LOCAL( void )
-  CFF_GlyphSlot_Done( CFF_GlyphSlot  slot );
+  cff_slot_done( CFF_GlyphSlot  slot );
 
   FT_LOCAL( FT_Error )
-  CFF_GlyphSlot_Init( CFF_GlyphSlot   slot );
+  cff_slot_init( CFF_GlyphSlot   slot );
 
 
   /*************************************************************************/
@@ -130,7 +131,7 @@
   /* Face functions                                                        */
   /*                                                                       */
   FT_LOCAL( FT_Error )
-  CFF_Face_Init( FT_Stream      stream,
+  cff_face_init( FT_Stream      stream,
                  CFF_Face       face,
                  FT_Int         face_index,
                  FT_Int         num_params,
@@ -137,7 +138,7 @@
                  FT_Parameter*  params );
 
   FT_LOCAL( void )
-  CFF_Face_Done( CFF_Face  face );
+  cff_face_done( CFF_Face  face );
 
 
   /*************************************************************************/
@@ -145,10 +146,10 @@
   /* Driver functions                                                      */
   /*                                                                       */
   FT_LOCAL( FT_Error )
-  CFF_Driver_Init( CFF_Driver  driver );
+  cff_driver_init( CFF_Driver  driver );
 
   FT_LOCAL( void )
-  CFF_Driver_Done( CFF_Driver  driver );
+  cff_driver_done( CFF_Driver  driver );
 
 
 FT_END_HEADER
--- a/src/cff/cffparse.c
+++ b/src/cff/cffparse.c
@@ -64,7 +64,7 @@
 
 
   FT_LOCAL_DEF( void )
-  CFF_Parser_Init( CFF_Parser  parser,
+  cff_parser_init( CFF_Parser  parser,
                    FT_UInt     code,
                    void*       object )
   {
@@ -480,7 +480,7 @@
 
 
   FT_LOCAL_DEF( FT_Error )
-  CFF_Parser_Run( CFF_Parser  parser,
+  cff_parser_run( CFF_Parser  parser,
                   FT_Byte*    start,
                   FT_Byte*    limit )
   {
--- a/src/cff/cffparse.h
+++ b/src/cff/cffparse.h
@@ -50,12 +50,12 @@
 
 
   FT_LOCAL( void )
-  CFF_Parser_Init( CFF_Parser  parser,
+  cff_parser_init( CFF_Parser  parser,
                    FT_UInt     code,
                    void*       object );
 
   FT_LOCAL( FT_Error )
-  CFF_Parser_Run( CFF_Parser  parser,
+  cff_parser_run( CFF_Parser  parser,
                   FT_Byte*    start,
                   FT_Byte*    limit );
 
--- a/src/cff/rules.mk
+++ b/src/cff/rules.mk
@@ -28,6 +28,7 @@
                $(CFF_DIR_)cffload.c   \
                $(CFF_DIR_)cffgload.c  \
                $(CFF_DIR_)cffparse.c  \
+               $(CFF_DIR_)cffcmap.c   \
                $(CFF_DIR_)cffdrivr.c
 
 # CFF driver headers