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