misc/libfreetype/src/type42/t42parse.c
author unc0rr
Mon, 04 Feb 2013 00:13:55 +0400
changeset 8479 8d71109b04d2
parent 5172 88f2e05288ba
permissions -rw-r--r--
Some work on loading replay and interaction with checker
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5172
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     1
/***************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     2
/*                                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     3
/*  t42parse.c                                                             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     4
/*                                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     5
/*    Type 42 font parser (body).                                          */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     6
/*                                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     7
/*  Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     8
/*  Roberto Alameda.                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     9
/*                                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    10
/*  This file is part of the FreeType project, and may only be used,       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    11
/*  modified, and distributed under the terms of the FreeType project      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    12
/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    13
/*  this file you indicate that you have read the license and              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    14
/*  understand and accept it fully.                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    15
/*                                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    16
/***************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    17
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    18
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    19
#include "t42parse.h"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    20
#include "t42error.h"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    21
#include FT_INTERNAL_DEBUG_H
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    22
#include FT_INTERNAL_STREAM_H
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    23
#include FT_INTERNAL_POSTSCRIPT_AUX_H
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    24
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    25
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    26
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    27
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    28
  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    29
  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    30
  /* messages during execution.                                            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    31
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    32
#undef  FT_COMPONENT
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    33
#define FT_COMPONENT  trace_t42
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    34
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    35
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    36
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    37
  t42_parse_font_matrix( T42_Face    face,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    38
                         T42_Loader  loader );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    39
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    40
  t42_parse_encoding( T42_Face    face,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    41
                      T42_Loader  loader );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    42
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    43
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    44
  t42_parse_charstrings( T42_Face    face,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    45
                         T42_Loader  loader );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    46
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    47
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    48
  t42_parse_sfnts( T42_Face    face,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    49
                   T42_Loader  loader );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    50
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    51
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    52
  /* as Type42 fonts have no Private dict,         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    53
  /* we set the last argument of T1_FIELD_XXX to 0 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    54
  static const
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    55
  T1_FieldRec  t42_keywords[] =
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    56
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    57
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    58
#undef  FT_STRUCTURE
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    59
#define FT_STRUCTURE  T1_FontInfo
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    60
#undef  T1CODE
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    61
#define T1CODE        T1_FIELD_LOCATION_FONT_INFO
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    62
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    63
    T1_FIELD_STRING( "version",            version,             0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    64
    T1_FIELD_STRING( "Notice",             notice,              0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    65
    T1_FIELD_STRING( "FullName",           full_name,           0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    66
    T1_FIELD_STRING( "FamilyName",         family_name,         0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    67
    T1_FIELD_STRING( "Weight",             weight,              0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    68
    T1_FIELD_NUM   ( "ItalicAngle",        italic_angle,        0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    69
    T1_FIELD_BOOL  ( "isFixedPitch",       is_fixed_pitch,      0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    70
    T1_FIELD_NUM   ( "UnderlinePosition",  underline_position,  0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    71
    T1_FIELD_NUM   ( "UnderlineThickness", underline_thickness, 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    72
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    73
#undef  FT_STRUCTURE
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    74
#define FT_STRUCTURE  PS_FontExtraRec
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    75
#undef  T1CODE
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    76
#define T1CODE        T1_FIELD_LOCATION_FONT_EXTRA
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    77
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    78
    T1_FIELD_NUM   ( "FSType",             fs_type,             0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    79
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    80
#undef  FT_STRUCTURE
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    81
#define FT_STRUCTURE  T1_FontRec
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    82
#undef  T1CODE
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    83
#define T1CODE        T1_FIELD_LOCATION_FONT_DICT
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    84
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    85
    T1_FIELD_KEY  ( "FontName",    font_name,    0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    86
    T1_FIELD_NUM  ( "PaintType",   paint_type,   0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    87
    T1_FIELD_NUM  ( "FontType",    font_type,    0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    88
    T1_FIELD_FIXED( "StrokeWidth", stroke_width, 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    89
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    90
#undef  FT_STRUCTURE
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    91
#define FT_STRUCTURE  FT_BBox
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    92
#undef  T1CODE
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    93
#define T1CODE        T1_FIELD_LOCATION_BBOX
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    94
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    95
    T1_FIELD_BBOX("FontBBox", xMin, 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    96
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    97
    T1_FIELD_CALLBACK( "FontMatrix",  t42_parse_font_matrix, 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    98
    T1_FIELD_CALLBACK( "Encoding",    t42_parse_encoding,    0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    99
    T1_FIELD_CALLBACK( "CharStrings", t42_parse_charstrings, 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   100
    T1_FIELD_CALLBACK( "sfnts",       t42_parse_sfnts,       0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   101
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   102
    { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   103
  };
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   104
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   105
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   106
#define T1_Add_Table( p, i, o, l )  (p)->funcs.add( (p), i, o, l )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   107
#define T1_Done_Table( p )          \
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   108
          do                        \
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   109
          {                         \
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   110
            if ( (p)->funcs.done )  \
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   111
              (p)->funcs.done( p ); \
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   112
          } while ( 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   113
#define T1_Release_Table( p )          \
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   114
          do                           \
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   115
          {                            \
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   116
            if ( (p)->funcs.release )  \
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   117
              (p)->funcs.release( p ); \
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   118
          } while ( 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   119
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   120
#define T1_Skip_Spaces( p )    (p)->root.funcs.skip_spaces( &(p)->root )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   121
#define T1_Skip_PS_Token( p )  (p)->root.funcs.skip_PS_token( &(p)->root )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   122
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   123
#define T1_ToInt( p )                          \
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   124
          (p)->root.funcs.to_int( &(p)->root )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   125
#define T1_ToBytes( p, b, m, n, d )                          \
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   126
          (p)->root.funcs.to_bytes( &(p)->root, b, m, n, d )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   127
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   128
#define T1_ToFixedArray( p, m, f, t )                           \
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   129
          (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   130
#define T1_ToToken( p, t )                          \
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   131
          (p)->root.funcs.to_token( &(p)->root, t )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   132
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   133
#define T1_Load_Field( p, f, o, m, pf )                         \
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   134
          (p)->root.funcs.load_field( &(p)->root, f, o, m, pf )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   135
#define T1_Load_Field_Table( p, f, o, m, pf )                         \
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   136
          (p)->root.funcs.load_field_table( &(p)->root, f, o, m, pf )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   137
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   138
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   139
  /********************* Parsing Functions ******************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   140
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   141
  FT_LOCAL_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   142
  t42_parser_init( T42_Parser     parser,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   143
                   FT_Stream      stream,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   144
                   FT_Memory      memory,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   145
                   PSAux_Service  psaux )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   146
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   147
    FT_Error  error = T42_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   148
    FT_Long   size;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   149
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   150
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   151
    psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   152
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   153
    parser->stream    = stream;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   154
    parser->base_len  = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   155
    parser->base_dict = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   156
    parser->in_memory = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   157
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   158
    /*******************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   159
    /*                                                                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   160
    /* Here a short summary of what is going on:                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   161
    /*                                                                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   162
    /*   When creating a new Type 42 parser, we try to locate and load */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   163
    /*   the base dictionary, loading the whole font into memory.      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   164
    /*                                                                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   165
    /*   When `loading' the base dictionary, we only set up pointers   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   166
    /*   in the case of a memory-based stream.  Otherwise, we allocate */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   167
    /*   and load the base dictionary in it.                           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   168
    /*                                                                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   169
    /*   parser->in_memory is set if we have a memory stream.          */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   170
    /*                                                                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   171
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   172
    if ( FT_STREAM_SEEK( 0L ) ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   173
         FT_FRAME_ENTER( 17 ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   174
      goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   175
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   176
    if ( ft_memcmp( stream->cursor, "%!PS-TrueTypeFont", 17 ) != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   177
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   178
      FT_TRACE2(( "not a Type42 font\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   179
      error = T42_Err_Unknown_File_Format;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   180
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   181
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   182
    FT_FRAME_EXIT();
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   183
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   184
    if ( error || FT_STREAM_SEEK( 0 ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   185
      goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   186
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   187
    size = stream->size;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   188
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   189
    /* now, try to load `size' bytes of the `base' dictionary we */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   190
    /* found previously                                          */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   191
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   192
    /* if it is a memory-based resource, set up pointers */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   193
    if ( !stream->read )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   194
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   195
      parser->base_dict = (FT_Byte*)stream->base + stream->pos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   196
      parser->base_len  = size;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   197
      parser->in_memory = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   198
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   199
      /* check that the `size' field is valid */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   200
      if ( FT_STREAM_SKIP( size ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   201
        goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   202
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   203
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   204
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   205
      /* read segment in memory */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   206
      if ( FT_ALLOC( parser->base_dict, size )       ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   207
           FT_STREAM_READ( parser->base_dict, size ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   208
        goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   209
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   210
      parser->base_len = size;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   211
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   212
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   213
    parser->root.base   = parser->base_dict;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   214
    parser->root.cursor = parser->base_dict;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   215
    parser->root.limit  = parser->root.cursor + parser->base_len;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   216
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   217
  Exit:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   218
    if ( error && !parser->in_memory )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   219
      FT_FREE( parser->base_dict );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   220
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   221
    return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   222
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   223
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   224
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   225
  FT_LOCAL_DEF( void )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   226
  t42_parser_done( T42_Parser  parser )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   227
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   228
    FT_Memory  memory = parser->root.memory;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   229
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   230
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   231
    /* free the base dictionary only when we have a disk stream */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   232
    if ( !parser->in_memory )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   233
      FT_FREE( parser->base_dict );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   234
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   235
    parser->root.funcs.done( &parser->root );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   236
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   237
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   238
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   239
  static int
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   240
  t42_is_space( FT_Byte  c )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   241
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   242
    return ( c == ' '  || c == '\t'              ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   243
             c == '\r' || c == '\n' || c == '\f' ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   244
             c == '\0'                           );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   245
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   246
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   247
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   248
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   249
  t42_parse_font_matrix( T42_Face    face,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   250
                         T42_Loader  loader )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   251
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   252
    T42_Parser  parser = &loader->parser;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   253
    FT_Matrix*  matrix = &face->type1.font_matrix;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   254
    FT_Vector*  offset = &face->type1.font_offset;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   255
    FT_Face     root   = (FT_Face)&face->root;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   256
    FT_Fixed    temp[6];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   257
    FT_Fixed    temp_scale;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   258
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   259
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   260
    (void)T1_ToFixedArray( parser, 6, temp, 3 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   261
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   262
    temp_scale = FT_ABS( temp[3] );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   263
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   264
    /* Set Units per EM based on FontMatrix values.  We set the value to */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   265
    /* 1000 / temp_scale, because temp_scale was already multiplied by   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   266
    /* 1000 (in t1_tofixed, from psobjs.c).                              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   267
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   268
    root->units_per_EM = (FT_UShort)( FT_DivFix( 1000 * 0x10000L,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   269
                                                 temp_scale ) >> 16 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   270
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   271
    /* we need to scale the values by 1.0/temp_scale */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   272
    if ( temp_scale != 0x10000L )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   273
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   274
      temp[0] = FT_DivFix( temp[0], temp_scale );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   275
      temp[1] = FT_DivFix( temp[1], temp_scale );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   276
      temp[2] = FT_DivFix( temp[2], temp_scale );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   277
      temp[4] = FT_DivFix( temp[4], temp_scale );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   278
      temp[5] = FT_DivFix( temp[5], temp_scale );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   279
      temp[3] = 0x10000L;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   280
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   281
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   282
    matrix->xx = temp[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   283
    matrix->yx = temp[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   284
    matrix->xy = temp[2];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   285
    matrix->yy = temp[3];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   286
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   287
    /* note that the offsets must be expressed in integer font units */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   288
    offset->x = temp[4] >> 16;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   289
    offset->y = temp[5] >> 16;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   290
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   291
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   292
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   293
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   294
  t42_parse_encoding( T42_Face    face,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   295
                      T42_Loader  loader )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   296
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   297
    T42_Parser  parser = &loader->parser;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   298
    FT_Byte*    cur;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   299
    FT_Byte*    limit  = parser->root.limit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   300
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   301
    PSAux_Service  psaux  = (PSAux_Service)face->psaux;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   302
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   303
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   304
    T1_Skip_Spaces( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   305
    cur = parser->root.cursor;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   306
    if ( cur >= limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   307
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   308
      FT_ERROR(( "t42_parse_encoding: out of bounds\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   309
      parser->root.error = T42_Err_Invalid_File_Format;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   310
      return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   311
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   312
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   313
    /* if we have a number or `[', the encoding is an array, */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   314
    /* and we must load it now                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   315
    if ( ft_isdigit( *cur ) || *cur == '[' )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   316
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   317
      T1_Encoding  encode          = &face->type1.encoding;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   318
      FT_UInt      count, n;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   319
      PS_Table     char_table      = &loader->encoding_table;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   320
      FT_Memory    memory          = parser->root.memory;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   321
      FT_Error     error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   322
      FT_Bool      only_immediates = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   323
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   324
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   325
      /* read the number of entries in the encoding; should be 256 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   326
      if ( *cur == '[' )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   327
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   328
        count           = 256;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   329
        only_immediates = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   330
        parser->root.cursor++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   331
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   332
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   333
        count = (FT_UInt)T1_ToInt( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   334
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   335
      T1_Skip_Spaces( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   336
      if ( parser->root.cursor >= limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   337
        return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   338
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   339
      /* we use a T1_Table to store our charnames */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   340
      loader->num_chars = encode->num_chars = count;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   341
      if ( FT_NEW_ARRAY( encode->char_index, count )     ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   342
           FT_NEW_ARRAY( encode->char_name,  count )     ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   343
           FT_SET_ERROR( psaux->ps_table_funcs->init(
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   344
                           char_table, count, memory ) ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   345
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   346
        parser->root.error = error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   347
        return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   348
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   349
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   350
      /* We need to `zero' out encoding_table.elements */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   351
      for ( n = 0; n < count; n++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   352
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   353
        char*  notdef = (char *)".notdef";
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   354
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   355
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   356
        T1_Add_Table( char_table, n, notdef, 8 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   357
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   358
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   359
      /* Now we need to read records of the form                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   360
      /*                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   361
      /*   ... charcode /charname ...                           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   362
      /*                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   363
      /* for each entry in our table.                           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   364
      /*                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   365
      /* We simply look for a number followed by an immediate   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   366
      /* name.  Note that this ignores correctly the sequence   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   367
      /* that is often seen in type42 fonts:                    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   368
      /*                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   369
      /*   0 1 255 { 1 index exch /.notdef put } for dup        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   370
      /*                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   371
      /* used to clean the encoding array before anything else. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   372
      /*                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   373
      /* Alternatively, if the array is directly given as       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   374
      /*                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   375
      /*   /Encoding [ ... ]                                    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   376
      /*                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   377
      /* we only read immediates.                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   378
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   379
      n = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   380
      T1_Skip_Spaces( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   381
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   382
      while ( parser->root.cursor < limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   383
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   384
        cur = parser->root.cursor;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   385
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   386
        /* we stop when we encounter `def' or `]' */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   387
        if ( *cur == 'd' && cur + 3 < limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   388
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   389
          if ( cur[1] == 'e'          &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   390
               cur[2] == 'f'          &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   391
               t42_is_space( cur[3] ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   392
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   393
            FT_TRACE6(( "encoding end\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   394
            cur += 3;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   395
            break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   396
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   397
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   398
        if ( *cur == ']' )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   399
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   400
          FT_TRACE6(( "encoding end\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   401
          cur++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   402
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   403
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   404
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   405
        /* check whether we have found an entry */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   406
        if ( ft_isdigit( *cur ) || only_immediates )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   407
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   408
          FT_Int  charcode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   409
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   410
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   411
          if ( only_immediates )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   412
            charcode = n;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   413
          else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   414
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   415
            charcode = (FT_Int)T1_ToInt( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   416
            T1_Skip_Spaces( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   417
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   418
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   419
          cur = parser->root.cursor;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   420
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   421
          if ( *cur == '/' && cur + 2 < limit && n < count )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   422
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   423
            FT_PtrDist  len;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   424
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   425
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   426
            cur++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   427
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   428
            parser->root.cursor = cur;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   429
            T1_Skip_PS_Token( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   430
            if ( parser->root.error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   431
              return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   432
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   433
            len = parser->root.cursor - cur;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   434
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   435
            parser->root.error = T1_Add_Table( char_table, charcode,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   436
                                               cur, len + 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   437
            if ( parser->root.error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   438
              return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   439
            char_table->elements[charcode][len] = '\0';
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   440
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   441
            n++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   442
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   443
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   444
        else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   445
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   446
          T1_Skip_PS_Token( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   447
          if ( parser->root.error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   448
            return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   449
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   450
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   451
        T1_Skip_Spaces( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   452
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   453
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   454
      face->type1.encoding_type  = T1_ENCODING_TYPE_ARRAY;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   455
      parser->root.cursor        = cur;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   456
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   457
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   458
    /* Otherwise, we should have either `StandardEncoding', */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   459
    /* `ExpertEncoding', or `ISOLatin1Encoding'             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   460
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   461
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   462
      if ( cur + 17 < limit                                            &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   463
           ft_strncmp( (const char*)cur, "StandardEncoding", 16 ) == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   464
        face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   465
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   466
      else if ( cur + 15 < limit                                          &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   467
                ft_strncmp( (const char*)cur, "ExpertEncoding", 14 ) == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   468
        face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   469
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   470
      else if ( cur + 18 < limit                                             &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   471
                ft_strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   472
        face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   473
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   474
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   475
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   476
        FT_ERROR(( "t42_parse_encoding: invalid token\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   477
        parser->root.error = T42_Err_Invalid_File_Format;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   478
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   479
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   480
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   481
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   482
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   483
  typedef enum  T42_Load_Status_
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   484
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   485
    BEFORE_START,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   486
    BEFORE_TABLE_DIR,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   487
    OTHER_TABLES
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   488
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   489
  } T42_Load_Status;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   490
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   491
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   492
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   493
  t42_parse_sfnts( T42_Face    face,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   494
                   T42_Loader  loader )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   495
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   496
    T42_Parser  parser = &loader->parser;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   497
    FT_Memory   memory = parser->root.memory;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   498
    FT_Byte*    cur;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   499
    FT_Byte*    limit  = parser->root.limit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   500
    FT_Error    error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   501
    FT_Int      num_tables = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   502
    FT_ULong    count, ttf_size = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   503
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   504
    FT_Long     n, string_size, old_string_size, real_size;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   505
    FT_Byte*    string_buf = NULL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   506
    FT_Bool     allocated  = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   507
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   508
    T42_Load_Status  status;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   509
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   510
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   511
    /* The format is                                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   512
    /*                                              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   513
    /*   /sfnts [ <hexstring> <hexstring> ... ] def */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   514
    /*                                              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   515
    /* or                                           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   516
    /*                                              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   517
    /*   /sfnts [                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   518
    /*      <num_bin_bytes> RD <binary data>        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   519
    /*      <num_bin_bytes> RD <binary data>        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   520
    /*      ...                                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   521
    /*   ] def                                      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   522
    /*                                              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   523
    /* with exactly one space after the `RD' token. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   524
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   525
    T1_Skip_Spaces( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   526
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   527
    if ( parser->root.cursor >= limit || *parser->root.cursor++ != '[' )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   528
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   529
      FT_ERROR(( "t42_parse_sfnts: can't find begin of sfnts vector\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   530
      error = T42_Err_Invalid_File_Format;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   531
      goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   532
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   533
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   534
    T1_Skip_Spaces( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   535
    status          = BEFORE_START;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   536
    string_size     = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   537
    old_string_size = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   538
    count           = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   539
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   540
    while ( parser->root.cursor < limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   541
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   542
      cur = parser->root.cursor;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   543
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   544
      if ( *cur == ']' )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   545
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   546
        parser->root.cursor++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   547
        goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   548
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   549
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   550
      else if ( *cur == '<' )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   551
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   552
        T1_Skip_PS_Token( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   553
        if ( parser->root.error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   554
          goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   555
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   556
        /* don't include delimiters */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   557
        string_size = (FT_Long)( ( parser->root.cursor - cur - 2 + 1 ) / 2 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   558
        if ( FT_REALLOC( string_buf, old_string_size, string_size ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   559
          goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   560
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   561
        allocated = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   562
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   563
        parser->root.cursor = cur;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   564
        (void)T1_ToBytes( parser, string_buf, string_size, &real_size, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   565
        old_string_size = string_size;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   566
        string_size = real_size;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   567
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   568
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   569
      else if ( ft_isdigit( *cur ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   570
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   571
        if ( allocated )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   572
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   573
          FT_ERROR(( "t42_parse_sfnts: "
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   574
                     "can't handle mixed binary and hex strings\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   575
          error = T42_Err_Invalid_File_Format;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   576
          goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   577
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   578
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   579
        string_size = T1_ToInt( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   580
        if ( string_size < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   581
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   582
          FT_ERROR(( "t42_parse_sfnts: invalid string size\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   583
          error = T42_Err_Invalid_File_Format;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   584
          goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   585
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   586
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   587
        T1_Skip_PS_Token( parser );             /* `RD' */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   588
        if ( parser->root.error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   589
          return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   590
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   591
        string_buf = parser->root.cursor + 1;   /* one space after `RD' */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   592
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   593
        if ( limit - parser->root.cursor < string_size )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   594
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   595
          FT_ERROR(( "t42_parse_sfnts: too many binary data\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   596
          error = T42_Err_Invalid_File_Format;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   597
          goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   598
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   599
        else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   600
          parser->root.cursor += string_size + 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   601
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   602
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   603
      if ( !string_buf )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   604
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   605
        FT_ERROR(( "t42_parse_sfnts: invalid data in sfnts array\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   606
        error = T42_Err_Invalid_File_Format;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   607
        goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   608
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   609
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   610
      /* A string can have a trailing zero byte for padding.  Ignore it. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   611
      if ( string_buf[string_size - 1] == 0 && ( string_size % 2 == 1 ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   612
        string_size--;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   613
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   614
      if ( !string_size )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   615
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   616
        FT_ERROR(( "t42_parse_sfnts: invalid string\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   617
        error = T42_Err_Invalid_File_Format;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   618
        goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   619
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   620
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   621
      for ( n = 0; n < string_size; n++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   622
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   623
        switch ( status )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   624
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   625
        case BEFORE_START:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   626
          /* load offset table, 12 bytes */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   627
          if ( count < 12 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   628
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   629
            face->ttf_data[count++] = string_buf[n];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   630
            continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   631
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   632
          else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   633
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   634
            num_tables = 16 * face->ttf_data[4] + face->ttf_data[5];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   635
            status     = BEFORE_TABLE_DIR;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   636
            ttf_size   = 12 + 16 * num_tables;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   637
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   638
            if ( FT_REALLOC( face->ttf_data, 12, ttf_size ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   639
              goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   640
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   641
          /* fall through */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   642
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   643
        case BEFORE_TABLE_DIR:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   644
          /* the offset table is read; read the table directory */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   645
          if ( count < ttf_size )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   646
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   647
            face->ttf_data[count++] = string_buf[n];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   648
            continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   649
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   650
          else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   651
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   652
            int       i;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   653
            FT_ULong  len;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   654
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   655
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   656
            for ( i = 0; i < num_tables; i++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   657
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   658
              FT_Byte*  p = face->ttf_data + 12 + 16 * i + 12;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   659
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   660
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   661
              len = FT_PEEK_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   662
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   663
              /* Pad to a 4-byte boundary length */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   664
              ttf_size += ( len + 3 ) & ~3;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   665
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   666
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   667
            status         = OTHER_TABLES;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   668
            face->ttf_size = ttf_size;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   669
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   670
            /* there are no more than 256 tables, so no size check here */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   671
            if ( FT_REALLOC( face->ttf_data, 12 + 16 * num_tables,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   672
                             ttf_size + 1 ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   673
              goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   674
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   675
          /* fall through */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   676
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   677
        case OTHER_TABLES:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   678
          /* all other tables are just copied */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   679
          if ( count >= ttf_size )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   680
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   681
            FT_ERROR(( "t42_parse_sfnts: too many binary data\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   682
            error = T42_Err_Invalid_File_Format;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   683
            goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   684
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   685
          face->ttf_data[count++] = string_buf[n];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   686
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   687
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   688
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   689
      T1_Skip_Spaces( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   690
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   691
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   692
    /* if control reaches this point, the format was not valid */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   693
    error = T42_Err_Invalid_File_Format;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   694
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   695
  Fail:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   696
    parser->root.error = error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   697
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   698
  Exit:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   699
    if ( allocated )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   700
      FT_FREE( string_buf );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   701
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   702
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   703
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   704
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   705
  t42_parse_charstrings( T42_Face    face,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   706
                         T42_Loader  loader )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   707
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   708
    T42_Parser     parser       = &loader->parser;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   709
    PS_Table       code_table   = &loader->charstrings;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   710
    PS_Table       name_table   = &loader->glyph_names;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   711
    PS_Table       swap_table   = &loader->swap_table;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   712
    FT_Memory      memory       = parser->root.memory;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   713
    FT_Error       error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   714
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   715
    PSAux_Service  psaux        = (PSAux_Service)face->psaux;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   716
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   717
    FT_Byte*       cur;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   718
    FT_Byte*       limit        = parser->root.limit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   719
    FT_UInt        n;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   720
    FT_UInt        notdef_index = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   721
    FT_Byte        notdef_found = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   722
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   723
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   724
    T1_Skip_Spaces( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   725
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   726
    if ( parser->root.cursor >= limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   727
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   728
      FT_ERROR(( "t42_parse_charstrings: out of bounds\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   729
      error = T42_Err_Invalid_File_Format;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   730
      goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   731
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   732
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   733
    if ( ft_isdigit( *parser->root.cursor ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   734
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   735
      loader->num_glyphs = (FT_UInt)T1_ToInt( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   736
      if ( parser->root.error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   737
        return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   738
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   739
    else if ( *parser->root.cursor == '<' )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   740
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   741
      /* We have `<< ... >>'.  Count the number of `/' in the dictionary */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   742
      /* to get its size.                                                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   743
      FT_UInt  count = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   744
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   745
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   746
      T1_Skip_PS_Token( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   747
      if ( parser->root.error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   748
        return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   749
      T1_Skip_Spaces( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   750
      cur = parser->root.cursor;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   751
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   752
      while ( parser->root.cursor < limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   753
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   754
        if ( *parser->root.cursor == '/' )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   755
          count++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   756
        else if ( *parser->root.cursor == '>' )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   757
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   758
          loader->num_glyphs  = count;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   759
          parser->root.cursor = cur;        /* rewind */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   760
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   761
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   762
        T1_Skip_PS_Token( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   763
        if ( parser->root.error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   764
          return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   765
        T1_Skip_Spaces( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   766
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   767
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   768
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   769
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   770
      FT_ERROR(( "t42_parse_charstrings: invalid token\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   771
      error = T42_Err_Invalid_File_Format;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   772
      goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   773
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   774
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   775
    if ( parser->root.cursor >= limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   776
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   777
      FT_ERROR(( "t42_parse_charstrings: out of bounds\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   778
      error = T42_Err_Invalid_File_Format;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   779
      goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   780
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   781
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   782
    /* initialize tables */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   783
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   784
    error = psaux->ps_table_funcs->init( code_table,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   785
                                         loader->num_glyphs,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   786
                                         memory );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   787
    if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   788
      goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   789
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   790
    error = psaux->ps_table_funcs->init( name_table,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   791
                                         loader->num_glyphs,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   792
                                         memory );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   793
    if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   794
      goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   795
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   796
    /* Initialize table for swapping index notdef_index and */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   797
    /* index 0 names and codes (if necessary).              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   798
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   799
    error = psaux->ps_table_funcs->init( swap_table, 4, memory );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   800
    if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   801
      goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   802
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   803
    n = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   804
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   805
    for (;;)
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   806
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   807
      /* The format is simple:                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   808
      /*   `/glyphname' + index [+ def]          */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   809
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   810
      T1_Skip_Spaces( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   811
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   812
      cur = parser->root.cursor;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   813
      if ( cur >= limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   814
        break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   815
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   816
      /* We stop when we find an `end' keyword or '>' */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   817
      if ( *cur   == 'e'          &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   818
           cur + 3 < limit        &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   819
           cur[1] == 'n'          &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   820
           cur[2] == 'd'          &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   821
           t42_is_space( cur[3] ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   822
        break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   823
      if ( *cur == '>' )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   824
        break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   825
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   826
      T1_Skip_PS_Token( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   827
      if ( parser->root.error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   828
        return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   829
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   830
      if ( *cur == '/' )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   831
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   832
        FT_PtrDist  len;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   833
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   834
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   835
        if ( cur + 1 >= limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   836
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   837
          FT_ERROR(( "t42_parse_charstrings: out of bounds\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   838
          error = T42_Err_Invalid_File_Format;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   839
          goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   840
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   841
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   842
        cur++;                              /* skip `/' */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   843
        len = parser->root.cursor - cur;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   844
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   845
        error = T1_Add_Table( name_table, n, cur, len + 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   846
        if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   847
          goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   848
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   849
        /* add a trailing zero to the name table */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   850
        name_table->elements[n][len] = '\0';
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   851
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   852
        /* record index of /.notdef */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   853
        if ( *cur == '.'                                              &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   854
             ft_strcmp( ".notdef",
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   855
                        (const char*)(name_table->elements[n]) ) == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   856
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   857
          notdef_index = n;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   858
          notdef_found = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   859
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   860
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   861
        T1_Skip_Spaces( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   862
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   863
        cur = parser->root.cursor;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   864
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   865
        (void)T1_ToInt( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   866
        if ( parser->root.cursor >= limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   867
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   868
          FT_ERROR(( "t42_parse_charstrings: out of bounds\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   869
          error = T42_Err_Invalid_File_Format;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   870
          goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   871
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   872
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   873
        len = parser->root.cursor - cur;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   874
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   875
        error = T1_Add_Table( code_table, n, cur, len + 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   876
        if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   877
          goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   878
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   879
        code_table->elements[n][len] = '\0';
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   880
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   881
        n++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   882
        if ( n >= loader->num_glyphs )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   883
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   884
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   885
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   886
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   887
    loader->num_glyphs = n;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   888
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   889
    if ( !notdef_found )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   890
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   891
      FT_ERROR(( "t42_parse_charstrings: no /.notdef glyph\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   892
      error = T42_Err_Invalid_File_Format;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   893
      goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   894
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   895
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   896
    /* if /.notdef does not occupy index 0, do our magic. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   897
    if ( ft_strcmp( (const char*)".notdef",
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   898
                    (const char*)name_table->elements[0] ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   899
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   900
      /* Swap glyph in index 0 with /.notdef glyph.  First, add index 0  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   901
      /* name and code entries to swap_table.  Then place notdef_index   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   902
      /* name and code entries into swap_table.  Then swap name and code */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   903
      /* entries at indices notdef_index and 0 using values stored in    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   904
      /* swap_table.                                                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   905
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   906
      /* Index 0 name */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   907
      error = T1_Add_Table( swap_table, 0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   908
                            name_table->elements[0],
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   909
                            name_table->lengths [0] );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   910
      if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   911
        goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   912
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   913
      /* Index 0 code */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   914
      error = T1_Add_Table( swap_table, 1,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   915
                            code_table->elements[0],
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   916
                            code_table->lengths [0] );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   917
      if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   918
        goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   919
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   920
      /* Index notdef_index name */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   921
      error = T1_Add_Table( swap_table, 2,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   922
                            name_table->elements[notdef_index],
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   923
                            name_table->lengths [notdef_index] );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   924
      if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   925
        goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   926
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   927
      /* Index notdef_index code */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   928
      error = T1_Add_Table( swap_table, 3,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   929
                            code_table->elements[notdef_index],
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   930
                            code_table->lengths [notdef_index] );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   931
      if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   932
        goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   933
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   934
      error = T1_Add_Table( name_table, notdef_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   935
                            swap_table->elements[0],
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   936
                            swap_table->lengths [0] );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   937
      if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   938
        goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   939
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   940
      error = T1_Add_Table( code_table, notdef_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   941
                            swap_table->elements[1],
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   942
                            swap_table->lengths [1] );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   943
      if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   944
        goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   945
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   946
      error = T1_Add_Table( name_table, 0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   947
                            swap_table->elements[2],
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   948
                            swap_table->lengths [2] );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   949
      if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   950
        goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   951
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   952
      error = T1_Add_Table( code_table, 0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   953
                            swap_table->elements[3],
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   954
                            swap_table->lengths [3] );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   955
      if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   956
        goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   957
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   958
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   959
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   960
    return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   961
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   962
  Fail:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   963
    parser->root.error = error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   964
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   965
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   966
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   967
  static FT_Error
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   968
  t42_load_keyword( T42_Face    face,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   969
                    T42_Loader  loader,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   970
                    T1_Field    field )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   971
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   972
    FT_Error  error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   973
    void*     dummy_object;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   974
    void**    objects;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   975
    FT_UInt   max_objects = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   976
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   977
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   978
    /* if the keyword has a dedicated callback, call it */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   979
    if ( field->type == T1_FIELD_TYPE_CALLBACK )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   980
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   981
      field->reader( (FT_Face)face, loader );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   982
      error = loader->parser.root.error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   983
      goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   984
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   985
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   986
    /* now the keyword is either a simple field or a table of fields; */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   987
    /* we are now going to take care of it                            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   988
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   989
    switch ( field->location )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   990
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   991
    case T1_FIELD_LOCATION_FONT_INFO:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   992
      dummy_object = &face->type1.font_info;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   993
      break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   994
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   995
    case T1_FIELD_LOCATION_FONT_EXTRA:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   996
      dummy_object = &face->type1.font_extra;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   997
      break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   998
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   999
    case T1_FIELD_LOCATION_BBOX:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1000
      dummy_object = &face->type1.font_bbox;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1001
      break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1002
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1003
    default:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1004
      dummy_object = &face->type1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1005
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1006
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1007
    objects = &dummy_object;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1008
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1009
    if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1010
         field->type == T1_FIELD_TYPE_FIXED_ARRAY   )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1011
      error = T1_Load_Field_Table( &loader->parser, field,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1012
                                   objects, max_objects, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1013
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1014
      error = T1_Load_Field( &loader->parser, field,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1015
                             objects, max_objects, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1016
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1017
   Exit:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1018
    return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1019
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1020
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1021
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1022
  FT_LOCAL_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1023
  t42_parse_dict( T42_Face    face,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1024
                  T42_Loader  loader,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1025
                  FT_Byte*    base,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1026
                  FT_Long     size )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1027
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1028
    T42_Parser  parser     = &loader->parser;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1029
    FT_Byte*    limit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1030
    FT_Int      n_keywords = (FT_Int)( sizeof ( t42_keywords ) /
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1031
                                         sizeof ( t42_keywords[0] ) );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1032
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1033
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1034
    parser->root.cursor = base;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1035
    parser->root.limit  = base + size;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1036
    parser->root.error  = T42_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1037
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1038
    limit = parser->root.limit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1039
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1040
    T1_Skip_Spaces( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1041
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1042
    while ( parser->root.cursor < limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1043
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1044
      FT_Byte*  cur;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1045
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1046
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1047
      cur = parser->root.cursor;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1048
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1049
      /* look for `FontDirectory' which causes problems for some fonts */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1050
      if ( *cur == 'F' && cur + 25 < limit                    &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1051
           ft_strncmp( (char*)cur, "FontDirectory", 13 ) == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1052
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1053
        FT_Byte*  cur2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1054
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1055
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1056
        /* skip the `FontDirectory' keyword */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1057
        T1_Skip_PS_Token( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1058
        T1_Skip_Spaces  ( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1059
        cur = cur2 = parser->root.cursor;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1060
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1061
        /* look up the `known' keyword */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1062
        while ( cur < limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1063
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1064
          if ( *cur == 'k' && cur + 5 < limit             &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1065
                ft_strncmp( (char*)cur, "known", 5 ) == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1066
            break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1067
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1068
          T1_Skip_PS_Token( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1069
          if ( parser->root.error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1070
            goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1071
          T1_Skip_Spaces  ( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1072
          cur = parser->root.cursor;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1073
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1074
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1075
        if ( cur < limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1076
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1077
          T1_TokenRec  token;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1078
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1079
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1080
          /* skip the `known' keyword and the token following it */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1081
          T1_Skip_PS_Token( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1082
          T1_ToToken( parser, &token );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1083
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1084
          /* if the last token was an array, skip it! */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1085
          if ( token.type == T1_TOKEN_TYPE_ARRAY )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1086
            cur2 = parser->root.cursor;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1087
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1088
        parser->root.cursor = cur2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1089
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1090
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1091
      /* look for immediates */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1092
      else if ( *cur == '/' && cur + 2 < limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1093
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1094
        FT_PtrDist  len;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1095
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1096
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1097
        cur++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1098
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1099
        parser->root.cursor = cur;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1100
        T1_Skip_PS_Token( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1101
        if ( parser->root.error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1102
          goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1103
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1104
        len = parser->root.cursor - cur;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1105
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1106
        if ( len > 0 && len < 22 && parser->root.cursor < limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1107
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1108
          int  i;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1109
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1110
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1111
          /* now compare the immediate name to the keyword table */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1112
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1113
          /* loop through all known keywords */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1114
          for ( i = 0; i < n_keywords; i++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1115
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1116
            T1_Field  keyword = (T1_Field)&t42_keywords[i];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1117
            FT_Byte   *name   = (FT_Byte*)keyword->ident;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1118
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1119
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1120
            if ( !name )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1121
              continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1122
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1123
            if ( cur[0] == name[0]                                  &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1124
                 len == (FT_PtrDist)ft_strlen( (const char *)name ) &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1125
                 ft_memcmp( cur, name, len ) == 0                   )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1126
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1127
              /* we found it -- run the parsing callback! */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1128
              parser->root.error = t42_load_keyword( face,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1129
                                                     loader,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1130
                                                     keyword );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1131
              if ( parser->root.error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1132
                return parser->root.error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1133
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1134
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1135
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1136
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1137
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1138
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1139
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1140
        T1_Skip_PS_Token( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1141
        if ( parser->root.error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1142
          goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1143
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1144
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1145
      T1_Skip_Spaces( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1146
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1147
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1148
  Exit:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1149
    return parser->root.error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1150
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1151
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1152
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1153
  FT_LOCAL_DEF( void )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1154
  t42_loader_init( T42_Loader  loader,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1155
                   T42_Face    face )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1156
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1157
    FT_UNUSED( face );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1158
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1159
    FT_MEM_ZERO( loader, sizeof ( *loader ) );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1160
    loader->num_glyphs = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1161
    loader->num_chars  = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1162
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1163
    /* initialize the tables -- simply set their `init' field to 0 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1164
    loader->encoding_table.init = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1165
    loader->charstrings.init    = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1166
    loader->glyph_names.init    = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1167
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1168
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1169
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1170
  FT_LOCAL_DEF( void )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1171
  t42_loader_done( T42_Loader  loader )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1172
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1173
    T42_Parser  parser = &loader->parser;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1174
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1175
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1176
    /* finalize tables */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1177
    T1_Release_Table( &loader->encoding_table );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1178
    T1_Release_Table( &loader->charstrings );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1179
    T1_Release_Table( &loader->glyph_names );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1180
    T1_Release_Table( &loader->swap_table );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1181
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1182
    /* finalize parser */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1183
    t42_parser_done( parser );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1184
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1185
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1186
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1187
/* END */