shithub: freetype+ttf2subf

ref: 5ae1bad3f6f1c842a6f87d8c6e1e5c0237eb236b
dir: /src/cid/cidparse.h/

View raw version
/***************************************************************************/
/*                                                                         */
/*  cidparse.h                                                             */
/*                                                                         */
/*    CID-keyed Type1 parser (specification).                              */
/*                                                                         */
/*  Copyright 1996-2000 by                                                 */
/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
/*                                                                         */
/*  This file is part of the FreeType project, and may only be used,       */
/*  modified, and distributed under the terms of the FreeType project      */
/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
/*  this file you indicate that you have read the license and              */
/*  understand and accept it fully.                                        */
/*                                                                         */
/***************************************************************************/


#ifndef CIDPARSE_H
#define CIDPARSE_H

#include <freetype/internal/t1types.h>


#ifdef __cplusplus
  extern "C" {
#endif


#if 0

  /*************************************************************************/
  /*                                                                       */
  /* <Struct>                                                              */
  /*    T1_Table                                                           */
  /*                                                                       */
  /* <Description>                                                         */
  /*    A T1_Table is a simple object used to store an array of objects    */
  /*    in a single memory block.                                          */
  /*                                                                       */
  /* <Fields>                                                              */
  /*    block     :: The address in memory of the growheap's block.  This  */
  /*                 can change between two object adds, due to the use    */
  /*                 of `realloc()'.                                       */
  /*                                                                       */
  /*    cursor    :: The current top of the growheap within its block.     */
  /*                                                                       */
  /*    capacity  :: The current size of the heap block.  Increments by    */
  /*                 blocks of 1 kByte.                                    */
  /*                                                                       */
  /*    init      :: A boolean.  Set when the table has been initialized   */
  /*                 (the table user should set this field).               */
  /*                                                                       */
  /*    max_elems :: The maximal number of elements in the table.          */
  /*                                                                       */
  /*    num_elems :: The current number of elements (in use) in the table. */
  /*                                                                       */
  /*    elements  :: A table of element addresses within the block.        */
  /*                                                                       */
  /*    lengths   :: A table of element sizes within the block.            */
  /*                                                                       */
  /*    memory    :: The memory object used for memory operations          */
  /*                 (allocation resp. reallocation).                      */
  /*                                                                       */
  typedef struct  T1_Table_
  {
    FT_Byte*   block;          /* current memory block           */
    FT_Int     cursor;         /* current cursor in memory block */
    FT_Int     capacity;       /* current size of memory block   */
    FT_Long    init;

    FT_Int     max_elems;
    FT_Int     num_elems;
    FT_Byte**  elements;       /* addresses of table elements */
    FT_Int*    lengths;        /* lengths of table elements   */

    FT_Memory  memory;

  } T1_Table;


  LOCAL_DEF
  FT_Error  T1_New_Table( T1_Table*  table,
                          FT_Int     count,
                          T1_Memory  memory );

  LOCAL_DEF
  FT_Error  T1_Add_Table( T1_Table*  table,
                          FT_Int     index,
                          void*      object,
                          FT_Int     length );

  LOCAL_DEF
  void  T1_Release_Table( T1_Table*  table );

#endif /* 0 */


  /*************************************************************************/
  /*                                                                       */
  /* <Struct>                                                              */
  /*    CID_Parser                                                         */
  /*                                                                       */
  /* <Description>                                                         */
  /*    A CID_Parser is an object used to parse a Type 1 fonts very        */
  /*    quickly.                                                           */
  /*                                                                       */
  /* <Fields>                                                              */
  /*    stream         :: The current input stream.                        */
  /*                                                                       */
  /*    memory         :: The current memory object.                       */
  /*                                                                       */
  /*    postscript     :: A pointer to the data to be parsed.              */
  /*                                                                       */
  /*    postscript_len :: The length of the data to be parsed.             */
  /*                                                                       */
  /*    data_offset    :: The start position of the binary data (i.e., the */
  /*                      end of the data to be parsed.                    */
  /*                                                                       */
  /*    cursor         :: The current parser cursor.                       */
  /*                                                                       */
  /*    limit          :: The current parser limit (i.e., the first byte   */
  /*                      after the current dictionary).                   */
  /*                                                                       */
  /*    error          :: The current parsing error.                       */
  /*                                                                       */
  /*    cid            :: A structure which holds the information about    */
  /*                      the current font.                                */
  /*                                                                       */
  /*    num_dict       :: The number of font dictionaries.                 */
  /*                                                                       */
  typedef struct CID_Parser_
  {
    FT_Stream  stream;
    FT_Memory  memory;

    FT_Byte*   postscript;
    FT_Int     postscript_len;

    FT_ULong   data_offset;

    FT_Byte*   cursor;
    FT_Byte*   limit;
    FT_Error   error;

    CID_Info*  cid;
    FT_Int     num_dict;

  } CID_Parser;


  LOCAL_DEF
  FT_Error  CID_New_Parser( CID_Parser*  parser,
                            FT_Stream    stream,
                            FT_Memory    memory );

  LOCAL_DEF
  void  CID_Done_Parser( CID_Parser*  parser );


  /*************************************************************************/
  /*                                                                       */
  /*                            PARSING ROUTINES                           */
  /*                                                                       */
  /*************************************************************************/

  LOCAL_DEF
  FT_Long  CID_ToInt( CID_Parser*  parser );

  LOCAL_DEF
  FT_Int  CID_ToCoordArray( CID_Parser* parser,
                            FT_Int     max_coords,
                            FT_Short*  coords );

  LOCAL_DEF
  FT_Int  CID_ToFixedArray( CID_Parser* parser,
                            FT_Int      max_values,
                            FT_Fixed*   values,
                            FT_Int      power_ten );

  LOCAL_DEF
  void  CID_Skip_Spaces( CID_Parser*  parser );


  /* simple enumeration type used to identify token types */
  typedef enum  T1_Token_Type_
  {
    t1_token_none = 0,
    t1_token_any,
    t1_token_string,
    t1_token_array,

    /* do not remove */
    t1_token_max

  } T1_Token_Type;


  /* a simple structure used to identify tokens */
  typedef struct T1_Token_Rec_
  {
    FT_Byte*       start;   /* first character of token in input stream */
    FT_Byte*       limit;   /* first character after the token          */
    T1_Token_Type  type;    /* type of token..                          */

  } T1_Token_Rec;


  LOCAL_DEF
  void  CID_ToToken( CID_Parser*    parser,
                     T1_Token_Rec*  token );


  /* enumeration type used to identify object fields */
  typedef enum  T1_Field_Type_
  {
    t1_field_none = 0,
    t1_field_bool,
    t1_field_integer,
    t1_field_fixed,
    t1_field_string,
    t1_field_integer_array,
    t1_field_fixed_array,
    t1_field_callback,

    /* do not remove */
    t1_field_max

  } T1_Field_Type;

  typedef enum  T1_Field_Location_
  {
    t1_field_cid_info,
    t1_field_font_dict,
    t1_field_font_info,
    t1_field_private,

    /* do not remove */
    t1_field_location_max

  } T1_Field_Location;


  typedef FT_Error  (*CID_Field_Parser)( CID_Face     face,
                                         CID_Parser*  parser );

  /* structure type used to model object fields */
  typedef struct  T1_Field_Rec_
  {
    const char*        ident;         /* field identifier                  */
    T1_Field_Location  location;
    T1_Field_Type      type;          /* type of field                     */
    CID_Field_Parser   reader;
    FT_UInt            offset;        /* offset of field in object         */
    FT_UInt            size;          /* size of field in bytes            */
    FT_UInt            array_max;     /* maximal number of elements for    */
                                      /* array                             */
    FT_UInt            count_offset;  /* offset of element count for       */
                                      /* arrays                            */
  } T1_Field_Rec;


#define T1_FIELD_REF( s, f )  ( ((s*)0)->f )

#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname )         \
          {                                                  \
            _ident, T1CODE, _type,                           \
            0,                                               \
            (FT_UInt)(char*)&T1_FIELD_REF( T1TYPE, _fname ), \
            sizeof ( T1_FIELD_REF( T1TYPE, _fname ) ),       \
            0, 0                                             \
          },

#define T1_NEW_CALLBACK_FIELD( _ident, _reader ) \
          {                                      \
            _ident, T1CODE, t1_field_callback,   \
            _reader,                             \
            0, 0,                                \
            0, 0                                 \
          },

#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max )           \
          {                                                         \
            _ident, T1CODE, _type,                                  \
            0,                                                      \
            (FT_UInt)(char*)&T1_FIELD_REF( T1TYPE, _fname ),        \
            sizeof ( T1_FIELD_REF( T1TYPE, _fname )[0] ),           \
            _max,                                                   \
            (FT_UInt)(char*)&T1_FIELD_REF( T1TYPE, num_ ## _fname ) \
          },

#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max )   \
          {                                                  \
            _ident, T1CODE, _type,                           \
            0,                                               \
            (FT_UInt)(char*)&T1_FIELD_REF( T1TYPE, _fname ), \
            sizeof ( T1_FIELD_REF( T1TYPE, _fname )[0] ),    \
            _max, 0                                          \
          },


#define T1_FIELD_BOOL( _ident, _fname )                        \
          T1_NEW_SIMPLE_FIELD( _ident, t1_field_bool, _fname )

#define T1_FIELD_NUM( _ident, _fname )                            \
          T1_NEW_SIMPLE_FIELD( _ident, t1_field_integer, _fname )

#define T1_FIELD_FIXED( _ident, _fname )                        \
          T1_NEW_SIMPLE_FIELD( _ident, t1_field_fixed, _fname )

#define T1_FIELD_STRING( _ident, _fname )                        \
          T1_NEW_SIMPLE_FIELD( _ident, t1_field_string, _fname )

#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax )           \
          T1_NEW_TABLE_FIELD( _ident, t1_field_integer_array, \
                              _fname, _fmax )

#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax )       \
          T1_NEW_TABLE_FIELD( _ident, t1_field_fixed_array, \
                              _fname, _fmax )

#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax )           \
          T1_NEW_TABLE_FIELD2( _ident, t1_field_integer_array, \
                               _fname, _fmax )

#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax )       \
          T1_NEW_TABLE_FIELD2( _ident, t1_field_fixed_array, \
                               _fname, _fmax )

#define T1_FIELD_CALLBACK( _ident, _name )                 \
          T1_NEW_CALLBACK_FIELD( _ident, parse_ ## _name )


  LOCAL_DEF
  FT_Error  CID_Load_Field( CID_Parser*          parser,
                            const T1_Field_Rec*  field,
                            void*                object );

  LOCAL_DEF
  FT_Error  CID_Load_Field_Table( CID_Parser*          parser,
                                  const T1_Field_Rec*  field,
                                  void*                object );


#ifdef __cplusplus
  }
#endif


#endif /* CIDPARSE_H */


/* END */