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-2018 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 */