1 /****************************************************************************
2  *
3  * pshrec.h
4  *
5  *   Postscript (Type1/Type2) hints recorder (specification).
6  *
7  * Copyright (C) 2001-2019 by
8  * David Turner, Robert Wilhelm, and Werner Lemberg.
9  *
10  * This file is part of the FreeType project, and may only be used,
11  * modified, and distributed under the terms of the FreeType project
12  * license, LICENSE.TXT.  By continuing to use, modify, or distribute
13  * this file you indicate that you have read the license and
14  * understand and accept it fully.
15  *
16  */
17 
18 
19   /***************************************************************************
20    *
21    * The functions defined here are called from the Type 1, CID and CFF
22    * font drivers to record the hints of a given character/glyph.
23    *
24    * The hints are recorded in a unified format, and are later processed
25    * by the `optimizer' and `fitter' to adjust the outlines to the pixel
26    * grid.
27    *
28    */
29 
30 
31 #ifndef PSHREC_H_
32 #define PSHREC_H_
33 
34 
35 #include <ft2build.h>
36 #include FT_INTERNAL_POSTSCRIPT_HINTS_H
37 #include "pshglob.h"
38 
39 
40 FT_BEGIN_HEADER
41 
42 
43   /*************************************************************************/
44   /*************************************************************************/
45   /*****                                                               *****/
46   /*****                 GLYPH HINTS RECORDER INTERNALS                *****/
47   /*****                                                               *****/
48   /*************************************************************************/
49   /*************************************************************************/
50 
51   /* handle to hint record */
52   typedef struct PS_HintRec_*  PS_Hint;
53 
54   /* hint types */
55   typedef enum  PS_Hint_Type_
56   {
57     PS_HINT_TYPE_1 = 1,
58     PS_HINT_TYPE_2 = 2
59 
60   } PS_Hint_Type;
61 
62 
63   /* hint flags */
64 #define PS_HINT_FLAG_GHOST   1U
65 #define PS_HINT_FLAG_BOTTOM  2U
66 
67 
68   /* hint descriptor */
69   typedef struct  PS_HintRec_
70   {
71     FT_Int   pos;
72     FT_Int   len;
73     FT_UInt  flags;
74 
75   } PS_HintRec;
76 
77 
78 #define ps_hint_is_active( x )  ( (x)->flags & PS_HINT_FLAG_ACTIVE )
79 #define ps_hint_is_ghost( x )   ( (x)->flags & PS_HINT_FLAG_GHOST  )
80 #define ps_hint_is_bottom( x )  ( (x)->flags & PS_HINT_FLAG_BOTTOM )
81 
82 
83   /* hints table descriptor */
84   typedef struct  PS_Hint_TableRec_
85   {
86     FT_UInt  num_hints;
87     FT_UInt  max_hints;
88     PS_Hint  hints;
89 
90   } PS_Hint_TableRec, *PS_Hint_Table;
91 
92 
93   /* hint and counter mask descriptor */
94   typedef struct  PS_MaskRec_
95   {
96     FT_UInt   num_bits;
97     FT_UInt   max_bits;
98     FT_Byte*  bytes;
99     FT_UInt   end_point;
100 
101   } PS_MaskRec, *PS_Mask;
102 
103 
104   /* masks and counters table descriptor */
105   typedef struct  PS_Mask_TableRec_
106   {
107     FT_UInt  num_masks;
108     FT_UInt  max_masks;
109     PS_Mask  masks;
110 
111   } PS_Mask_TableRec, *PS_Mask_Table;
112 
113 
114  /* dimension-specific hints descriptor */
115   typedef struct  PS_DimensionRec_
116   {
117     PS_Hint_TableRec  hints;
118     PS_Mask_TableRec  masks;
119     PS_Mask_TableRec  counters;
120 
121   } PS_DimensionRec, *PS_Dimension;
122 
123 
124   /* glyph hints descriptor                                */
125   /* dimension 0 => X coordinates + vertical hints/stems   */
126   /* dimension 1 => Y coordinates + horizontal hints/stems */
127   typedef struct  PS_HintsRec_
128   {
129     FT_Memory        memory;
130     FT_Error         error;
131     FT_UInt32        magic;
132     PS_Hint_Type     hint_type;
133     PS_DimensionRec  dimension[2];
134 
135   } PS_HintsRec, *PS_Hints;
136 
137   /* */
138 
139   /* initialize hints recorder */
140   FT_LOCAL( void )
141   ps_hints_init( PS_Hints   hints,
142                  FT_Memory  memory );
143 
144   /* finalize hints recorder */
145   FT_LOCAL( void )
146   ps_hints_done( PS_Hints  hints );
147 
148   /* initialize Type1 hints recorder interface */
149   FT_LOCAL( void )
150   t1_hints_funcs_init( T1_Hints_FuncsRec*  funcs );
151 
152   /* initialize Type2 hints recorder interface */
153   FT_LOCAL( void )
154   t2_hints_funcs_init( T2_Hints_FuncsRec*  funcs );
155 
156 
157 #ifdef DEBUG_HINTER
158   extern PS_Hints  ps_debug_hints;
159   extern  int      ps_debug_no_horz_hints;
160   extern  int      ps_debug_no_vert_hints;
161 #endif
162 
163  /* */
164 
165 
166 FT_END_HEADER
167 
168 
169 #endif /* PSHREC_H_ */
170 
171 
172 /* END */
173