(root)/
freetype-2.13.2/
src/
pshinter/
pshalgo.h
       1  /****************************************************************************
       2   *
       3   * pshalgo.h
       4   *
       5   *   PostScript hinting algorithm (specification).
       6   *
       7   * Copyright (C) 2001-2023 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    typedef enum PSH_Dir_
      97    {
      98      PSH_DIR_NONE       = 0,
      99      PSH_DIR_UP         = 1,
     100      PSH_DIR_DOWN       = 2,
     101      PSH_DIR_VERTICAL   = 1 | 2,
     102      PSH_DIR_LEFT       = 4,
     103      PSH_DIR_RIGHT      = 8,
     104      PSH_DIR_HORIZONTAL = 4 | 8
     105  
     106    } PSH_Dir;
     107  
     108  
     109    /* the following bit-flags are computed once by the glyph */
     110    /* analyzer, for both dimensions                          */
     111  #define PSH_POINT_OFF     1U      /* point is off the curve */
     112  #define PSH_POINT_SMOOTH  2U      /* point is smooth        */
     113  #define PSH_POINT_INFLEX  4U      /* point is inflection    */
     114  
     115  
     116  #define psh_point_is_smooth( p )  ( (p)->flags & PSH_POINT_SMOOTH )
     117  #define psh_point_is_off( p )     ( (p)->flags & PSH_POINT_OFF    )
     118  #define psh_point_is_inflex( p )  ( (p)->flags & PSH_POINT_INFLEX )
     119  
     120  #define psh_point_set_smooth( p )  (p)->flags |= PSH_POINT_SMOOTH
     121  #define psh_point_set_off( p )     (p)->flags |= PSH_POINT_OFF
     122  #define psh_point_set_inflex( p )  (p)->flags |= PSH_POINT_INFLEX
     123  
     124  
     125    /* the following bit-flags are re-computed for each dimension */
     126  #define PSH_POINT_STRONG      16U /* point is strong                           */
     127  #define PSH_POINT_FITTED      32U /* point is already fitted                   */
     128  #define PSH_POINT_EXTREMUM    64U /* point is local extremum                   */
     129  #define PSH_POINT_POSITIVE   128U /* extremum has positive contour flow        */
     130  #define PSH_POINT_NEGATIVE   256U /* extremum has negative contour flow        */
     131  #define PSH_POINT_EDGE_MIN   512U /* point is aligned to left/bottom stem edge */
     132  #define PSH_POINT_EDGE_MAX  1024U /* point is aligned to top/right stem edge   */
     133  
     134  
     135  #define psh_point_is_strong( p )    ( (p)->flags2 & PSH_POINT_STRONG )
     136  #define psh_point_is_fitted( p )    ( (p)->flags2 & PSH_POINT_FITTED )
     137  #define psh_point_is_extremum( p )  ( (p)->flags2 & PSH_POINT_EXTREMUM )
     138  #define psh_point_is_positive( p )  ( (p)->flags2 & PSH_POINT_POSITIVE )
     139  #define psh_point_is_negative( p )  ( (p)->flags2 & PSH_POINT_NEGATIVE )
     140  #define psh_point_is_edge_min( p )  ( (p)->flags2 & PSH_POINT_EDGE_MIN )
     141  #define psh_point_is_edge_max( p )  ( (p)->flags2 & PSH_POINT_EDGE_MAX )
     142  
     143  #define psh_point_set_strong( p )    (p)->flags2 |= PSH_POINT_STRONG
     144  #define psh_point_set_fitted( p )    (p)->flags2 |= PSH_POINT_FITTED
     145  #define psh_point_set_extremum( p )  (p)->flags2 |= PSH_POINT_EXTREMUM
     146  #define psh_point_set_positive( p )  (p)->flags2 |= PSH_POINT_POSITIVE
     147  #define psh_point_set_negative( p )  (p)->flags2 |= PSH_POINT_NEGATIVE
     148  #define psh_point_set_edge_min( p )  (p)->flags2 |= PSH_POINT_EDGE_MIN
     149  #define psh_point_set_edge_max( p )  (p)->flags2 |= PSH_POINT_EDGE_MAX
     150  
     151  
     152    typedef struct  PSH_PointRec_
     153    {
     154      PSH_Point    prev;
     155      PSH_Point    next;
     156      PSH_Contour  contour;
     157      FT_UInt      flags;
     158      FT_UInt      flags2;
     159      PSH_Dir      dir_in;
     160      PSH_Dir      dir_out;
     161      PSH_Hint     hint;
     162      FT_Pos       org_u;
     163      FT_Pos       org_v;
     164      FT_Pos       cur_u;
     165  #ifdef DEBUG_HINTER
     166      FT_Pos       org_x;
     167      FT_Pos       cur_x;
     168      FT_Pos       org_y;
     169      FT_Pos       cur_y;
     170      FT_UInt      flags_x;
     171      FT_UInt      flags_y;
     172  #endif
     173  
     174    } PSH_PointRec;
     175  
     176  
     177    typedef struct  PSH_ContourRec_
     178    {
     179      PSH_Point  start;
     180      FT_UInt    count;
     181  
     182    } PSH_ContourRec;
     183  
     184  
     185    typedef struct  PSH_GlyphRec_
     186    {
     187      FT_UInt            num_points;
     188      FT_UInt            num_contours;
     189  
     190      PSH_Point          points;
     191      PSH_Contour        contours;
     192  
     193      FT_Memory          memory;
     194      FT_Outline*        outline;
     195      PSH_Globals        globals;
     196      PSH_Hint_TableRec  hint_tables[2];
     197  
     198      FT_Bool            do_horz_hints;
     199      FT_Bool            do_vert_hints;
     200      FT_Bool            do_horz_snapping;
     201      FT_Bool            do_vert_snapping;
     202      FT_Bool            do_stem_adjust;
     203  
     204    } PSH_GlyphRec, *PSH_Glyph;
     205  
     206  
     207  #ifdef DEBUG_HINTER
     208    extern PSH_Hint_Table  ps_debug_hint_table;
     209  
     210    typedef void
     211    (*PSH_HintFunc)( PSH_Hint  hint,
     212                     FT_Bool   vertical );
     213  
     214    extern PSH_HintFunc    ps_debug_hint_func;
     215  
     216    extern PSH_Glyph       ps_debug_glyph;
     217  #endif
     218  
     219  
     220    extern FT_Error
     221    ps_hints_apply( PS_Hints        ps_hints,
     222                    FT_Outline*     outline,
     223                    PSH_Globals     globals,
     224                    FT_Render_Mode  hint_mode );
     225  
     226  
     227  FT_END_HEADER
     228  
     229  
     230  #endif /* PSHALGO_H_ */
     231  
     232  
     233  /* END */