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