Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
4680 right-hear 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, 2002, 2003, 2005, 2006, 2007, 2009 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 
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 FT_Error
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_UInt    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
#ifndef FT_CONFIG_OPTION_PIC
683
 
684
#define FT_DEFINE_PSHINTER_INTERFACE(class_, get_globals_funcs_,             \
685
                                     get_t1_funcs_, get_t2_funcs_)           \
686
  static const PSHinter_Interface class_ =                                   \
687
  {                                                                          \
688
    get_globals_funcs_, get_t1_funcs_, get_t2_funcs_                         \
689
  };
690
 
691
#else /* FT_CONFIG_OPTION_PIC */
692
 
693
#define FT_DEFINE_PSHINTER_INTERFACE(class_, get_globals_funcs_,             \
694
                                     get_t1_funcs_, get_t2_funcs_)           \
695
  void                                                                       \
696
  FT_Init_Class_##class_( FT_Library library,                                \
697
                          PSHinter_Interface*  clazz)                        \
698
  {                                                                          \
699
    FT_UNUSED(library);                                                      \
700
    clazz->get_globals_funcs = get_globals_funcs_;                           \
701
    clazz->get_t1_funcs = get_t1_funcs_;                                     \
702
    clazz->get_t2_funcs = get_t2_funcs_;                                     \
703
  }
704
 
705
#endif /* FT_CONFIG_OPTION_PIC */
706
 
707
FT_END_HEADER
708
 
709
#endif /* __PSHINTS_H__ */
710
 
711
 
712
/* END */