1 /***************************************************************************/
   2 /*                                                                         */
   3 /*  pshalgo.h                                                              */
   4 /*                                                                         */
   5 /*    PostScript hinting algorithm (specification).                        */
   6 /*                                                                         */
   7 /*  Copyright 2001-2018 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 #ifndef PSHALGO_H_
  20 #define PSHALGO_H_
  21 
  22 
  23 #include "pshrec.h"
  24 #include "pshglob.h"
  25 
  26 
  27 FT_BEGIN_HEADER
  28 
  29 
  30   /* handle to Hint structure */
  31   typedef struct PSH_HintRec_*  PSH_Hint;
  32 
  33 
  34   /* hint bit-flags */
  35 #define PSH_HINT_GHOST   PS_HINT_FLAG_GHOST
  36 #define PSH_HINT_BOTTOM  PS_HINT_FLAG_BOTTOM
  37 #define PSH_HINT_ACTIVE  4U
  38 #define PSH_HINT_FITTED  8U
  39 
  40 
  41 #define psh_hint_is_active( x )  ( ( (x)->flags & PSH_HINT_ACTIVE ) != 0 )
  42 #define psh_hint_is_ghost( x )   ( ( (x)->flags & PSH_HINT_GHOST  ) != 0 )
  43 #define psh_hint_is_fitted( x )  ( ( (x)->flags & PSH_HINT_FITTED ) != 0 )
  44 
  45 #define psh_hint_activate( x )    (x)->flags |=  PSH_HINT_ACTIVE
  46 #define psh_hint_deactivate( x )  (x)->flags &= ~PSH_HINT_ACTIVE
  47 #define psh_hint_set_fitted( x )  (x)->flags |=  PSH_HINT_FITTED
  48 
  49 
  50   /* hint structure */
  51   typedef struct  PSH_HintRec_
  52   {
  53     FT_Int    org_pos;
  54     FT_Int    org_len;
  55     FT_Pos    cur_pos;
  56     FT_Pos    cur_len;
  57     FT_UInt   flags;
  58     PSH_Hint  parent;
  59     FT_Int    order;
  60 
  61   } PSH_HintRec;
  62 
  63 
  64   /* this is an interpolation zone used for strong points;  */
  65   /* weak points are interpolated according to their strong */
  66   /* neighbours                                             */
  67   typedef struct  PSH_ZoneRec_
  68   {
  69     FT_Fixed  scale;
  70     FT_Fixed  delta;
  71     FT_Pos    min;
  72     FT_Pos    max;
  73 
  74   } PSH_ZoneRec, *PSH_Zone;
  75 
  76 
  77   typedef struct  PSH_Hint_TableRec_
  78   {
  79     FT_UInt        max_hints;
  80     FT_UInt        num_hints;
  81     PSH_Hint       hints;
  82     PSH_Hint*      sort;
  83     PSH_Hint*      sort_global;
  84     FT_UInt        num_zones;
  85     PSH_ZoneRec*   zones;
  86     PSH_Zone       zone;
  87     PS_Mask_Table  hint_masks;
  88     PS_Mask_Table  counter_masks;
  89 
  90   } PSH_Hint_TableRec, *PSH_Hint_Table;
  91 
  92 
  93   typedef struct PSH_PointRec_*    PSH_Point;
  94   typedef struct PSH_ContourRec_*  PSH_Contour;
  95 
  96   enum
  97   {
  98     PSH_DIR_NONE  =  4,
  99     PSH_DIR_UP    = -1,
 100     PSH_DIR_DOWN  =  1,
 101     PSH_DIR_LEFT  = -2,
 102     PSH_DIR_RIGHT =  2
 103   };
 104 
 105 #define PSH_DIR_HORIZONTAL  2
 106 #define PSH_DIR_VERTICAL    1
 107 
 108 #define PSH_DIR_COMPARE( d1, d2 )   ( (d1) == (d2) || (d1) == -(d2) )
 109 #define PSH_DIR_IS_HORIZONTAL( d )  PSH_DIR_COMPARE( d, PSH_DIR_HORIZONTAL )
 110 #define PSH_DIR_IS_VERTICAL( d )    PSH_DIR_COMPARE( d, PSH_DIR_VERTICAL )
 111 
 112 
 113   /* the following bit-flags are computed once by the glyph */
 114   /* analyzer, for both dimensions                          */
 115 #define PSH_POINT_OFF     1U      /* point is off the curve */
 116 #define PSH_POINT_SMOOTH  2U      /* point is smooth        */
 117 #define PSH_POINT_INFLEX  4U      /* point is inflection    */
 118 
 119 
 120 #define psh_point_is_smooth( p )  ( (p)->flags & PSH_POINT_SMOOTH )
 121 #define psh_point_is_off( p )     ( (p)->flags & PSH_POINT_OFF    )
 122 #define psh_point_is_inflex( p )  ( (p)->flags & PSH_POINT_INFLEX )
 123 
 124 #define psh_point_set_smooth( p )  (p)->flags |= PSH_POINT_SMOOTH
 125 #define psh_point_set_off( p )     (p)->flags |= PSH_POINT_OFF
 126 #define psh_point_set_inflex( p )  (p)->flags |= PSH_POINT_INFLEX
 127 
 128 
 129   /* the following bit-flags are re-computed for each dimension */
 130 #define PSH_POINT_STRONG      16U /* point is strong                           */
 131 #define PSH_POINT_FITTED      32U /* point is already fitted                   */
 132 #define PSH_POINT_EXTREMUM    64U /* point is local extremum                   */
 133 #define PSH_POINT_POSITIVE   128U /* extremum has positive contour flow        */
 134 #define PSH_POINT_NEGATIVE   256U /* extremum has negative contour flow        */
 135 #define PSH_POINT_EDGE_MIN   512U /* point is aligned to left/bottom stem edge */
 136 #define PSH_POINT_EDGE_MAX  1024U /* point is aligned to top/right stem edge   */
 137 
 138 
 139 #define psh_point_is_strong( p )    ( (p)->flags2 & PSH_POINT_STRONG )
 140 #define psh_point_is_fitted( p )    ( (p)->flags2 & PSH_POINT_FITTED )
 141 #define psh_point_is_extremum( p )  ( (p)->flags2 & PSH_POINT_EXTREMUM )
 142 #define psh_point_is_positive( p )  ( (p)->flags2 & PSH_POINT_POSITIVE )
 143 #define psh_point_is_negative( p )  ( (p)->flags2 & PSH_POINT_NEGATIVE )
 144 #define psh_point_is_edge_min( p )  ( (p)->flags2 & PSH_POINT_EDGE_MIN )
 145 #define psh_point_is_edge_max( p )  ( (p)->flags2 & PSH_POINT_EDGE_MAX )
 146 
 147 #define psh_point_set_strong( p )    (p)->flags2 |= PSH_POINT_STRONG
 148 #define psh_point_set_fitted( p )    (p)->flags2 |= PSH_POINT_FITTED
 149 #define psh_point_set_extremum( p )  (p)->flags2 |= PSH_POINT_EXTREMUM
 150 #define psh_point_set_positive( p )  (p)->flags2 |= PSH_POINT_POSITIVE
 151 #define psh_point_set_negative( p )  (p)->flags2 |= PSH_POINT_NEGATIVE
 152 #define psh_point_set_edge_min( p )  (p)->flags2 |= PSH_POINT_EDGE_MIN
 153 #define psh_point_set_edge_max( p )  (p)->flags2 |= PSH_POINT_EDGE_MAX
 154 
 155 
 156   typedef struct  PSH_PointRec_
 157   {
 158     PSH_Point    prev;
 159     PSH_Point    next;
 160     PSH_Contour  contour;
 161     FT_UInt      flags;
 162     FT_UInt      flags2;
 163     FT_Char      dir_in;
 164     FT_Char      dir_out;
 165     PSH_Hint     hint;
 166     FT_Pos       org_u;
 167     FT_Pos       org_v;
 168     FT_Pos       cur_u;
 169 #ifdef DEBUG_HINTER
 170     FT_Pos       org_x;
 171     FT_Pos       cur_x;
 172     FT_Pos       org_y;
 173     FT_Pos       cur_y;
 174     FT_UInt      flags_x;
 175     FT_UInt      flags_y;
 176 #endif
 177 
 178   } PSH_PointRec;
 179 
 180 
 181   typedef struct  PSH_ContourRec_
 182   {
 183     PSH_Point  start;
 184     FT_UInt    count;
 185 
 186   } PSH_ContourRec;
 187 
 188 
 189   typedef struct  PSH_GlyphRec_
 190   {
 191     FT_UInt            num_points;
 192     FT_UInt            num_contours;
 193 
 194     PSH_Point          points;
 195     PSH_Contour        contours;
 196 
 197     FT_Memory          memory;
 198     FT_Outline*        outline;
 199     PSH_Globals        globals;
 200     PSH_Hint_TableRec  hint_tables[2];
 201 
 202     FT_Bool            vertical;
 203     FT_Int             major_dir;
 204     FT_Int             minor_dir;
 205 
 206     FT_Bool            do_horz_hints;
 207     FT_Bool            do_vert_hints;
 208     FT_Bool            do_horz_snapping;
 209     FT_Bool            do_vert_snapping;
 210     FT_Bool            do_stem_adjust;
 211 
 212   } PSH_GlyphRec, *PSH_Glyph;
 213 
 214 
 215 #ifdef DEBUG_HINTER
 216   extern PSH_Hint_Table  ps_debug_hint_table;
 217 
 218   typedef void
 219   (*PSH_HintFunc)( PSH_Hint  hint,
 220                    FT_Bool   vertical );
 221 
 222   extern PSH_HintFunc    ps_debug_hint_func;
 223 
 224   extern PSH_Glyph       ps_debug_glyph;
 225 #endif
 226 
 227 
 228   extern FT_Error
 229   ps_hints_apply( PS_Hints        ps_hints,
 230                   FT_Outline*     outline,
 231                   PSH_Globals     globals,
 232                   FT_Render_Mode  hint_mode );
 233 
 234 
 235 FT_END_HEADER
 236 
 237 
 238 #endif /* PSHALGO_H_ */
 239 
 240 
 241 /* END */