1 /****************************************************************************
   2  *
   3  * aflatin.h
   4  *
   5  *   Auto-fitter hinting routines for latin writing system
   6  *   (specification).
   7  *
   8  * Copyright (C) 2003-2019 by
   9  * David Turner, Robert Wilhelm, and Werner Lemberg.
  10  *
  11  * This file is part of the FreeType project, and may only be used,
  12  * modified, and distributed under the terms of the FreeType project
  13  * license, LICENSE.TXT.  By continuing to use, modify, or distribute
  14  * this file you indicate that you have read the license and
  15  * understand and accept it fully.
  16  *
  17  */
  18 
  19 
  20 #ifndef AFLATIN_H_
  21 #define AFLATIN_H_
  22 
  23 #include "afhints.h"
  24 
  25 
  26 FT_BEGIN_HEADER
  27 
  28   /* the `latin' writing system */
  29 
  30   AF_DECLARE_WRITING_SYSTEM_CLASS( af_latin_writing_system_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 writing system
  50    * hinters to re-use some of them.
  51    */
  52 
  53 
  54 #define AF_LATIN_IS_TOP_BLUE( b ) \
  55           ( (b)->properties & AF_BLUE_PROPERTY_LATIN_TOP )
  56 #define AF_LATIN_IS_SUB_TOP_BLUE( b ) \
  57           ( (b)->properties & AF_BLUE_PROPERTY_LATIN_SUB_TOP )
  58 #define AF_LATIN_IS_NEUTRAL_BLUE( b ) \
  59           ( (b)->properties & AF_BLUE_PROPERTY_LATIN_NEUTRAL )
  60 #define AF_LATIN_IS_X_HEIGHT_BLUE( b ) \
  61           ( (b)->properties & AF_BLUE_PROPERTY_LATIN_X_HEIGHT )
  62 #define AF_LATIN_IS_LONG_BLUE( b ) \
  63           ( (b)->properties & AF_BLUE_PROPERTY_LATIN_LONG )
  64 
  65 #define AF_LATIN_MAX_WIDTHS  16
  66 
  67 
  68 #define AF_LATIN_BLUE_ACTIVE      ( 1U << 0 ) /* zone height is <= 3/4px   */
  69 #define AF_LATIN_BLUE_TOP         ( 1U << 1 ) /* we have a top blue zone   */
  70 #define AF_LATIN_BLUE_SUB_TOP     ( 1U << 2 ) /* we have a subscript top   */
  71                                               /* blue zone                 */
  72 #define AF_LATIN_BLUE_NEUTRAL     ( 1U << 3 ) /* we have neutral blue zone */
  73 #define AF_LATIN_BLUE_ADJUSTMENT  ( 1U << 4 ) /* used for scale adjustment */
  74                                               /* optimization              */
  75 
  76 
  77   typedef struct  AF_LatinBlueRec_
  78   {
  79     AF_WidthRec  ref;
  80     AF_WidthRec  shoot;
  81     FT_Pos       ascender;
  82     FT_Pos       descender;
  83     FT_UInt      flags;
  84 
  85   } AF_LatinBlueRec, *AF_LatinBlue;
  86 
  87 
  88   typedef struct  AF_LatinAxisRec_
  89   {
  90     FT_Fixed         scale;
  91     FT_Pos           delta;
  92 
  93     FT_UInt          width_count;                 /* number of used widths */
  94     AF_WidthRec      widths[AF_LATIN_MAX_WIDTHS]; /* widths array          */
  95     FT_Pos           edge_distance_threshold;   /* used for creating edges */
  96     FT_Pos           standard_width;         /* the default stem thickness */
  97     FT_Bool          extra_light;         /* is standard width very light? */
  98 
  99     /* ignored for horizontal metrics */
 100     FT_UInt          blue_count;
 101     AF_LatinBlueRec  blues[AF_BLUE_STRINGSET_MAX];
 102 
 103     FT_Fixed         org_scale;
 104     FT_Pos           org_delta;
 105 
 106   } AF_LatinAxisRec, *AF_LatinAxis;
 107 
 108 
 109   typedef struct  AF_LatinMetricsRec_
 110   {
 111     AF_StyleMetricsRec  root;
 112     FT_UInt             units_per_em;
 113     AF_LatinAxisRec     axis[AF_DIMENSION_MAX];
 114 
 115   } AF_LatinMetricsRec, *AF_LatinMetrics;
 116 
 117 
 118   FT_LOCAL( FT_Error )
 119   af_latin_metrics_init( AF_LatinMetrics  metrics,
 120                          FT_Face          face );
 121 
 122   FT_LOCAL( void )
 123   af_latin_metrics_scale( AF_LatinMetrics  metrics,
 124                           AF_Scaler        scaler );
 125 
 126   FT_LOCAL( void )
 127   af_latin_metrics_init_widths( AF_LatinMetrics  metrics,
 128                                 FT_Face          face );
 129 
 130   FT_LOCAL( void )
 131   af_latin_metrics_check_digits( AF_LatinMetrics  metrics,
 132                                  FT_Face          face );
 133 
 134 
 135   /*************************************************************************/
 136   /*************************************************************************/
 137   /*****                                                               *****/
 138   /*****           L A T I N   G L Y P H   A N A L Y S I S             *****/
 139   /*****                                                               *****/
 140   /*************************************************************************/
 141   /*************************************************************************/
 142 
 143 #define AF_LATIN_HINTS_HORZ_SNAP    ( 1U << 0 ) /* stem width snapping  */
 144 #define AF_LATIN_HINTS_VERT_SNAP    ( 1U << 1 ) /* stem height snapping */
 145 #define AF_LATIN_HINTS_STEM_ADJUST  ( 1U << 2 ) /* stem width/height    */
 146                                                 /* adjustment           */
 147 #define AF_LATIN_HINTS_MONO         ( 1U << 3 ) /* monochrome rendering */
 148 
 149 
 150 #define AF_LATIN_HINTS_DO_HORZ_SNAP( h )             \
 151   AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_HORZ_SNAP )
 152 
 153 #define AF_LATIN_HINTS_DO_VERT_SNAP( h )             \
 154   AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_VERT_SNAP )
 155 
 156 #define AF_LATIN_HINTS_DO_STEM_ADJUST( h )             \
 157   AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_STEM_ADJUST )
 158 
 159 #define AF_LATIN_HINTS_DO_MONO( h )             \
 160   AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_MONO )
 161 
 162 
 163   /*
 164    * The next functions shouldn't normally be exported.  However, other
 165    * writing systems might like to use these functions as-is.
 166    */
 167   FT_LOCAL( FT_Error )
 168   af_latin_hints_compute_segments( AF_GlyphHints  hints,
 169                                    AF_Dimension   dim );
 170 
 171   FT_LOCAL( void )
 172   af_latin_hints_link_segments( AF_GlyphHints  hints,
 173                                 FT_UInt        width_count,
 174                                 AF_WidthRec*   widths,
 175                                 AF_Dimension   dim );
 176 
 177   FT_LOCAL( FT_Error )
 178   af_latin_hints_compute_edges( AF_GlyphHints  hints,
 179                                 AF_Dimension   dim );
 180 
 181   FT_LOCAL( FT_Error )
 182   af_latin_hints_detect_features( AF_GlyphHints  hints,
 183                                   FT_UInt        width_count,
 184                                   AF_WidthRec*   widths,
 185                                   AF_Dimension   dim );
 186 
 187 /* */
 188 
 189 FT_END_HEADER
 190 
 191 #endif /* AFLATIN_H_ */
 192 
 193 
 194 /* END */