Home | History | Annotate | Download | only in pshinter
      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 */
    242