ref: 9950adcc11cf94b7d42d236e07fb2be0fb0a695b
dir: /src/autofit/aftypes.h/
/***************************************************************************/ /* */ /* aftypes.h */ /* */ /* Auto-fitter types (specification only). */ /* */ /* Copyright 2003, 2004, 2005, 2006 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /************************************************************************* * * The auto-fitter is a complete rewrite of the old auto-hinter. * Its main feature is the ability to differentiate between different * scripts in order to apply language-specific rules. * * The code has also been compartimentized into several entities that * should make algorithmic experimentation easier than with the old * code. * * Finally, we get rid of the Catharon license, since this code is * released under the FreeType one. * *************************************************************************/ #ifndef __AFTYPES_H__ #define __AFTYPES_H__ #include <ft2build.h> #include FT_FREETYPE_H #include FT_OUTLINE_H #include FT_INTERNAL_OBJECTS_H #include FT_INTERNAL_DEBUG_H FT_BEGIN_HEADER /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** D E B U G G I N G *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ #define xxAF_USE_WARPER /* only define to use warp hinting */ #define xxAF_DEBUG #ifdef AF_DEBUG #include <stdio.h> #define AF_LOG( x ) printf x #else #define AF_LOG( x ) do ; while ( 0 ) /* nothing */ #endif /* AF_DEBUG */ /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** U T I L I T Y S T U F F *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ typedef struct AF_WidthRec_ { FT_Pos org; /* original position/width in font units */ FT_Pos cur; /* current/scaled position/width in device sub-pixels */ FT_Pos fit; /* current/fitted position/width in device sub-pixels */ } AF_WidthRec, *AF_Width; FT_LOCAL( void ) af_sort_pos( FT_UInt count, FT_Pos* table ); FT_LOCAL( void ) af_sort_widths( FT_UInt count, AF_Width widths ); /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** A N G L E T Y P E S *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ /* * The auto-fitter doesn't need a very high angular accuracy; * this allows us to speed up some computations considerably with a * light Cordic algorithm (see afangles.c). */ typedef FT_Int AF_Angle; #define AF_ANGLE_PI 256 #define AF_ANGLE_2PI ( AF_ANGLE_PI * 2 ) #define AF_ANGLE_PI2 ( AF_ANGLE_PI / 2 ) #define AF_ANGLE_PI4 ( AF_ANGLE_PI / 4 ) #if 0 /* * compute the angle of a given 2-D vector */ FT_LOCAL( AF_Angle ) af_angle_atan( FT_Pos dx, FT_Pos dy ); /* * compute `angle2 - angle1'; the result is always within * the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1] */ FT_LOCAL( AF_Angle ) af_angle_diff( AF_Angle angle1, AF_Angle angle2 ); #endif /* 0 */ /* * Return TRUE if a corner is flat or nearly flat. This is equivalent to * saying that the angle difference between the `in' and `out' vectors is * very small. */ FT_LOCAL( FT_Int ) af_corner_is_flat( FT_Pos x_in, FT_Pos y_in, FT_Pos x_out, FT_Pos y_out ); /* * Return -1, 0, or +1, depending on the orientation of a given corner. * We use the Cartesian coordinate system, with positive vertical values * going upwards. The function returns +1 when the corner turns to the * left, -1 to the right, and 0 for undecided. */ FT_LOCAL( FT_Int ) af_corner_orientation( FT_Pos x_in, FT_Pos y_in, FT_Pos x_out, FT_Pos y_out ); #define AF_ANGLE_DIFF( result, angle1, angle2 ) \ FT_BEGIN_STMNT \ AF_Angle _delta = (angle2) - (angle1); \ \ \ _delta %= AF_ANGLE_2PI; \ if ( _delta < 0 ) \ _delta += AF_ANGLE_2PI; \ \ if ( _delta > AF_ANGLE_PI ) \ _delta -= AF_ANGLE_2PI; \ \ result = _delta; \ FT_END_STMNT /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** O U T L I N E S *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ /* opaque handle to glyph-specific hints -- see `afhints.h' for more * details */ typedef struct AF_GlyphHintsRec_* AF_GlyphHints; /* This structure is used to model an input glyph outline to * the auto-hinter. The latter will set the `hints' field * depending on the glyph's script. */ typedef struct AF_OutlineRec_ { FT_Face face; FT_Outline outline; FT_UInt outline_resolution; FT_Int advance; FT_UInt metrics_resolution; AF_GlyphHints hints; } AF_OutlineRec; /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** S C A L E R S *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ /* * A scaler models the target pixel device that will receive the * auto-hinted glyph image. */ typedef enum { AF_SCALER_FLAG_NO_HORIZONTAL = 1, /* disable horizontal hinting */ AF_SCALER_FLAG_NO_VERTICAL = 2, /* disable vertical hinting */ AF_SCALER_FLAG_NO_ADVANCE = 4 /* disable advance hinting */ } AF_ScalerFlags; typedef struct AF_ScalerRec_ { FT_Face face; /* source font face */ FT_Fixed x_scale; /* from font units to 1/64th device pixels */ FT_Fixed y_scale; /* from font units to 1/64th device pixels */ FT_Pos x_delta; /* in 1/64th device pixels */ FT_Pos y_delta; /* in 1/64th device pixels */ FT_Render_Mode render_mode; /* monochrome, anti-aliased, LCD, etc. */ FT_UInt32 flags; /* additional control flags, see above */ } AF_ScalerRec, *AF_Scaler; #define AF_SCALER_EQUAL_SCALES( a, b ) \ ( (a)->x_scale == (b)->x_scale && \ (a)->y_scale == (b)->y_scale && \ (a)->x_delta == (b)->x_delta && \ (a)->y_delta == (b)->y_delta ) /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** S C R I P T S *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ /* * The list of know scripts. Each different script corresponds to the * following information: * * - A set of Unicode ranges to test whether the face supports the * script. * * - A specific global analyzer that will compute global metrics * specific to the script. * * - A specific glyph analyzer that will compute segments and * edges for each glyph covered by the script. * * - A specific grid-fitting algorithm that will distort the * scaled glyph outline according to the results of the glyph * analyzer. * * Note that a given analyzer and/or grid-fitting algorithm can be * used by more than one script. */ typedef enum { AF_SCRIPT_NONE = 0, AF_SCRIPT_LATIN = 1, AF_SCRIPT_CJK = 2, /* add new scripts here. Don't forget to update the list in */ /* `afglobal.c'. */ AF_SCRIPT_MAX /* do not remove */ } AF_Script; typedef struct AF_ScriptClassRec_ const* AF_ScriptClass; typedef struct AF_ScriptMetricsRec_ { AF_ScriptClass clazz; AF_ScalerRec scaler; } AF_ScriptMetricsRec, *AF_ScriptMetrics; /* This function parses an FT_Face to compute global metrics for * a specific script. */ typedef FT_Error (*AF_Script_InitMetricsFunc)( AF_ScriptMetrics metrics, FT_Face face ); typedef void (*AF_Script_ScaleMetricsFunc)( AF_ScriptMetrics metrics, AF_Scaler scaler ); typedef void (*AF_Script_DoneMetricsFunc)( AF_ScriptMetrics metrics ); typedef FT_Error (*AF_Script_InitHintsFunc)( AF_GlyphHints hints, AF_ScriptMetrics metrics ); typedef void (*AF_Script_ApplyHintsFunc)( AF_GlyphHints hints, FT_Outline* outline, AF_ScriptMetrics metrics ); typedef struct AF_Script_UniRangeRec_ { FT_UInt32 first; FT_UInt32 last; } AF_Script_UniRangeRec; typedef const AF_Script_UniRangeRec *AF_Script_UniRange; typedef struct AF_ScriptClassRec_ { AF_Script script; AF_Script_UniRange script_uni_ranges; /* last must be { 0, 0 } */ FT_UInt script_metrics_size; AF_Script_InitMetricsFunc script_metrics_init; AF_Script_ScaleMetricsFunc script_metrics_scale; AF_Script_DoneMetricsFunc script_metrics_done; AF_Script_InitHintsFunc script_hints_init; AF_Script_ApplyHintsFunc script_hints_apply; } AF_ScriptClassRec; /* */ FT_END_HEADER #endif /* __AFTYPES_H__ */ /* END */