Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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