Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /***************************************************************************/
  2. /*                                                                         */
  3. /*  psaux.h                                                                */
  4. /*                                                                         */
  5. /*    Auxiliary functions and data structures related to PostScript fonts  */
  6. /*    (specification).                                                     */
  7. /*                                                                         */
  8. /*  Copyright 1996-2004, 2006, 2008, 2009, 2012 by                         */
  9. /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
  10. /*                                                                         */
  11. /*  This file is part of the FreeType project, and may only be used,       */
  12. /*  modified, and distributed under the terms of the FreeType project      */
  13. /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
  14. /*  this file you indicate that you have read the license and              */
  15. /*  understand and accept it fully.                                        */
  16. /*                                                                         */
  17. /***************************************************************************/
  18.  
  19.  
  20. #ifndef __PSAUX_H__
  21. #define __PSAUX_H__
  22.  
  23.  
  24. #include <ft2build.h>
  25. #include FT_INTERNAL_OBJECTS_H
  26. #include FT_INTERNAL_TYPE1_TYPES_H
  27. #include FT_SERVICE_POSTSCRIPT_CMAPS_H
  28.  
  29.  
  30. FT_BEGIN_HEADER
  31.  
  32.  
  33.   /*************************************************************************/
  34.   /*************************************************************************/
  35.   /*****                                                               *****/
  36.   /*****                             T1_TABLE                          *****/
  37.   /*****                                                               *****/
  38.   /*************************************************************************/
  39.   /*************************************************************************/
  40.  
  41.  
  42.   typedef struct PS_TableRec_*              PS_Table;
  43.   typedef const struct PS_Table_FuncsRec_*  PS_Table_Funcs;
  44.  
  45.  
  46.   /*************************************************************************/
  47.   /*                                                                       */
  48.   /* <Struct>                                                              */
  49.   /*    PS_Table_FuncsRec                                                  */
  50.   /*                                                                       */
  51.   /* <Description>                                                         */
  52.   /*    A set of function pointers to manage PS_Table objects.             */
  53.   /*                                                                       */
  54.   /* <Fields>                                                              */
  55.   /*    table_init    :: Used to initialize a table.                       */
  56.   /*                                                                       */
  57.   /*    table_done    :: Finalizes resp. destroy a given table.            */
  58.   /*                                                                       */
  59.   /*    table_add     :: Adds a new object to a table.                     */
  60.   /*                                                                       */
  61.   /*    table_release :: Releases table data, then finalizes it.           */
  62.   /*                                                                       */
  63.   typedef struct  PS_Table_FuncsRec_
  64.   {
  65.     FT_Error
  66.     (*init)( PS_Table   table,
  67.              FT_Int     count,
  68.              FT_Memory  memory );
  69.  
  70.     void
  71.     (*done)( PS_Table  table );
  72.  
  73.     FT_Error
  74.     (*add)( PS_Table    table,
  75.             FT_Int      idx,
  76.             void*       object,
  77.             FT_PtrDist  length );
  78.  
  79.     void
  80.     (*release)( PS_Table  table );
  81.  
  82.   } PS_Table_FuncsRec;
  83.  
  84.  
  85.   /*************************************************************************/
  86.   /*                                                                       */
  87.   /* <Struct>                                                              */
  88.   /*    PS_TableRec                                                        */
  89.   /*                                                                       */
  90.   /* <Description>                                                         */
  91.   /*    A PS_Table is a simple object used to store an array of objects in */
  92.   /*    a single memory block.                                             */
  93.   /*                                                                       */
  94.   /* <Fields>                                                              */
  95.   /*    block     :: The address in memory of the growheap's block.  This  */
  96.   /*                 can change between two object adds, due to            */
  97.   /*                 reallocation.                                         */
  98.   /*                                                                       */
  99.   /*    cursor    :: The current top of the grow heap within its block.    */
  100.   /*                                                                       */
  101.   /*    capacity  :: The current size of the heap block.  Increments by    */
  102.   /*                 1kByte chunks.                                        */
  103.   /*                                                                       */
  104.   /*    init      :: Set to 0xDEADBEEF if `elements' and `lengths' have    */
  105.   /*                 been allocated.                                       */
  106.   /*                                                                       */
  107.   /*    max_elems :: The maximum number of elements in table.              */
  108.   /*                                                                       */
  109.   /*    num_elems :: The current number of elements in table.              */
  110.   /*                                                                       */
  111.   /*    elements  :: A table of element addresses within the block.        */
  112.   /*                                                                       */
  113.   /*    lengths   :: A table of element sizes within the block.            */
  114.   /*                                                                       */
  115.   /*    memory    :: The object used for memory operations                 */
  116.   /*                 (alloc/realloc).                                      */
  117.   /*                                                                       */
  118.   /*    funcs     :: A table of method pointers for this object.           */
  119.   /*                                                                       */
  120.   typedef struct  PS_TableRec_
  121.   {
  122.     FT_Byte*           block;          /* current memory block           */
  123.     FT_Offset          cursor;         /* current cursor in memory block */
  124.     FT_Offset          capacity;       /* current size of memory block   */
  125.     FT_Long            init;
  126.  
  127.     FT_Int             max_elems;
  128.     FT_Int             num_elems;
  129.     FT_Byte**          elements;       /* addresses of table elements */
  130.     FT_PtrDist*        lengths;        /* lengths of table elements   */
  131.  
  132.     FT_Memory          memory;
  133.     PS_Table_FuncsRec  funcs;
  134.  
  135.   } PS_TableRec;
  136.  
  137.  
  138.   /*************************************************************************/
  139.   /*************************************************************************/
  140.   /*****                                                               *****/
  141.   /*****                       T1 FIELDS & TOKENS                      *****/
  142.   /*****                                                               *****/
  143.   /*************************************************************************/
  144.   /*************************************************************************/
  145.  
  146.   typedef struct PS_ParserRec_*  PS_Parser;
  147.  
  148.   typedef struct T1_TokenRec_*   T1_Token;
  149.  
  150.   typedef struct T1_FieldRec_*   T1_Field;
  151.  
  152.  
  153.   /* simple enumeration type used to identify token types */
  154.   typedef enum  T1_TokenType_
  155.   {
  156.     T1_TOKEN_TYPE_NONE = 0,
  157.     T1_TOKEN_TYPE_ANY,
  158.     T1_TOKEN_TYPE_STRING,
  159.     T1_TOKEN_TYPE_ARRAY,
  160.     T1_TOKEN_TYPE_KEY, /* aka `name' */
  161.  
  162.     /* do not remove */
  163.     T1_TOKEN_TYPE_MAX
  164.  
  165.   } T1_TokenType;
  166.  
  167.  
  168.   /* a simple structure used to identify tokens */
  169.   typedef struct  T1_TokenRec_
  170.   {
  171.     FT_Byte*      start;   /* first character of token in input stream */
  172.     FT_Byte*      limit;   /* first character after the token          */
  173.     T1_TokenType  type;    /* type of token                            */
  174.  
  175.   } T1_TokenRec;
  176.  
  177.  
  178.   /* enumeration type used to identify object fields */
  179.   typedef enum  T1_FieldType_
  180.   {
  181.     T1_FIELD_TYPE_NONE = 0,
  182.     T1_FIELD_TYPE_BOOL,
  183.     T1_FIELD_TYPE_INTEGER,
  184.     T1_FIELD_TYPE_FIXED,
  185.     T1_FIELD_TYPE_FIXED_1000,
  186.     T1_FIELD_TYPE_STRING,
  187.     T1_FIELD_TYPE_KEY,
  188.     T1_FIELD_TYPE_BBOX,
  189.     T1_FIELD_TYPE_MM_BBOX,
  190.     T1_FIELD_TYPE_INTEGER_ARRAY,
  191.     T1_FIELD_TYPE_FIXED_ARRAY,
  192.     T1_FIELD_TYPE_CALLBACK,
  193.  
  194.     /* do not remove */
  195.     T1_FIELD_TYPE_MAX
  196.  
  197.   } T1_FieldType;
  198.  
  199.  
  200.   typedef enum  T1_FieldLocation_
  201.   {
  202.     T1_FIELD_LOCATION_CID_INFO,
  203.     T1_FIELD_LOCATION_FONT_DICT,
  204.     T1_FIELD_LOCATION_FONT_EXTRA,
  205.     T1_FIELD_LOCATION_FONT_INFO,
  206.     T1_FIELD_LOCATION_PRIVATE,
  207.     T1_FIELD_LOCATION_BBOX,
  208.     T1_FIELD_LOCATION_LOADER,
  209.     T1_FIELD_LOCATION_FACE,
  210.     T1_FIELD_LOCATION_BLEND,
  211.  
  212.     /* do not remove */
  213.     T1_FIELD_LOCATION_MAX
  214.  
  215.   } T1_FieldLocation;
  216.  
  217.  
  218.   typedef void
  219.   (*T1_Field_ParseFunc)( FT_Face     face,
  220.                          FT_Pointer  parser );
  221.  
  222.  
  223.   /* structure type used to model object fields */
  224.   typedef struct  T1_FieldRec_
  225.   {
  226.     const char*         ident;        /* field identifier               */
  227.     T1_FieldLocation    location;
  228.     T1_FieldType        type;         /* type of field                  */
  229.     T1_Field_ParseFunc  reader;
  230.     FT_UInt             offset;       /* offset of field in object      */
  231.     FT_Byte             size;         /* size of field in bytes         */
  232.     FT_UInt             array_max;    /* maximum number of elements for */
  233.                                       /* array                          */
  234.     FT_UInt             count_offset; /* offset of element count for    */
  235.                                       /* arrays; must not be zero if in */
  236.                                       /* use -- in other words, a       */
  237.                                       /* `num_FOO' element must not     */
  238.                                       /* start the used structure if we */
  239.                                       /* parse a `FOO' array            */
  240.     FT_UInt             dict;         /* where we expect it             */
  241.   } T1_FieldRec;
  242.  
  243. #define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */
  244. #define T1_FIELD_DICT_PRIVATE  ( 1 << 1 )
  245.  
  246.  
  247.  
  248. #define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \
  249.           {                                                 \
  250.             _ident, T1CODE, _type,                          \
  251.             0,                                              \
  252.             FT_FIELD_OFFSET( _fname ),                      \
  253.             FT_FIELD_SIZE( _fname ),                        \
  254.             0, 0,                                           \
  255.             _dict                                           \
  256.           },
  257.  
  258. #define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \
  259.           {                                             \
  260.             _ident, T1CODE, T1_FIELD_TYPE_CALLBACK,     \
  261.             (T1_Field_ParseFunc)_reader,                \
  262.             0, 0,                                       \
  263.             0, 0,                                       \
  264.             _dict                                       \
  265.           },
  266.  
  267. #define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \
  268.           {                                                      \
  269.             _ident, T1CODE, _type,                               \
  270.             0,                                                   \
  271.             FT_FIELD_OFFSET( _fname ),                           \
  272.             FT_FIELD_SIZE_DELTA( _fname ),                       \
  273.             _max,                                                \
  274.             FT_FIELD_OFFSET( num_ ## _fname ),                   \
  275.             _dict                                                \
  276.           },
  277.  
  278. #define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \
  279.           {                                                       \
  280.             _ident, T1CODE, _type,                                \
  281.             0,                                                    \
  282.             FT_FIELD_OFFSET( _fname ),                            \
  283.             FT_FIELD_SIZE_DELTA( _fname ),                        \
  284.             _max, 0,                                              \
  285.             _dict                                                 \
  286.           },
  287.  
  288.  
  289. #define T1_FIELD_BOOL( _ident, _fname, _dict )                             \
  290.           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict )
  291.  
  292. #define T1_FIELD_NUM( _ident, _fname, _dict )                                 \
  293.           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict )
  294.  
  295. #define T1_FIELD_FIXED( _ident, _fname, _dict )                             \
  296.           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict )
  297.  
  298. #define T1_FIELD_FIXED_1000( _ident, _fname, _dict )                     \
  299.           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \
  300.                                _dict )
  301.  
  302. #define T1_FIELD_STRING( _ident, _fname, _dict )                             \
  303.           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict )
  304.  
  305. #define T1_FIELD_KEY( _ident, _fname, _dict )                             \
  306.           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict )
  307.  
  308. #define T1_FIELD_BBOX( _ident, _fname, _dict )                             \
  309.           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict )
  310.  
  311.  
  312. #define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict )         \
  313.           T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
  314.                               _fname, _fmax, _dict )
  315.  
  316. #define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict )     \
  317.           T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
  318.                               _fname, _fmax, _dict )
  319.  
  320. #define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict )         \
  321.           T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
  322.                                _fname, _fmax, _dict )
  323.  
  324. #define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict )     \
  325.           T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
  326.                                _fname, _fmax, _dict )
  327.  
  328. #define T1_FIELD_CALLBACK( _ident, _name, _dict )       \
  329.           T1_NEW_CALLBACK_FIELD( _ident, _name, _dict )
  330.  
  331.  
  332.   /*************************************************************************/
  333.   /*************************************************************************/
  334.   /*****                                                               *****/
  335.   /*****                            T1 PARSER                          *****/
  336.   /*****                                                               *****/
  337.   /*************************************************************************/
  338.   /*************************************************************************/
  339.  
  340.   typedef const struct PS_Parser_FuncsRec_*  PS_Parser_Funcs;
  341.  
  342.   typedef struct  PS_Parser_FuncsRec_
  343.   {
  344.     void
  345.     (*init)( PS_Parser  parser,
  346.              FT_Byte*   base,
  347.              FT_Byte*   limit,
  348.              FT_Memory  memory );
  349.  
  350.     void
  351.     (*done)( PS_Parser  parser );
  352.  
  353.     void
  354.     (*skip_spaces)( PS_Parser  parser );
  355.     void
  356.     (*skip_PS_token)( PS_Parser  parser );
  357.  
  358.     FT_Long
  359.     (*to_int)( PS_Parser  parser );
  360.     FT_Fixed
  361.     (*to_fixed)( PS_Parser  parser,
  362.                  FT_Int     power_ten );
  363.  
  364.     FT_Error
  365.     (*to_bytes)( PS_Parser  parser,
  366.                  FT_Byte*   bytes,
  367.                  FT_Offset  max_bytes,
  368.                  FT_Long*   pnum_bytes,
  369.                  FT_Bool    delimiters );
  370.  
  371.     FT_Int
  372.     (*to_coord_array)( PS_Parser  parser,
  373.                        FT_Int     max_coords,
  374.                        FT_Short*  coords );
  375.     FT_Int
  376.     (*to_fixed_array)( PS_Parser  parser,
  377.                        FT_Int     max_values,
  378.                        FT_Fixed*  values,
  379.                        FT_Int     power_ten );
  380.  
  381.     void
  382.     (*to_token)( PS_Parser  parser,
  383.                  T1_Token   token );
  384.     void
  385.     (*to_token_array)( PS_Parser  parser,
  386.                        T1_Token   tokens,
  387.                        FT_UInt    max_tokens,
  388.                        FT_Int*    pnum_tokens );
  389.  
  390.     FT_Error
  391.     (*load_field)( PS_Parser       parser,
  392.                    const T1_Field  field,
  393.                    void**          objects,
  394.                    FT_UInt         max_objects,
  395.                    FT_ULong*       pflags );
  396.  
  397.     FT_Error
  398.     (*load_field_table)( PS_Parser       parser,
  399.                          const T1_Field  field,
  400.                          void**          objects,
  401.                          FT_UInt         max_objects,
  402.                          FT_ULong*       pflags );
  403.  
  404.   } PS_Parser_FuncsRec;
  405.  
  406.  
  407.   /*************************************************************************/
  408.   /*                                                                       */
  409.   /* <Struct>                                                              */
  410.   /*    PS_ParserRec                                                       */
  411.   /*                                                                       */
  412.   /* <Description>                                                         */
  413.   /*    A PS_Parser is an object used to parse a Type 1 font very quickly. */
  414.   /*                                                                       */
  415.   /* <Fields>                                                              */
  416.   /*    cursor :: The current position in the text.                        */
  417.   /*                                                                       */
  418.   /*    base   :: Start of the processed text.                             */
  419.   /*                                                                       */
  420.   /*    limit  :: End of the processed text.                               */
  421.   /*                                                                       */
  422.   /*    error  :: The last error returned.                                 */
  423.   /*                                                                       */
  424.   /*    memory :: The object used for memory operations (alloc/realloc).   */
  425.   /*                                                                       */
  426.   /*    funcs  :: A table of functions for the parser.                     */
  427.   /*                                                                       */
  428.   typedef struct  PS_ParserRec_
  429.   {
  430.     FT_Byte*   cursor;
  431.     FT_Byte*   base;
  432.     FT_Byte*   limit;
  433.     FT_Error   error;
  434.     FT_Memory  memory;
  435.  
  436.     PS_Parser_FuncsRec  funcs;
  437.  
  438.   } PS_ParserRec;
  439.  
  440.  
  441.   /*************************************************************************/
  442.   /*************************************************************************/
  443.   /*****                                                               *****/
  444.   /*****                         T1 BUILDER                            *****/
  445.   /*****                                                               *****/
  446.   /*************************************************************************/
  447.   /*************************************************************************/
  448.  
  449.  
  450.   typedef struct T1_BuilderRec_*  T1_Builder;
  451.  
  452.  
  453.   typedef FT_Error
  454.   (*T1_Builder_Check_Points_Func)( T1_Builder  builder,
  455.                                    FT_Int      count );
  456.  
  457.   typedef void
  458.   (*T1_Builder_Add_Point_Func)( T1_Builder  builder,
  459.                                 FT_Pos      x,
  460.                                 FT_Pos      y,
  461.                                 FT_Byte     flag );
  462.  
  463.   typedef FT_Error
  464.   (*T1_Builder_Add_Point1_Func)( T1_Builder  builder,
  465.                                  FT_Pos      x,
  466.                                  FT_Pos      y );
  467.  
  468.   typedef FT_Error
  469.   (*T1_Builder_Add_Contour_Func)( T1_Builder  builder );
  470.  
  471.   typedef FT_Error
  472.   (*T1_Builder_Start_Point_Func)( T1_Builder  builder,
  473.                                   FT_Pos      x,
  474.                                   FT_Pos      y );
  475.  
  476.   typedef void
  477.   (*T1_Builder_Close_Contour_Func)( T1_Builder  builder );
  478.  
  479.  
  480.   typedef const struct T1_Builder_FuncsRec_*  T1_Builder_Funcs;
  481.  
  482.   typedef struct  T1_Builder_FuncsRec_
  483.   {
  484.     void
  485.     (*init)( T1_Builder    builder,
  486.              FT_Face       face,
  487.              FT_Size       size,
  488.              FT_GlyphSlot  slot,
  489.              FT_Bool       hinting );
  490.  
  491.     void
  492.     (*done)( T1_Builder   builder );
  493.  
  494.     T1_Builder_Check_Points_Func   check_points;
  495.     T1_Builder_Add_Point_Func      add_point;
  496.     T1_Builder_Add_Point1_Func     add_point1;
  497.     T1_Builder_Add_Contour_Func    add_contour;
  498.     T1_Builder_Start_Point_Func    start_point;
  499.     T1_Builder_Close_Contour_Func  close_contour;
  500.  
  501.   } T1_Builder_FuncsRec;
  502.  
  503.  
  504.   /* an enumeration type to handle charstring parsing states */
  505.   typedef enum  T1_ParseState_
  506.   {
  507.     T1_Parse_Start,
  508.     T1_Parse_Have_Width,
  509.     T1_Parse_Have_Moveto,
  510.     T1_Parse_Have_Path
  511.  
  512.   } T1_ParseState;
  513.  
  514.  
  515.   /*************************************************************************/
  516.   /*                                                                       */
  517.   /* <Structure>                                                           */
  518.   /*    T1_BuilderRec                                                      */
  519.   /*                                                                       */
  520.   /* <Description>                                                         */
  521.   /*     A structure used during glyph loading to store its outline.       */
  522.   /*                                                                       */
  523.   /* <Fields>                                                              */
  524.   /*    memory       :: The current memory object.                         */
  525.   /*                                                                       */
  526.   /*    face         :: The current face object.                           */
  527.   /*                                                                       */
  528.   /*    glyph        :: The current glyph slot.                            */
  529.   /*                                                                       */
  530.   /*    loader       :: XXX                                                */
  531.   /*                                                                       */
  532.   /*    base         :: The base glyph outline.                            */
  533.   /*                                                                       */
  534.   /*    current      :: The current glyph outline.                         */
  535.   /*                                                                       */
  536.   /*    max_points   :: maximum points in builder outline                  */
  537.   /*                                                                       */
  538.   /*    max_contours :: Maximum number of contours in builder outline.     */
  539.   /*                                                                       */
  540.   /*    pos_x        :: The horizontal translation (if composite glyph).   */
  541.   /*                                                                       */
  542.   /*    pos_y        :: The vertical translation (if composite glyph).     */
  543.   /*                                                                       */
  544.   /*    left_bearing :: The left side bearing point.                       */
  545.   /*                                                                       */
  546.   /*    advance      :: The horizontal advance vector.                     */
  547.   /*                                                                       */
  548.   /*    bbox         :: Unused.                                            */
  549.   /*                                                                       */
  550.   /*    parse_state  :: An enumeration which controls the charstring       */
  551.   /*                    parsing state.                                     */
  552.   /*                                                                       */
  553.   /*    load_points  :: If this flag is not set, no points are loaded.     */
  554.   /*                                                                       */
  555.   /*    no_recurse   :: Set but not used.                                  */
  556.   /*                                                                       */
  557.   /*    metrics_only :: A boolean indicating that we only want to compute  */
  558.   /*                    the metrics of a given glyph, not load all of its  */
  559.   /*                    points.                                            */
  560.   /*                                                                       */
  561.   /*    funcs        :: An array of function pointers for the builder.     */
  562.   /*                                                                       */
  563.   typedef struct  T1_BuilderRec_
  564.   {
  565.     FT_Memory       memory;
  566.     FT_Face         face;
  567.     FT_GlyphSlot    glyph;
  568.     FT_GlyphLoader  loader;
  569.     FT_Outline*     base;
  570.     FT_Outline*     current;
  571.  
  572.     FT_Pos          pos_x;
  573.     FT_Pos          pos_y;
  574.  
  575.     FT_Vector       left_bearing;
  576.     FT_Vector       advance;
  577.  
  578.     FT_BBox         bbox;          /* bounding box */
  579.     T1_ParseState   parse_state;
  580.     FT_Bool         load_points;
  581.     FT_Bool         no_recurse;
  582.  
  583.     FT_Bool         metrics_only;
  584.  
  585.     void*           hints_funcs;    /* hinter-specific */
  586.     void*           hints_globals;  /* hinter-specific */
  587.  
  588.     T1_Builder_FuncsRec  funcs;
  589.  
  590.   } T1_BuilderRec;
  591.  
  592.  
  593.   /*************************************************************************/
  594.   /*************************************************************************/
  595.   /*****                                                               *****/
  596.   /*****                         T1 DECODER                            *****/
  597.   /*****                                                               *****/
  598.   /*************************************************************************/
  599.   /*************************************************************************/
  600.  
  601. #if 0
  602.  
  603.   /*************************************************************************/
  604.   /*                                                                       */
  605.   /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine   */
  606.   /* calls during glyph loading.                                           */
  607.   /*                                                                       */
  608. #define T1_MAX_SUBRS_CALLS  8
  609.  
  610.  
  611.   /*************************************************************************/
  612.   /*                                                                       */
  613.   /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity.  A     */
  614.   /* minimum of 16 is required.                                            */
  615.   /*                                                                       */
  616. #define T1_MAX_CHARSTRINGS_OPERANDS  32
  617.  
  618. #endif /* 0 */
  619.  
  620.  
  621.   typedef struct  T1_Decoder_ZoneRec_
  622.   {
  623.     FT_Byte*  cursor;
  624.     FT_Byte*  base;
  625.     FT_Byte*  limit;
  626.  
  627.   } T1_Decoder_ZoneRec, *T1_Decoder_Zone;
  628.  
  629.  
  630.   typedef struct T1_DecoderRec_*              T1_Decoder;
  631.   typedef const struct T1_Decoder_FuncsRec_*  T1_Decoder_Funcs;
  632.  
  633.  
  634.   typedef FT_Error
  635.   (*T1_Decoder_Callback)( T1_Decoder  decoder,
  636.                           FT_UInt     glyph_index );
  637.  
  638.  
  639.   typedef struct  T1_Decoder_FuncsRec_
  640.   {
  641.     FT_Error
  642.     (*init)( T1_Decoder           decoder,
  643.              FT_Face              face,
  644.              FT_Size              size,
  645.              FT_GlyphSlot         slot,
  646.              FT_Byte**            glyph_names,
  647.              PS_Blend             blend,
  648.              FT_Bool              hinting,
  649.              FT_Render_Mode       hint_mode,
  650.              T1_Decoder_Callback  callback );
  651.  
  652.     void
  653.     (*done)( T1_Decoder  decoder );
  654.  
  655.     FT_Error
  656.     (*parse_charstrings)( T1_Decoder  decoder,
  657.                           FT_Byte*    base,
  658.                           FT_UInt     len );
  659.  
  660.   } T1_Decoder_FuncsRec;
  661.  
  662.  
  663.   typedef struct  T1_DecoderRec_
  664.   {
  665.     T1_BuilderRec        builder;
  666.  
  667.     FT_Long              stack[T1_MAX_CHARSTRINGS_OPERANDS];
  668.     FT_Long*             top;
  669.  
  670.     T1_Decoder_ZoneRec   zones[T1_MAX_SUBRS_CALLS + 1];
  671.     T1_Decoder_Zone      zone;
  672.  
  673.     FT_Service_PsCMaps   psnames;      /* for seac */
  674.     FT_UInt              num_glyphs;
  675.     FT_Byte**            glyph_names;
  676.  
  677.     FT_Int               lenIV;        /* internal for sub routine calls */
  678.     FT_UInt              num_subrs;
  679.     FT_Byte**            subrs;
  680.     FT_PtrDist*          subrs_len;    /* array of subrs length (optional) */
  681.  
  682.     FT_Matrix            font_matrix;
  683.     FT_Vector            font_offset;
  684.  
  685.     FT_Int               flex_state;
  686.     FT_Int               num_flex_vectors;
  687.     FT_Vector            flex_vectors[7];
  688.  
  689.     PS_Blend             blend;       /* for multiple master support */
  690.  
  691.     FT_Render_Mode       hint_mode;
  692.  
  693.     T1_Decoder_Callback  parse_callback;
  694.     T1_Decoder_FuncsRec  funcs;
  695.  
  696.     FT_Long*             buildchar;
  697.     FT_UInt              len_buildchar;
  698.  
  699.     FT_Bool              seac;
  700.  
  701.   } T1_DecoderRec;
  702.  
  703.  
  704.   /*************************************************************************/
  705.   /*************************************************************************/
  706.   /*****                                                               *****/
  707.   /*****                            AFM PARSER                         *****/
  708.   /*****                                                               *****/
  709.   /*************************************************************************/
  710.   /*************************************************************************/
  711.  
  712.   typedef struct AFM_ParserRec_*  AFM_Parser;
  713.  
  714.   typedef struct  AFM_Parser_FuncsRec_
  715.   {
  716.     FT_Error
  717.     (*init)( AFM_Parser  parser,
  718.              FT_Memory   memory,
  719.              FT_Byte*    base,
  720.              FT_Byte*    limit );
  721.  
  722.     void
  723.     (*done)( AFM_Parser  parser );
  724.  
  725.     FT_Error
  726.     (*parse)( AFM_Parser  parser );
  727.  
  728.   } AFM_Parser_FuncsRec;
  729.  
  730.  
  731.   typedef struct AFM_StreamRec_*  AFM_Stream;
  732.  
  733.  
  734.   /*************************************************************************/
  735.   /*                                                                       */
  736.   /* <Struct>                                                              */
  737.   /*    AFM_ParserRec                                                      */
  738.   /*                                                                       */
  739.   /* <Description>                                                         */
  740.   /*    An AFM_Parser is a parser for the AFM files.                       */
  741.   /*                                                                       */
  742.   /* <Fields>                                                              */
  743.   /*    memory    :: The object used for memory operations (alloc and      */
  744.   /*                 realloc).                                             */
  745.   /*                                                                       */
  746.   /*    stream    :: This is an opaque object.                             */
  747.   /*                                                                       */
  748.   /*    FontInfo  :: The result will be stored here.                       */
  749.   /*                                                                       */
  750.   /*    get_index :: A user provided function to get a glyph index by its  */
  751.   /*                 name.                                                 */
  752.   /*                                                                       */
  753.   typedef struct  AFM_ParserRec_
  754.   {
  755.     FT_Memory     memory;
  756.     AFM_Stream    stream;
  757.  
  758.     AFM_FontInfo  FontInfo;
  759.  
  760.     FT_Int
  761.     (*get_index)( const char*  name,
  762.                   FT_Offset    len,
  763.                   void*        user_data );
  764.  
  765.     void*         user_data;
  766.  
  767.   } AFM_ParserRec;
  768.  
  769.  
  770.   /*************************************************************************/
  771.   /*************************************************************************/
  772.   /*****                                                               *****/
  773.   /*****                     TYPE1 CHARMAPS                            *****/
  774.   /*****                                                               *****/
  775.   /*************************************************************************/
  776.   /*************************************************************************/
  777.  
  778.   typedef const struct T1_CMap_ClassesRec_*  T1_CMap_Classes;
  779.  
  780.   typedef struct T1_CMap_ClassesRec_
  781.   {
  782.     FT_CMap_Class  standard;
  783.     FT_CMap_Class  expert;
  784.     FT_CMap_Class  custom;
  785.     FT_CMap_Class  unicode;
  786.  
  787.   } T1_CMap_ClassesRec;
  788.  
  789.  
  790.   /*************************************************************************/
  791.   /*************************************************************************/
  792.   /*****                                                               *****/
  793.   /*****                        PSAux Module Interface                 *****/
  794.   /*****                                                               *****/
  795.   /*************************************************************************/
  796.   /*************************************************************************/
  797.  
  798.   typedef struct  PSAux_ServiceRec_
  799.   {
  800.     /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */
  801.     const PS_Table_FuncsRec*    ps_table_funcs;
  802.     const PS_Parser_FuncsRec*   ps_parser_funcs;
  803.     const T1_Builder_FuncsRec*  t1_builder_funcs;
  804.     const T1_Decoder_FuncsRec*  t1_decoder_funcs;
  805.  
  806.     void
  807.     (*t1_decrypt)( FT_Byte*   buffer,
  808.                    FT_Offset  length,
  809.                    FT_UShort  seed );
  810.  
  811.     T1_CMap_Classes  t1_cmap_classes;
  812.  
  813.     /* fields after this comment line were added after version 2.1.10 */
  814.     const AFM_Parser_FuncsRec*  afm_parser_funcs;
  815.  
  816.   } PSAux_ServiceRec, *PSAux_Service;
  817.  
  818.   /* backwards-compatible type definition */
  819.   typedef PSAux_ServiceRec   PSAux_Interface;
  820.  
  821.  
  822.   /*************************************************************************/
  823.   /*************************************************************************/
  824.   /*****                                                               *****/
  825.   /*****                 Some convenience functions                    *****/
  826.   /*****                                                               *****/
  827.   /*************************************************************************/
  828.   /*************************************************************************/
  829.  
  830. #define IS_PS_NEWLINE( ch ) \
  831.   ( (ch) == '\r' ||         \
  832.     (ch) == '\n' )
  833.  
  834. #define IS_PS_SPACE( ch )  \
  835.   ( (ch) == ' '         || \
  836.     IS_PS_NEWLINE( ch ) || \
  837.     (ch) == '\t'        || \
  838.     (ch) == '\f'        || \
  839.     (ch) == '\0' )
  840.  
  841. #define IS_PS_SPECIAL( ch )       \
  842.   ( (ch) == '/'                || \
  843.     (ch) == '(' || (ch) == ')' || \
  844.     (ch) == '<' || (ch) == '>' || \
  845.     (ch) == '[' || (ch) == ']' || \
  846.     (ch) == '{' || (ch) == '}' || \
  847.     (ch) == '%'                )
  848.  
  849. #define IS_PS_DELIM( ch )  \
  850.   ( IS_PS_SPACE( ch )   || \
  851.     IS_PS_SPECIAL( ch ) )
  852.  
  853. #define IS_PS_DIGIT( ch )        \
  854.   ( (ch) >= '0' && (ch) <= '9' )
  855.  
  856. #define IS_PS_XDIGIT( ch )            \
  857.   ( IS_PS_DIGIT( ch )              || \
  858.     ( (ch) >= 'A' && (ch) <= 'F' ) || \
  859.     ( (ch) >= 'a' && (ch) <= 'f' ) )
  860.  
  861. #define IS_PS_BASE85( ch )       \
  862.   ( (ch) >= '!' && (ch) <= 'u' )
  863.  
  864. #define IS_PS_TOKEN( cur, limit, token )                                \
  865.   ( (char)(cur)[0] == (token)[0]                                     && \
  866.     ( (cur) + sizeof ( (token) ) == (limit) ||                          \
  867.       ( (cur) + sizeof( (token) ) < (limit)          &&                 \
  868.         IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) )             && \
  869.     ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 )
  870.  
  871.  
  872. FT_END_HEADER
  873.  
  874. #endif /* __PSAUX_H__ */
  875.  
  876.  
  877. /* END */
  878.