xref: /inferno-os/include/freetype/internal/pshints.h (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth /***************************************************************************/
2*37da2899SCharles.Forsyth /*                                                                         */
3*37da2899SCharles.Forsyth /*  pshints.h                                                              */
4*37da2899SCharles.Forsyth /*                                                                         */
5*37da2899SCharles.Forsyth /*    Interface to Postscript-specific (Type 1 and Type 2) hints           */
6*37da2899SCharles.Forsyth /*    recorders (specification only).  These are used to support native    */
7*37da2899SCharles.Forsyth /*    T1/T2 hints in the "type1", "cid" and "cff" font drivers.            */
8*37da2899SCharles.Forsyth /*                                                                         */
9*37da2899SCharles.Forsyth /*  Copyright 2001, 2002 by                                                */
10*37da2899SCharles.Forsyth /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
11*37da2899SCharles.Forsyth /*                                                                         */
12*37da2899SCharles.Forsyth /*  This file is part of the FreeType project, and may only be used,       */
13*37da2899SCharles.Forsyth /*  modified, and distributed under the terms of the FreeType project      */
14*37da2899SCharles.Forsyth /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
15*37da2899SCharles.Forsyth /*  this file you indicate that you have read the license and              */
16*37da2899SCharles.Forsyth /*  understand and accept it fully.                                        */
17*37da2899SCharles.Forsyth /*                                                                         */
18*37da2899SCharles.Forsyth /***************************************************************************/
19*37da2899SCharles.Forsyth 
20*37da2899SCharles.Forsyth 
21*37da2899SCharles.Forsyth #ifndef __PSHINTS_H__
22*37da2899SCharles.Forsyth #define __PSHINTS_H__
23*37da2899SCharles.Forsyth 
24*37da2899SCharles.Forsyth 
25*37da2899SCharles.Forsyth #include <ft2build.h>
26*37da2899SCharles.Forsyth #include FT_FREETYPE_H
27*37da2899SCharles.Forsyth #include FT_TYPE1_TABLES_H
28*37da2899SCharles.Forsyth 
29*37da2899SCharles.Forsyth 
30*37da2899SCharles.Forsyth FT_BEGIN_HEADER
31*37da2899SCharles.Forsyth 
32*37da2899SCharles.Forsyth 
33*37da2899SCharles.Forsyth   /*************************************************************************/
34*37da2899SCharles.Forsyth   /*************************************************************************/
35*37da2899SCharles.Forsyth   /*****                                                               *****/
36*37da2899SCharles.Forsyth   /*****               INTERNAL REPRESENTATION OF GLOBALS              *****/
37*37da2899SCharles.Forsyth   /*****                                                               *****/
38*37da2899SCharles.Forsyth   /*************************************************************************/
39*37da2899SCharles.Forsyth   /*************************************************************************/
40*37da2899SCharles.Forsyth 
41*37da2899SCharles.Forsyth   typedef struct PSH_GlobalsRec_*  PSH_Globals;
42*37da2899SCharles.Forsyth 
43*37da2899SCharles.Forsyth   typedef FT_Error
44*37da2899SCharles.Forsyth   (*PSH_Globals_NewFunc)( FT_Memory     memory,
45*37da2899SCharles.Forsyth                           T1_Private*   private_dict,
46*37da2899SCharles.Forsyth                           PSH_Globals*  aglobals );
47*37da2899SCharles.Forsyth 
48*37da2899SCharles.Forsyth   typedef FT_Error
49*37da2899SCharles.Forsyth   (*PSH_Globals_SetScaleFunc)( PSH_Globals  globals,
50*37da2899SCharles.Forsyth                                FT_Fixed     x_scale,
51*37da2899SCharles.Forsyth                                FT_Fixed     y_scale,
52*37da2899SCharles.Forsyth                                FT_Fixed     x_delta,
53*37da2899SCharles.Forsyth                                FT_Fixed     y_delta );
54*37da2899SCharles.Forsyth 
55*37da2899SCharles.Forsyth   typedef void
56*37da2899SCharles.Forsyth   (*PSH_Globals_DestroyFunc)( PSH_Globals  globals );
57*37da2899SCharles.Forsyth 
58*37da2899SCharles.Forsyth 
59*37da2899SCharles.Forsyth   typedef struct  PSH_Globals_FuncsRec_
60*37da2899SCharles.Forsyth   {
61*37da2899SCharles.Forsyth     PSH_Globals_NewFunc       create;
62*37da2899SCharles.Forsyth     PSH_Globals_SetScaleFunc  set_scale;
63*37da2899SCharles.Forsyth     PSH_Globals_DestroyFunc   destroy;
64*37da2899SCharles.Forsyth 
65*37da2899SCharles.Forsyth   } PSH_Globals_FuncsRec, *PSH_Globals_Funcs;
66*37da2899SCharles.Forsyth 
67*37da2899SCharles.Forsyth 
68*37da2899SCharles.Forsyth   /*************************************************************************/
69*37da2899SCharles.Forsyth   /*************************************************************************/
70*37da2899SCharles.Forsyth   /*****                                                               *****/
71*37da2899SCharles.Forsyth   /*****                  PUBLIC TYPE 1 HINTS RECORDER                 *****/
72*37da2899SCharles.Forsyth   /*****                                                               *****/
73*37da2899SCharles.Forsyth   /*************************************************************************/
74*37da2899SCharles.Forsyth   /*************************************************************************/
75*37da2899SCharles.Forsyth 
76*37da2899SCharles.Forsyth   /*************************************************************************/
77*37da2899SCharles.Forsyth   /*                                                                       */
78*37da2899SCharles.Forsyth   /* @type:                                                                */
79*37da2899SCharles.Forsyth   /*    T1_Hints                                                           */
80*37da2899SCharles.Forsyth   /*                                                                       */
81*37da2899SCharles.Forsyth   /* @description:                                                         */
82*37da2899SCharles.Forsyth   /*    This is a handle to an opaque structure used to record glyph hints */
83*37da2899SCharles.Forsyth   /*    from a Type 1 character glyph character string.                    */
84*37da2899SCharles.Forsyth   /*                                                                       */
85*37da2899SCharles.Forsyth   /*    The methods used to operate on this object are defined by the      */
86*37da2899SCharles.Forsyth   /*    @T1_Hints_FuncsRec structure.  Recording glyph hints is normally   */
87*37da2899SCharles.Forsyth   /*    achieved through the following scheme:                             */
88*37da2899SCharles.Forsyth   /*                                                                       */
89*37da2899SCharles.Forsyth   /*    - Open a new hint recording session by calling the "open" method.  */
90*37da2899SCharles.Forsyth   /*      This will rewind the recorder and prepare it for new input.      */
91*37da2899SCharles.Forsyth   /*                                                                       */
92*37da2899SCharles.Forsyth   /*    - For each hint found in the glyph charstring, call the            */
93*37da2899SCharles.Forsyth   /*      corresponding method ("stem", "stem3", or "reset").  Note that   */
94*37da2899SCharles.Forsyth   /*      these functions do not return an error code.                     */
95*37da2899SCharles.Forsyth   /*                                                                       */
96*37da2899SCharles.Forsyth   /*    - Close the recording session by calling the "close" method.  It   */
97*37da2899SCharles.Forsyth   /*      will return an error code if the hints were invalid or something */
98*37da2899SCharles.Forsyth   /*      strange happened (e.g. memory shortage).                         */
99*37da2899SCharles.Forsyth   /*                                                                       */
100*37da2899SCharles.Forsyth   /*    The hints accumulated in the object can later be used by the       */
101*37da2899SCharles.Forsyth   /*    PostScript hinter.                                                 */
102*37da2899SCharles.Forsyth   /*                                                                       */
103*37da2899SCharles.Forsyth   typedef struct T1_HintsRec_*  T1_Hints;
104*37da2899SCharles.Forsyth 
105*37da2899SCharles.Forsyth 
106*37da2899SCharles.Forsyth   /*************************************************************************/
107*37da2899SCharles.Forsyth   /*                                                                       */
108*37da2899SCharles.Forsyth   /* @type:                                                                */
109*37da2899SCharles.Forsyth   /*    T1_Hints_Funcs                                                     */
110*37da2899SCharles.Forsyth   /*                                                                       */
111*37da2899SCharles.Forsyth   /* @description:                                                         */
112*37da2899SCharles.Forsyth   /*    A pointer to the @T1_Hints_FuncsRec structure that defines the     */
113*37da2899SCharles.Forsyth   /*    API of a given @T1_Hints object.                                   */
114*37da2899SCharles.Forsyth   /*                                                                       */
115*37da2899SCharles.Forsyth   typedef const struct T1_Hints_FuncsRec_*  T1_Hints_Funcs;
116*37da2899SCharles.Forsyth 
117*37da2899SCharles.Forsyth 
118*37da2899SCharles.Forsyth   /*************************************************************************/
119*37da2899SCharles.Forsyth   /*                                                                       */
120*37da2899SCharles.Forsyth   /* @functype:                                                            */
121*37da2899SCharles.Forsyth   /*    T1_Hints_OpenFunc                                                  */
122*37da2899SCharles.Forsyth   /*                                                                       */
123*37da2899SCharles.Forsyth   /* @description:                                                         */
124*37da2899SCharles.Forsyth   /*    A method of the @T1_Hints class used to prepare it for a new       */
125*37da2899SCharles.Forsyth   /*    Type 1 hints recording session.                                    */
126*37da2899SCharles.Forsyth   /*                                                                       */
127*37da2899SCharles.Forsyth   /* @input:                                                               */
128*37da2899SCharles.Forsyth   /*    hints :: A handle to the Type 1 hints recorder.                    */
129*37da2899SCharles.Forsyth   /*                                                                       */
130*37da2899SCharles.Forsyth   /* @note:                                                                */
131*37da2899SCharles.Forsyth   /*    You should always call the @T1_Hints_CloseFunc method in order to  */
132*37da2899SCharles.Forsyth   /*    close an opened recording session.                                 */
133*37da2899SCharles.Forsyth   /*                                                                       */
134*37da2899SCharles.Forsyth   typedef void
135*37da2899SCharles.Forsyth   (*T1_Hints_OpenFunc)( T1_Hints  hints );
136*37da2899SCharles.Forsyth 
137*37da2899SCharles.Forsyth 
138*37da2899SCharles.Forsyth   /*************************************************************************/
139*37da2899SCharles.Forsyth   /*                                                                       */
140*37da2899SCharles.Forsyth   /* @functype:                                                            */
141*37da2899SCharles.Forsyth   /*    T1_Hints_SetStemFunc                                               */
142*37da2899SCharles.Forsyth   /*                                                                       */
143*37da2899SCharles.Forsyth   /* @description:                                                         */
144*37da2899SCharles.Forsyth   /*    A method of the @T1_Hints class used to record a new horizontal or */
145*37da2899SCharles.Forsyth   /*    vertical stem.  This corresponds to the Type 1 "hstem" and "vstem" */
146*37da2899SCharles.Forsyth   /*    operators.                                                         */
147*37da2899SCharles.Forsyth   /*                                                                       */
148*37da2899SCharles.Forsyth   /* @input:                                                               */
149*37da2899SCharles.Forsyth   /*    hints     :: A handle to the Type 1 hints recorder.                */
150*37da2899SCharles.Forsyth   /*                                                                       */
151*37da2899SCharles.Forsyth   /*    dimension :: 0 for horizontal stems (hstem), 1 for vertical ones   */
152*37da2899SCharles.Forsyth   /*                 (vstem).                                              */
153*37da2899SCharles.Forsyth   /*                                                                       */
154*37da2899SCharles.Forsyth   /*    coords    :: Array of 2 integers, used as (position,length) stem   */
155*37da2899SCharles.Forsyth   /*                 descriptor.                                           */
156*37da2899SCharles.Forsyth   /*                                                                       */
157*37da2899SCharles.Forsyth   /* @note:                                                                */
158*37da2899SCharles.Forsyth   /*    Use vertical coordinates (y) for horizontal stems (dim=0).  Use    */
159*37da2899SCharles.Forsyth   /*    horizontal coordinates (x) for vertical stems (dim=1).             */
160*37da2899SCharles.Forsyth   /*                                                                       */
161*37da2899SCharles.Forsyth   /*    "coords[0]" is the absolute stem position (lowest coordinate);     */
162*37da2899SCharles.Forsyth   /*    "coords[1]" is the length.                                         */
163*37da2899SCharles.Forsyth   /*                                                                       */
164*37da2899SCharles.Forsyth   /*    The length can be negative, in which case it must be either -20 or */
165*37da2899SCharles.Forsyth   /*    -21.  It will be interpreted as a "ghost" stem, according to       */
166*37da2899SCharles.Forsyth   /*    Type 1 specification.                                              */
167*37da2899SCharles.Forsyth   /*                                                                       */
168*37da2899SCharles.Forsyth   /*    If the length is -21 (corresponding to a bottom ghost stem), then  */
169*37da2899SCharles.Forsyth   /*    the real stem position is "coords[0]+coords[1]".                   */
170*37da2899SCharles.Forsyth   /*                                                                       */
171*37da2899SCharles.Forsyth   typedef void
172*37da2899SCharles.Forsyth   (*T1_Hints_SetStemFunc)( T1_Hints  hints,
173*37da2899SCharles.Forsyth                            FT_UInt   dimension,
174*37da2899SCharles.Forsyth                            FT_Long*  coords );
175*37da2899SCharles.Forsyth 
176*37da2899SCharles.Forsyth 
177*37da2899SCharles.Forsyth   /*************************************************************************/
178*37da2899SCharles.Forsyth   /*                                                                       */
179*37da2899SCharles.Forsyth   /* @functype:                                                            */
180*37da2899SCharles.Forsyth   /*    T1_Hints_SetStem3Func                                              */
181*37da2899SCharles.Forsyth   /*                                                                       */
182*37da2899SCharles.Forsyth   /* @description:                                                         */
183*37da2899SCharles.Forsyth   /*    A method of the @T1_Hints class used to record three               */
184*37da2899SCharles.Forsyth   /*    counter-controlled horizontal or vertical stems at once.           */
185*37da2899SCharles.Forsyth   /*                                                                       */
186*37da2899SCharles.Forsyth   /* @input:                                                               */
187*37da2899SCharles.Forsyth   /*    hints     :: A handle to the Type 1 hints recorder.                */
188*37da2899SCharles.Forsyth   /*                                                                       */
189*37da2899SCharles.Forsyth   /*    dimension :: 0 for horizontal stems, 1 for vertical ones.          */
190*37da2899SCharles.Forsyth   /*                                                                       */
191*37da2899SCharles.Forsyth   /*    coords    :: An array of 6 integers, holding 3 (position,length)   */
192*37da2899SCharles.Forsyth   /*                 pairs for the counter-controlled stems.               */
193*37da2899SCharles.Forsyth   /*                                                                       */
194*37da2899SCharles.Forsyth   /* @note:                                                                */
195*37da2899SCharles.Forsyth   /*    Use vertical coordinates (y) for horizontal stems (dim=0).  Use    */
196*37da2899SCharles.Forsyth   /*    horizontal coordinates (x) for vertical stems (dim=1).             */
197*37da2899SCharles.Forsyth   /*                                                                       */
198*37da2899SCharles.Forsyth   /*    The lengths cannot be negative (ghost stems are never              */
199*37da2899SCharles.Forsyth   /*    counter-controlled).                                               */
200*37da2899SCharles.Forsyth   /*                                                                       */
201*37da2899SCharles.Forsyth   typedef void
202*37da2899SCharles.Forsyth   (*T1_Hints_SetStem3Func)( T1_Hints  hints,
203*37da2899SCharles.Forsyth                             FT_UInt   dimension,
204*37da2899SCharles.Forsyth                             FT_Long*  coords );
205*37da2899SCharles.Forsyth 
206*37da2899SCharles.Forsyth 
207*37da2899SCharles.Forsyth   /*************************************************************************/
208*37da2899SCharles.Forsyth   /*                                                                       */
209*37da2899SCharles.Forsyth   /* @functype:                                                            */
210*37da2899SCharles.Forsyth   /*    T1_Hints_ResetFunc                                                 */
211*37da2899SCharles.Forsyth   /*                                                                       */
212*37da2899SCharles.Forsyth   /* @description:                                                         */
213*37da2899SCharles.Forsyth   /*    A method of the @T1_Hints class used to reset the stems hints in a */
214*37da2899SCharles.Forsyth   /*    recording session.                                                 */
215*37da2899SCharles.Forsyth   /*                                                                       */
216*37da2899SCharles.Forsyth   /* @input:                                                               */
217*37da2899SCharles.Forsyth   /*    hints     :: A handle to the Type 1 hints recorder.                */
218*37da2899SCharles.Forsyth   /*                                                                       */
219*37da2899SCharles.Forsyth   /*    end_point :: The index of the last point in the input glyph in     */
220*37da2899SCharles.Forsyth   /*                 which the previously defined hints apply.             */
221*37da2899SCharles.Forsyth   /*                                                                       */
222*37da2899SCharles.Forsyth   typedef void
223*37da2899SCharles.Forsyth   (*T1_Hints_ResetFunc)( T1_Hints  hints,
224*37da2899SCharles.Forsyth                          FT_UInt   end_point );
225*37da2899SCharles.Forsyth 
226*37da2899SCharles.Forsyth 
227*37da2899SCharles.Forsyth   /*************************************************************************/
228*37da2899SCharles.Forsyth   /*                                                                       */
229*37da2899SCharles.Forsyth   /* @functype:                                                            */
230*37da2899SCharles.Forsyth   /*    T1_Hints_CloseFunc                                                 */
231*37da2899SCharles.Forsyth   /*                                                                       */
232*37da2899SCharles.Forsyth   /* @description:                                                         */
233*37da2899SCharles.Forsyth   /*    A method of the @T1_Hints class used to close a hint recording     */
234*37da2899SCharles.Forsyth   /*    session.                                                           */
235*37da2899SCharles.Forsyth   /*                                                                       */
236*37da2899SCharles.Forsyth   /* @input:                                                               */
237*37da2899SCharles.Forsyth   /*    hints     :: A handle to the Type 1 hints recorder.                */
238*37da2899SCharles.Forsyth   /*                                                                       */
239*37da2899SCharles.Forsyth   /*    end_point :: The index of the last point in the input glyph.       */
240*37da2899SCharles.Forsyth   /*                                                                       */
241*37da2899SCharles.Forsyth   /* @return:                                                              */
242*37da2899SCharles.Forsyth   /*    FreeType error code.  0 means success.                             */
243*37da2899SCharles.Forsyth   /*                                                                       */
244*37da2899SCharles.Forsyth   /* @note:                                                                */
245*37da2899SCharles.Forsyth   /*    The error code will be set to indicate that an error occured       */
246*37da2899SCharles.Forsyth   /*    during the recording session.                                      */
247*37da2899SCharles.Forsyth   /*                                                                       */
248*37da2899SCharles.Forsyth   typedef FT_Error
249*37da2899SCharles.Forsyth   (*T1_Hints_CloseFunc)( T1_Hints  hints,
250*37da2899SCharles.Forsyth                          FT_UInt   end_point );
251*37da2899SCharles.Forsyth 
252*37da2899SCharles.Forsyth 
253*37da2899SCharles.Forsyth   /*************************************************************************/
254*37da2899SCharles.Forsyth   /*                                                                       */
255*37da2899SCharles.Forsyth   /* @functype:                                                            */
256*37da2899SCharles.Forsyth   /*    T1_Hints_ApplyFunc                                                 */
257*37da2899SCharles.Forsyth   /*                                                                       */
258*37da2899SCharles.Forsyth   /* @description:                                                         */
259*37da2899SCharles.Forsyth   /*    A method of the @T1_Hints class used to apply hints to the         */
260*37da2899SCharles.Forsyth   /*    corresponding glyph outline.  Must be called once all hints have   */
261*37da2899SCharles.Forsyth   /*    been recorded.                                                     */
262*37da2899SCharles.Forsyth   /*                                                                       */
263*37da2899SCharles.Forsyth   /* @input:                                                               */
264*37da2899SCharles.Forsyth   /*   hints      :: A handle to the Type 1 hints recorder.                */
265*37da2899SCharles.Forsyth   /*                                                                       */
266*37da2899SCharles.Forsyth   /*   outline    :: A pointer to the target outline descriptor.           */
267*37da2899SCharles.Forsyth   /*                                                                       */
268*37da2899SCharles.Forsyth   /*   globals    :: The hinter globals for this font.                     */
269*37da2899SCharles.Forsyth   /*                                                                       */
270*37da2899SCharles.Forsyth   /*   hint_flags :: Hinter bit flags.                                     */
271*37da2899SCharles.Forsyth   /*                                                                       */
272*37da2899SCharles.Forsyth   /* @return:                                                              */
273*37da2899SCharles.Forsyth   /*   FreeType error code.  0 means success.                              */
274*37da2899SCharles.Forsyth   /*                                                                       */
275*37da2899SCharles.Forsyth   /* @note:                                                                */
276*37da2899SCharles.Forsyth   /*    On input, all points within the outline are in font coordinates.   */
277*37da2899SCharles.Forsyth   /*    On output, they are in 1/64th of pixels.                           */
278*37da2899SCharles.Forsyth   /*                                                                       */
279*37da2899SCharles.Forsyth   /*    The scaling transformation is taken from the "globals" object      */
280*37da2899SCharles.Forsyth   /*    which must correspond to the same font as the glyph.               */
281*37da2899SCharles.Forsyth   /*                                                                       */
282*37da2899SCharles.Forsyth   typedef FT_Error
283*37da2899SCharles.Forsyth   (*T1_Hints_ApplyFunc)( T1_Hints        hints,
284*37da2899SCharles.Forsyth                          FT_Outline*     outline,
285*37da2899SCharles.Forsyth                          PSH_Globals     globals,
286*37da2899SCharles.Forsyth                          FT_Render_Mode  hint_mode );
287*37da2899SCharles.Forsyth 
288*37da2899SCharles.Forsyth 
289*37da2899SCharles.Forsyth   /*************************************************************************/
290*37da2899SCharles.Forsyth   /*                                                                       */
291*37da2899SCharles.Forsyth   /* @struct:                                                              */
292*37da2899SCharles.Forsyth   /*    T1_Hints_FuncsRec                                                  */
293*37da2899SCharles.Forsyth   /*                                                                       */
294*37da2899SCharles.Forsyth   /* @description:                                                         */
295*37da2899SCharles.Forsyth   /*    The structure used to provide the API to @T1_Hints objects.        */
296*37da2899SCharles.Forsyth   /*                                                                       */
297*37da2899SCharles.Forsyth   /* @fields:                                                              */
298*37da2899SCharles.Forsyth   /*    hints :: A handle to the T1 Hints recorder.                        */
299*37da2899SCharles.Forsyth   /*                                                                       */
300*37da2899SCharles.Forsyth   /*    open  :: The function to open a recording session.                 */
301*37da2899SCharles.Forsyth   /*                                                                       */
302*37da2899SCharles.Forsyth   /*    close :: The function to close a recording session.                */
303*37da2899SCharles.Forsyth   /*                                                                       */
304*37da2899SCharles.Forsyth   /*    stem  :: The function to set a simple stem.                        */
305*37da2899SCharles.Forsyth   /*                                                                       */
306*37da2899SCharles.Forsyth   /*    stem3 :: The function to set counter-controlled stems.             */
307*37da2899SCharles.Forsyth   /*                                                                       */
308*37da2899SCharles.Forsyth   /*    reset :: The function to reset stem hints.                         */
309*37da2899SCharles.Forsyth   /*                                                                       */
310*37da2899SCharles.Forsyth   /*    apply :: The function to apply the hints to the corresponding      */
311*37da2899SCharles.Forsyth   /*             glyph outline.                                            */
312*37da2899SCharles.Forsyth   /*                                                                       */
313*37da2899SCharles.Forsyth   typedef struct  T1_Hints_FuncsRec_
314*37da2899SCharles.Forsyth   {
315*37da2899SCharles.Forsyth     T1_Hints               hints;
316*37da2899SCharles.Forsyth     T1_Hints_OpenFunc      open;
317*37da2899SCharles.Forsyth     T1_Hints_CloseFunc     close;
318*37da2899SCharles.Forsyth     T1_Hints_SetStemFunc   stem;
319*37da2899SCharles.Forsyth     T1_Hints_SetStem3Func  stem3;
320*37da2899SCharles.Forsyth     T1_Hints_ResetFunc     reset;
321*37da2899SCharles.Forsyth     T1_Hints_ApplyFunc     apply;
322*37da2899SCharles.Forsyth 
323*37da2899SCharles.Forsyth   } T1_Hints_FuncsRec;
324*37da2899SCharles.Forsyth 
325*37da2899SCharles.Forsyth 
326*37da2899SCharles.Forsyth   /*************************************************************************/
327*37da2899SCharles.Forsyth   /*************************************************************************/
328*37da2899SCharles.Forsyth   /*****                                                               *****/
329*37da2899SCharles.Forsyth   /*****                  PUBLIC TYPE 2 HINTS RECORDER                 *****/
330*37da2899SCharles.Forsyth   /*****                                                               *****/
331*37da2899SCharles.Forsyth   /*************************************************************************/
332*37da2899SCharles.Forsyth   /*************************************************************************/
333*37da2899SCharles.Forsyth 
334*37da2899SCharles.Forsyth   /*************************************************************************/
335*37da2899SCharles.Forsyth   /*                                                                       */
336*37da2899SCharles.Forsyth   /* @type:                                                                */
337*37da2899SCharles.Forsyth   /*    T2_Hints                                                           */
338*37da2899SCharles.Forsyth   /*                                                                       */
339*37da2899SCharles.Forsyth   /* @description:                                                         */
340*37da2899SCharles.Forsyth   /*    This is a handle to an opaque structure used to record glyph hints */
341*37da2899SCharles.Forsyth   /*    from a Type 2 character glyph character string.                    */
342*37da2899SCharles.Forsyth   /*                                                                       */
343*37da2899SCharles.Forsyth   /*    The methods used to operate on this object are defined by the      */
344*37da2899SCharles.Forsyth   /*    @T2_Hints_FuncsRec structure.  Recording glyph hints is normally   */
345*37da2899SCharles.Forsyth   /*    achieved through the following scheme:                             */
346*37da2899SCharles.Forsyth   /*                                                                       */
347*37da2899SCharles.Forsyth   /*    - Open a new hint recording session by calling the "open" method.  */
348*37da2899SCharles.Forsyth   /*      This will rewind the recorder and prepare it for new input.      */
349*37da2899SCharles.Forsyth   /*                                                                       */
350*37da2899SCharles.Forsyth   /*    - For each hint found in the glyph charstring, call the            */
351*37da2899SCharles.Forsyth   /*      corresponding method ("stems", "hintmask", "counters").  Note    */
352*37da2899SCharles.Forsyth   /*      that these functions do not return an error code.                */
353*37da2899SCharles.Forsyth   /*                                                                       */
354*37da2899SCharles.Forsyth   /*    - Close the recording session by calling the "close" method.  It   */
355*37da2899SCharles.Forsyth   /*      will return an error code if the hints were invalid or something */
356*37da2899SCharles.Forsyth   /*      strange happened (e.g. memory shortage).                         */
357*37da2899SCharles.Forsyth   /*                                                                       */
358*37da2899SCharles.Forsyth   /*    The hints accumulated in the object can later be used by the       */
359*37da2899SCharles.Forsyth   /*    Postscript hinter.                                                 */
360*37da2899SCharles.Forsyth   /*                                                                       */
361*37da2899SCharles.Forsyth   typedef struct T2_HintsRec_*  T2_Hints;
362*37da2899SCharles.Forsyth 
363*37da2899SCharles.Forsyth 
364*37da2899SCharles.Forsyth   /*************************************************************************/
365*37da2899SCharles.Forsyth   /*                                                                       */
366*37da2899SCharles.Forsyth   /* @type:                                                                */
367*37da2899SCharles.Forsyth   /*    T2_Hints_Funcs                                                     */
368*37da2899SCharles.Forsyth   /*                                                                       */
369*37da2899SCharles.Forsyth   /* @description:                                                         */
370*37da2899SCharles.Forsyth   /*    A pointer to the @T2_Hints_FuncsRec structure that defines the API */
371*37da2899SCharles.Forsyth   /*    of a given @T2_Hints object.                                       */
372*37da2899SCharles.Forsyth   /*                                                                       */
373*37da2899SCharles.Forsyth   typedef const struct T2_Hints_FuncsRec_*  T2_Hints_Funcs;
374*37da2899SCharles.Forsyth 
375*37da2899SCharles.Forsyth 
376*37da2899SCharles.Forsyth   /*************************************************************************/
377*37da2899SCharles.Forsyth   /*                                                                       */
378*37da2899SCharles.Forsyth   /* @functype:                                                            */
379*37da2899SCharles.Forsyth   /*    T2_Hints_OpenFunc                                                  */
380*37da2899SCharles.Forsyth   /*                                                                       */
381*37da2899SCharles.Forsyth   /* @description:                                                         */
382*37da2899SCharles.Forsyth   /*    A method of the @T2_Hints class used to prepare it for a new       */
383*37da2899SCharles.Forsyth   /*    Type 2 hints recording session.                                    */
384*37da2899SCharles.Forsyth   /*                                                                       */
385*37da2899SCharles.Forsyth   /* @input:                                                               */
386*37da2899SCharles.Forsyth   /*    hints :: A handle to the Type 2 hints recorder.                    */
387*37da2899SCharles.Forsyth   /*                                                                       */
388*37da2899SCharles.Forsyth   /* @note:                                                                */
389*37da2899SCharles.Forsyth   /*    You should always call the @T2_Hints_CloseFunc method in order to  */
390*37da2899SCharles.Forsyth   /*    close an opened recording session.                                 */
391*37da2899SCharles.Forsyth   /*                                                                       */
392*37da2899SCharles.Forsyth   typedef void
393*37da2899SCharles.Forsyth   (*T2_Hints_OpenFunc)( T2_Hints  hints );
394*37da2899SCharles.Forsyth 
395*37da2899SCharles.Forsyth 
396*37da2899SCharles.Forsyth   /*************************************************************************/
397*37da2899SCharles.Forsyth   /*                                                                       */
398*37da2899SCharles.Forsyth   /* @functype:                                                            */
399*37da2899SCharles.Forsyth   /*    T2_Hints_StemsFunc                                                 */
400*37da2899SCharles.Forsyth   /*                                                                       */
401*37da2899SCharles.Forsyth   /* @description:                                                         */
402*37da2899SCharles.Forsyth   /*    A method of the @T2_Hints class used to set the table of stems in  */
403*37da2899SCharles.Forsyth   /*    either the vertical or horizontal dimension.  Equivalent to the    */
404*37da2899SCharles.Forsyth   /*    "hstem", "vstem", "hstemhm", and "vstemhm" Type 2 operators.       */
405*37da2899SCharles.Forsyth   /*                                                                       */
406*37da2899SCharles.Forsyth   /* @input:                                                               */
407*37da2899SCharles.Forsyth   /*    hints     :: A handle to the Type 2 hints recorder.                */
408*37da2899SCharles.Forsyth   /*                                                                       */
409*37da2899SCharles.Forsyth   /*    dimension :: 0 for horizontal stems (hstem), 1 for vertical ones   */
410*37da2899SCharles.Forsyth   /*                 (vstem).                                              */
411*37da2899SCharles.Forsyth   /*                                                                       */
412*37da2899SCharles.Forsyth   /*    count     :: The number of stems.                                  */
413*37da2899SCharles.Forsyth   /*                                                                       */
414*37da2899SCharles.Forsyth   /*    coords    :: An array of "count" (position,length) pairs.          */
415*37da2899SCharles.Forsyth   /*                                                                       */
416*37da2899SCharles.Forsyth   /* @note:                                                                */
417*37da2899SCharles.Forsyth   /*    Use vertical coordinates (y) for horizontal stems (dim=0).  Use    */
418*37da2899SCharles.Forsyth   /*    horizontal coordinates (x) for vertical stems (dim=1).             */
419*37da2899SCharles.Forsyth   /*                                                                       */
420*37da2899SCharles.Forsyth   /*    There are "2*count" elements in the "coords" aray.  Each even      */
421*37da2899SCharles.Forsyth   /*    element is an absolute position in font units, each odd element is */
422*37da2899SCharles.Forsyth   /*    a length in font units.                                            */
423*37da2899SCharles.Forsyth   /*                                                                       */
424*37da2899SCharles.Forsyth   /*    A length can be negative, in which case it must be either -20 or   */
425*37da2899SCharles.Forsyth   /*    -21.  It will be interpreted as a "ghost" stem, according to the   */
426*37da2899SCharles.Forsyth   /*    Type 1 specification.                                              */
427*37da2899SCharles.Forsyth   /*                                                                       */
428*37da2899SCharles.Forsyth   typedef void
429*37da2899SCharles.Forsyth   (*T2_Hints_StemsFunc)( T2_Hints   hints,
430*37da2899SCharles.Forsyth                          FT_UInt    dimension,
431*37da2899SCharles.Forsyth                          FT_UInt    count,
432*37da2899SCharles.Forsyth                          FT_Fixed*  coordinates );
433*37da2899SCharles.Forsyth 
434*37da2899SCharles.Forsyth 
435*37da2899SCharles.Forsyth   /*************************************************************************/
436*37da2899SCharles.Forsyth   /*                                                                       */
437*37da2899SCharles.Forsyth   /* @functype:                                                            */
438*37da2899SCharles.Forsyth   /*    T2_Hints_MaskFunc                                                  */
439*37da2899SCharles.Forsyth   /*                                                                       */
440*37da2899SCharles.Forsyth   /* @description:                                                         */
441*37da2899SCharles.Forsyth   /*    A method of the @T2_Hints class used to set a given hintmask       */
442*37da2899SCharles.Forsyth   /*    (this corresponds to the "hintmask" Type 2 operator).              */
443*37da2899SCharles.Forsyth   /*                                                                       */
444*37da2899SCharles.Forsyth   /* @input:                                                               */
445*37da2899SCharles.Forsyth   /*    hints     :: A handle to the Type 2 hints recorder.                */
446*37da2899SCharles.Forsyth   /*                                                                       */
447*37da2899SCharles.Forsyth   /*    end_point :: The glyph index of the last point to which the        */
448*37da2899SCharles.Forsyth   /*                 previously defined/activated hints apply.             */
449*37da2899SCharles.Forsyth   /*                                                                       */
450*37da2899SCharles.Forsyth   /*    bit_count :: The number of bits in the hint mask.                  */
451*37da2899SCharles.Forsyth   /*                                                                       */
452*37da2899SCharles.Forsyth   /*    bytes     :: An array of bytes modelling the hint mask.            */
453*37da2899SCharles.Forsyth   /*                                                                       */
454*37da2899SCharles.Forsyth   /* @note:                                                                */
455*37da2899SCharles.Forsyth   /*    If the hintmask starts the charstring (before any glyph point      */
456*37da2899SCharles.Forsyth   /*    definition), the value of "end_point" should be 0.                 */
457*37da2899SCharles.Forsyth   /*                                                                       */
458*37da2899SCharles.Forsyth   /*    "bit_count" is the number of meaningful bits in the "bytes" array; */
459*37da2899SCharles.Forsyth   /*    it must be equal to the total number of hints defined so far       */
460*37da2899SCharles.Forsyth   /*    (i.e. horizontal+verticals).                                       */
461*37da2899SCharles.Forsyth   /*                                                                       */
462*37da2899SCharles.Forsyth   /*    The "bytes" array can come directly from the Type 2 charstring and */
463*37da2899SCharles.Forsyth   /*    respects the same format.                                          */
464*37da2899SCharles.Forsyth   /*                                                                       */
465*37da2899SCharles.Forsyth   typedef void
466*37da2899SCharles.Forsyth   (*T2_Hints_MaskFunc)( T2_Hints        hints,
467*37da2899SCharles.Forsyth                         FT_UInt         end_point,
468*37da2899SCharles.Forsyth                         FT_UInt         bit_count,
469*37da2899SCharles.Forsyth                         const FT_Byte*  bytes );
470*37da2899SCharles.Forsyth 
471*37da2899SCharles.Forsyth 
472*37da2899SCharles.Forsyth   /*************************************************************************/
473*37da2899SCharles.Forsyth   /*                                                                       */
474*37da2899SCharles.Forsyth   /* @functype:                                                            */
475*37da2899SCharles.Forsyth   /*    T2_Hints_CounterFunc                                               */
476*37da2899SCharles.Forsyth   /*                                                                       */
477*37da2899SCharles.Forsyth   /* @description:                                                         */
478*37da2899SCharles.Forsyth   /*    A method of the @T2_Hints class used to set a given counter mask   */
479*37da2899SCharles.Forsyth   /*    (this corresponds to the "hintmask" Type 2 operator).              */
480*37da2899SCharles.Forsyth   /*                                                                       */
481*37da2899SCharles.Forsyth   /* @input:                                                               */
482*37da2899SCharles.Forsyth   /*    hints     :: A handle to the Type 2 hints recorder.                */
483*37da2899SCharles.Forsyth   /*                                                                       */
484*37da2899SCharles.Forsyth   /*    end_point :: A glyph index of the last point to which the          */
485*37da2899SCharles.Forsyth   /*                 previously defined/active hints apply.                */
486*37da2899SCharles.Forsyth   /*                                                                       */
487*37da2899SCharles.Forsyth   /*    bit_count :: The number of bits in the hint mask.                  */
488*37da2899SCharles.Forsyth   /*                                                                       */
489*37da2899SCharles.Forsyth   /*    bytes     :: An array of bytes modelling the hint mask.            */
490*37da2899SCharles.Forsyth   /*                                                                       */
491*37da2899SCharles.Forsyth   /* @note:                                                                */
492*37da2899SCharles.Forsyth   /*    If the hintmask starts the charstring (before any glyph point      */
493*37da2899SCharles.Forsyth   /*    definition), the value of "end_point" should be 0.                 */
494*37da2899SCharles.Forsyth   /*                                                                       */
495*37da2899SCharles.Forsyth   /*    "bit_count" is the number of meaningful bits in the "bytes" array; */
496*37da2899SCharles.Forsyth   /*    it must be equal to the total number of hints defined so far       */
497*37da2899SCharles.Forsyth   /*    (i.e. horizontal+verticals).                                       */
498*37da2899SCharles.Forsyth   /*                                                                       */
499*37da2899SCharles.Forsyth   /*    The "bytes" array can come directly from the Type 2 charstring and */
500*37da2899SCharles.Forsyth   /*    respects the same format.                                          */
501*37da2899SCharles.Forsyth   /*                                                                       */
502*37da2899SCharles.Forsyth   typedef void
503*37da2899SCharles.Forsyth   (*T2_Hints_CounterFunc)( T2_Hints        hints,
504*37da2899SCharles.Forsyth                            FT_UInt         bit_count,
505*37da2899SCharles.Forsyth                            const FT_Byte*  bytes );
506*37da2899SCharles.Forsyth 
507*37da2899SCharles.Forsyth 
508*37da2899SCharles.Forsyth   /*************************************************************************/
509*37da2899SCharles.Forsyth   /*                                                                       */
510*37da2899SCharles.Forsyth   /* @functype:                                                            */
511*37da2899SCharles.Forsyth   /*    T2_Hints_CloseFunc                                                 */
512*37da2899SCharles.Forsyth   /*                                                                       */
513*37da2899SCharles.Forsyth   /* @description:                                                         */
514*37da2899SCharles.Forsyth   /*    A method of the @T2_Hints class used to close a hint recording     */
515*37da2899SCharles.Forsyth   /*    session.                                                           */
516*37da2899SCharles.Forsyth   /*                                                                       */
517*37da2899SCharles.Forsyth   /* @input:                                                               */
518*37da2899SCharles.Forsyth   /*    hints     :: A handle to the Type 2 hints recorder.                */
519*37da2899SCharles.Forsyth   /*                                                                       */
520*37da2899SCharles.Forsyth   /*    end_point :: The index of the last point in the input glyph.       */
521*37da2899SCharles.Forsyth   /*                                                                       */
522*37da2899SCharles.Forsyth   /* @return:                                                              */
523*37da2899SCharles.Forsyth   /*    FreeType error code.  0 means success.                             */
524*37da2899SCharles.Forsyth   /*                                                                       */
525*37da2899SCharles.Forsyth   /* @note:                                                                */
526*37da2899SCharles.Forsyth   /*    The error code will be set to indicate that an error occured       */
527*37da2899SCharles.Forsyth   /*    during the recording session.                                      */
528*37da2899SCharles.Forsyth   /*                                                                       */
529*37da2899SCharles.Forsyth   typedef FT_Error
530*37da2899SCharles.Forsyth   (*T2_Hints_CloseFunc)( T2_Hints  hints,
531*37da2899SCharles.Forsyth                          FT_UInt   end_point );
532*37da2899SCharles.Forsyth 
533*37da2899SCharles.Forsyth 
534*37da2899SCharles.Forsyth   /*************************************************************************/
535*37da2899SCharles.Forsyth   /*                                                                       */
536*37da2899SCharles.Forsyth   /* @functype:                                                            */
537*37da2899SCharles.Forsyth   /*    T2_Hints_ApplyFunc                                                 */
538*37da2899SCharles.Forsyth   /*                                                                       */
539*37da2899SCharles.Forsyth   /* @description:                                                         */
540*37da2899SCharles.Forsyth   /*    A method of the @T2_Hints class used to apply hints to the         */
541*37da2899SCharles.Forsyth   /*    corresponding glyph outline.  Must be called after the "close"     */
542*37da2899SCharles.Forsyth   /*    method.                                                            */
543*37da2899SCharles.Forsyth   /*                                                                       */
544*37da2899SCharles.Forsyth   /* @input:                                                               */
545*37da2899SCharles.Forsyth   /*    hints      :: A handle to the Type 2 hints recorder.               */
546*37da2899SCharles.Forsyth   /*                                                                       */
547*37da2899SCharles.Forsyth   /*    outline    :: A pointer to the target outline descriptor.          */
548*37da2899SCharles.Forsyth   /*                                                                       */
549*37da2899SCharles.Forsyth   /*    globals    :: The hinter globals for this font.                    */
550*37da2899SCharles.Forsyth   /*                                                                       */
551*37da2899SCharles.Forsyth   /*    hint_flags :: Hinter bit flags.                                    */
552*37da2899SCharles.Forsyth   /*                                                                       */
553*37da2899SCharles.Forsyth   /* @return:                                                              */
554*37da2899SCharles.Forsyth   /*   FreeType error code.  0 means success.                              */
555*37da2899SCharles.Forsyth   /*                                                                       */
556*37da2899SCharles.Forsyth   /* @note:                                                                */
557*37da2899SCharles.Forsyth   /*    On input, all points within the outline are in font coordinates.   */
558*37da2899SCharles.Forsyth   /*    On output, they are in 1/64th of pixels.                           */
559*37da2899SCharles.Forsyth   /*                                                                       */
560*37da2899SCharles.Forsyth   /*    The scaling transformation is taken from the "globals" object      */
561*37da2899SCharles.Forsyth   /*    which must correspond to the same font than the glyph.             */
562*37da2899SCharles.Forsyth   /*                                                                       */
563*37da2899SCharles.Forsyth   typedef FT_Error
564*37da2899SCharles.Forsyth   (*T2_Hints_ApplyFunc)( T2_Hints        hints,
565*37da2899SCharles.Forsyth                          FT_Outline*     outline,
566*37da2899SCharles.Forsyth                          PSH_Globals     globals,
567*37da2899SCharles.Forsyth                          FT_Render_Mode  hint_mode );
568*37da2899SCharles.Forsyth 
569*37da2899SCharles.Forsyth 
570*37da2899SCharles.Forsyth   /*************************************************************************/
571*37da2899SCharles.Forsyth   /*                                                                       */
572*37da2899SCharles.Forsyth   /* @struct:                                                              */
573*37da2899SCharles.Forsyth   /*    T2_Hints_FuncsRec                                                  */
574*37da2899SCharles.Forsyth   /*                                                                       */
575*37da2899SCharles.Forsyth   /* @description:                                                         */
576*37da2899SCharles.Forsyth   /*    The structure used to provide the API to @T2_Hints objects.        */
577*37da2899SCharles.Forsyth   /*                                                                       */
578*37da2899SCharles.Forsyth   /* @fields:                                                              */
579*37da2899SCharles.Forsyth   /*    hints    :: A handle to the T2 hints recorder object.              */
580*37da2899SCharles.Forsyth   /*                                                                       */
581*37da2899SCharles.Forsyth   /*    open     :: The function to open a recording session.              */
582*37da2899SCharles.Forsyth   /*                                                                       */
583*37da2899SCharles.Forsyth   /*    close    :: The function to close a recording session.             */
584*37da2899SCharles.Forsyth   /*                                                                       */
585*37da2899SCharles.Forsyth   /*    stems    :: The function to set the dimension's stems table.       */
586*37da2899SCharles.Forsyth   /*                                                                       */
587*37da2899SCharles.Forsyth   /*    hintmask :: The function to set hint masks.                        */
588*37da2899SCharles.Forsyth   /*                                                                       */
589*37da2899SCharles.Forsyth   /*    counter  :: The function to set counter masks.                     */
590*37da2899SCharles.Forsyth   /*                                                                       */
591*37da2899SCharles.Forsyth   /*    apply    :: The function to apply the hints on the corresponding   */
592*37da2899SCharles.Forsyth   /*                glyph outline.                                         */
593*37da2899SCharles.Forsyth   /*                                                                       */
594*37da2899SCharles.Forsyth   typedef struct  T2_Hints_FuncsRec_
595*37da2899SCharles.Forsyth   {
596*37da2899SCharles.Forsyth     T2_Hints              hints;
597*37da2899SCharles.Forsyth     T2_Hints_OpenFunc     open;
598*37da2899SCharles.Forsyth     T2_Hints_CloseFunc    close;
599*37da2899SCharles.Forsyth     T2_Hints_StemsFunc    stems;
600*37da2899SCharles.Forsyth     T2_Hints_MaskFunc     hintmask;
601*37da2899SCharles.Forsyth     T2_Hints_CounterFunc  counter;
602*37da2899SCharles.Forsyth     T2_Hints_ApplyFunc    apply;
603*37da2899SCharles.Forsyth 
604*37da2899SCharles.Forsyth   } T2_Hints_FuncsRec;
605*37da2899SCharles.Forsyth 
606*37da2899SCharles.Forsyth 
607*37da2899SCharles.Forsyth   /* */
608*37da2899SCharles.Forsyth 
609*37da2899SCharles.Forsyth 
610*37da2899SCharles.Forsyth   typedef struct  PSHinter_Interface_
611*37da2899SCharles.Forsyth   {
612*37da2899SCharles.Forsyth     PSH_Globals_Funcs  (*get_globals_funcs)( FT_Module  module );
613*37da2899SCharles.Forsyth     T1_Hints_Funcs     (*get_t1_funcs)     ( FT_Module  module );
614*37da2899SCharles.Forsyth     T2_Hints_Funcs     (*get_t2_funcs)     ( FT_Module  module );
615*37da2899SCharles.Forsyth 
616*37da2899SCharles.Forsyth   } PSHinter_Interface;
617*37da2899SCharles.Forsyth 
618*37da2899SCharles.Forsyth   typedef PSHinter_Interface*  PSHinter_Service;
619*37da2899SCharles.Forsyth 
620*37da2899SCharles.Forsyth 
621*37da2899SCharles.Forsyth FT_END_HEADER
622*37da2899SCharles.Forsyth 
623*37da2899SCharles.Forsyth #endif /* __PSHINTS_H__ */
624*37da2899SCharles.Forsyth 
625*37da2899SCharles.Forsyth 
626*37da2899SCharles.Forsyth /* END */
627