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