Home | History | Annotate | Download | only in autofit
      1 /***************************************************************************/
      2 /*                                                                         */
      3 /*  aftypes.h                                                              */
      4 /*                                                                         */
      5 /*    Auto-fitter types (specification only).                              */
      6 /*                                                                         */
      7 /*  Copyright 2003-2009, 2011-2012 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   /*************************************************************************
     20    *
     21    *  The auto-fitter is a complete rewrite of the old auto-hinter.
     22    *  Its main feature is the ability to differentiate between different
     23    *  scripts in order to apply language-specific rules.
     24    *
     25    *  The code has also been compartmentized into several entities that
     26    *  should make algorithmic experimentation easier than with the old
     27    *  code.
     28    *
     29    *  Finally, we get rid of the Catharon license, since this code is
     30    *  released under the FreeType one.
     31    *
     32    *************************************************************************/
     33 
     34 
     35 #ifndef __AFTYPES_H__
     36 #define __AFTYPES_H__
     37 
     38 #include <ft2build.h>
     39 
     40 #include FT_FREETYPE_H
     41 #include FT_OUTLINE_H
     42 #include FT_INTERNAL_OBJECTS_H
     43 #include FT_INTERNAL_DEBUG_H
     44 
     45 
     46 FT_BEGIN_HEADER
     47 
     48   /*************************************************************************/
     49   /*************************************************************************/
     50   /*****                                                               *****/
     51   /*****                    D E B U G G I N G                          *****/
     52   /*****                                                               *****/
     53   /*************************************************************************/
     54   /*************************************************************************/
     55 
     56 #ifdef FT_DEBUG_AUTOFIT
     57 
     58 #include FT_CONFIG_STANDARD_LIBRARY_H
     59 
     60 extern int    _af_debug_disable_horz_hints;
     61 extern int    _af_debug_disable_vert_hints;
     62 extern int    _af_debug_disable_blue_hints;
     63 extern void*  _af_debug_hints;
     64 
     65 #endif /* FT_DEBUG_AUTOFIT */
     66 
     67 
     68   /*************************************************************************/
     69   /*************************************************************************/
     70   /*****                                                               *****/
     71   /*****                 U T I L I T Y   S T U F F                     *****/
     72   /*****                                                               *****/
     73   /*************************************************************************/
     74   /*************************************************************************/
     75 
     76   typedef struct  AF_WidthRec_
     77   {
     78     FT_Pos  org;  /* original position/width in font units              */
     79     FT_Pos  cur;  /* current/scaled position/width in device sub-pixels */
     80     FT_Pos  fit;  /* current/fitted position/width in device sub-pixels */
     81 
     82   } AF_WidthRec, *AF_Width;
     83 
     84 
     85   FT_LOCAL( void )
     86   af_sort_pos( FT_UInt  count,
     87                FT_Pos*  table );
     88 
     89   FT_LOCAL( void )
     90   af_sort_and_quantize_widths( FT_UInt*  count,
     91                                AF_Width  widths,
     92                                FT_Pos    threshold );
     93 
     94 
     95   /*************************************************************************/
     96   /*************************************************************************/
     97   /*****                                                               *****/
     98   /*****                   A N G L E   T Y P E S                       *****/
     99   /*****                                                               *****/
    100   /*************************************************************************/
    101   /*************************************************************************/
    102 
    103   /*
    104    *  The auto-fitter doesn't need a very high angular accuracy;
    105    *  this allows us to speed up some computations considerably with a
    106    *  light Cordic algorithm (see afangles.c).
    107    */
    108 
    109   typedef FT_Int  AF_Angle;
    110 
    111 
    112 #define AF_ANGLE_PI   256
    113 #define AF_ANGLE_2PI  ( AF_ANGLE_PI * 2 )
    114 #define AF_ANGLE_PI2  ( AF_ANGLE_PI / 2 )
    115 #define AF_ANGLE_PI4  ( AF_ANGLE_PI / 4 )
    116 
    117 
    118 #if 0
    119   /*
    120    *  compute the angle of a given 2-D vector
    121    */
    122   FT_LOCAL( AF_Angle )
    123   af_angle_atan( FT_Pos  dx,
    124                  FT_Pos  dy );
    125 
    126 
    127   /*
    128    *  compute `angle2 - angle1'; the result is always within
    129    *  the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1]
    130    */
    131   FT_LOCAL( AF_Angle )
    132   af_angle_diff( AF_Angle  angle1,
    133                  AF_Angle  angle2 );
    134 #endif /* 0 */
    135 
    136 
    137 #define AF_ANGLE_DIFF( result, angle1, angle2 ) \
    138   FT_BEGIN_STMNT                                \
    139     AF_Angle  _delta = (angle2) - (angle1);     \
    140                                                 \
    141                                                 \
    142     _delta %= AF_ANGLE_2PI;                     \
    143     if ( _delta < 0 )                           \
    144       _delta += AF_ANGLE_2PI;                   \
    145                                                 \
    146     if ( _delta > AF_ANGLE_PI )                 \
    147       _delta -= AF_ANGLE_2PI;                   \
    148                                                 \
    149     result = _delta;                            \
    150   FT_END_STMNT
    151 
    152 
    153   /*  opaque handle to glyph-specific hints -- see `afhints.h' for more
    154    *  details
    155    */
    156   typedef struct AF_GlyphHintsRec_*  AF_GlyphHints;
    157 
    158 
    159   /*************************************************************************/
    160   /*************************************************************************/
    161   /*****                                                               *****/
    162   /*****                       S C A L E R S                           *****/
    163   /*****                                                               *****/
    164   /*************************************************************************/
    165   /*************************************************************************/
    166 
    167   /*
    168    *  A scaler models the target pixel device that will receive the
    169    *  auto-hinted glyph image.
    170    */
    171 
    172   typedef enum  AF_ScalerFlags_
    173   {
    174     AF_SCALER_FLAG_NO_HORIZONTAL = 1,  /* disable horizontal hinting */
    175     AF_SCALER_FLAG_NO_VERTICAL   = 2,  /* disable vertical hinting   */
    176     AF_SCALER_FLAG_NO_ADVANCE    = 4   /* disable advance hinting    */
    177 
    178   } AF_ScalerFlags;
    179 
    180 
    181   typedef struct  AF_ScalerRec_
    182   {
    183     FT_Face         face;        /* source font face                        */
    184     FT_Fixed        x_scale;     /* from font units to 1/64th device pixels */
    185     FT_Fixed        y_scale;     /* from font units to 1/64th device pixels */
    186     FT_Pos          x_delta;     /* in 1/64th device pixels                 */
    187     FT_Pos          y_delta;     /* in 1/64th device pixels                 */
    188     FT_Render_Mode  render_mode; /* monochrome, anti-aliased, LCD, etc.     */
    189     FT_UInt32       flags;       /* additional control flags, see above     */
    190 
    191   } AF_ScalerRec, *AF_Scaler;
    192 
    193 
    194 #define AF_SCALER_EQUAL_SCALES( a, b )      \
    195           ( (a)->x_scale == (b)->x_scale && \
    196             (a)->y_scale == (b)->y_scale && \
    197             (a)->x_delta == (b)->x_delta && \
    198             (a)->y_delta == (b)->y_delta )
    199 
    200 
    201   /*************************************************************************/
    202   /*************************************************************************/
    203   /*****                                                               *****/
    204   /*****                       S C R I P T S                           *****/
    205   /*****                                                               *****/
    206   /*************************************************************************/
    207   /*************************************************************************/
    208 
    209   /*
    210    *  The list of known scripts.  Each different script corresponds to the
    211    *  following information:
    212    *
    213    *   - A set of Unicode ranges to test whether the face supports the
    214    *     script.
    215    *
    216    *   - A specific global analyzer that will compute global metrics
    217    *     specific to the script.
    218    *
    219    *   - A specific glyph analyzer that will compute segments and
    220    *     edges for each glyph covered by the script.
    221    *
    222    *   - A specific grid-fitting algorithm that will distort the
    223    *     scaled glyph outline according to the results of the glyph
    224    *     analyzer.
    225    *
    226    *  Note that a given analyzer and/or grid-fitting algorithm can be
    227    *  used by more than one script.
    228    */
    229 
    230   typedef enum  AF_Script_
    231   {
    232     AF_SCRIPT_DUMMY = 0,
    233     AF_SCRIPT_LATIN = 1,
    234     AF_SCRIPT_CJK   = 2,
    235     AF_SCRIPT_INDIC = 3,
    236 #ifdef FT_OPTION_AUTOFIT2
    237     AF_SCRIPT_LATIN2 = 4,
    238 #endif
    239 
    240     /* add new scripts here.  Don't forget to update the list in */
    241     /* `afglobal.c'.                                             */
    242 
    243     AF_SCRIPT_MAX   /* do not remove */
    244 
    245   } AF_Script;
    246 
    247 
    248   typedef struct AF_ScriptClassRec_ const*  AF_ScriptClass;
    249   typedef struct AF_FaceGlobalsRec_*        AF_FaceGlobals;
    250 
    251   typedef struct  AF_ScriptMetricsRec_
    252   {
    253     AF_ScriptClass  clazz;
    254     AF_ScalerRec    scaler;
    255     FT_Bool         digits_have_same_width;
    256 
    257     AF_FaceGlobals  globals;    /* to access properties */
    258 
    259   } AF_ScriptMetricsRec, *AF_ScriptMetrics;
    260 
    261 
    262   /*  This function parses an FT_Face to compute global metrics for
    263    *  a specific script.
    264    */
    265   typedef FT_Error
    266   (*AF_Script_InitMetricsFunc)( AF_ScriptMetrics  metrics,
    267                                 FT_Face           face );
    268 
    269   typedef void
    270   (*AF_Script_ScaleMetricsFunc)( AF_ScriptMetrics  metrics,
    271                                  AF_Scaler         scaler );
    272 
    273   typedef void
    274   (*AF_Script_DoneMetricsFunc)( AF_ScriptMetrics  metrics );
    275 
    276 
    277   typedef FT_Error
    278   (*AF_Script_InitHintsFunc)( AF_GlyphHints     hints,
    279                               AF_ScriptMetrics  metrics );
    280 
    281   typedef void
    282   (*AF_Script_ApplyHintsFunc)( AF_GlyphHints     hints,
    283                                FT_Outline*       outline,
    284                                AF_ScriptMetrics  metrics );
    285 
    286 
    287   typedef struct  AF_Script_UniRangeRec_
    288   {
    289     FT_UInt32  first;
    290     FT_UInt32  last;
    291 
    292   } AF_Script_UniRangeRec;
    293 
    294 #define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) }
    295 
    296   typedef const AF_Script_UniRangeRec  *AF_Script_UniRange;
    297 
    298 
    299   typedef struct  AF_ScriptClassRec_
    300   {
    301     AF_Script           script;
    302     AF_Script_UniRange  script_uni_ranges; /* last must be { 0, 0 }        */
    303     FT_UInt32           standard_char;     /* for default width and height */
    304 
    305     FT_Offset                   script_metrics_size;
    306     AF_Script_InitMetricsFunc   script_metrics_init;
    307     AF_Script_ScaleMetricsFunc  script_metrics_scale;
    308     AF_Script_DoneMetricsFunc   script_metrics_done;
    309 
    310     AF_Script_InitHintsFunc     script_hints_init;
    311     AF_Script_ApplyHintsFunc    script_hints_apply;
    312 
    313   } AF_ScriptClassRec;
    314 
    315 
    316   /* Declare and define vtables for classes */
    317 #ifndef FT_CONFIG_OPTION_PIC
    318 
    319 #define AF_DECLARE_SCRIPT_CLASS( script_class ) \
    320   FT_CALLBACK_TABLE const AF_ScriptClassRec     \
    321   script_class;
    322 
    323 #define AF_DEFINE_SCRIPT_CLASS( script_class, script_, ranges, def_char,   \
    324                                 m_size,                                    \
    325                                 m_init, m_scale, m_done, h_init, h_apply ) \
    326   FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec  script_class =            \
    327   {                                                                        \
    328     script_,                                                               \
    329     ranges,                                                                \
    330     def_char,                                                              \
    331                                                                            \
    332     m_size,                                                                \
    333                                                                            \
    334     m_init,                                                                \
    335     m_scale,                                                               \
    336     m_done,                                                                \
    337                                                                            \
    338     h_init,                                                                \
    339     h_apply                                                                \
    340   };
    341 
    342 #else /* FT_CONFIG_OPTION_PIC */
    343 
    344 #define AF_DECLARE_SCRIPT_CLASS( script_class )             \
    345   FT_LOCAL( void )                                          \
    346   FT_Init_Class_ ## script_class( AF_ScriptClassRec*  ac );
    347 
    348 #define AF_DEFINE_SCRIPT_CLASS( script_class, script_, ranges, def_char,   \
    349                                 m_size,                                    \
    350                                 m_init, m_scale, m_done, h_init, h_apply ) \
    351   FT_LOCAL_DEF( void )                                                     \
    352   FT_Init_Class_ ## script_class( AF_ScriptClassRec*  ac )                 \
    353   {                                                                        \
    354     ac->script               = script_;                                    \
    355     ac->script_uni_ranges    = ranges;                                     \
    356     ac->default_char         = def_char;                                   \
    357                                                                            \
    358     ac->script_metrics_size  = m_size;                                     \
    359                                                                            \
    360     ac->script_metrics_init  = m_init;                                     \
    361     ac->script_metrics_scale = m_scale;                                    \
    362     ac->script_metrics_done  = m_done;                                     \
    363                                                                            \
    364     ac->script_hints_init    = h_init;                                     \
    365     ac->script_hints_apply   = h_apply;                                    \
    366   }
    367 
    368 #endif /* FT_CONFIG_OPTION_PIC */
    369 
    370 
    371 /* */
    372 
    373 FT_END_HEADER
    374 
    375 #endif /* __AFTYPES_H__ */
    376 
    377 
    378 /* END */
    379