ref: e793092d0a9f4d4d383315bcefd485dcbe4804b3
dir: /src/autofit/aftypes.h/
/*************************************************************************** * * FreeType auto-fitter * * (c) 2004 David Turner * * 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_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 *****/ /***** *****/ /**************************************************************************/ /**************************************************************************/ 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 *****/ /***** *****/ /**************************************************************************/ /**************************************************************************/ /* * Angle type. The auto-fitter doesn't need a very high angular accuracy, * and 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) /* * compute the angle of a given 2-D vector * */ FT_LOCAL( AF_Angle ) af_angle_atan( FT_Pos dx, FT_Pos dy ); /* * computes "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 ); /**************************************************************************/ /**************************************************************************/ /***** *****/ /***** 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; /* additionnal 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 correspond to the * following information: * * - a set of Unicode ranges to test weither 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, /* 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 a 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__ */