shithub: freetype+ttf2subf

Download patch

ref: 2e421319fc4bedef44218fc144b1186ea53df584
parent: 2c5f482b48c3951abb4b30b864e12e5d7e6c8ab0
author: David Turner <[email protected]>
date: Fri May 26 18:13:17 EDT 2000

moved a lot of things from the TrueType driver to the SFNT
module (whose interface has changed, by the way)

This allows even more code re-use between TrueType and
OpenType formats..

git/fs: mount .git/fs: mount/attach disallowed
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,12 @@
 LATEST_CHANGES
 
+  - moved a lot of stuff from the TrueType driver to the SFNT module,
+    this allows greater code re-use between font drivers (e.g. TrueType,
+    OpenType, Compact-TrueType, etc..)
+
+  - added a tiny segment cache to the SFNT Charmap 4 decoder, in order
+    to minimally speed it up..
+
   - added support for Multiple Master fonts in "type1z". There is also
     a new file named <freetype/ftmm.h> which defines functions to
     manage them from client applications.
--- a/include/freetype/internal/autohint.h
+++ b/include/freetype/internal/autohint.h
@@ -149,6 +149,24 @@
                                                  FT_Face        face );
 
 
+ /***********************************************************************
+  *
+  * <FuncType>
+  *    FT_AutoHinter_Reset_Func
+  *
+  * <Description>
+  *    This function is used to recompute the global metrics in a given   
+  *    font. This is useful when global font data changes (e.g. multiple
+  *    masters fonts where blend coordinates change..)
+  *
+  * <Input>
+  *    hinter      :: handle to source auto-hinter
+  *    face        :: handle to the face.
+  *
+  *
+  */
+  typedef  FT_Error    (*FT_AutoHinter_Reset_Func)( FT_AutoHinter  hinter,
+                                                    FT_Face        face );
 
  /***********************************************************************
   *
@@ -189,6 +207,7 @@
   {
     FT_AutoHinter_Init_Func   init_autohinter;
     FT_AutoHinter_Done_Func   done_autohinter;
+    FT_AutoHinter_Reset_Func  reset_face;
     FT_AutoHinter_Load_Func   load_glyph;
 
     FT_AutoHinter_Get_Global_Func   get_global_hints;
--- a/include/freetype/internal/ftstream.h
+++ b/include/freetype/internal/ftstream.h
@@ -195,7 +195,12 @@
 
   BASE_DEF(void)      FT_Forget_Frame( FT_Stream  stream );
 
+  BASE_DEF(FT_Error)  FT_Extract_Frame( FT_Stream  stream,
+                                        FT_ULong   count,
+                                        FT_Byte*  *pbytes );
 
+  BASE_DEF(void)      FT_Release_Frame( FT_Stream  stream,
+                                        FT_Byte*  *pbytes );
 
   BASE_DEF(FT_Char)   FT_Get_Char( FT_Stream  stream );
 
@@ -233,13 +238,14 @@
 #define ACCESS_Frame( size )  \
           FT_SET_ERROR( FT_Access_Frame( stream, size ) )
 
-#define ACCESS_Compressed_Frame( size )  \
-          FT_SET_ERROR( FT_Access_Compressed_Frame( stream, size ) )
-
-
 #define FORGET_Frame() \
           FT_Forget_Frame( stream )
 
+#define EXTRACT_Frame( size, bytes ) \
+          FT_SET_ERROR( FT_Extract_Frame( stream, size, (FT_Byte**)&(bytes) ) )
+          
+#define RELEASE_Frame( bytes ) \
+          FT_Release_Frame( stream, (FT_Byte**)&(bytes) )
 
 #define FILE_Seek( position )  \
           FT_SET_ERROR( FT_Seek_Stream( stream, position ) )
--- a/include/freetype/internal/sfnt.h
+++ b/include/freetype/internal/sfnt.h
@@ -26,6 +26,96 @@
   /*************************************************************************/
   /*                                                                       */
   /* <FuncType>                                                            */
+  /*    TT_Init_Face_Func                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    First part of the SFNT face object initialisation. This will       */
+  /*    find the face in a SFNT file or collection, and load its           */
+  /*    format tag in face->format_tag.                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream     :: The input stream.                                    */
+  /*    face       :: A handle to the target face object.                  */
+  /*    faceIndex  :: The index of the TrueType font, if we're opening a   */
+  /*                  collection.                                          */
+  /*    num_params :: number of additional parameters                      */
+  /*    params     :: optional additional parameters                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The stream cursor must be at the font file's origin                */
+  /*    This function recognizes fonts embedded in a "TrueType collection" */
+  /*                                                                       */
+  /*    Once the format tag has been validated by the font driver, it      */
+  /*    should then call the TT_Load_Face_Func callback to read the rest   */
+  /*    of the SFNT tables in the object..                                 */
+  /*                                                                       */
+  typedef
+  FT_Error  (*TT_Init_Face_Func)( FT_Stream      stream,
+                                  TT_Face        face,
+                                  FT_Int         face_index,
+                                  FT_Int         num_params,
+                                  FT_Parameter*  params );
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_Face_Func                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Second part of the SFNT face object initialisation. This will      */
+  /*    load the common SFNT tables (head, OS/2, maxp, metrics, etc..)     */
+  /*    in the face object..                                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream     :: The input stream.                                    */
+  /*    face       :: A handle to the target face object.                  */
+  /*    faceIndex  :: The index of the TrueType font, if we're opening a   */
+  /*                  collection.                                          */
+  /*    num_params :: number of additional parameters                      */
+  /*    params     :: optional additional parameters                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function must be called after TT_Init_Face_Func               */
+  /*                                                                       */
+  typedef
+  FT_Error  (*TT_Load_Face_Func)( FT_Stream      stream,
+                                  TT_Face        face,
+                                  FT_Int         face_index,
+                                  FT_Int         num_params,
+                                  FT_Parameter*  params );
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Done_Face_Func                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A callback used to delete the common SFNT data from a face.        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face       :: A handle to the target face object.                  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function does NOT destroy the face object..                   */
+  /*                                                                       */
+  typedef
+  void    (*TT_Done_Face_Func)( TT_Face   face );
+
+
+  typedef
+  FTDriver_Interface  (*SFNT_Get_Interface_Func)( FT_Driver    driver,
+                                                  const char*  interface );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
   /*    TT_Load_Format_Tag                                                 */
   /*                                                                       */
   /* <Description>                                                         */
@@ -338,10 +428,17 @@
   {
     TT_Goto_Table_Func      goto_table;
 
+    TT_Init_Face_Func       init_face;
+    TT_Load_Face_Func       load_face;
+    TT_Done_Face_Func       done_face;
+    SFNT_Get_Interface_Func get_interface;
+    
     TT_Load_Any_Func        load_any;
     TT_Load_Format_Tag_Func load_format_tag;
     TT_Load_Directory_Func  load_directory;
 
+    /* these functions are called by "load_face" but they can also */
+    /* be called from external modules, if there is a need to      */
     TT_Load_Table_Func      load_header;
     TT_Load_Metrics_Func    load_metrics;
     TT_Load_Table_Func      load_charmaps;
--- a/include/freetype/internal/tttypes.h
+++ b/include/freetype/internal/tttypes.h
@@ -423,466 +423,9 @@
   } TT_Table;
 
 
-#if 0
   /*************************************************************************/
   /*                                                                       */
   /* <Struct>                                                              */
-  /*    TT_Header                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to model a TrueType font header table.  All       */
-  /*    fields follow the TrueType specification.                          */
-  /*                                                                       */
-  typedef struct  TT_Header_
-  {
-    TT_Fixed   Table_Version;
-    TT_Fixed   Font_Revision;
-
-    TT_Long    CheckSum_Adjust;
-    TT_Long    Magic_Number;
-
-    TT_UShort  Flags;
-    TT_UShort  Units_Per_EM;
-
-    TT_Long    Created [2];
-    TT_Long    Modified[2];
-
-    TT_FWord   xMin;
-    TT_FWord   yMin;
-    TT_FWord   xMax;
-    TT_FWord   yMax;
-
-    TT_UShort  Mac_Style;
-    TT_UShort  Lowest_Rec_PPEM;
-
-    TT_Short   Font_Direction;
-    TT_Short   Index_To_Loc_Format;
-    TT_Short   Glyph_Data_Format;
-
-  } TT_Header;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_HoriHeader                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to model a TrueType horizontal header, the `hhea' */
-  /*    table, as well as the corresponding horizontal metrics table,      */
-  /*    i.e., the `hmtx' table.                                            */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    Version                :: The table version.                       */
-  /*                                                                       */
-  /*    Ascender               :: The font's ascender, i.e., the distance  */
-  /*                              from the baseline to the top-most of all */
-  /*                              glyph points found in the font.          */
-  /*                                                                       */
-  /*                              This value is invalid in many fonts, as  */
-  /*                              it is usually set by the font designer,  */
-  /*                              and often reflects only a portion of the */
-  /*                              glyphs found in the font (maybe ASCII).  */
-  /*                                                                       */
-  /*                              You should use the `sTypoAscender' field */
-  /*                              of the OS/2 table instead if you want    */
-  /*                              the correct one.                         */
-  /*                                                                       */
-  /*    Descender              :: The font's descender, i.e., the distance */
-  /*                              from the baseline to the bottom-most of  */
-  /*                              all glyph points found in the font.  It  */
-  /*                              is negative.                             */
-  /*                                                                       */
-  /*                              This value is invalid in many fonts, as  */
-  /*                              it is usually set by the font designer,  */
-  /*                              and often reflects only a portion of the */
-  /*                              glyphs found in the font (maybe ASCII).  */
-  /*                                                                       */
-  /*                              You should use the `sTypoDescender'      */
-  /*                              field of the OS/2 table instead if you   */
-  /*                              want the correct one.                    */
-  /*                                                                       */
-  /*    Line_Gap               :: The font's line gap, i.e., the distance  */
-  /*                              to add to the ascender and descender to  */
-  /*                              get the BTB, i.e., the                   */
-  /*                              baseline-to-baseline distance for the    */
-  /*                              font.                                    */
-  /*                                                                       */
-  /*    advance_Width_Max      :: This field is the maximum of all advance */
-  /*                              widths found in the font.  It can be     */
-  /*                              used to compute the maximum width of an  */
-  /*                              arbitrary string of text.                */
-  /*                                                                       */
-  /*    min_Left_Side_Bearing  :: The minimum left side bearing of all     */
-  /*                              glyphs within the font.                  */
-  /*                                                                       */
-  /*    min_Right_Side_Bearing :: The minimum right side bearing of all    */
-  /*                              glyphs within the font.                  */
-  /*                                                                       */
-  /*    xMax_Extent            :: The maximum horizontal extent (i.e., the */
-  /*                              `width' of a glyph's bounding box) for   */
-  /*                              all glyphs in the font.                  */
-  /*                                                                       */
-  /*    caret_Slope_Rise       :: The rise coefficient of the cursor's     */
-  /*                              slope of the cursor (slope=rise/run).    */
-  /*                                                                       */
-  /*    caret_Slope_Run        :: The run coefficient of the cursor's      */
-  /*                              slope.                                   */
-  /*                                                                       */
-  /*    Reserved               :: 10 reserved bytes.                       */
-  /*                                                                       */
-  /*    metric_Data_Format     :: Always 0.                                */
-  /*                                                                       */
-  /*    number_Of_HMetrics     :: Number of HMetrics entries in the `hmtx' */
-  /*                              table -- this value can be smaller than  */
-  /*                              the total number of glyphs in the font.  */
-  /*                                                                       */
-  /*    long_metrics           :: A pointer into the `hmtx' table.         */
-  /*                                                                       */
-  /*    short_metrics          :: A pointer into the `hmtx' table.         */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should   */
-  /*               be identical except for the names of their fields which */
-  /*               are different.                                          */
-  /*                                                                       */
-  /*               This ensures that a single function in the `ttload'     */
-  /*               module is able to read both the horizontal and vertical */
-  /*               headers.                                                */
-  /*                                                                       */
-  typedef struct  TT_HoriHeader_
-  {
-    TT_Fixed   Version;
-    TT_FWord   Ascender;
-    TT_FWord   Descender;
-    TT_FWord   Line_Gap;
-
-    TT_UFWord  advance_Width_Max;      /* advance width maximum */
-
-    TT_FWord   min_Left_Side_Bearing;  /* minimum left-sb       */
-    TT_FWord   min_Right_Side_Bearing; /* minimum right-sb      */
-    TT_FWord   xMax_Extent;            /* xmax extents          */
-    TT_FWord   caret_Slope_Rise;
-    TT_FWord   caret_Slope_Run;
-    TT_FWord   caret_Offset;
-
-    TT_Short   Reserved[4];
-
-    TT_Short   metric_Data_Format;
-    TT_UShort  number_Of_HMetrics;
-
-    /* The following fields are not defined by the TrueType specification */
-    /* but they're used to connect the metrics header to the relevant     */
-    /* `HMTX' table.                                                      */
-
-    void*      long_metrics;
-    void*      short_metrics;
-
-  } TT_HoriHeader;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_VertHeader                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to model a TrueType vertical header, the `vhea'   */
-  /*    table, as well as the corresponding vertical metrics table, i.e.,  */
-  /*    the `vmtx' table.                                                  */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    Version                 :: The table version.                      */
-  /*                                                                       */
-  /*    Ascender                :: The font's ascender, i.e., the distance */
-  /*                               from the baseline to the top-most of    */
-  /*                               all glyph points found in the font.     */
-  /*                                                                       */
-  /*                               This value is invalid in many fonts, as */
-  /*                               it is usually set by the font designer, */
-  /*                               and often reflects only a portion of    */
-  /*                               the glyphs found in the font (maybe     */
-  /*                               ASCII).                                 */
-  /*                                                                       */
-  /*                               You should use the `sTypoAscender'      */
-  /*                               field of the OS/2 table instead if you  */
-  /*                               want the correct one.                   */
-  /*                                                                       */
-  /*    Descender               :: The font's descender, i.e., the         */
-  /*                               distance from the baseline to the       */
-  /*                               bottom-most of all glyph points found   */
-  /*                               in the font.  It is negative.           */
-  /*                                                                       */
-  /*                               This value is invalid in many fonts, as */
-  /*                               it is usually set by the font designer, */
-  /*                               and often reflects only a portion of    */
-  /*                               the glyphs found in the font (maybe     */
-  /*                               ASCII).                                 */
-  /*                                                                       */
-  /*                               You should use the `sTypoDescender'     */
-  /*                               field of the OS/2 table instead if you  */
-  /*                               want the correct one.                   */
-  /*                                                                       */
-  /*    Line_Gap                :: The font's line gap, i.e., the distance */
-  /*                               to add to the ascender and descender to */
-  /*                               get the BTB, i.e., the                  */
-  /*                               baseline-to-baseline distance for the   */
-  /*                               font.                                   */
-  /*                                                                       */
-  /*    advance_Height_Max      :: This field is the maximum of all        */
-  /*                               advance heights found in the font.  It  */
-  /*                               can be used to compute the maximum      */
-  /*                               height of an arbitrary string of text.  */
-  /*                                                                       */
-  /*    min_Top_Side_Bearing    :: The minimum top side bearing of all     */
-  /*                               glyphs within the font.                 */
-  /*                                                                       */
-  /*    min_Bottom_Side_Bearing :: The minimum bottom side bearing of all  */
-  /*                               glyphs within the font.                 */
-  /*                                                                       */
-  /*    yMax_Extent             :: The maximum vertical extent (i.e., the  */
-  /*                               `height' of a glyph's bounding box) for */
-  /*                               all glyphs in the font.                 */
-  /*                                                                       */
-  /*    caret_Slope_Rise        :: The rise coefficient of the cursor's    */
-  /*                               slope of the cursor (slope=rise/run).   */
-  /*                                                                       */
-  /*    caret_Slope_Run         :: The run coefficient of the cursor's     */
-  /*                               slope.                                  */
-  /*                                                                       */
-  /*    Reserved                :: 10 reserved bytes.                      */
-  /*                                                                       */
-  /*    metric_Data_Format      :: Always 0.                               */
-  /*                                                                       */
-  /*    number_Of_HMetrics      :: Number of VMetrics entries in the       */
-  /*                               `vmtx' table -- this value can be       */
-  /*                               smaller than the total number of glyphs */
-  /*                               in the font.                            */
-  /*                                                                       */
-  /*    long_metrics           :: A pointer into the `vmtx' table.         */
-  /*                                                                       */
-  /*    short_metrics          :: A pointer into the `vmtx' table.         */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should   */
-  /*               be identical except for the names of their fields which */
-  /*               are different.                                          */
-  /*                                                                       */
-  /*               This ensures that a single function in the `ttload'     */
-  /*               module is able to read both the horizontal and vertical */
-  /*               headers.                                                */
-  /*                                                                       */
-  typedef struct TT_VertHeader_
-  {
-    TT_Fixed   Version;
-    TT_FWord   Ascender;
-    TT_FWord   Descender;
-    TT_FWord   Line_Gap;
-
-    TT_UFWord  advance_Height_Max;      /* advance height maximum */
-
-    TT_FWord   min_Top_Side_Bearing;    /* minimum left-sb or top-sb       */
-    TT_FWord   min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb   */
-    TT_FWord   yMax_Extent;             /* xmax or ymax extents            */
-    TT_FWord   caret_Slope_Rise;
-    TT_FWord   caret_Slope_Run;
-    TT_FWord   caret_Offset;
-
-    TT_Short   Reserved[4];
-
-    TT_Short   metric_Data_Format;
-    TT_UShort  number_Of_VMetrics;
-
-    /* The following fields are not defined by the TrueType specification */
-    /* but they're used to connect the metrics header to the relevant     */
-    /* `HMTX' or `VMTX' table.                                            */
-
-    void*      long_metrics;
-    void*      short_metrics;
-
-  } TT_VertHeader;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_OS2                                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to model a TrueType OS/2 table. This is the long  */
-  /*    table version.  All fields comply to the TrueType specification.   */
-  /*                                                                       */
-  /*    Note that we now support old Mac fonts which do not include an     */
-  /*    OS/2 table.  In this case, the `version' field is always set to    */
-  /*    0xFFFF.                                                            */
-  /*                                                                       */
-  typedef struct  TT_OS2_
-  {
-    TT_UShort  version;                /* 0x0001 - more or 0xFFFF */
-    TT_FWord   xAvgCharWidth;
-    TT_UShort  usWeightClass;
-    TT_UShort  usWidthClass;
-    TT_Short   fsType;
-    TT_FWord   ySubscriptXSize;
-    TT_FWord   ySubscriptYSize;
-    TT_FWord   ySubscriptXOffset;
-    TT_FWord   ySubscriptYOffset;
-    TT_FWord   ySuperscriptXSize;
-    TT_FWord   ySuperscriptYSize;
-    TT_FWord   ySuperscriptXOffset;
-    TT_FWord   ySuperscriptYOffset;
-    TT_FWord   yStrikeoutSize;
-    TT_FWord   yStrikeoutPosition;
-    TT_Short   sFamilyClass;
-
-    TT_Byte    panose[10];
-
-    TT_ULong   ulUnicodeRange1;        /* Bits 0-31   */
-    TT_ULong   ulUnicodeRange2;        /* Bits 32-63  */
-    TT_ULong   ulUnicodeRange3;        /* Bits 64-95  */
-    TT_ULong   ulUnicodeRange4;        /* Bits 96-127 */
-
-    TT_Char    achVendID[4];
-
-    TT_UShort  fsSelection;
-    TT_UShort  usFirstCharIndex;
-    TT_UShort  usLastCharIndex;
-    TT_Short   sTypoAscender;
-    TT_Short   sTypoDescender;
-    TT_Short   sTypoLineGap;
-    TT_UShort  usWinAscent;
-    TT_UShort  usWinDescent;
-
-    /* only version 1 tables: */
-
-    TT_ULong   ulCodePageRange1;       /* Bits 0-31   */
-    TT_ULong   ulCodePageRange2;       /* Bits 32-63  */
-
-  } TT_OS2;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_Postscript                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to model a TrueType Postscript table.  All fields */
-  /*    comply to the TrueType table.  This structure does not reference   */
-  /*    the Postscript glyph names, which can be nevertheless accessed     */
-  /*    with the `ttpost' module.                                          */
-  /*                                                                       */
-  typedef struct  TT_Postscript_
-  {
-    TT_Fixed  FormatType;
-    TT_Fixed  italicAngle;
-    TT_FWord  underlinePosition;
-    TT_FWord  underlineThickness;
-    TT_ULong  isFixedPitch;
-    TT_ULong  minMemType42;
-    TT_ULong  maxMemType42;
-    TT_ULong  minMemType1;
-    TT_ULong  maxMemType1;
-
-    /* Glyph names follow in the file, but we don't   */
-    /* load them by default.  See the ttpost.c file.  */
-
-  } TT_Postscript;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_MaxProfile                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The maximum profile is a table containing many max values which    */
-  /*    can be used to pre-allocate arrays.  This ensures that no memory   */
-  /*    allocation occurs during a glyph load.                             */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    version               :: The version number.                       */
-  /*                                                                       */
-  /*    numGlyphs             :: The number of glyphs in this TrueType     */
-  /*                             font.                                     */
-  /*                                                                       */
-  /*    maxPoints             :: The maximum number of points in a         */
-  /*                             non-composite TrueType glyph.  See also   */
-  /*                             the structure element                     */
-  /*                             `maxCompositePoints'.                     */
-  /*                                                                       */
-  /*    maxContours           :: The maximum number of contours in a       */
-  /*                             non-composite TrueType glyph.  See also   */
-  /*                             the structure element                     */
-  /*                             `maxCompositeContours'.                   */
-  /*                                                                       */
-  /*    maxCompositePoints    :: The maximum number of points in a         */
-  /*                             composite TrueType glyph.  See also the   */
-  /*                             structure element `maxPoints'.            */
-  /*                                                                       */
-  /*    maxCompositeContours  :: The maximum number of contours in a       */
-  /*                             composite TrueType glyph.  See also the   */
-  /*                             structure element `maxContours'.          */
-  /*                                                                       */
-  /*    maxZones              :: The maximum number of zones used for      */
-  /*                             glyph hinting.                            */
-  /*                                                                       */
-  /*    maxTwilightPoints     :: The maximum number of points in the       */
-  /*                             twilight zone used for glyph hinting.     */
-  /*                                                                       */
-  /*    maxStorage            :: The maximum number of elements in the     */
-  /*                             storage area used for glyph hinting.      */
-  /*                                                                       */
-  /*    maxFunctionDefs       :: The maximum number of function            */
-  /*                             definitions in the TrueType bytecode for  */
-  /*                             this font.                                */
-  /*                                                                       */
-  /*    maxInstructionDefs    :: The maximum number of instruction         */
-  /*                             definitions in the TrueType bytecode for  */
-  /*                             this font.                                */
-  /*                                                                       */
-  /*    maxStackElements      :: The maximum number of stack elements used */
-  /*                             during bytecode interpretation.           */
-  /*                                                                       */
-  /*    maxSizeOfInstructions :: The maximum number of TrueType opcodes    */
-  /*                             used for glyph hinting.                   */
-  /*                                                                       */
-  /*    maxComponentElements  :: An obscure value related to composite     */
-  /*                             glyphs definitions.                       */
-  /*                                                                       */
-  /*    maxComponentDepth     :: An obscure value related to composite     */
-  /*                             glyphs definitions.  Probably the maximum */
-  /*                             number of simple glyphs in a composite.   */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This structure is only used during font loading.                   */
-  /*                                                                       */
-  typedef struct  TT_MaxProfile_
-  {
-    TT_Fixed   version;
-    TT_UShort  numGlyphs;
-    TT_UShort  maxPoints;
-    TT_UShort  maxContours;
-    TT_UShort  maxCompositePoints;
-    TT_UShort  maxCompositeContours;
-    TT_UShort  maxZones;
-    TT_UShort  maxTwilightPoints;
-    TT_UShort  maxStorage;
-    TT_UShort  maxFunctionDefs;
-    TT_UShort  maxInstructionDefs;
-    TT_UShort  maxStackElements;
-    TT_UShort  maxSizeOfInstructions;
-    TT_UShort  maxComponentElements;
-    TT_UShort  maxComponentDepth;
-
-  } TT_MaxProfile;
-
-
-#endif
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
   /*    TT_CMapDir                                                         */
   /*                                                                       */
   /* <Description>                                                         */
@@ -1657,7 +1200,9 @@
     TT_CMap4Segment*  segments;
     TT_UShort*        glyphIdArray;
     TT_UShort         numGlyphId;   /* control value */
-
+    
+    TT_CMap4Segment*  last_segment;  /* last used segment, this is a small  */
+                                     /* cache to potentially increase speed */
   } TT_CMap4;
 
 
@@ -2062,6 +1607,15 @@
     /* a pointer to the bytecode interpreter to use. This is also */
     /* used to hook the debugger for the `ttdebug' utility..      */
     TT_Interpreter     interpreter;
+
+    /***********************************************************************/
+    /*                                                                     */
+    /* Other tables or fields. This is used by derivative formats like     */
+    /* OpenType.                                                           */
+    /*                                                                     */
+    /***********************************************************************/
+
+    void*              other;
 
   } TT_FaceRec;
 
--- a/src/base/ftstream.c
+++ b/src/base/ftstream.c
@@ -121,7 +121,38 @@
   }
 
 
+  BASE_FUNC(FT_Error)  FT_Extract_Frame( FT_Stream  stream,
+                                         FT_ULong   count,
+                                         FT_Byte*  *pbytes )
+  {
+    FT_Error  error;
+    
+    error = FT_Access_Frame( stream, count );
+    if (!error)
+    {
+      *pbytes = (FT_Byte*)stream->cursor;
+        
+      /* equivalent to FT_Forget_Frame, with no memory block release */
+      stream->cursor = 0;
+      stream->limit  = 0;
+    }
+    return error;
+  }                                         
 
+
+  BASE_FUNC(void)    FT_Release_Frame( FT_Stream  stream,
+                                       FT_Byte*  *pbytes )
+  {
+    if (stream->read)
+    {
+      FT_Memory  memory = stream->memory;
+      FREE( *pbytes );
+    }
+    *pbytes = 0;
+  }
+
+
+
   BASE_FUNC(FT_Error)  FT_Access_Frame( FT_Stream  stream,
                                         FT_ULong   count )
   {
@@ -194,7 +225,6 @@
     if (stream->read)
     {
       FT_Memory  memory = stream->memory;
-
       FREE( stream->base );
     }
     stream->cursor = 0;
--- a/src/sfnt/rules.mk
+++ b/src/sfnt/rules.mk
@@ -38,6 +38,7 @@
                   $(SFNT_DIR_)ttcmap.c   \
                   $(SFNT_DIR_)ttsbit.c   \
                   $(SFNT_DIR_)ttpost.c   \
+                  $(SFNT_DIR_)sfobjs.c   \
                   $(SFNT_DIR_)sfdriver.c
 
 
@@ -44,6 +45,7 @@
   # driver headers
   #
   SFNT_DRV_H := $(BASE_H)              \
+                $(SFNT_DIR_)sfobjs.h   \
                 $(SFNT_DIR_)ttload.h   \
                 $(SFNT_DIR_)ttsbit.h   \
                 $(SFNT_DIR_)ttcmap.h   \
--- a/src/sfnt/sfdriver.c
+++ b/src/sfnt/sfdriver.c
@@ -5,10 +5,51 @@
 #include <ttsbit.h>
 #include <ttpost.h>
 #include <ttcmap.h>
+#include <sfobjs.h>
 
+  static
+  void*  get_sfnt_table( TT_Face  face, FT_Sfnt_Tag  tag )
+  {
+    void*  table;
+
+    switch (tag)
+    {
+      case ft_sfnt_head: table = &face->header; break;
+      case ft_sfnt_hhea: table = &face->horizontal; break;
+      case ft_sfnt_vhea: table = (face->vertical_info ? &face->vertical : 0 ); break;
+      case ft_sfnt_os2:  table = (face->os2.version == 0xFFFF ? 0 : &face->os2 ); break;
+      case ft_sfnt_post: table = &face->postscript; break;
+      case ft_sfnt_maxp: table = &face->max_profile; break;
+	  case ft_sfnt_pclt: table = face->pclt.Version ? &face->pclt : 0 ; break;
+
+      default:
+        table = 0;
+    }
+    return table;
+  }
+
+
+  static
+  FTDriver_Interface  SFNT_Get_Interface( FT_Driver    driver,
+                                          const char*  interface )
+  {
+    UNUSED(driver);
+
+    if (strcmp(interface,"get_sfnt")==0)
+      return (FTDriver_Interface)get_sfnt_table;
+
+    return 0;
+  }
+
+
   static const SFNT_Interface  sfnt_interface =
   {
     TT_Goto_Table,
+
+    SFNT_Init_Face,
+    SFNT_Load_Face,
+    SFNT_Done_Face,
+    SFNT_Get_Interface,
 
     TT_Load_Any,
     TT_Load_Format_Tag,
--- a/src/sfnt/sfnt.c
+++ b/src/sfnt/sfnt.c
@@ -2,6 +2,7 @@
 
 #include <ttload.c>
 #include <ttcmap.c>
+#include <sfobjs.c>
 
 #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
 #include <ttsbit.c>
--- a/src/sfnt/ttcmap.c
+++ b/src/sfnt/ttcmap.c
@@ -214,6 +214,8 @@
       FORGET_Frame();
 
       cmap->get_index = code_to_index4;
+      
+      cmap4->last_segment = cmap4->segments;
       break;
 
     case 6:
@@ -438,35 +440,45 @@
     seg4     = cmap4->segments;
     limit    = seg4 + segCount;
 
-    for ( ; seg4 < limit; seg4++, segCount-- )
+    /* check against the last segment */
+    seg4 = cmap4->last_segment;
+    if ( (TT_ULong)(charCode       - seg4->startCount) <
+         (TT_ULong)(seg4->endCount - seg4->startCount) )
+      goto Found;
+
+    for ( seg4 = cmap4->segments; seg4 < limit; seg4++, segCount-- )
     {
-      if ( charCode <= seg4->endCount )
-      {
-        /* the ranges are sorted in increasing order, if we're out of  */
-        /* the range here, the char code isn't in the charmap, so exit */
-        if ( charCode < seg4->startCount )
-          break;
+      /* the ranges are sorted in increasing order, if we're out of  */
+      /* the range here, the char code isn't in the charmap, so exit */
+      if ( charCode > seg4->endCount )
+        break;
+        
+      if ( charCode >= seg4->startCount )
+        goto Found;
+    }
+    return 0;
 
-        /* when the idRangeOffset is 0, we can compute the glyph index */
-        /* directly..                                                  */
-        if ( seg4->idRangeOffset == 0 )
-          result = (charCode + seg4->idDelta) & 0xFFFF;
-        else
-        /* otherwise, we must use the glyphIdArray to do it            */
-        {
-          index1 = seg4->idRangeOffset/2 + (charCode - seg4->startCount)
-                   - segCount;
+ Found:    
+    cmap4->last_segment = seg4;
+    
+    /* when the idRangeOffset is 0, we can compute the glyph index */
+    /* directly..                                                  */
+    
+    if ( seg4->idRangeOffset == 0 )
+      result = (charCode + seg4->idDelta) & 0xFFFF;
+      
+    else
+    /* otherwise, we must use the glyphIdArray to do it            */
+    {
+      index1 = seg4->idRangeOffset/2 + (charCode - seg4->startCount)
+               - segCount;
 
-          if ( index1 < cmap4->numGlyphId       &&
-               cmap4->glyphIdArray[index1] != 0 )
-          {
-            result = (cmap4->glyphIdArray[index1] + seg4->idDelta) & 0xFFFF;
-          }
-        }
-        break;
+      if ( index1 < cmap4->numGlyphId       &&
+           cmap4->glyphIdArray[index1] != 0 )
+      {
+        result = (cmap4->glyphIdArray[index1] + seg4->idDelta) & 0xFFFF;
       }
     }
-
     return result;
   }
 
--- a/src/truetype/ttdriver.c
+++ b/src/truetype/ttdriver.c
@@ -43,271 +43,7 @@
   /*************************************************************************/
 
 
- /******************************************************************
-  *
-  * <Function>
-  *    find_encoding
-  *
-  * <Description>
-  *    return the FT_Encoding corresponding to a given
-  *    (platform_id,encoding_id) pair, as found in TrueType charmaps
-  *
-  * <Input>
-  *   platform_id ::
-  *   encoding_id ::
-  *
-  * <Return>
-  *   the corresponding FT_Encoding tag. ft_encoding_none by default
-  *
-  *****************************************************************/
 
-  static
-  FT_Encoding   find_encoding( int  platform_id,
-                               int  encoding_id )
-  {
-    typedef struct  TEncoding
-    {
-      int          platform_id;
-      int          encoding_id;
-      FT_Encoding  encoding;
-
-    } TEncoding;
-
-    static
-    const TEncoding   tt_encodings[] =
-    {
-      { TT_PLATFORM_ISO,                         -1, ft_encoding_unicode },
-
-      { TT_PLATFORM_APPLE_UNICODE,               -1, ft_encoding_unicode },
-
-      { TT_PLATFORM_MACINTOSH,      TT_MAC_ID_ROMAN, ft_encoding_apple_roman },
-
-      { TT_PLATFORM_MICROSOFT,  TT_MS_ID_UNICODE_CS, ft_encoding_unicode },
-      { TT_PLATFORM_MICROSOFT,  TT_MS_ID_SJIS,       ft_encoding_sjis },
-      { TT_PLATFORM_MICROSOFT,  TT_MS_ID_BIG_5,      ft_encoding_big5 }
-    };
-
-    const TEncoding  *cur, *limit;
-
-    cur   = tt_encodings;
-    limit = cur + sizeof(tt_encodings)/sizeof(tt_encodings[0]);
-
-    for ( ; cur < limit; cur++ )
-    {
-      if (cur->platform_id == platform_id)
-      {
-        if (cur->encoding_id == encoding_id ||
-            cur->encoding_id == -1          )
-          return cur->encoding;
-      }
-    }
-    return ft_encoding_none;
-  }
-
-
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Init_Face                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A driver method used to initialize a new TrueType face object.     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    resource       :: A handle to the source resource.                 */
-  /*                                                                       */
-  /*    typeface_index :: An index of the face in the font resource.  Used */
-  /*                      to access individual faces in font collections.  */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face           :: A handle to the face object.                     */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The `typeface_index' parameter field will be set to -1 if the      */
-  /*    engine only wants to test the format of the resource.  This means  */
-  /*    that font drivers should simply check the font format, then return */
-  /*    immediately with an error code of 0 (meaning success).  The field  */
-  /*    `num_faces' should be set.                                         */
-  /*                                                                       */
-  /*    Done_Face() will be called subsequently, whatever the result was.  */
-  /*                                                                       */
-  static
-  TT_Error  Init_Face( FT_Stream      stream,
-                       TT_Face        face,
-                       FT_Int         typeface_index,
-                       FT_Int         num_params,
-                       FT_Parameter*  params )
-  {
-    TT_Error     error;
-
-    /* initialize the TrueType face object */
-    error = TT_Init_Face( stream, face, typeface_index, num_params, params );
-
-    /* now set up root fields */
-    if ( !error && typeface_index >= 0 )
-    {
-      FT_Face     root = &face->root;
-      FT_Int      flags;
-      TT_CharMap  charmap;
-      TT_Int      n;
-      FT_Memory   memory;
-
-      memory = root->memory;
-
-      /*****************************************************************/
-      /*                                                               */
-      /* Compute face flags.                                           */
-      /*                                                               */
-      flags = FT_FACE_FLAG_SCALABLE  |    /* scalable outlines */
-              FT_FACE_FLAG_SFNT      |    /* SFNT file format  */
-              FT_FACE_FLAG_HORIZONTAL;    /* horizontal data   */
-
-      /* fixed width font ? */
-      if ( face->postscript.isFixedPitch )
-        flags |= FT_FACE_FLAG_FIXED_WIDTH;
-
-      /* vertical information ? */
-      if ( face->vertical_info )
-        flags |= FT_FACE_FLAG_VERTICAL;
-
-      /* kerning available ? */
-      if ( face->kern_pairs )
-        flags |= FT_FACE_FLAG_KERNING;
-
-      root->face_flags = flags;
-
-      /*****************************************************************/
-      /*                                                               */
-      /* Compute style flags.                                          */
-      /*                                                               */
-      flags = 0;
-
-      if ( face->os2.version != 0xFFFF )
-      {
-        /* We have an OS/2 table, use the `fsSelection' field */
-        if ( face->os2.fsSelection & 1 )
-          flags |= FT_STYLE_FLAG_ITALIC;
-
-        if ( face->os2.fsSelection & 32 )
-          flags |= FT_STYLE_FLAG_BOLD;
-      }
-      else
-      {
-        /* This is an old Mac font, use the header field */
-        if ( face->header.Mac_Style & 1 )
-          flags |= FT_STYLE_FLAG_BOLD;
-
-        if ( face->header.Mac_Style & 2 )
-          flags |= FT_STYLE_FLAG_ITALIC;
-      }
-
-      face->root.style_flags = flags;
-
-      /*****************************************************************/
-      /*                                                               */
-      /* Polish the charmaps.                                          */
-      /*                                                               */
-      /*   Try to set the charmap encoding according to the platform & */
-      /*   encoding ID of each charmap.                                */
-      /*                                                               */
-      charmap            = face->charmaps;
-      root->num_charmaps = face->num_charmaps;
-
-      /* allocate table of pointers */
-      if ( ALLOC_ARRAY( root->charmaps, root->num_charmaps, FT_CharMap ) )
-        return error;
-
-      for ( n = 0; n < root->num_charmaps; n++, charmap++ )
-      {
-        FT_Int  platform = charmap->cmap.platformID;
-        FT_Int  encoding = charmap->cmap.platformEncodingID;
-
-        charmap->root.face        = (FT_Face)face;
-        charmap->root.platform_id = platform;
-        charmap->root.encoding_id = encoding;
-        charmap->root.encoding    = find_encoding(platform,encoding);
-
-        /* now, set root->charmap with a unicode charmap wherever available */
-        if (!root->charmap && charmap->root.encoding == ft_encoding_unicode)
-          root->charmap = (FT_CharMap)charmap;
-
-        root->charmaps[n] = (FT_CharMap)charmap;
-      }
-
-#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
-      if ( face->num_sbit_strikes )
-      {
-       face->root.num_fixed_sizes = face->num_sbit_strikes;
-       if ( ALLOC_ARRAY( face->root.available_sizes,
-                         face->num_sbit_strikes,
-                         FT_Bitmap_Size ) )
-         return error;
-
-       for ( n = 0 ; n < face->num_sbit_strikes ; n++ )
-       {
-         face->root.available_sizes[n].width =
-           face->sbit_strikes[n].x_ppem;
-         face->root.available_sizes[n].height =
-           face->sbit_strikes[n].y_ppem;
-       }
-      }
-      else
-#else
-      {
-       root->num_fixed_sizes = 0;
-       root->available_sizes = 0;
-      }
-#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
-
-      /*****************************************************************/
-      /*                                                               */
-      /*  Set up metrics.                                              */
-      /*                                                               */
-      root->bbox.xMin    = face->header.xMin;
-      root->bbox.yMin    = face->header.yMin;
-      root->bbox.xMax    = face->header.xMax;
-      root->bbox.yMax    = face->header.yMax;
-      root->units_per_EM = face->header.Units_Per_EM;
-
-      /* The ascender/descender/height are computed from the OS/2 table   */
-      /* when found.  Otherwise, they're taken from the horizontal header */
-      if ( face->os2.version != 0xFFFF )
-      {
-        root->ascender  =  face->os2.sTypoAscender;
-        root->descender = -face->os2.sTypoDescender;
-        root->height    =  root->ascender + root->descender +
-                           face->os2.sTypoLineGap;
-      }
-      else
-      {
-        root->ascender  = face->horizontal.Ascender;
-        root->descender = face->horizontal.Descender;
-        root->height    = root->ascender + root->descender +
-                          face->horizontal.Line_Gap;
-      }
-
-      root->max_advance_width  = face->horizontal.advance_Width_Max;
-
-      root->max_advance_height = root->height;
-      if ( face->vertical_info )
-        root->max_advance_height = face->vertical.advance_Height_Max;
-
-      root->underline_position  = face->postscript.underlinePosition;
-      root->underline_thickness = face->postscript.underlineThickness;
-
-      /* root->max_points      - already set up */
-      /* root->max_contours    - already set up */
-
-    }
-    return error;
-  }
-
-
 #undef  PAIR_TAG
 #define PAIR_TAG( left, right )  ( ((TT_ULong)left << 16) | (TT_ULong)right )
 
@@ -639,35 +375,18 @@
 
 
   static
-  void*  tt_get_sfnt_table( TT_Face  face, FT_Sfnt_Tag  tag )
+  FTDriver_Interface  tt_get_interface( TT_Driver  driver, const char* interface )
   {
-    void*  table;
-
-    switch (tag)
+    FT_Driver        sfntd = FT_Get_Driver( driver->root.library, "sfnt" );
+    SFNT_Interface*  sfnt;
+    
+    /* only return the default interface from the SFNT module */
+    if (sfntd)
     {
-      case ft_sfnt_head: table = &face->header; break;
-      case ft_sfnt_hhea: table = &face->horizontal; break;
-      case ft_sfnt_vhea: table = (face->vertical_info ? &face->vertical : 0 ); break;
-      case ft_sfnt_os2:  table = (face->os2.version == 0xFFFF ? 0 : &face->os2 ); break;
-      case ft_sfnt_post: table = &face->postscript; break;
-      case ft_sfnt_maxp: table = &face->max_profile; break;
-	  case ft_sfnt_pclt: table = face->pclt.Version ? &face->pclt : 0 ; break;
-
-      default:
-        table = 0;
+      sfnt = (SFNT_Interface*)(sfntd->interface.format_interface);
+      if (sfnt)
+        return sfnt->get_interface( (FT_Driver)driver, interface );
     }
-    return table;
-  }
-
-
-  static
-  FTDriver_Interface  tt_get_interface( TT_Driver  driver, const char* interface )
-  {
-    UNUSED(driver);
-
-    if (strcmp(interface,"get_sfnt")==0)
-      return (FTDriver_Interface)tt_get_sfnt_table;
-
     return 0;
   }
 
@@ -691,7 +410,7 @@
     (FTDriver_doneDriver)        TT_Done_Driver,
     (FTDriver_getInterface)      tt_get_interface,
 
-    (FTDriver_initFace)          Init_Face,
+    (FTDriver_initFace)          TT_Init_Face,
     (FTDriver_doneFace)          TT_Done_Face,
     (FTDriver_getKerning)        Get_Kerning,
 
--- a/src/truetype/ttobjs.c
+++ b/src/truetype/ttobjs.c
@@ -45,97 +45,8 @@
   /*************************************************************************/
 
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Get_Name                                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Returns a given ENGLISH name record in ASCII.                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face   :: A handle to the source face object.                      */
-  /*                                                                       */
-  /*    nameid :: The name id of the name record to return.                */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Char string.  NULL if no name is present.                          */
-  /*                                                                       */
-  static
-  FT_String*  Get_Name( TT_Face    face,
-                        TT_UShort  nameid )
-  {
-    FT_Memory    memory = face->root.memory;
-    TT_UShort    n;
-    TT_NameRec*  rec;
-    TT_Bool      wide_chars = 1;
 
-    /* first pass, look for a given name record */
-    rec = face->name_table.names;
-    for ( n = 0; n < face->name_table.numNameRecords; n++, rec++ )
-    {
-      if ( rec->nameID == nameid )
-      {
-        /* found the name - now create an ASCII string from it */
-        TT_Bool  found = 0;
 
-        /* Test for Microsoft English language */
-        if ( rec->platformID == TT_PLATFORM_MICROSOFT &&
-             rec->encodingID <= TT_MS_ID_UNICODE_CS   &&
-             (rec->languageID & 0x3FF) == 0x009 )
-          found = 1;
-
-        /* Test for Apple Unicode encoding */
-        else if ( rec->platformID == TT_PLATFORM_APPLE_UNICODE )
-          found = 1;
-
-        /* Test for Apple Roman */
-        else if ( rec->platformID == TT_PLATFORM_MACINTOSH &&
-                  rec->languageID == TT_MAC_ID_ROMAN       )
-        {
-          found      = 1;
-          wide_chars = 0;
-        }
-
-        /* Found a Unicode Name */
-        if ( found )
-        {
-          TT_String*  string;
-          TT_UInt     len;
-
-          if ( wide_chars )
-          {
-            TT_UInt   m;
-
-            len = (TT_UInt)rec->stringLength / 2;
-            if ( MEM_Alloc( string, len + 1 ) )
-              return NULL;
-
-            for ( m = 0; m < len; m ++ )
-              string[m] = rec->string[2*m + 1];
-          }
-          else
-          {
-            len = rec->stringLength;
-            if ( MEM_Alloc( string, len + 1 ) )
-              return NULL;
-
-            MEM_Copy( string, rec->string, len );
-          }
-
-          string[len] = '\0';
-          return string;
-        }
-      }
-    }
-    return NULL;
-  }
-
-
-#undef  LOAD_
-#define LOAD_(x)   ( (error = sfnt->load_##x( face, stream )) != TT_Err_Ok )
-
-
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
@@ -160,127 +71,52 @@
                           FT_Parameter*  params )
   {
     TT_Error           error;
-    TT_ULong           format_tag;
+    FT_Driver          sfnt_driver;
     SFNT_Interface*    sfnt;
-    PSNames_Interface* psnames;
 
-    /* for now, parameters are unused */
-    UNUSED(num_params);
-    UNUSED(params);
+    sfnt_driver = FT_Get_Driver( face->root.driver->library, "sfnt" );
+    if (!sfnt_driver) goto Bad_Format;
 
-    sfnt = (SFNT_Interface*)face->sfnt;
-    if (!sfnt)
-    {
-      /* look-up the SFNT driver */
-      FT_Driver  sfnt_driver;
+    sfnt = (SFNT_Interface*)(sfnt_driver->interface.format_interface);
+    if (!sfnt) goto Bad_Format;
 
-      sfnt_driver = FT_Get_Driver( face->root.driver->library, "sfnt" );
-      if (!sfnt_driver)
-        return FT_Err_Invalid_File_Format;
-
-      sfnt = (SFNT_Interface*)(sfnt_driver->interface.format_interface);
-      if (!sfnt)
-        return FT_Err_Invalid_File_Format;
-
-      face->sfnt       = sfnt;
-      face->goto_table = sfnt->goto_table;
-    }
-
-    psnames = (PSNames_Interface*)face->psnames;
-    if (!psnames)
-    {
-      /* look-up the PSNames driver */
-      FT_Driver  psnames_driver;
-
-      psnames_driver = FT_Get_Driver( face->root.driver->library, "psnames" );
-      if (psnames_driver)
-        face->psnames = (PSNames_Interface*)
-                            (psnames_driver->interface.format_interface);
-    }
-
     /* create input stream from resource */
     if ( FILE_Seek(0) )
       goto Exit;
 
     /* check that we have a valid TrueType file */
-    error = sfnt->load_format_tag( face, stream, face_index, &format_tag );
+    error = sfnt->init_face( stream, face, face_index, num_params, params );
     if (error) goto Exit;
 
     /* We must also be able to accept Mac/GX fonts, as well as OT ones */
-    if ( format_tag != 0x00010000 &&    /* MS fonts  */
-         format_tag != TTAG_true  )     /* Mac fonts */
+    if ( face->format_tag != 0x00010000 &&    /* MS fonts  */
+         face->format_tag != TTAG_true  )     /* Mac fonts */
     {
       FT_TRACE2(( "[not a valid TTF font]" ));
-      error = FT_Err_Unknown_File_Format;
-      goto Exit;
+      goto Bad_Format;
     }
 
-    /* store format tag */
-    face->format_tag = format_tag;
-	
-    /* Load font directory */
-    error = sfnt->load_directory( face, stream, face_index );
-    if ( error ) goto Exit;
-
-    face->root.num_faces = face->ttc_header.DirCount;
-    if ( face->root.num_faces < 1 )
-      face->root.num_faces = 1;
-
     /* If we're performing a simple font format check, exit immediately */
     if ( face_index < 0 )
       return TT_Err_Ok;
 
-    /* Load tables */
+    /* Load font directory */
+    error = sfnt->load_face( stream, face, face_index, num_params, params );
+    if ( error ) goto Exit;
 
-    if ( LOAD_( header )        ||
-         LOAD_( max_profile )   ||
-
-         (error = sfnt->load_metrics( face, stream, 0 )) != TT_Err_Ok  ||
-         /* load the `hhea' & `hmtx' tables at once */
-
-         (error = sfnt->load_metrics( face, stream, 1 )) != TT_Err_Ok ||
-         /* try to load the `vhea' & `vmtx' at once if present */
-
-         LOAD_( charmaps )      ||
-         LOAD_( names )         ||
-         LOAD_( os2 )           ||
-         LOAD_( psnames )       )
-     goto Exit;
-
-    /* the optional tables */
-
-    /* embedded bitmap support. */
-#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
-    if (sfnt->load_sbits && LOAD_(sbits)) goto Exit;
-#endif
-
-    if ( LOAD_( hdmx )          ||
-         LOAD_( gasp )          ||
-         LOAD_( kerning )       ||
-		 LOAD_( pclt )          ||
-
-         (error = TT_Load_Locations( face, stream )) != TT_Err_Ok ||
-         (error = TT_Load_CVT      ( face, stream )) != TT_Err_Ok ||
-         (error = TT_Load_Programs ( face, stream )) != TT_Err_Ok )
-
-      goto Exit;
-
-#ifdef TT_CONFIG_OPTION_EXTEND_ENGINE
-    if ( ( error = TT_Extension_Create( face ) ) != TT_Err_Ok )
-      goto Exit;
-#endif
-
-    face->root.family_name = Get_Name( face, TT_NAME_ID_FONT_FAMILY );
-    face->root.style_name  = Get_Name( face, TT_NAME_ID_FONT_SUBFAMILY );
-
+    error = TT_Load_Locations( face, stream ) ||
+            TT_Load_CVT      ( face, stream ) ||
+            TT_Load_Programs ( face, stream );
   Exit:
     return error;
+     
+  Bad_Format:
+    error = FT_Err_Unknown_File_Format;
+    goto Exit;
   }
 
 
-#undef LOAD_
 
-
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
@@ -295,94 +131,27 @@
   LOCAL_DEF
   void  TT_Done_Face( TT_Face  face )
   {
-    TT_UShort  n;
     FT_Memory  memory = face->root.memory;
+    FT_Stream  stream = face->root.stream;
 
     SFNT_Interface*  sfnt = face->sfnt;
 
     if (sfnt)
-    {
-      /* destroy the postscript names table if it is supported */
-      if (sfnt->free_psnames)
-        sfnt->free_psnames( face );
+      sfnt->done_face(face);
 
-      /* destroy the embedded bitmaps table if it is supported */
-      if (sfnt->free_sbits)
-        sfnt->free_sbits( face );
-    }
-
-    /* freeing the kerning table */
-    FREE( face->kern_pairs );
-    face->num_kern_pairs = 0;
-
-    /* freeing the collection table */
-    FREE( face->ttc_header.TableDirectory );
-    face->ttc_header.DirCount = 0;
-
-    /* freeing table directory */
-    FREE( face->dir_tables );
-    face->num_tables = 0;
-
     /* freeing the locations table */
     FREE( face->glyph_locations );
     face->num_locations = 0;
 
-    /* freeing the character mapping tables */
-    if (sfnt && sfnt->load_charmaps )
-    {
-      for ( n = 0; n < face->num_charmaps; n++ )
-        sfnt->free_charmap( face, &face->charmaps[n].cmap );
-    }
-
-    FREE( face->charmaps );
-    face->num_charmaps = 0;
-
-    FREE( face->root.charmaps );
-    face->root.num_charmaps = 0;
-    face->root.charmap      = 0;
-
     /* freeing the CVT */
     FREE( face->cvt );
     face->cvt_size = 0;
 
-    /* freeing the horizontal metrics */
-    FREE( face->horizontal.long_metrics );
-    FREE( face->horizontal.short_metrics );
-
-    /* freeing the vertical ones, if any */
-    if ( face->vertical_info )
-    {
-      FREE( face->vertical.long_metrics  );
-      FREE( face->vertical.short_metrics );
-      face->vertical_info = 0;
-    }
-
     /* freeing the programs */
-    FREE( face->font_program );
-    FREE( face->cvt_program );
+    RELEASE_Frame( face->font_program );
+    RELEASE_Frame( face->cvt_program );
     face->font_program_size = 0;
     face->cvt_program_size  = 0;
-
-    /* freeing the gasp table */
-    FREE( face->gasp.gaspRanges );
-    face->gasp.numRanges = 0;
-
-    /* freeing the name table */
-    sfnt->free_names( face );
-
-    /* freeing the hdmx table */
-    sfnt->free_hdmx( face );
-
-    /* freeing family and style name */
-    FREE( face->root.family_name );
-    FREE( face->root.style_name );
-
-    /* freeing sbit size table */
-    face->root.num_fixed_sizes = 0;
-    if ( face->root.available_sizes )
-      FREE( face->root.available_sizes );
-
-    face->sfnt = 0;
   }
 
 
--- a/src/truetype/ttpload.c
+++ b/src/truetype/ttpload.c
@@ -199,10 +199,8 @@
                               FT_Stream  stream )
   {
     TT_Error   error;
-    FT_Memory  memory = stream->memory;
     TT_ULong   table_len;
 
-
     FT_TRACE2(( "Font program " ));
 
     /* The font program is optional */
@@ -216,12 +214,7 @@
     else
     {
       face->font_program_size = table_len;
-
-      if ( ALLOC( face->font_program,
-                  face->font_program_size ) ||
-
-           FILE_Read( (void*)face->font_program,
-                      face->font_program_size )   )
+      if ( EXTRACT_Frame( table_len, face->font_program ) )
         goto Exit;
 
       FT_TRACE2(( "loaded, %12d bytes\n", face->font_program_size ));
@@ -241,14 +234,8 @@
     else
     {
       face->cvt_program_size = table_len;
-
-      if ( ALLOC( face->cvt_program,
-                  face->cvt_program_size )           ||
-
-           FILE_Read( (void*)face->cvt_program,
-                      face->cvt_program_size ) )
-        return error;
-
+      if ( EXTRACT_Frame( table_len, face->cvt_program ) )
+        goto Exit;
       FT_TRACE2(( "loaded, %12d bytes\n", face->cvt_program_size ));
     }
 
--- a/src/type1/module.mk
+++ b/src/type1/module.mk
@@ -2,5 +2,5 @@
 
 add_type1_driver:
 	$(OPEN_DRIVER)t1_driver_interface$(CLOSE_DRIVER)
-	$(ECHO_DRIVER)type1     $(ECHO_DRIVER_DESC) Postscript font files with extension *.pfa or *.pfb $(ECHO_DRIVER_DONE)
+	$(ECHO_DRIVER)type1     $(ECHO_DRIVER_DESC)Postscript font files with extension *.pfa or *.pfb$(ECHO_DRIVER_DONE)