Home | History | Annotate | Download | only in autofit
      1 /***************************************************************************/
      2 /*                                                                         */
      3 /*  aflatin.h                                                              */
      4 /*                                                                         */
      5 /*    Auto-fitter hinting routines for latin script (specification).       */
      6 /*                                                                         */
      7 /*  Copyright 2003-2007, 2009, 2011 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 __AFLATIN_H__
     20 #define __AFLATIN_H__
     21 
     22 #include "afhints.h"
     23 
     24 
     25 FT_BEGIN_HEADER
     26 
     27 
     28   /* the latin-specific script class */
     29 
     30   AF_DECLARE_SCRIPT_CLASS(af_latin_script_class)
     31 
     32 
     33   /* constants are given with units_per_em == 2048 in mind */
     34 #define AF_LATIN_CONSTANT( metrics, c )                                      \
     35   ( ( (c) * (FT_Long)( (AF_LatinMetrics)(metrics) )->units_per_em ) / 2048 )
     36 
     37 
     38   /*************************************************************************/
     39   /*************************************************************************/
     40   /*****                                                               *****/
     41   /*****            L A T I N   G L O B A L   M E T R I C S            *****/
     42   /*****                                                               *****/
     43   /*************************************************************************/
     44   /*************************************************************************/
     45 
     46 
     47   /*
     48    *  The following declarations could be embedded in the file `aflatin.c';
     49    *  they have been made semi-public to allow alternate script hinters to
     50    *  re-use some of them.
     51    */
     52 
     53 
     54   /* Latin (global) metrics management */
     55 
     56   enum
     57   {
     58     AF_LATIN_BLUE_CAPITAL_TOP,
     59     AF_LATIN_BLUE_CAPITAL_BOTTOM,
     60     AF_LATIN_BLUE_SMALL_F_TOP,
     61     AF_LATIN_BLUE_SMALL_TOP,
     62     AF_LATIN_BLUE_SMALL_BOTTOM,
     63     AF_LATIN_BLUE_SMALL_MINOR,
     64 
     65     AF_LATIN_BLUE_MAX
     66   };
     67 
     68 
     69 #define AF_LATIN_IS_TOP_BLUE( b )  ( (b) == AF_LATIN_BLUE_CAPITAL_TOP || \
     70                                      (b) == AF_LATIN_BLUE_SMALL_F_TOP || \
     71                                      (b) == AF_LATIN_BLUE_SMALL_TOP   )
     72 
     73 #define AF_LATIN_MAX_WIDTHS  16
     74 #define AF_LATIN_MAX_BLUES   AF_LATIN_BLUE_MAX
     75 
     76 
     77   enum
     78   {
     79     AF_LATIN_BLUE_ACTIVE     = 1 << 0,  /* set if zone height is <= 3/4px */
     80     AF_LATIN_BLUE_TOP        = 1 << 1,  /* result of AF_LATIN_IS_TOP_BLUE */
     81     AF_LATIN_BLUE_ADJUSTMENT = 1 << 2,  /* used for scale adjustment      */
     82                                         /* optimization                   */
     83     AF_LATIN_BLUE_FLAG_MAX
     84   };
     85 
     86 
     87   typedef struct  AF_LatinBlueRec_
     88   {
     89     AF_WidthRec  ref;
     90     AF_WidthRec  shoot;
     91     FT_UInt      flags;
     92 
     93   } AF_LatinBlueRec, *AF_LatinBlue;
     94 
     95 
     96   typedef struct  AF_LatinAxisRec_
     97   {
     98     FT_Fixed         scale;
     99     FT_Pos           delta;
    100 
    101     FT_UInt          width_count;                 /* number of used widths */
    102     AF_WidthRec      widths[AF_LATIN_MAX_WIDTHS]; /* widths array          */
    103     FT_Pos           edge_distance_threshold;   /* used for creating edges */
    104     FT_Pos           standard_width;         /* the default stem thickness */
    105     FT_Bool          extra_light;         /* is standard width very light? */
    106 
    107     /* ignored for horizontal metrics */
    108     FT_UInt          blue_count;
    109     AF_LatinBlueRec  blues[AF_LATIN_BLUE_MAX];
    110 
    111     FT_Fixed         org_scale;
    112     FT_Pos           org_delta;
    113 
    114   } AF_LatinAxisRec, *AF_LatinAxis;
    115 
    116 
    117   typedef struct  AF_LatinMetricsRec_
    118   {
    119     AF_ScriptMetricsRec  root;
    120     FT_UInt              units_per_em;
    121     AF_LatinAxisRec      axis[AF_DIMENSION_MAX];
    122 
    123   } AF_LatinMetricsRec, *AF_LatinMetrics;
    124 
    125 
    126   FT_LOCAL( FT_Error )
    127   af_latin_metrics_init( AF_LatinMetrics  metrics,
    128                          FT_Face          face );
    129 
    130   FT_LOCAL( void )
    131   af_latin_metrics_scale( AF_LatinMetrics  metrics,
    132                           AF_Scaler        scaler );
    133 
    134   FT_LOCAL( void )
    135   af_latin_metrics_init_widths( AF_LatinMetrics  metrics,
    136                                 FT_Face          face,
    137                                 FT_ULong         charcode );
    138 
    139   FT_LOCAL( void )
    140   af_latin_metrics_check_digits( AF_LatinMetrics  metrics,
    141                                  FT_Face          face );
    142 
    143 
    144   /*************************************************************************/
    145   /*************************************************************************/
    146   /*****                                                               *****/
    147   /*****           L A T I N   G L Y P H   A N A L Y S I S             *****/
    148   /*****                                                               *****/
    149   /*************************************************************************/
    150   /*************************************************************************/
    151 
    152   enum
    153   {
    154     AF_LATIN_HINTS_HORZ_SNAP   = 1 << 0, /* enable stem width snapping  */
    155     AF_LATIN_HINTS_VERT_SNAP   = 1 << 1, /* enable stem height snapping */
    156     AF_LATIN_HINTS_STEM_ADJUST = 1 << 2, /* enable stem width/height    */
    157                                          /* adjustment                  */
    158     AF_LATIN_HINTS_MONO        = 1 << 3  /* indicate monochrome         */
    159                                          /* rendering                   */
    160   };
    161 
    162 
    163 #define AF_LATIN_HINTS_DO_HORZ_SNAP( h )             \
    164   AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_HORZ_SNAP )
    165 
    166 #define AF_LATIN_HINTS_DO_VERT_SNAP( h )             \
    167   AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_VERT_SNAP )
    168 
    169 #define AF_LATIN_HINTS_DO_STEM_ADJUST( h )             \
    170   AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_STEM_ADJUST )
    171 
    172 #define AF_LATIN_HINTS_DO_MONO( h )             \
    173   AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_MONO )
    174 
    175 
    176   /*
    177    *  This shouldn't normally be exported.  However, other scripts might
    178    *  like to use this function as-is.
    179    */
    180   FT_LOCAL( FT_Error )
    181   af_latin_hints_compute_segments( AF_GlyphHints  hints,
    182                                    AF_Dimension   dim );
    183 
    184   /*
    185    *  This shouldn't normally be exported.  However, other scripts might
    186    *  want to use this function as-is.
    187    */
    188   FT_LOCAL( void )
    189   af_latin_hints_link_segments( AF_GlyphHints  hints,
    190                                 AF_Dimension   dim );
    191 
    192   /*
    193    *  This shouldn't normally be exported.  However, other scripts might
    194    *  want to use this function as-is.
    195    */
    196   FT_LOCAL( FT_Error )
    197   af_latin_hints_compute_edges( AF_GlyphHints  hints,
    198                                 AF_Dimension   dim );
    199 
    200   FT_LOCAL( FT_Error )
    201   af_latin_hints_detect_features( AF_GlyphHints  hints,
    202                                   AF_Dimension   dim );
    203 
    204 /* */
    205 
    206 FT_END_HEADER
    207 
    208 #endif /* __AFLATIN_H__ */
    209 
    210 
    211 /* END */
    212