Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
4759 right-hear 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, 2009 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 
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
  /*                                                               */
49
  /*    PS_Table_FuncsRec                                                  */
50
  /*                                                                       */
51
  /*                                                          */
52
  /*    A set of function pointers to manage PS_Table objects.             */
53
  /*                                                                       */
54
  /*                                                               */
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
  /*                                                               */
88
  /*    PS_TableRec                                                        */
89
  /*                                                                       */
90
  /*                                                          */
91
  /*    A PS_Table is a simple object used to store an array of objects in */
92
  /*    a single memory block.                                             */
93
  /*                                                                       */
94
  /*                                                               */
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_EXTRA,
201
    T1_FIELD_LOCATION_FONT_INFO,
202
    T1_FIELD_LOCATION_PRIVATE,
203
    T1_FIELD_LOCATION_BBOX,
204
    T1_FIELD_LOCATION_LOADER,
205
    T1_FIELD_LOCATION_FACE,
206
    T1_FIELD_LOCATION_BLEND,
207
 
208
    /* do not remove */
209
    T1_FIELD_LOCATION_MAX
210
 
211
  } T1_FieldLocation;
212
 
213
 
214
  typedef void
215
  (*T1_Field_ParseFunc)( FT_Face     face,
216
                         FT_Pointer  parser );
217
 
218
 
219
  /* structure type used to model object fields */
220
  typedef struct  T1_FieldRec_
221
  {
222
    const char*         ident;        /* field identifier               */
223
    T1_FieldLocation    location;
224
    T1_FieldType        type;         /* type of field                  */
225
    T1_Field_ParseFunc  reader;
226
    FT_UInt             offset;       /* offset of field in object      */
227
    FT_Byte             size;         /* size of field in bytes         */
228
    FT_UInt             array_max;    /* maximal number of elements for */
229
                                      /* array                          */
230
    FT_UInt             count_offset; /* offset of element count for    */
231
                                      /* arrays; must not be zero if in */
232
                                      /* use -- in other words, a       */
233
                                      /* `num_FOO' element must not     */
234
                                      /* start the used structure if we */
235
                                      /* parse a `FOO' array            */
236
    FT_UInt             dict;         /* where we expect it             */
237
  } T1_FieldRec;
238
 
239
#define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */
240
#define T1_FIELD_DICT_PRIVATE  ( 1 << 1 )
241
 
242
 
243
 
244
#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \
245
          {                                                 \
246
            _ident, T1CODE, _type,                          \
247
            0,                                              \
248
            FT_FIELD_OFFSET( _fname ),                      \
249
            FT_FIELD_SIZE( _fname ),                        \
250
            0, 0,                                           \
251
            _dict                                           \
252
          },
253
 
254
#define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \
255
          {                                             \
256
            _ident, T1CODE, T1_FIELD_TYPE_CALLBACK,     \
257
            (T1_Field_ParseFunc)_reader,                \
258
            0, 0,                                       \
259
            0, 0,                                       \
260
            _dict                                       \
261
          },
262
 
263
#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \
264
          {                                                      \
265
            _ident, T1CODE, _type,                               \
266
            0,                                                   \
267
            FT_FIELD_OFFSET( _fname ),                           \
268
            FT_FIELD_SIZE_DELTA( _fname ),                       \
269
            _max,                                                \
270
            FT_FIELD_OFFSET( num_ ## _fname ),                   \
271
            _dict                                                \
272
          },
273
 
274
#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \
275
          {                                                       \
276
            _ident, T1CODE, _type,                                \
277
            0,                                                    \
278
            FT_FIELD_OFFSET( _fname ),                            \
279
            FT_FIELD_SIZE_DELTA( _fname ),                        \
280
            _max, 0,                                              \
281
            _dict                                                 \
282
          },
283
 
284
 
285
#define T1_FIELD_BOOL( _ident, _fname, _dict )                             \
286
          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict )
287
 
288
#define T1_FIELD_NUM( _ident, _fname, _dict )                                 \
289
          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict )
290
 
291
#define T1_FIELD_FIXED( _ident, _fname, _dict )                             \
292
          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict )
293
 
294
#define T1_FIELD_FIXED_1000( _ident, _fname, _dict )                     \
295
          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \
296
                               _dict )
297
 
298
#define T1_FIELD_STRING( _ident, _fname, _dict )                             \
299
          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict )
300
 
301
#define T1_FIELD_KEY( _ident, _fname, _dict )                             \
302
          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict )
303
 
304
#define T1_FIELD_BBOX( _ident, _fname, _dict )                             \
305
          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict )
306
 
307
 
308
#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict )         \
309
          T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
310
                              _fname, _fmax, _dict )
311
 
312
#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict )     \
313
          T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
314
                              _fname, _fmax, _dict )
315
 
316
#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict )         \
317
          T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
318
                               _fname, _fmax, _dict )
319
 
320
#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict )     \
321
          T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
322
                               _fname, _fmax, _dict )
323
 
324
#define T1_FIELD_CALLBACK( _ident, _name, _dict )       \
325
          T1_NEW_CALLBACK_FIELD( _ident, _name, _dict )
326
 
327
 
328
  /*************************************************************************/
329
  /*************************************************************************/
330
  /*****                                                               *****/
331
  /*****                            T1 PARSER                          *****/
332
  /*****                                                               *****/
333
  /*************************************************************************/
334
  /*************************************************************************/
335
 
336
  typedef const struct PS_Parser_FuncsRec_*  PS_Parser_Funcs;
337
 
338
  typedef struct  PS_Parser_FuncsRec_
339
  {
340
    void
341
    (*init)( PS_Parser  parser,
342
             FT_Byte*   base,
343
             FT_Byte*   limit,
344
             FT_Memory  memory );
345
 
346
    void
347
    (*done)( PS_Parser  parser );
348
 
349
    void
350
    (*skip_spaces)( PS_Parser  parser );
351
    void
352
    (*skip_PS_token)( PS_Parser  parser );
353
 
354
    FT_Long
355
    (*to_int)( PS_Parser  parser );
356
    FT_Fixed
357
    (*to_fixed)( PS_Parser  parser,
358
                 FT_Int     power_ten );
359
 
360
    FT_Error
361
    (*to_bytes)( PS_Parser  parser,
362
                 FT_Byte*   bytes,
363
                 FT_Offset  max_bytes,
364
                 FT_Long*   pnum_bytes,
365
                 FT_Bool    delimiters );
366
 
367
    FT_Int
368
    (*to_coord_array)( PS_Parser  parser,
369
                       FT_Int     max_coords,
370
                       FT_Short*  coords );
371
    FT_Int
372
    (*to_fixed_array)( PS_Parser  parser,
373
                       FT_Int     max_values,
374
                       FT_Fixed*  values,
375
                       FT_Int     power_ten );
376
 
377
    void
378
    (*to_token)( PS_Parser  parser,
379
                 T1_Token   token );
380
    void
381
    (*to_token_array)( PS_Parser  parser,
382
                       T1_Token   tokens,
383
                       FT_UInt    max_tokens,
384
                       FT_Int*    pnum_tokens );
385
 
386
    FT_Error
387
    (*load_field)( PS_Parser       parser,
388
                   const T1_Field  field,
389
                   void**          objects,
390
                   FT_UInt         max_objects,
391
                   FT_ULong*       pflags );
392
 
393
    FT_Error
394
    (*load_field_table)( PS_Parser       parser,
395
                         const T1_Field  field,
396
                         void**          objects,
397
                         FT_UInt         max_objects,
398
                         FT_ULong*       pflags );
399
 
400
  } PS_Parser_FuncsRec;
401
 
402
 
403
  /*************************************************************************/
404
  /*                                                                       */
405
  /*                                                               */
406
  /*    PS_ParserRec                                                       */
407
  /*                                                                       */
408
  /*                                                          */
409
  /*    A PS_Parser is an object used to parse a Type 1 font very quickly. */
410
  /*                                                                       */
411
  /*                                                               */
412
  /*    cursor :: The current position in the text.                        */
413
  /*                                                                       */
414
  /*    base   :: Start of the processed text.                             */
415
  /*                                                                       */
416
  /*    limit  :: End of the processed text.                               */
417
  /*                                                                       */
418
  /*    error  :: The last error returned.                                 */
419
  /*                                                                       */
420
  /*    memory :: The object used for memory operations (alloc/realloc).   */
421
  /*                                                                       */
422
  /*    funcs  :: A table of functions for the parser.                     */
423
  /*                                                                       */
424
  typedef struct  PS_ParserRec_
425
  {
426
    FT_Byte*   cursor;
427
    FT_Byte*   base;
428
    FT_Byte*   limit;
429
    FT_Error   error;
430
    FT_Memory  memory;
431
 
432
    PS_Parser_FuncsRec  funcs;
433
 
434
  } PS_ParserRec;
435
 
436
 
437
  /*************************************************************************/
438
  /*************************************************************************/
439
  /*****                                                               *****/
440
  /*****                         T1 BUILDER                            *****/
441
  /*****                                                               *****/
442
  /*************************************************************************/
443
  /*************************************************************************/
444
 
445
 
446
  typedef struct T1_BuilderRec_*  T1_Builder;
447
 
448
 
449
  typedef FT_Error
450
  (*T1_Builder_Check_Points_Func)( T1_Builder  builder,
451
                                   FT_Int      count );
452
 
453
  typedef void
454
  (*T1_Builder_Add_Point_Func)( T1_Builder  builder,
455
                                FT_Pos      x,
456
                                FT_Pos      y,
457
                                FT_Byte     flag );
458
 
459
  typedef FT_Error
460
  (*T1_Builder_Add_Point1_Func)( T1_Builder  builder,
461
                                 FT_Pos      x,
462
                                 FT_Pos      y );
463
 
464
  typedef FT_Error
465
  (*T1_Builder_Add_Contour_Func)( T1_Builder  builder );
466
 
467
  typedef FT_Error
468
  (*T1_Builder_Start_Point_Func)( T1_Builder  builder,
469
                                  FT_Pos      x,
470
                                  FT_Pos      y );
471
 
472
  typedef void
473
  (*T1_Builder_Close_Contour_Func)( T1_Builder  builder );
474
 
475
 
476
  typedef const struct T1_Builder_FuncsRec_*  T1_Builder_Funcs;
477
 
478
  typedef struct  T1_Builder_FuncsRec_
479
  {
480
    void
481
    (*init)( T1_Builder    builder,
482
             FT_Face       face,
483
             FT_Size       size,
484
             FT_GlyphSlot  slot,
485
             FT_Bool       hinting );
486
 
487
    void
488
    (*done)( T1_Builder   builder );
489
 
490
    T1_Builder_Check_Points_Func   check_points;
491
    T1_Builder_Add_Point_Func      add_point;
492
    T1_Builder_Add_Point1_Func     add_point1;
493
    T1_Builder_Add_Contour_Func    add_contour;
494
    T1_Builder_Start_Point_Func    start_point;
495
    T1_Builder_Close_Contour_Func  close_contour;
496
 
497
  } T1_Builder_FuncsRec;
498
 
499
 
500
  /* an enumeration type to handle charstring parsing states */
501
  typedef enum  T1_ParseState_
502
  {
503
    T1_Parse_Start,
504
    T1_Parse_Have_Width,
505
    T1_Parse_Have_Moveto,
506
    T1_Parse_Have_Path
507
 
508
  } T1_ParseState;
509
 
510
 
511
  /*************************************************************************/
512
  /*                                                                       */
513
  /*                                                            */
514
  /*    T1_BuilderRec                                                      */
515
  /*                                                                       */
516
  /*                                                          */
517
  /*     A structure used during glyph loading to store its outline.       */
518
  /*                                                                       */
519
  /*                                                               */
520
  /*    memory       :: The current memory object.                         */
521
  /*                                                                       */
522
  /*    face         :: The current face object.                           */
523
  /*                                                                       */
524
  /*    glyph        :: The current glyph slot.                            */
525
  /*                                                                       */
526
  /*    loader       :: XXX                                                */
527
  /*                                                                       */
528
  /*    base         :: The base glyph outline.                            */
529
  /*                                                                       */
530
  /*    current      :: The current glyph outline.                         */
531
  /*                                                                       */
532
  /*    max_points   :: maximum points in builder outline                  */
533
  /*                                                                       */
534
  /*    max_contours :: Maximal number of contours in builder outline.     */
535
  /*                                                                       */
536
  /*    pos_x        :: The horizontal translation (if composite glyph).   */
537
  /*                                                                       */
538
  /*    pos_y        :: The vertical translation (if composite glyph).     */
539
  /*                                                                       */
540
  /*    left_bearing :: The left side bearing point.                       */
541
  /*                                                                       */
542
  /*    advance      :: The horizontal advance vector.                     */
543
  /*                                                                       */
544
  /*    bbox         :: Unused.                                            */
545
  /*                                                                       */
546
  /*    parse_state  :: An enumeration which controls the charstring       */
547
  /*                    parsing state.                                     */
548
  /*                                                                       */
549
  /*    load_points  :: If this flag is not set, no points are loaded.     */
550
  /*                                                                       */
551
  /*    no_recurse   :: Set but not used.                                  */
552
  /*                                                                       */
553
  /*    metrics_only :: A boolean indicating that we only want to compute  */
554
  /*                    the metrics of a given glyph, not load all of its  */
555
  /*                    points.                                            */
556
  /*                                                                       */
557
  /*    funcs        :: An array of function pointers for the builder.     */
558
  /*                                                                       */
559
  typedef struct  T1_BuilderRec_
560
  {
561
    FT_Memory       memory;
562
    FT_Face         face;
563
    FT_GlyphSlot    glyph;
564
    FT_GlyphLoader  loader;
565
    FT_Outline*     base;
566
    FT_Outline*     current;
567
 
568
    FT_Pos          pos_x;
569
    FT_Pos          pos_y;
570
 
571
    FT_Vector       left_bearing;
572
    FT_Vector       advance;
573
 
574
    FT_BBox         bbox;          /* bounding box */
575
    T1_ParseState   parse_state;
576
    FT_Bool         load_points;
577
    FT_Bool         no_recurse;
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_Long*             buildchar;
693
    FT_UInt              len_buildchar;
694
 
695
    FT_Bool              seac;
696
 
697
  } T1_DecoderRec;
698
 
699
 
700
  /*************************************************************************/
701
  /*************************************************************************/
702
  /*****                                                               *****/
703
  /*****                            AFM PARSER                         *****/
704
  /*****                                                               *****/
705
  /*************************************************************************/
706
  /*************************************************************************/
707
 
708
  typedef struct AFM_ParserRec_*  AFM_Parser;
709
 
710
  typedef struct  AFM_Parser_FuncsRec_
711
  {
712
    FT_Error
713
    (*init)( AFM_Parser  parser,
714
             FT_Memory   memory,
715
             FT_Byte*    base,
716
             FT_Byte*    limit );
717
 
718
    void
719
    (*done)( AFM_Parser  parser );
720
 
721
    FT_Error
722
    (*parse)( AFM_Parser  parser );
723
 
724
  } AFM_Parser_FuncsRec;
725
 
726
 
727
  typedef struct AFM_StreamRec_*  AFM_Stream;
728
 
729
 
730
  /*************************************************************************/
731
  /*                                                                       */
732
  /*                                                               */
733
  /*    AFM_ParserRec                                                      */
734
  /*                                                                       */
735
  /*                                                          */
736
  /*    An AFM_Parser is a parser for the AFM files.                       */
737
  /*                                                                       */
738
  /*                                                               */
739
  /*    memory    :: The object used for memory operations (alloc and      */
740
  /*                 realloc).                                             */
741
  /*                                                                       */
742
  /*    stream    :: This is an opaque object.                             */
743
  /*                                                                       */
744
  /*    FontInfo  :: The result will be stored here.                       */
745
  /*                                                                       */
746
  /*    get_index :: A user provided function to get a glyph index by its  */
747
  /*                 name.                                                 */
748
  /*                                                                       */
749
  typedef struct  AFM_ParserRec_
750
  {
751
    FT_Memory     memory;
752
    AFM_Stream    stream;
753
 
754
    AFM_FontInfo  FontInfo;
755
 
756
    FT_Int
757
    (*get_index)( const char*  name,
758
                  FT_Offset    len,
759
                  void*        user_data );
760
 
761
    void*         user_data;
762
 
763
  } AFM_ParserRec;
764
 
765
 
766
  /*************************************************************************/
767
  /*************************************************************************/
768
  /*****                                                               *****/
769
  /*****                     TYPE1 CHARMAPS                            *****/
770
  /*****                                                               *****/
771
  /*************************************************************************/
772
  /*************************************************************************/
773
 
774
  typedef const struct T1_CMap_ClassesRec_*  T1_CMap_Classes;
775
 
776
  typedef struct T1_CMap_ClassesRec_
777
  {
778
    FT_CMap_Class  standard;
779
    FT_CMap_Class  expert;
780
    FT_CMap_Class  custom;
781
    FT_CMap_Class  unicode;
782
 
783
  } T1_CMap_ClassesRec;
784
 
785
 
786
  /*************************************************************************/
787
  /*************************************************************************/
788
  /*****                                                               *****/
789
  /*****                        PSAux Module Interface                 *****/
790
  /*****                                                               *****/
791
  /*************************************************************************/
792
  /*************************************************************************/
793
 
794
  typedef struct  PSAux_ServiceRec_
795
  {
796
    /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */
797
    const PS_Table_FuncsRec*    ps_table_funcs;
798
    const PS_Parser_FuncsRec*   ps_parser_funcs;
799
    const T1_Builder_FuncsRec*  t1_builder_funcs;
800
    const T1_Decoder_FuncsRec*  t1_decoder_funcs;
801
 
802
    void
803
    (*t1_decrypt)( FT_Byte*   buffer,
804
                   FT_Offset  length,
805
                   FT_UShort  seed );
806
 
807
    T1_CMap_Classes  t1_cmap_classes;
808
 
809
    /* fields after this comment line were added after version 2.1.10 */
810
    const AFM_Parser_FuncsRec*  afm_parser_funcs;
811
 
812
  } PSAux_ServiceRec, *PSAux_Service;
813
 
814
  /* backwards-compatible type definition */
815
  typedef PSAux_ServiceRec   PSAux_Interface;
816
 
817
 
818
  /*************************************************************************/
819
  /*************************************************************************/
820
  /*****                                                               *****/
821
  /*****                 Some convenience functions                    *****/
822
  /*****                                                               *****/
823
  /*************************************************************************/
824
  /*************************************************************************/
825
 
826
#define IS_PS_NEWLINE( ch ) \
827
  ( (ch) == '\r' ||         \
828
    (ch) == '\n' )
829
 
830
#define IS_PS_SPACE( ch )  \
831
  ( (ch) == ' '         || \
832
    IS_PS_NEWLINE( ch ) || \
833
    (ch) == '\t'        || \
834
    (ch) == '\f'        || \
835
    (ch) == '\0' )
836
 
837
#define IS_PS_SPECIAL( ch )       \
838
  ( (ch) == '/'                || \
839
    (ch) == '(' || (ch) == ')' || \
840
    (ch) == '<' || (ch) == '>' || \
841
    (ch) == '[' || (ch) == ']' || \
842
    (ch) == '{' || (ch) == '}' || \
843
    (ch) == '%'                )
844
 
845
#define IS_PS_DELIM( ch )  \
846
  ( IS_PS_SPACE( ch )   || \
847
    IS_PS_SPECIAL( ch ) )
848
 
849
#define IS_PS_DIGIT( ch )        \
850
  ( (ch) >= '0' && (ch) <= '9' )
851
 
852
#define IS_PS_XDIGIT( ch )            \
853
  ( IS_PS_DIGIT( ch )              || \
854
    ( (ch) >= 'A' && (ch) <= 'F' ) || \
855
    ( (ch) >= 'a' && (ch) <= 'f' ) )
856
 
857
#define IS_PS_BASE85( ch )       \
858
  ( (ch) >= '!' && (ch) <= 'u' )
859
 
860
#define IS_PS_TOKEN( cur, limit, token )                                \
861
  ( (char)(cur)[0] == (token)[0]                                     && \
862
    ( (cur) + sizeof ( (token) ) == (limit) ||                          \
863
      ( (cur) + sizeof( (token) ) < (limit)          &&                 \
864
        IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) )             && \
865
    ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 )
866
 
867
 
868
FT_END_HEADER
869
 
870
#endif /* __PSAUX_H__ */
871
 
872
 
873
/* END */