1 /***************************************************************************/ 2 /* */ 3 /* aftypes.h */ 4 /* */ 5 /* Auto-fitter types (specification only). */ 6 /* */ 7 /* Copyright 2003-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 /************************************************************************* 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_widths( FT_UInt count, 91 AF_Width widths ); 92 93 94 /*************************************************************************/ 95 /*************************************************************************/ 96 /***** *****/ 97 /***** A N G L E T Y P E S *****/ 98 /***** *****/ 99 /*************************************************************************/ 100 /*************************************************************************/ 101 102 /* 103 * The auto-fitter doesn't need a very high angular accuracy; 104 * this allows us to speed up some computations considerably with a 105 * light Cordic algorithm (see afangles.c). 106 */ 107 108 typedef FT_Int AF_Angle; 109 110 111 #define AF_ANGLE_PI 256 112 #define AF_ANGLE_2PI ( AF_ANGLE_PI * 2 ) 113 #define AF_ANGLE_PI2 ( AF_ANGLE_PI / 2 ) 114 #define AF_ANGLE_PI4 ( AF_ANGLE_PI / 4 ) 115 116 117 #if 0 118 /* 119 * compute the angle of a given 2-D vector 120 */ 121 FT_LOCAL( AF_Angle ) 122 af_angle_atan( FT_Pos dx, 123 FT_Pos dy ); 124 125 126 /* 127 * compute `angle2 - angle1'; the result is always within 128 * the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1] 129 */ 130 FT_LOCAL( AF_Angle ) 131 af_angle_diff( AF_Angle angle1, 132 AF_Angle angle2 ); 133 #endif /* 0 */ 134 135 136 #define AF_ANGLE_DIFF( result, angle1, angle2 ) \ 137 FT_BEGIN_STMNT \ 138 AF_Angle _delta = (angle2) - (angle1); \ 139 \ 140 \ 141 _delta %= AF_ANGLE_2PI; \ 142 if ( _delta < 0 ) \ 143 _delta += AF_ANGLE_2PI; \ 144 \ 145 if ( _delta > AF_ANGLE_PI ) \ 146 _delta -= AF_ANGLE_2PI; \ 147 \ 148 result = _delta; \ 149 FT_END_STMNT 150 151 152 /* opaque handle to glyph-specific hints -- see `afhints.h' for more 153 * details 154 */ 155 typedef struct AF_GlyphHintsRec_* AF_GlyphHints; 156 157 158 /*************************************************************************/ 159 /*************************************************************************/ 160 /***** *****/ 161 /***** S C A L E R S *****/ 162 /***** *****/ 163 /*************************************************************************/ 164 /*************************************************************************/ 165 166 /* 167 * A scaler models the target pixel device that will receive the 168 * auto-hinted glyph image. 169 */ 170 171 typedef enum AF_ScalerFlags_ 172 { 173 AF_SCALER_FLAG_NO_HORIZONTAL = 1, /* disable horizontal hinting */ 174 AF_SCALER_FLAG_NO_VERTICAL = 2, /* disable vertical hinting */ 175 AF_SCALER_FLAG_NO_ADVANCE = 4 /* disable advance hinting */ 176 177 } AF_ScalerFlags; 178 179 180 typedef struct AF_ScalerRec_ 181 { 182 FT_Face face; /* source font face */ 183 FT_Fixed x_scale; /* from font units to 1/64th device pixels */ 184 FT_Fixed y_scale; /* from font units to 1/64th device pixels */ 185 FT_Pos x_delta; /* in 1/64th device pixels */ 186 FT_Pos y_delta; /* in 1/64th device pixels */ 187 FT_Render_Mode render_mode; /* monochrome, anti-aliased, LCD, etc. */ 188 FT_UInt32 flags; /* additional control flags, see above */ 189 190 } AF_ScalerRec, *AF_Scaler; 191 192 193 #define AF_SCALER_EQUAL_SCALES( a, b ) \ 194 ( (a)->x_scale == (b)->x_scale && \ 195 (a)->y_scale == (b)->y_scale && \ 196 (a)->x_delta == (b)->x_delta && \ 197 (a)->y_delta == (b)->y_delta ) 198 199 200 /*************************************************************************/ 201 /*************************************************************************/ 202 /***** *****/ 203 /***** S C R I P T S *****/ 204 /***** *****/ 205 /*************************************************************************/ 206 /*************************************************************************/ 207 208 /* 209 * The list of known scripts. Each different script corresponds to the 210 * following information: 211 * 212 * - A set of Unicode ranges to test whether the face supports the 213 * script. 214 * 215 * - A specific global analyzer that will compute global metrics 216 * specific to the script. 217 * 218 * - A specific glyph analyzer that will compute segments and 219 * edges for each glyph covered by the script. 220 * 221 * - A specific grid-fitting algorithm that will distort the 222 * scaled glyph outline according to the results of the glyph 223 * analyzer. 224 * 225 * Note that a given analyzer and/or grid-fitting algorithm can be 226 * used by more than one script. 227 */ 228 229 typedef enum AF_Script_ 230 { 231 AF_SCRIPT_NONE = 0, 232 AF_SCRIPT_LATIN = 1, 233 AF_SCRIPT_CJK = 2, 234 AF_SCRIPT_INDIC = 3, 235 #ifdef FT_OPTION_AUTOFIT2 236 AF_SCRIPT_LATIN2, 237 #endif 238 239 /* add new scripts here. Don't forget to update the list in */ 240 /* `afglobal.c'. */ 241 242 AF_SCRIPT_MAX /* do not remove */ 243 244 } AF_Script; 245 246 247 typedef struct AF_ScriptClassRec_ const* AF_ScriptClass; 248 249 typedef struct AF_ScriptMetricsRec_ 250 { 251 AF_ScriptClass clazz; 252 AF_ScalerRec scaler; 253 FT_Bool digits_have_same_width; 254 255 } AF_ScriptMetricsRec, *AF_ScriptMetrics; 256 257 258 /* This function parses an FT_Face to compute global metrics for 259 * a specific script. 260 */ 261 typedef FT_Error 262 (*AF_Script_InitMetricsFunc)( AF_ScriptMetrics metrics, 263 FT_Face face ); 264 265 typedef void 266 (*AF_Script_ScaleMetricsFunc)( AF_ScriptMetrics metrics, 267 AF_Scaler scaler ); 268 269 typedef void 270 (*AF_Script_DoneMetricsFunc)( AF_ScriptMetrics metrics ); 271 272 273 typedef FT_Error 274 (*AF_Script_InitHintsFunc)( AF_GlyphHints hints, 275 AF_ScriptMetrics metrics ); 276 277 typedef void 278 (*AF_Script_ApplyHintsFunc)( AF_GlyphHints hints, 279 FT_Outline* outline, 280 AF_ScriptMetrics metrics ); 281 282 283 typedef struct AF_Script_UniRangeRec_ 284 { 285 FT_UInt32 first; 286 FT_UInt32 last; 287 288 } AF_Script_UniRangeRec; 289 290 #define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) } 291 292 typedef const AF_Script_UniRangeRec *AF_Script_UniRange; 293 294 295 typedef struct AF_ScriptClassRec_ 296 { 297 AF_Script script; 298 AF_Script_UniRange script_uni_ranges; /* last must be { 0, 0 } */ 299 300 FT_Offset script_metrics_size; 301 AF_Script_InitMetricsFunc script_metrics_init; 302 AF_Script_ScaleMetricsFunc script_metrics_scale; 303 AF_Script_DoneMetricsFunc script_metrics_done; 304 305 AF_Script_InitHintsFunc script_hints_init; 306 AF_Script_ApplyHintsFunc script_hints_apply; 307 308 } AF_ScriptClassRec; 309 310 311 /* Declare and define vtables for classes */ 312 #ifndef FT_CONFIG_OPTION_PIC 313 314 #define AF_DECLARE_SCRIPT_CLASS( script_class ) \ 315 FT_CALLBACK_TABLE const AF_ScriptClassRec \ 316 script_class; 317 318 #define AF_DEFINE_SCRIPT_CLASS( script_class, script_, ranges, m_size, \ 319 m_init, m_scale, m_done, h_init, h_apply ) \ 320 FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec \ 321 script_class = \ 322 { \ 323 script_, \ 324 ranges, \ 325 \ 326 m_size, \ 327 \ 328 m_init, \ 329 m_scale, \ 330 m_done, \ 331 \ 332 h_init, \ 333 h_apply \ 334 }; 335 336 #else /* FT_CONFIG_OPTION_PIC */ 337 338 #define AF_DECLARE_SCRIPT_CLASS( script_class ) \ 339 FT_LOCAL( void ) \ 340 FT_Init_Class_##script_class( AF_ScriptClassRec* ac ); 341 342 #define AF_DEFINE_SCRIPT_CLASS( script_class, script_, ranges, m_size, \ 343 m_init, m_scale, m_done, h_init, h_apply ) \ 344 FT_LOCAL_DEF( void ) \ 345 FT_Init_Class_##script_class( AF_ScriptClassRec* ac ) \ 346 { \ 347 ac->script = script_; \ 348 ac->script_uni_ranges = ranges; \ 349 \ 350 ac->script_metrics_size = m_size; \ 351 \ 352 ac->script_metrics_init = m_init; \ 353 ac->script_metrics_scale = m_scale; \ 354 ac->script_metrics_done = m_done; \ 355 \ 356 ac->script_hints_init = h_init; \ 357 ac->script_hints_apply = h_apply; \ 358 } 359 360 #endif /* FT_CONFIG_OPTION_PIC */ 361 362 363 /* */ 364 365 FT_END_HEADER 366 367 #endif /* __AFTYPES_H__ */ 368 369 370 /* END */ 371