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