• 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-2018 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_INTERNAL_HASH_H
28 #include FT_INTERNAL_TRUETYPE_TYPES_H
29 #include FT_SERVICE_POSTSCRIPT_CMAPS_H
30 #include FT_INTERNAL_CFF_TYPES_H
31 #include FT_INTERNAL_CFF_OBJECTS_TYPES_H
32 
33 
34 
35 FT_BEGIN_HEADER
36 
37 
38   /************************************************************************
39    *
40    * PostScript modules driver class.
41    */
42   typedef struct  PS_DriverRec_
43   {
44     FT_DriverRec  root;
45 
46     FT_UInt   hinting_engine;
47     FT_Bool   no_stem_darkening;
48     FT_Int    darken_params[8];
49     FT_Int32  random_seed;
50 
51   } PS_DriverRec, *PS_Driver;
52 
53 
54   /*************************************************************************/
55   /*************************************************************************/
56   /*****                                                               *****/
57   /*****                             T1_TABLE                          *****/
58   /*****                                                               *****/
59   /*************************************************************************/
60   /*************************************************************************/
61 
62 
63   typedef struct PS_TableRec_*              PS_Table;
64   typedef const struct PS_Table_FuncsRec_*  PS_Table_Funcs;
65 
66 
67   /**************************************************************************
68    *
69    * @struct:
70    *   PS_Table_FuncsRec
71    *
72    * @description:
73    *   A set of function pointers to manage PS_Table objects.
74    *
75    * @fields:
76    *   table_init ::
77    *     Used to initialize a table.
78    *
79    *   table_done ::
80    *     Finalizes resp. destroy a given table.
81    *
82    *   table_add ::
83    *     Adds a new object to a table.
84    *
85    *   table_release ::
86    *     Releases table data, then finalizes it.
87    */
88   typedef struct  PS_Table_FuncsRec_
89   {
90     FT_Error
91     (*init)( PS_Table   table,
92              FT_Int     count,
93              FT_Memory  memory );
94 
95     void
96     (*done)( PS_Table  table );
97 
98     FT_Error
99     (*add)( PS_Table  table,
100             FT_Int    idx,
101             void*     object,
102             FT_UInt   length );
103 
104     void
105     (*release)( PS_Table  table );
106 
107   } PS_Table_FuncsRec;
108 
109 
110   /**************************************************************************
111    *
112    * @struct:
113    *   PS_TableRec
114    *
115    * @description:
116    *   A PS_Table is a simple object used to store an array of objects in
117    *   a single memory block.
118    *
119    * @fields:
120    *   block ::
121    *     The address in memory of the growheap's block.  This
122    *     can change between two object adds, due to
123    *     reallocation.
124    *
125    *   cursor ::
126    *     The current top of the grow heap within its block.
127    *
128    *   capacity ::
129    *     The current size of the heap block.  Increments by
130    *     1kByte chunks.
131    *
132    *   init ::
133    *     Set to 0xDEADBEEF if `elements' and `lengths' have
134    *     been allocated.
135    *
136    *   max_elems ::
137    *     The maximum number of elements in table.
138    *
139    *   num_elems ::
140    *     The current number of elements in table.
141    *
142    *   elements ::
143    *     A table of element addresses within the block.
144    *
145    *   lengths ::
146    *     A table of element sizes within the block.
147    *
148    *   memory ::
149    *     The object used for memory operations
150    *     (alloc/realloc).
151    *
152    *   funcs ::
153    *     A table of method pointers for this object.
154    */
155   typedef struct  PS_TableRec_
156   {
157     FT_Byte*           block;          /* current memory block           */
158     FT_Offset          cursor;         /* current cursor in memory block */
159     FT_Offset          capacity;       /* current size of memory block   */
160     FT_ULong           init;
161 
162     FT_Int             max_elems;
163     FT_Int             num_elems;
164     FT_Byte**          elements;       /* addresses of table elements */
165     FT_UInt*           lengths;        /* lengths of table elements   */
166 
167     FT_Memory          memory;
168     PS_Table_FuncsRec  funcs;
169 
170   } PS_TableRec;
171 
172 
173   /*************************************************************************/
174   /*************************************************************************/
175   /*****                                                               *****/
176   /*****                       T1 FIELDS & TOKENS                      *****/
177   /*****                                                               *****/
178   /*************************************************************************/
179   /*************************************************************************/
180 
181   typedef struct PS_ParserRec_*  PS_Parser;
182 
183   typedef struct T1_TokenRec_*   T1_Token;
184 
185   typedef struct T1_FieldRec_*   T1_Field;
186 
187 
188   /* simple enumeration type used to identify token types */
189   typedef enum  T1_TokenType_
190   {
191     T1_TOKEN_TYPE_NONE = 0,
192     T1_TOKEN_TYPE_ANY,
193     T1_TOKEN_TYPE_STRING,
194     T1_TOKEN_TYPE_ARRAY,
195     T1_TOKEN_TYPE_KEY, /* aka `name' */
196 
197     /* do not remove */
198     T1_TOKEN_TYPE_MAX
199 
200   } T1_TokenType;
201 
202 
203   /* a simple structure used to identify tokens */
204   typedef struct  T1_TokenRec_
205   {
206     FT_Byte*      start;   /* first character of token in input stream */
207     FT_Byte*      limit;   /* first character after the token          */
208     T1_TokenType  type;    /* type of token                            */
209 
210   } T1_TokenRec;
211 
212 
213   /* enumeration type used to identify object fields */
214   typedef enum  T1_FieldType_
215   {
216     T1_FIELD_TYPE_NONE = 0,
217     T1_FIELD_TYPE_BOOL,
218     T1_FIELD_TYPE_INTEGER,
219     T1_FIELD_TYPE_FIXED,
220     T1_FIELD_TYPE_FIXED_1000,
221     T1_FIELD_TYPE_STRING,
222     T1_FIELD_TYPE_KEY,
223     T1_FIELD_TYPE_BBOX,
224     T1_FIELD_TYPE_MM_BBOX,
225     T1_FIELD_TYPE_INTEGER_ARRAY,
226     T1_FIELD_TYPE_FIXED_ARRAY,
227     T1_FIELD_TYPE_CALLBACK,
228 
229     /* do not remove */
230     T1_FIELD_TYPE_MAX
231 
232   } T1_FieldType;
233 
234 
235   typedef enum  T1_FieldLocation_
236   {
237     T1_FIELD_LOCATION_CID_INFO,
238     T1_FIELD_LOCATION_FONT_DICT,
239     T1_FIELD_LOCATION_FONT_EXTRA,
240     T1_FIELD_LOCATION_FONT_INFO,
241     T1_FIELD_LOCATION_PRIVATE,
242     T1_FIELD_LOCATION_BBOX,
243     T1_FIELD_LOCATION_LOADER,
244     T1_FIELD_LOCATION_FACE,
245     T1_FIELD_LOCATION_BLEND,
246 
247     /* do not remove */
248     T1_FIELD_LOCATION_MAX
249 
250   } T1_FieldLocation;
251 
252 
253   typedef void
254   (*T1_Field_ParseFunc)( FT_Face     face,
255                          FT_Pointer  parser );
256 
257 
258   /* structure type used to model object fields */
259   typedef struct  T1_FieldRec_
260   {
261     const char*         ident;        /* field identifier               */
262     T1_FieldLocation    location;
263     T1_FieldType        type;         /* type of field                  */
264     T1_Field_ParseFunc  reader;
265     FT_UInt             offset;       /* offset of field in object      */
266     FT_Byte             size;         /* size of field in bytes         */
267     FT_UInt             array_max;    /* maximum number of elements for */
268                                       /* array                          */
269     FT_UInt             count_offset; /* offset of element count for    */
270                                       /* arrays; must not be zero if in */
271                                       /* use -- in other words, a       */
272                                       /* `num_FOO' element must not     */
273                                       /* start the used structure if we */
274                                       /* parse a `FOO' array            */
275     FT_UInt             dict;         /* where we expect it             */
276   } T1_FieldRec;
277 
278 #define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */
279 #define T1_FIELD_DICT_PRIVATE  ( 1 << 1 )
280 
281 
282 
283 #define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \
284           {                                                 \
285             _ident, T1CODE, _type,                          \
286             0,                                              \
287             FT_FIELD_OFFSET( _fname ),                      \
288             FT_FIELD_SIZE( _fname ),                        \
289             0, 0,                                           \
290             _dict                                           \
291           },
292 
293 #define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \
294           {                                             \
295             _ident, T1CODE, T1_FIELD_TYPE_CALLBACK,     \
296             (T1_Field_ParseFunc)_reader,                \
297             0, 0,                                       \
298             0, 0,                                       \
299             _dict                                       \
300           },
301 
302 #define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \
303           {                                                      \
304             _ident, T1CODE, _type,                               \
305             0,                                                   \
306             FT_FIELD_OFFSET( _fname ),                           \
307             FT_FIELD_SIZE_DELTA( _fname ),                       \
308             _max,                                                \
309             FT_FIELD_OFFSET( num_ ## _fname ),                   \
310             _dict                                                \
311           },
312 
313 #define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \
314           {                                                       \
315             _ident, T1CODE, _type,                                \
316             0,                                                    \
317             FT_FIELD_OFFSET( _fname ),                            \
318             FT_FIELD_SIZE_DELTA( _fname ),                        \
319             _max, 0,                                              \
320             _dict                                                 \
321           },
322 
323 
324 #define T1_FIELD_BOOL( _ident, _fname, _dict )                             \
325           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict )
326 
327 #define T1_FIELD_NUM( _ident, _fname, _dict )                                 \
328           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict )
329 
330 #define T1_FIELD_FIXED( _ident, _fname, _dict )                             \
331           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict )
332 
333 #define T1_FIELD_FIXED_1000( _ident, _fname, _dict )                     \
334           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \
335                                _dict )
336 
337 #define T1_FIELD_STRING( _ident, _fname, _dict )                             \
338           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict )
339 
340 #define T1_FIELD_KEY( _ident, _fname, _dict )                             \
341           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict )
342 
343 #define T1_FIELD_BBOX( _ident, _fname, _dict )                             \
344           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict )
345 
346 
347 #define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict )         \
348           T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
349                               _fname, _fmax, _dict )
350 
351 #define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict )     \
352           T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
353                               _fname, _fmax, _dict )
354 
355 #define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict )         \
356           T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
357                                _fname, _fmax, _dict )
358 
359 #define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict )     \
360           T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
361                                _fname, _fmax, _dict )
362 
363 #define T1_FIELD_CALLBACK( _ident, _name, _dict )       \
364           T1_NEW_CALLBACK_FIELD( _ident, _name, _dict )
365 
366 
367   /*************************************************************************/
368   /*************************************************************************/
369   /*****                                                               *****/
370   /*****                            T1 PARSER                          *****/
371   /*****                                                               *****/
372   /*************************************************************************/
373   /*************************************************************************/
374 
375   typedef const struct PS_Parser_FuncsRec_*  PS_Parser_Funcs;
376 
377   typedef struct  PS_Parser_FuncsRec_
378   {
379     void
380     (*init)( PS_Parser  parser,
381              FT_Byte*   base,
382              FT_Byte*   limit,
383              FT_Memory  memory );
384 
385     void
386     (*done)( PS_Parser  parser );
387 
388     void
389     (*skip_spaces)( PS_Parser  parser );
390     void
391     (*skip_PS_token)( PS_Parser  parser );
392 
393     FT_Long
394     (*to_int)( PS_Parser  parser );
395     FT_Fixed
396     (*to_fixed)( PS_Parser  parser,
397                  FT_Int     power_ten );
398 
399     FT_Error
400     (*to_bytes)( PS_Parser  parser,
401                  FT_Byte*   bytes,
402                  FT_Offset  max_bytes,
403                  FT_ULong*  pnum_bytes,
404                  FT_Bool    delimiters );
405 
406     FT_Int
407     (*to_coord_array)( PS_Parser  parser,
408                        FT_Int     max_coords,
409                        FT_Short*  coords );
410     FT_Int
411     (*to_fixed_array)( PS_Parser  parser,
412                        FT_Int     max_values,
413                        FT_Fixed*  values,
414                        FT_Int     power_ten );
415 
416     void
417     (*to_token)( PS_Parser  parser,
418                  T1_Token   token );
419     void
420     (*to_token_array)( PS_Parser  parser,
421                        T1_Token   tokens,
422                        FT_UInt    max_tokens,
423                        FT_Int*    pnum_tokens );
424 
425     FT_Error
426     (*load_field)( PS_Parser       parser,
427                    const T1_Field  field,
428                    void**          objects,
429                    FT_UInt         max_objects,
430                    FT_ULong*       pflags );
431 
432     FT_Error
433     (*load_field_table)( PS_Parser       parser,
434                          const T1_Field  field,
435                          void**          objects,
436                          FT_UInt         max_objects,
437                          FT_ULong*       pflags );
438 
439   } PS_Parser_FuncsRec;
440 
441 
442   /**************************************************************************
443    *
444    * @struct:
445    *   PS_ParserRec
446    *
447    * @description:
448    *   A PS_Parser is an object used to parse a Type 1 font very quickly.
449    *
450    * @fields:
451    *   cursor ::
452    *     The current position in the text.
453    *
454    *   base ::
455    *     Start of the processed text.
456    *
457    *   limit ::
458    *     End of the processed text.
459    *
460    *   error ::
461    *     The last error returned.
462    *
463    *   memory ::
464    *     The object used for memory operations (alloc/realloc).
465    *
466    *   funcs ::
467    *     A table of functions for the parser.
468    */
469   typedef struct  PS_ParserRec_
470   {
471     FT_Byte*   cursor;
472     FT_Byte*   base;
473     FT_Byte*   limit;
474     FT_Error   error;
475     FT_Memory  memory;
476 
477     PS_Parser_FuncsRec  funcs;
478 
479   } PS_ParserRec;
480 
481 
482   /*************************************************************************/
483   /*************************************************************************/
484   /*****                                                               *****/
485   /*****                         PS BUILDER                            *****/
486   /*****                                                               *****/
487   /*************************************************************************/
488   /*************************************************************************/
489 
490 
491   typedef struct PS_Builder_  PS_Builder;
492   typedef const struct PS_Builder_FuncsRec_*  PS_Builder_Funcs;
493 
494   typedef struct  PS_Builder_FuncsRec_
495   {
496     void
497     (*init)( PS_Builder*  ps_builder,
498              void*        builder,
499              FT_Bool      is_t1 );
500 
501     void
502     (*done)( PS_Builder*  builder );
503 
504   } PS_Builder_FuncsRec;
505 
506 
507   /**************************************************************************
508    *
509    * @struct:
510    *   PS_Builder
511    *
512    * @description:
513    *    A structure used during glyph loading to store its outline.
514    *
515    * @fields:
516    *   memory ::
517    *     The current memory object.
518    *
519    *   face ::
520    *     The current face object.
521    *
522    *   glyph ::
523    *     The current glyph slot.
524    *
525    *   loader ::
526    *     XXX
527    *
528    *   base ::
529    *     The base glyph outline.
530    *
531    *   current ::
532    *     The current glyph outline.
533    *
534    *   pos_x ::
535    *     The horizontal translation (if composite glyph).
536    *
537    *   pos_y ::
538    *     The vertical translation (if composite glyph).
539    *
540    *   left_bearing ::
541    *     The left side bearing point.
542    *
543    *   advance ::
544    *     The horizontal advance vector.
545    *
546    *   bbox ::
547    *     Unused.
548    *
549    *   path_begun ::
550    *     A flag which indicates that a new path has begun.
551    *
552    *   load_points ::
553    *     If this flag is not set, no points are loaded.
554    *
555    *   no_recurse ::
556    *     Set but not used.
557    *
558    *   metrics_only ::
559    *     A boolean indicating that we only want to compute
560    *     the metrics of a given glyph, not load all of its
561    *     points.
562    *
563    *   is_t1 ::
564    *     Set if current font type is Type 1.
565    *
566    *   funcs ::
567    *     An array of function pointers for the builder.
568    */
569   struct  PS_Builder_
570   {
571     FT_Memory       memory;
572     FT_Face         face;
573     CFF_GlyphSlot   glyph;
574     FT_GlyphLoader  loader;
575     FT_Outline*     base;
576     FT_Outline*     current;
577 
578     FT_Pos*  pos_x;
579     FT_Pos*  pos_y;
580 
581     FT_Vector*  left_bearing;
582     FT_Vector*  advance;
583 
584     FT_BBox*  bbox;          /* bounding box */
585     FT_Bool   path_begun;
586     FT_Bool   load_points;
587     FT_Bool   no_recurse;
588 
589     FT_Bool  metrics_only;
590     FT_Bool  is_t1;
591 
592     PS_Builder_FuncsRec  funcs;
593 
594   };
595 
596 
597   /*************************************************************************/
598   /*************************************************************************/
599   /*****                                                               *****/
600   /*****                            PS DECODER                         *****/
601   /*****                                                               *****/
602   /*************************************************************************/
603   /*************************************************************************/
604 
605 #define PS_MAX_OPERANDS        48
606 #define PS_MAX_SUBRS_CALLS     16   /* maximum subroutine nesting;         */
607                                     /* only 10 are allowed but there exist */
608                                     /* fonts like `HiraKakuProN-W3.ttf'    */
609                                     /* (Hiragino Kaku Gothic ProN W3;      */
610                                     /* 8.2d6e1; 2014-12-19) that exceed    */
611                                     /* this limit                          */
612 
613   /* execution context charstring zone */
614 
615   typedef struct  PS_Decoder_Zone_
616   {
617     FT_Byte*  base;
618     FT_Byte*  limit;
619     FT_Byte*  cursor;
620 
621   } PS_Decoder_Zone;
622 
623 
624   typedef FT_Error
625   (*CFF_Decoder_Get_Glyph_Callback)( TT_Face    face,
626                                      FT_UInt    glyph_index,
627                                      FT_Byte**  pointer,
628                                      FT_ULong*  length );
629 
630   typedef void
631   (*CFF_Decoder_Free_Glyph_Callback)( TT_Face    face,
632                                       FT_Byte**  pointer,
633                                       FT_ULong   length );
634 
635 
636   typedef struct  PS_Decoder_
637   {
638     PS_Builder  builder;
639 
640     FT_Fixed   stack[PS_MAX_OPERANDS + 1];
641     FT_Fixed*  top;
642 
643     PS_Decoder_Zone   zones[PS_MAX_SUBRS_CALLS + 1];
644     PS_Decoder_Zone*  zone;
645 
646     FT_Int     flex_state;
647     FT_Int     num_flex_vectors;
648     FT_Vector  flex_vectors[7];
649 
650     CFF_Font     cff;
651     CFF_SubFont  current_subfont; /* for current glyph_index */
652     FT_Generic*  cf2_instance;
653 
654     FT_Pos*  glyph_width;
655     FT_Bool  width_only;
656     FT_Int   num_hints;
657 
658     FT_UInt  num_locals;
659     FT_UInt  num_globals;
660 
661     FT_Int  locals_bias;
662     FT_Int  globals_bias;
663 
664     FT_Byte**  locals;
665     FT_Byte**  globals;
666 
667     FT_Byte**  glyph_names;   /* for pure CFF fonts only  */
668     FT_UInt    num_glyphs;    /* number of glyphs in font */
669 
670     FT_Render_Mode  hint_mode;
671 
672     FT_Bool  seac;
673 
674     CFF_Decoder_Get_Glyph_Callback   get_glyph_callback;
675     CFF_Decoder_Free_Glyph_Callback  free_glyph_callback;
676 
677     /* Type 1 stuff */
678     FT_Service_PsCMaps  psnames;      /* for seac */
679 
680     FT_Int    lenIV;         /* internal for sub routine calls   */
681     FT_UInt*  locals_len;    /* array of subrs length (optional) */
682     FT_Hash   locals_hash;   /* used if `num_subrs' was massaged */
683 
684     FT_Matrix  font_matrix;
685     FT_Vector  font_offset;
686 
687     PS_Blend  blend;         /* for multiple master support */
688 
689     FT_Long*  buildchar;
690     FT_UInt   len_buildchar;
691 
692   } PS_Decoder;
693 
694 
695   /*************************************************************************/
696   /*************************************************************************/
697   /*****                                                               *****/
698   /*****                         T1 BUILDER                            *****/
699   /*****                                                               *****/
700   /*************************************************************************/
701   /*************************************************************************/
702 
703 
704   typedef struct T1_BuilderRec_*  T1_Builder;
705 
706 
707   typedef FT_Error
708   (*T1_Builder_Check_Points_Func)( T1_Builder  builder,
709                                    FT_Int      count );
710 
711   typedef void
712   (*T1_Builder_Add_Point_Func)( T1_Builder  builder,
713                                 FT_Pos      x,
714                                 FT_Pos      y,
715                                 FT_Byte     flag );
716 
717   typedef FT_Error
718   (*T1_Builder_Add_Point1_Func)( T1_Builder  builder,
719                                  FT_Pos      x,
720                                  FT_Pos      y );
721 
722   typedef FT_Error
723   (*T1_Builder_Add_Contour_Func)( T1_Builder  builder );
724 
725   typedef FT_Error
726   (*T1_Builder_Start_Point_Func)( T1_Builder  builder,
727                                   FT_Pos      x,
728                                   FT_Pos      y );
729 
730   typedef void
731   (*T1_Builder_Close_Contour_Func)( T1_Builder  builder );
732 
733 
734   typedef const struct T1_Builder_FuncsRec_*  T1_Builder_Funcs;
735 
736   typedef struct  T1_Builder_FuncsRec_
737   {
738     void
739     (*init)( T1_Builder    builder,
740              FT_Face       face,
741              FT_Size       size,
742              FT_GlyphSlot  slot,
743              FT_Bool       hinting );
744 
745     void
746     (*done)( T1_Builder   builder );
747 
748     T1_Builder_Check_Points_Func   check_points;
749     T1_Builder_Add_Point_Func      add_point;
750     T1_Builder_Add_Point1_Func     add_point1;
751     T1_Builder_Add_Contour_Func    add_contour;
752     T1_Builder_Start_Point_Func    start_point;
753     T1_Builder_Close_Contour_Func  close_contour;
754 
755   } T1_Builder_FuncsRec;
756 
757 
758   /* an enumeration type to handle charstring parsing states */
759   typedef enum  T1_ParseState_
760   {
761     T1_Parse_Start,
762     T1_Parse_Have_Width,
763     T1_Parse_Have_Moveto,
764     T1_Parse_Have_Path
765 
766   } T1_ParseState;
767 
768 
769   /**************************************************************************
770    *
771    * @struct:
772    *   T1_BuilderRec
773    *
774    * @description:
775    *    A structure used during glyph loading to store its outline.
776    *
777    * @fields:
778    *   memory ::
779    *     The current memory object.
780    *
781    *   face ::
782    *     The current face object.
783    *
784    *   glyph ::
785    *     The current glyph slot.
786    *
787    *   loader ::
788    *     XXX
789    *
790    *   base ::
791    *     The base glyph outline.
792    *
793    *   current ::
794    *     The current glyph outline.
795    *
796    *   max_points ::
797    *     maximum points in builder outline
798    *
799    *   max_contours ::
800    *     Maximum number of contours in builder outline.
801    *
802    *   pos_x ::
803    *     The horizontal translation (if composite glyph).
804    *
805    *   pos_y ::
806    *     The vertical translation (if composite glyph).
807    *
808    *   left_bearing ::
809    *     The left side bearing point.
810    *
811    *   advance ::
812    *     The horizontal advance vector.
813    *
814    *   bbox ::
815    *     Unused.
816    *
817    *   parse_state ::
818    *     An enumeration which controls the charstring
819    *     parsing state.
820    *
821    *   load_points ::
822    *     If this flag is not set, no points are loaded.
823    *
824    *   no_recurse ::
825    *     Set but not used.
826    *
827    *   metrics_only ::
828    *     A boolean indicating that we only want to compute
829    *     the metrics of a given glyph, not load all of its
830    *     points.
831    *
832    *   funcs ::
833    *     An array of function pointers for the builder.
834    */
835   typedef struct  T1_BuilderRec_
836   {
837     FT_Memory       memory;
838     FT_Face         face;
839     FT_GlyphSlot    glyph;
840     FT_GlyphLoader  loader;
841     FT_Outline*     base;
842     FT_Outline*     current;
843 
844     FT_Pos          pos_x;
845     FT_Pos          pos_y;
846 
847     FT_Vector       left_bearing;
848     FT_Vector       advance;
849 
850     FT_BBox         bbox;          /* bounding box */
851     T1_ParseState   parse_state;
852     FT_Bool         load_points;
853     FT_Bool         no_recurse;
854 
855     FT_Bool         metrics_only;
856 
857     void*           hints_funcs;    /* hinter-specific */
858     void*           hints_globals;  /* hinter-specific */
859 
860     T1_Builder_FuncsRec  funcs;
861 
862   } T1_BuilderRec;
863 
864 
865   /*************************************************************************/
866   /*************************************************************************/
867   /*****                                                               *****/
868   /*****                         T1 DECODER                            *****/
869   /*****                                                               *****/
870   /*************************************************************************/
871   /*************************************************************************/
872 
873 #if 0
874 
875   /**************************************************************************
876    *
877    * T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine
878    * calls during glyph loading.
879    */
880 #define T1_MAX_SUBRS_CALLS  8
881 
882 
883   /**************************************************************************
884    *
885    * T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity.  A
886    * minimum of 16 is required.
887    */
888 #define T1_MAX_CHARSTRINGS_OPERANDS  32
889 
890 #endif /* 0 */
891 
892 
893   typedef struct  T1_Decoder_ZoneRec_
894   {
895     FT_Byte*  cursor;
896     FT_Byte*  base;
897     FT_Byte*  limit;
898 
899   } T1_Decoder_ZoneRec, *T1_Decoder_Zone;
900 
901 
902   typedef struct T1_DecoderRec_*              T1_Decoder;
903   typedef const struct T1_Decoder_FuncsRec_*  T1_Decoder_Funcs;
904 
905 
906   typedef FT_Error
907   (*T1_Decoder_Callback)( T1_Decoder  decoder,
908                           FT_UInt     glyph_index );
909 
910 
911   typedef struct  T1_Decoder_FuncsRec_
912   {
913     FT_Error
914     (*init)( T1_Decoder           decoder,
915              FT_Face              face,
916              FT_Size              size,
917              FT_GlyphSlot         slot,
918              FT_Byte**            glyph_names,
919              PS_Blend             blend,
920              FT_Bool              hinting,
921              FT_Render_Mode       hint_mode,
922              T1_Decoder_Callback  callback );
923 
924     void
925     (*done)( T1_Decoder  decoder );
926 
927 #ifdef T1_CONFIG_OPTION_OLD_ENGINE
928     FT_Error
929     (*parse_charstrings_old)( T1_Decoder  decoder,
930                               FT_Byte*    base,
931                               FT_UInt     len );
932 #else
933     FT_Error
934     (*parse_metrics)( T1_Decoder  decoder,
935                       FT_Byte*    base,
936                       FT_UInt     len );
937 #endif
938 
939     FT_Error
940     (*parse_charstrings)( PS_Decoder*  decoder,
941                           FT_Byte*     charstring_base,
942                           FT_ULong     charstring_len );
943 
944 
945   } T1_Decoder_FuncsRec;
946 
947 
948   typedef struct  T1_DecoderRec_
949   {
950     T1_BuilderRec        builder;
951 
952     FT_Long              stack[T1_MAX_CHARSTRINGS_OPERANDS];
953     FT_Long*             top;
954 
955     T1_Decoder_ZoneRec   zones[T1_MAX_SUBRS_CALLS + 1];
956     T1_Decoder_Zone      zone;
957 
958     FT_Service_PsCMaps   psnames;      /* for seac */
959     FT_UInt              num_glyphs;
960     FT_Byte**            glyph_names;
961 
962     FT_Int               lenIV;        /* internal for sub routine calls */
963     FT_Int               num_subrs;
964     FT_Byte**            subrs;
965     FT_UInt*             subrs_len;    /* array of subrs length (optional) */
966     FT_Hash              subrs_hash;   /* used if `num_subrs' was massaged */
967 
968     FT_Matrix            font_matrix;
969     FT_Vector            font_offset;
970 
971     FT_Int               flex_state;
972     FT_Int               num_flex_vectors;
973     FT_Vector            flex_vectors[7];
974 
975     PS_Blend             blend;       /* for multiple master support */
976 
977     FT_Render_Mode       hint_mode;
978 
979     T1_Decoder_Callback  parse_callback;
980     T1_Decoder_FuncsRec  funcs;
981 
982     FT_Long*             buildchar;
983     FT_UInt              len_buildchar;
984 
985     FT_Bool              seac;
986 
987     FT_Generic           cf2_instance;
988 
989   } T1_DecoderRec;
990 
991 
992   /*************************************************************************/
993   /*************************************************************************/
994   /*****                                                               *****/
995   /*****                        CFF BUILDER                            *****/
996   /*****                                                               *****/
997   /*************************************************************************/
998   /*************************************************************************/
999 
1000 
1001   typedef struct CFF_Builder_  CFF_Builder;
1002 
1003 
1004   typedef FT_Error
1005   (*CFF_Builder_Check_Points_Func)( CFF_Builder*  builder,
1006                                     FT_Int        count );
1007 
1008   typedef void
1009   (*CFF_Builder_Add_Point_Func)( CFF_Builder*  builder,
1010                                  FT_Pos        x,
1011                                  FT_Pos        y,
1012                                  FT_Byte       flag );
1013   typedef FT_Error
1014   (*CFF_Builder_Add_Point1_Func)( CFF_Builder*  builder,
1015                                   FT_Pos        x,
1016                                   FT_Pos        y );
1017   typedef FT_Error
1018   (*CFF_Builder_Start_Point_Func)( CFF_Builder*  builder,
1019                                    FT_Pos        x,
1020                                    FT_Pos        y );
1021   typedef void
1022   (*CFF_Builder_Close_Contour_Func)( CFF_Builder*  builder );
1023 
1024   typedef FT_Error
1025   (*CFF_Builder_Add_Contour_Func)( CFF_Builder*  builder );
1026 
1027   typedef const struct CFF_Builder_FuncsRec_*  CFF_Builder_Funcs;
1028 
1029   typedef struct  CFF_Builder_FuncsRec_
1030   {
1031     void
1032     (*init)( CFF_Builder*   builder,
1033              TT_Face        face,
1034              CFF_Size       size,
1035              CFF_GlyphSlot  glyph,
1036              FT_Bool        hinting );
1037 
1038     void
1039     (*done)( CFF_Builder*  builder );
1040 
1041     CFF_Builder_Check_Points_Func   check_points;
1042     CFF_Builder_Add_Point_Func      add_point;
1043     CFF_Builder_Add_Point1_Func     add_point1;
1044     CFF_Builder_Add_Contour_Func    add_contour;
1045     CFF_Builder_Start_Point_Func    start_point;
1046     CFF_Builder_Close_Contour_Func  close_contour;
1047 
1048   } CFF_Builder_FuncsRec;
1049 
1050 
1051   /**************************************************************************
1052    *
1053    * @struct:
1054    *   CFF_Builder
1055    *
1056    * @description:
1057    *    A structure used during glyph loading to store its outline.
1058    *
1059    * @fields:
1060    *   memory ::
1061    *     The current memory object.
1062    *
1063    *   face ::
1064    *     The current face object.
1065    *
1066    *   glyph ::
1067    *     The current glyph slot.
1068    *
1069    *   loader ::
1070    *     The current glyph loader.
1071    *
1072    *   base ::
1073    *     The base glyph outline.
1074    *
1075    *   current ::
1076    *     The current glyph outline.
1077    *
1078    *   pos_x ::
1079    *     The horizontal translation (if composite glyph).
1080    *
1081    *   pos_y ::
1082    *     The vertical translation (if composite glyph).
1083    *
1084    *   left_bearing ::
1085    *     The left side bearing point.
1086    *
1087    *   advance ::
1088    *     The horizontal advance vector.
1089    *
1090    *   bbox ::
1091    *     Unused.
1092    *
1093    *   path_begun ::
1094    *     A flag which indicates that a new path has begun.
1095    *
1096    *   load_points ::
1097    *     If this flag is not set, no points are loaded.
1098    *
1099    *   no_recurse ::
1100    *     Set but not used.
1101    *
1102    *   metrics_only ::
1103    *     A boolean indicating that we only want to compute
1104    *     the metrics of a given glyph, not load all of its
1105    *     points.
1106    *
1107    *   hints_funcs ::
1108    *     Auxiliary pointer for hinting.
1109    *
1110    *   hints_globals ::
1111    *     Auxiliary pointer for hinting.
1112    *
1113    *   funcs ::
1114    *     A table of method pointers for this object.
1115    */
1116   struct  CFF_Builder_
1117   {
1118     FT_Memory       memory;
1119     TT_Face         face;
1120     CFF_GlyphSlot   glyph;
1121     FT_GlyphLoader  loader;
1122     FT_Outline*     base;
1123     FT_Outline*     current;
1124 
1125     FT_Pos  pos_x;
1126     FT_Pos  pos_y;
1127 
1128     FT_Vector  left_bearing;
1129     FT_Vector  advance;
1130 
1131     FT_BBox  bbox;          /* bounding box */
1132 
1133     FT_Bool  path_begun;
1134     FT_Bool  load_points;
1135     FT_Bool  no_recurse;
1136 
1137     FT_Bool  metrics_only;
1138 
1139     void*  hints_funcs;     /* hinter-specific */
1140     void*  hints_globals;   /* hinter-specific */
1141 
1142     CFF_Builder_FuncsRec  funcs;
1143   };
1144 
1145 
1146   /*************************************************************************/
1147   /*************************************************************************/
1148   /*****                                                               *****/
1149   /*****                        CFF DECODER                            *****/
1150   /*****                                                               *****/
1151   /*************************************************************************/
1152   /*************************************************************************/
1153 
1154 
1155 #define CFF_MAX_OPERANDS        48
1156 #define CFF_MAX_SUBRS_CALLS     16  /* maximum subroutine nesting;         */
1157                                     /* only 10 are allowed but there exist */
1158                                     /* fonts like `HiraKakuProN-W3.ttf'    */
1159                                     /* (Hiragino Kaku Gothic ProN W3;      */
1160                                     /* 8.2d6e1; 2014-12-19) that exceed    */
1161                                     /* this limit                          */
1162 #define CFF_MAX_TRANS_ELEMENTS  32
1163 
1164   /* execution context charstring zone */
1165 
1166   typedef struct  CFF_Decoder_Zone_
1167   {
1168     FT_Byte*  base;
1169     FT_Byte*  limit;
1170     FT_Byte*  cursor;
1171 
1172   } CFF_Decoder_Zone;
1173 
1174 
1175   typedef struct  CFF_Decoder_
1176   {
1177     CFF_Builder  builder;
1178     CFF_Font     cff;
1179 
1180     FT_Fixed   stack[CFF_MAX_OPERANDS + 1];
1181     FT_Fixed*  top;
1182 
1183     CFF_Decoder_Zone   zones[CFF_MAX_SUBRS_CALLS + 1];
1184     CFF_Decoder_Zone*  zone;
1185 
1186     FT_Int     flex_state;
1187     FT_Int     num_flex_vectors;
1188     FT_Vector  flex_vectors[7];
1189 
1190     FT_Pos  glyph_width;
1191     FT_Pos  nominal_width;
1192 
1193     FT_Bool   read_width;
1194     FT_Bool   width_only;
1195     FT_Int    num_hints;
1196     FT_Fixed  buildchar[CFF_MAX_TRANS_ELEMENTS];
1197 
1198     FT_UInt  num_locals;
1199     FT_UInt  num_globals;
1200 
1201     FT_Int  locals_bias;
1202     FT_Int  globals_bias;
1203 
1204     FT_Byte**  locals;
1205     FT_Byte**  globals;
1206 
1207     FT_Byte**  glyph_names;   /* for pure CFF fonts only  */
1208     FT_UInt    num_glyphs;    /* number of glyphs in font */
1209 
1210     FT_Render_Mode  hint_mode;
1211 
1212     FT_Bool  seac;
1213 
1214     CFF_SubFont  current_subfont; /* for current glyph_index */
1215 
1216     CFF_Decoder_Get_Glyph_Callback   get_glyph_callback;
1217     CFF_Decoder_Free_Glyph_Callback  free_glyph_callback;
1218 
1219   } CFF_Decoder;
1220 
1221 
1222   typedef const struct CFF_Decoder_FuncsRec_*  CFF_Decoder_Funcs;
1223 
1224   typedef struct  CFF_Decoder_FuncsRec_
1225   {
1226     void
1227     (*init)( CFF_Decoder*                     decoder,
1228              TT_Face                          face,
1229              CFF_Size                         size,
1230              CFF_GlyphSlot                    slot,
1231              FT_Bool                          hinting,
1232              FT_Render_Mode                   hint_mode,
1233              CFF_Decoder_Get_Glyph_Callback   get_callback,
1234              CFF_Decoder_Free_Glyph_Callback  free_callback );
1235 
1236     FT_Error
1237     (*prepare)( CFF_Decoder*  decoder,
1238                 CFF_Size      size,
1239                 FT_UInt       glyph_index );
1240 
1241 #ifdef CFF_CONFIG_OPTION_OLD_ENGINE
1242     FT_Error
1243     (*parse_charstrings_old)( CFF_Decoder*  decoder,
1244                               FT_Byte*      charstring_base,
1245                               FT_ULong      charstring_len,
1246                               FT_Bool       in_dict );
1247 #endif
1248 
1249     FT_Error
1250     (*parse_charstrings)( PS_Decoder*  decoder,
1251                           FT_Byte*     charstring_base,
1252                           FT_ULong     charstring_len );
1253 
1254   } CFF_Decoder_FuncsRec;
1255 
1256 
1257   /*************************************************************************/
1258   /*************************************************************************/
1259   /*****                                                               *****/
1260   /*****                            AFM PARSER                         *****/
1261   /*****                                                               *****/
1262   /*************************************************************************/
1263   /*************************************************************************/
1264 
1265   typedef struct AFM_ParserRec_*  AFM_Parser;
1266 
1267   typedef struct  AFM_Parser_FuncsRec_
1268   {
1269     FT_Error
1270     (*init)( AFM_Parser  parser,
1271              FT_Memory   memory,
1272              FT_Byte*    base,
1273              FT_Byte*    limit );
1274 
1275     void
1276     (*done)( AFM_Parser  parser );
1277 
1278     FT_Error
1279     (*parse)( AFM_Parser  parser );
1280 
1281   } AFM_Parser_FuncsRec;
1282 
1283 
1284   typedef struct AFM_StreamRec_*  AFM_Stream;
1285 
1286 
1287   /**************************************************************************
1288    *
1289    * @struct:
1290    *   AFM_ParserRec
1291    *
1292    * @description:
1293    *   An AFM_Parser is a parser for the AFM files.
1294    *
1295    * @fields:
1296    *   memory ::
1297    *     The object used for memory operations (alloc and
1298    *     realloc).
1299    *
1300    *   stream ::
1301    *     This is an opaque object.
1302    *
1303    *   FontInfo ::
1304    *     The result will be stored here.
1305    *
1306    *   get_index ::
1307    *     A user provided function to get a glyph index by its
1308    *     name.
1309    */
1310   typedef struct  AFM_ParserRec_
1311   {
1312     FT_Memory     memory;
1313     AFM_Stream    stream;
1314 
1315     AFM_FontInfo  FontInfo;
1316 
1317     FT_Int
1318     (*get_index)( const char*  name,
1319                   FT_Offset    len,
1320                   void*        user_data );
1321 
1322     void*         user_data;
1323 
1324   } AFM_ParserRec;
1325 
1326 
1327   /*************************************************************************/
1328   /*************************************************************************/
1329   /*****                                                               *****/
1330   /*****                     TYPE1 CHARMAPS                            *****/
1331   /*****                                                               *****/
1332   /*************************************************************************/
1333   /*************************************************************************/
1334 
1335   typedef const struct T1_CMap_ClassesRec_*  T1_CMap_Classes;
1336 
1337   typedef struct T1_CMap_ClassesRec_
1338   {
1339     FT_CMap_Class  standard;
1340     FT_CMap_Class  expert;
1341     FT_CMap_Class  custom;
1342     FT_CMap_Class  unicode;
1343 
1344   } T1_CMap_ClassesRec;
1345 
1346 
1347   /*************************************************************************/
1348   /*************************************************************************/
1349   /*****                                                               *****/
1350   /*****                        PSAux Module Interface                 *****/
1351   /*****                                                               *****/
1352   /*************************************************************************/
1353   /*************************************************************************/
1354 
1355   typedef struct  PSAux_ServiceRec_
1356   {
1357     /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */
1358     const PS_Table_FuncsRec*    ps_table_funcs;
1359     const PS_Parser_FuncsRec*   ps_parser_funcs;
1360     const T1_Builder_FuncsRec*  t1_builder_funcs;
1361     const T1_Decoder_FuncsRec*  t1_decoder_funcs;
1362 
1363     void
1364     (*t1_decrypt)( FT_Byte*   buffer,
1365                    FT_Offset  length,
1366                    FT_UShort  seed );
1367 
1368     FT_UInt32
1369     (*cff_random)( FT_UInt32  r );
1370 
1371     void
1372     (*ps_decoder_init)( PS_Decoder*  ps_decoder,
1373                         void*        decoder,
1374                         FT_Bool      is_t1 );
1375 
1376     void
1377     (*t1_make_subfont)( FT_Face      face,
1378                         PS_Private   priv,
1379                         CFF_SubFont  subfont );
1380 
1381     T1_CMap_Classes  t1_cmap_classes;
1382 
1383     /* fields after this comment line were added after version 2.1.10 */
1384     const AFM_Parser_FuncsRec*  afm_parser_funcs;
1385 
1386     const CFF_Decoder_FuncsRec*  cff_decoder_funcs;
1387 
1388   } PSAux_ServiceRec, *PSAux_Service;
1389 
1390   /* backward compatible type definition */
1391   typedef PSAux_ServiceRec   PSAux_Interface;
1392 
1393 
1394   /*************************************************************************/
1395   /*************************************************************************/
1396   /*****                                                               *****/
1397   /*****                 Some convenience functions                    *****/
1398   /*****                                                               *****/
1399   /*************************************************************************/
1400   /*************************************************************************/
1401 
1402 #define IS_PS_NEWLINE( ch ) \
1403   ( (ch) == '\r' ||         \
1404     (ch) == '\n' )
1405 
1406 #define IS_PS_SPACE( ch )  \
1407   ( (ch) == ' '         || \
1408     IS_PS_NEWLINE( ch ) || \
1409     (ch) == '\t'        || \
1410     (ch) == '\f'        || \
1411     (ch) == '\0' )
1412 
1413 #define IS_PS_SPECIAL( ch )       \
1414   ( (ch) == '/'                || \
1415     (ch) == '(' || (ch) == ')' || \
1416     (ch) == '<' || (ch) == '>' || \
1417     (ch) == '[' || (ch) == ']' || \
1418     (ch) == '{' || (ch) == '}' || \
1419     (ch) == '%'                )
1420 
1421 #define IS_PS_DELIM( ch )  \
1422   ( IS_PS_SPACE( ch )   || \
1423     IS_PS_SPECIAL( ch ) )
1424 
1425 #define IS_PS_DIGIT( ch )        \
1426   ( (ch) >= '0' && (ch) <= '9' )
1427 
1428 #define IS_PS_XDIGIT( ch )            \
1429   ( IS_PS_DIGIT( ch )              || \
1430     ( (ch) >= 'A' && (ch) <= 'F' ) || \
1431     ( (ch) >= 'a' && (ch) <= 'f' ) )
1432 
1433 #define IS_PS_BASE85( ch )       \
1434   ( (ch) >= '!' && (ch) <= 'u' )
1435 
1436 #define IS_PS_TOKEN( cur, limit, token )                                \
1437   ( (char)(cur)[0] == (token)[0]                                     && \
1438     ( (cur) + sizeof ( (token) ) == (limit) ||                          \
1439       ( (cur) + sizeof( (token) ) < (limit)          &&                 \
1440         IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) )             && \
1441     ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 )
1442 
1443 
1444 FT_END_HEADER
1445 
1446 #endif /* PSAUX_H_ */
1447 
1448 
1449 /* END */
1450