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