-/***************************************************************************/\r
-/* */\r
-/* afhints.h */\r
-/* */\r
-/* Auto-fitter hinting routines (specification). */\r
-/* */\r
-/* Copyright 2003, 2004, 2005, 2006, 2007 by */\r
-/* David Turner, Robert Wilhelm, and Werner Lemberg. */\r
-/* */\r
-/* This file is part of the FreeType project, and may only be used, */\r
-/* modified, and distributed under the terms of the FreeType project */\r
-/* license, LICENSE.TXT. By continuing to use, modify, or distribute */\r
-/* this file you indicate that you have read the license and */\r
-/* understand and accept it fully. */\r
-/* */\r
-/***************************************************************************/\r
-\r
-\r
-#ifndef __AFHINTS_H__\r
-#define __AFHINTS_H__\r
-\r
-#include "aftypes.h"\r
-\r
-#define xxAF_SORT_SEGMENTS\r
-\r
-FT_BEGIN_HEADER\r
-\r
- /*\r
- * The definition of outline glyph hints. These are shared by all\r
- * script analysis routines (until now).\r
- */\r
-\r
- typedef enum\r
- {\r
- AF_DIMENSION_HORZ = 0, /* x coordinates, */\r
- /* i.e., vertical segments & edges */\r
- AF_DIMENSION_VERT = 1, /* y coordinates, */\r
- /* i.e., horizontal segments & edges */\r
-\r
- AF_DIMENSION_MAX /* do not remove */\r
-\r
- } AF_Dimension;\r
-\r
-\r
- /* hint directions -- the values are computed so that two vectors are */\r
- /* in opposite directions iff `dir1 + dir2 == 0' */\r
- typedef enum\r
- {\r
- AF_DIR_NONE = 4,\r
- AF_DIR_RIGHT = 1,\r
- AF_DIR_LEFT = -1,\r
- AF_DIR_UP = 2,\r
- AF_DIR_DOWN = -2\r
-\r
- } AF_Direction;\r
-\r
-\r
- /* point hint flags */\r
- typedef enum\r
- {\r
- AF_FLAG_NONE = 0,\r
-\r
- /* point type flags */\r
- AF_FLAG_CONIC = 1 << 0,\r
- AF_FLAG_CUBIC = 1 << 1,\r
- AF_FLAG_CONTROL = AF_FLAG_CONIC | AF_FLAG_CUBIC,\r
-\r
- /* point extremum flags */\r
- AF_FLAG_EXTREMA_X = 1 << 2,\r
- AF_FLAG_EXTREMA_Y = 1 << 3,\r
-\r
- /* point roundness flags */\r
- AF_FLAG_ROUND_X = 1 << 4,\r
- AF_FLAG_ROUND_Y = 1 << 5,\r
-\r
- /* point touch flags */\r
- AF_FLAG_TOUCH_X = 1 << 6,\r
- AF_FLAG_TOUCH_Y = 1 << 7,\r
-\r
- /* candidates for weak interpolation have this flag set */\r
- AF_FLAG_WEAK_INTERPOLATION = 1 << 8,\r
-\r
- /* all inflection points in the outline have this flag set */\r
- AF_FLAG_INFLECTION = 1 << 9\r
-\r
- } AF_Flags;\r
-\r
-\r
- /* edge hint flags */\r
- typedef enum\r
- {\r
- AF_EDGE_NORMAL = 0,\r
- AF_EDGE_ROUND = 1 << 0,\r
- AF_EDGE_SERIF = 1 << 1,\r
- AF_EDGE_DONE = 1 << 2\r
-\r
- } AF_Edge_Flags;\r
-\r
-\r
- typedef struct AF_PointRec_* AF_Point;\r
- typedef struct AF_SegmentRec_* AF_Segment;\r
- typedef struct AF_EdgeRec_* AF_Edge;\r
-\r
-\r
- typedef struct AF_PointRec_\r
- {\r
- FT_UShort flags; /* point flags used by hinter */\r
- FT_Char in_dir; /* direction of inwards vector */\r
- FT_Char out_dir; /* direction of outwards vector */\r
-\r
- FT_Pos ox, oy; /* original, scaled position */\r
- FT_Short fx, fy; /* original, unscaled position (font units) */\r
- FT_Pos x, y; /* current position */\r
- FT_Pos u, v; /* current (x,y) or (y,x) depending on context */\r
-\r
- AF_Point next; /* next point in contour */\r
- AF_Point prev; /* previous point in contour */\r
-\r
- } AF_PointRec;\r
-\r
-\r
- typedef struct AF_SegmentRec_\r
- {\r
- FT_Byte flags; /* edge/segment flags for this segment */\r
- FT_Char dir; /* segment direction */\r
- FT_Short pos; /* position of segment */\r
- FT_Short min_coord; /* minimum coordinate of segment */\r
- FT_Short max_coord; /* maximum coordinate of segment */\r
- FT_Short height; /* the hinted segment height */\r
-\r
- AF_Edge edge; /* the segment's parent edge */\r
- AF_Segment edge_next; /* link to next segment in parent edge */\r
-\r
- AF_Segment link; /* (stem) link segment */\r
- AF_Segment serif; /* primary segment for serifs */\r
- FT_Pos num_linked; /* number of linked segments */\r
- FT_Pos score; /* used during stem matching */\r
- FT_Pos len; /* used during stem matching */\r
-\r
- AF_Point first; /* first point in edge segment */\r
- AF_Point last; /* last point in edge segment */\r
- AF_Point* contour; /* ptr to first point of segment's contour */\r
-\r
- } AF_SegmentRec;\r
-\r
-\r
- typedef struct AF_EdgeRec_\r
- {\r
- FT_Short fpos; /* original, unscaled position (font units) */\r
- FT_Pos opos; /* original, scaled position */\r
- FT_Pos pos; /* current position */\r
-\r
- FT_Byte flags; /* edge flags */\r
- FT_Char dir; /* edge direction */\r
- FT_Fixed scale; /* used to speed up interpolation between edges */\r
- AF_Width blue_edge; /* non-NULL if this is a blue edge */\r
-\r
- AF_Edge link;\r
- AF_Edge serif;\r
- FT_Short num_linked;\r
-\r
- FT_Int score;\r
-\r
- AF_Segment first;\r
- AF_Segment last;\r
-\r
- } AF_EdgeRec;\r
-\r
-\r
- typedef struct AF_AxisHintsRec_\r
- {\r
- FT_Int num_segments;\r
- FT_Int max_segments;\r
- AF_Segment segments;\r
-#ifdef AF_SORT_SEGMENTS\r
- FT_Int mid_segments;\r
-#endif\r
-\r
- FT_Int num_edges;\r
- FT_Int max_edges;\r
- AF_Edge edges;\r
-\r
- AF_Direction major_dir;\r
-\r
- } AF_AxisHintsRec, *AF_AxisHints;\r
-\r
-\r
- typedef struct AF_GlyphHintsRec_\r
- {\r
- FT_Memory memory;\r
-\r
- FT_Fixed x_scale;\r
- FT_Pos x_delta;\r
-\r
- FT_Fixed y_scale;\r
- FT_Pos y_delta;\r
-\r
- FT_Pos edge_distance_threshold;\r
-\r
- FT_Int max_points;\r
- FT_Int num_points;\r
- AF_Point points;\r
-\r
- FT_Int max_contours;\r
- FT_Int num_contours;\r
- AF_Point* contours;\r
-\r
- AF_AxisHintsRec axis[AF_DIMENSION_MAX];\r
-\r
- FT_UInt32 scaler_flags; /* copy of scaler flags */\r
- FT_UInt32 other_flags; /* free for script-specific */\r
- /* implementations */\r
- AF_ScriptMetrics metrics;\r
-\r
- FT_Pos xmin_delta; /* used for warping */\r
- FT_Pos xmax_delta;\r
-\r
- } AF_GlyphHintsRec;\r
-\r
-\r
-#define AF_HINTS_TEST_SCALER( h, f ) ( (h)->scaler_flags & (f) )\r
-#define AF_HINTS_TEST_OTHER( h, f ) ( (h)->other_flags & (f) )\r
-\r
-\r
-#ifdef AF_DEBUG\r
-\r
-#define AF_HINTS_DO_HORIZONTAL( h ) \\r
- ( !_af_debug_disable_horz_hints && \\r
- !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL ) )\r
-\r
-#define AF_HINTS_DO_VERTICAL( h ) \\r
- ( !_af_debug_disable_vert_hints && \\r
- !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) )\r
-\r
-#define AF_HINTS_DO_ADVANCE( h ) \\r
- !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE )\r
-\r
-#define AF_HINTS_DO_BLUES( h ) ( !_af_debug_disable_blue_hints )\r
-\r
-#else /* !AF_DEBUG */\r
-\r
-#define AF_HINTS_DO_HORIZONTAL( h ) \\r
- !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL )\r
-\r
-#define AF_HINTS_DO_VERTICAL( h ) \\r
- !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL )\r
-\r
-#define AF_HINTS_DO_ADVANCE( h ) \\r
- !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE )\r
-\r
-#define AF_HINTS_DO_BLUES( h ) 1\r
-\r
-#endif /* !AF_DEBUG */\r
-\r
-\r
- FT_LOCAL( AF_Direction )\r
- af_direction_compute( FT_Pos dx,\r
- FT_Pos dy );\r
-\r
-\r
- FT_LOCAL( FT_Error )\r
- af_axis_hints_new_segment( AF_AxisHints axis,\r
- FT_Memory memory,\r
- AF_Segment *asegment );\r
-\r
- FT_LOCAL( FT_Error)\r
- af_axis_hints_new_edge( AF_AxisHints axis,\r
- FT_Int fpos,\r
- AF_Direction dir,\r
- FT_Memory memory,\r
- AF_Edge *edge );\r
-\r
- FT_LOCAL( void )\r
- af_glyph_hints_init( AF_GlyphHints hints,\r
- FT_Memory memory );\r
-\r
-\r
-\r
- /*\r
- * recompute all AF_Point in a AF_GlyphHints from the definitions\r
- * in a source outline\r
- */\r
- FT_LOCAL( void )\r
- af_glyph_hints_rescale( AF_GlyphHints hints,\r
- AF_ScriptMetrics metrics );\r
-\r
- FT_LOCAL( FT_Error )\r
- af_glyph_hints_reload( AF_GlyphHints hints,\r
- FT_Outline* outline,\r
- FT_Bool get_inflections );\r
-\r
- FT_LOCAL( void )\r
- af_glyph_hints_save( AF_GlyphHints hints,\r
- FT_Outline* outline );\r
-\r
- FT_LOCAL( void )\r
- af_glyph_hints_align_edge_points( AF_GlyphHints hints,\r
- AF_Dimension dim );\r
-\r
- FT_LOCAL( void )\r
- af_glyph_hints_align_strong_points( AF_GlyphHints hints,\r
- AF_Dimension dim );\r
-\r
- FT_LOCAL( void )\r
- af_glyph_hints_align_weak_points( AF_GlyphHints hints,\r
- AF_Dimension dim );\r
-\r
-#ifdef AF_USE_WARPER\r
- FT_LOCAL( void )\r
- af_glyph_hints_scale_dim( AF_GlyphHints hints,\r
- AF_Dimension dim,\r
- FT_Fixed scale,\r
- FT_Pos delta );\r
-#endif\r
-\r
- FT_LOCAL( void )\r
- af_glyph_hints_done( AF_GlyphHints hints );\r
-\r
-/* */\r
-\r
-#define AF_SEGMENT_LEN( seg ) ( (seg)->max_coord - (seg)->min_coord )\r
-\r
-#define AF_SEGMENT_DIST( seg1, seg2 ) ( ( (seg1)->pos > (seg2)->pos ) \\r
- ? (seg1)->pos - (seg2)->pos \\r
- : (seg2)->pos - (seg1)->pos )\r
-\r
-\r
-FT_END_HEADER\r
-\r
-#endif /* __AFHINTS_H__ */\r
-\r
-\r
-/* END */\r
+/***************************************************************************/
+/* */
+/* afhints.h */
+/* */
+/* Auto-fitter hinting routines (specification). */
+/* */
+/* Copyright 2003, 2004, 2005, 2006, 2007 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. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __AFHINTS_H__
+#define __AFHINTS_H__
+
+#include "aftypes.h"
+
+#define xxAF_SORT_SEGMENTS
+
+FT_BEGIN_HEADER
+
+ /*
+ * The definition of outline glyph hints. These are shared by all
+ * script analysis routines (until now).
+ */
+
+ typedef enum
+ {
+ AF_DIMENSION_HORZ = 0, /* x coordinates, */
+ /* i.e., vertical segments & edges */
+ AF_DIMENSION_VERT = 1, /* y coordinates, */
+ /* i.e., horizontal segments & edges */
+
+ AF_DIMENSION_MAX /* do not remove */
+
+ } AF_Dimension;
+
+
+ /* hint directions -- the values are computed so that two vectors are */
+ /* in opposite directions iff `dir1 + dir2 == 0' */
+ typedef enum
+ {
+ AF_DIR_NONE = 4,
+ AF_DIR_RIGHT = 1,
+ AF_DIR_LEFT = -1,
+ AF_DIR_UP = 2,
+ AF_DIR_DOWN = -2
+
+ } AF_Direction;
+
+
+ /* point hint flags */
+ typedef enum
+ {
+ AF_FLAG_NONE = 0,
+
+ /* point type flags */
+ AF_FLAG_CONIC = 1 << 0,
+ AF_FLAG_CUBIC = 1 << 1,
+ AF_FLAG_CONTROL = AF_FLAG_CONIC | AF_FLAG_CUBIC,
+
+ /* point extremum flags */
+ AF_FLAG_EXTREMA_X = 1 << 2,
+ AF_FLAG_EXTREMA_Y = 1 << 3,
+
+ /* point roundness flags */
+ AF_FLAG_ROUND_X = 1 << 4,
+ AF_FLAG_ROUND_Y = 1 << 5,
+
+ /* point touch flags */
+ AF_FLAG_TOUCH_X = 1 << 6,
+ AF_FLAG_TOUCH_Y = 1 << 7,
+
+ /* candidates for weak interpolation have this flag set */
+ AF_FLAG_WEAK_INTERPOLATION = 1 << 8,
+
+ /* all inflection points in the outline have this flag set */
+ AF_FLAG_INFLECTION = 1 << 9
+
+ } AF_Flags;
+
+
+ /* edge hint flags */
+ typedef enum
+ {
+ AF_EDGE_NORMAL = 0,
+ AF_EDGE_ROUND = 1 << 0,
+ AF_EDGE_SERIF = 1 << 1,
+ AF_EDGE_DONE = 1 << 2
+
+ } AF_Edge_Flags;
+
+
+ typedef struct AF_PointRec_* AF_Point;
+ typedef struct AF_SegmentRec_* AF_Segment;
+ typedef struct AF_EdgeRec_* AF_Edge;
+
+
+ typedef struct AF_PointRec_
+ {
+ FT_UShort flags; /* point flags used by hinter */
+ FT_Char in_dir; /* direction of inwards vector */
+ FT_Char out_dir; /* direction of outwards vector */
+
+ FT_Pos ox, oy; /* original, scaled position */
+ FT_Short fx, fy; /* original, unscaled position (font units) */
+ FT_Pos x, y; /* current position */
+ FT_Pos u, v; /* current (x,y) or (y,x) depending on context */
+
+ AF_Point next; /* next point in contour */
+ AF_Point prev; /* previous point in contour */
+
+ } AF_PointRec;
+
+
+ typedef struct AF_SegmentRec_
+ {
+ FT_Byte flags; /* edge/segment flags for this segment */
+ FT_Char dir; /* segment direction */
+ FT_Short pos; /* position of segment */
+ FT_Short min_coord; /* minimum coordinate of segment */
+ FT_Short max_coord; /* maximum coordinate of segment */
+ FT_Short height; /* the hinted segment height */
+
+ AF_Edge edge; /* the segment's parent edge */
+ AF_Segment edge_next; /* link to next segment in parent edge */
+
+ AF_Segment link; /* (stem) link segment */
+ AF_Segment serif; /* primary segment for serifs */
+ FT_Pos num_linked; /* number of linked segments */
+ FT_Pos score; /* used during stem matching */
+ FT_Pos len; /* used during stem matching */
+
+ AF_Point first; /* first point in edge segment */
+ AF_Point last; /* last point in edge segment */
+ AF_Point* contour; /* ptr to first point of segment's contour */
+
+ } AF_SegmentRec;
+
+
+ typedef struct AF_EdgeRec_
+ {
+ FT_Short fpos; /* original, unscaled position (font units) */
+ FT_Pos opos; /* original, scaled position */
+ FT_Pos pos; /* current position */
+
+ FT_Byte flags; /* edge flags */
+ FT_Char dir; /* edge direction */
+ FT_Fixed scale; /* used to speed up interpolation between edges */
+ AF_Width blue_edge; /* non-NULL if this is a blue edge */
+
+ AF_Edge link;
+ AF_Edge serif;
+ FT_Short num_linked;
+
+ FT_Int score;
+
+ AF_Segment first;
+ AF_Segment last;
+
+ } AF_EdgeRec;
+
+
+ typedef struct AF_AxisHintsRec_
+ {
+ FT_Int num_segments;
+ FT_Int max_segments;
+ AF_Segment segments;
+#ifdef AF_SORT_SEGMENTS
+ FT_Int mid_segments;
+#endif
+
+ FT_Int num_edges;
+ FT_Int max_edges;
+ AF_Edge edges;
+
+ AF_Direction major_dir;
+
+ } AF_AxisHintsRec, *AF_AxisHints;
+
+
+ typedef struct AF_GlyphHintsRec_
+ {
+ FT_Memory memory;
+
+ FT_Fixed x_scale;
+ FT_Pos x_delta;
+
+ FT_Fixed y_scale;
+ FT_Pos y_delta;
+
+ FT_Pos edge_distance_threshold;
+
+ FT_Int max_points;
+ FT_Int num_points;
+ AF_Point points;
+
+ FT_Int max_contours;
+ FT_Int num_contours;
+ AF_Point* contours;
+
+ AF_AxisHintsRec axis[AF_DIMENSION_MAX];
+
+ FT_UInt32 scaler_flags; /* copy of scaler flags */
+ FT_UInt32 other_flags; /* free for script-specific */
+ /* implementations */
+ AF_ScriptMetrics metrics;
+
+ FT_Pos xmin_delta; /* used for warping */
+ FT_Pos xmax_delta;
+
+ } AF_GlyphHintsRec;
+
+
+#define AF_HINTS_TEST_SCALER( h, f ) ( (h)->scaler_flags & (f) )
+#define AF_HINTS_TEST_OTHER( h, f ) ( (h)->other_flags & (f) )
+
+
+#ifdef AF_DEBUG
+
+#define AF_HINTS_DO_HORIZONTAL( h ) \
+ ( !_af_debug_disable_horz_hints && \
+ !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL ) )
+
+#define AF_HINTS_DO_VERTICAL( h ) \
+ ( !_af_debug_disable_vert_hints && \
+ !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) )
+
+#define AF_HINTS_DO_ADVANCE( h ) \
+ !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE )
+
+#define AF_HINTS_DO_BLUES( h ) ( !_af_debug_disable_blue_hints )
+
+#else /* !AF_DEBUG */
+
+#define AF_HINTS_DO_HORIZONTAL( h ) \
+ !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL )
+
+#define AF_HINTS_DO_VERTICAL( h ) \
+ !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL )
+
+#define AF_HINTS_DO_ADVANCE( h ) \
+ !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE )
+
+#define AF_HINTS_DO_BLUES( h ) 1
+
+#endif /* !AF_DEBUG */
+
+
+ FT_LOCAL( AF_Direction )
+ af_direction_compute( FT_Pos dx,
+ FT_Pos dy );
+
+
+ FT_LOCAL( FT_Error )
+ af_axis_hints_new_segment( AF_AxisHints axis,
+ FT_Memory memory,
+ AF_Segment *asegment );
+
+ FT_LOCAL( FT_Error)
+ af_axis_hints_new_edge( AF_AxisHints axis,
+ FT_Int fpos,
+ AF_Direction dir,
+ FT_Memory memory,
+ AF_Edge *edge );
+
+ FT_LOCAL( void )
+ af_glyph_hints_init( AF_GlyphHints hints,
+ FT_Memory memory );
+
+
+
+ /*
+ * recompute all AF_Point in a AF_GlyphHints from the definitions
+ * in a source outline
+ */
+ FT_LOCAL( void )
+ af_glyph_hints_rescale( AF_GlyphHints hints,
+ AF_ScriptMetrics metrics );
+
+ FT_LOCAL( FT_Error )
+ af_glyph_hints_reload( AF_GlyphHints hints,
+ FT_Outline* outline,
+ FT_Bool get_inflections );
+
+ FT_LOCAL( void )
+ af_glyph_hints_save( AF_GlyphHints hints,
+ FT_Outline* outline );
+
+ FT_LOCAL( void )
+ af_glyph_hints_align_edge_points( AF_GlyphHints hints,
+ AF_Dimension dim );
+
+ FT_LOCAL( void )
+ af_glyph_hints_align_strong_points( AF_GlyphHints hints,
+ AF_Dimension dim );
+
+ FT_LOCAL( void )
+ af_glyph_hints_align_weak_points( AF_GlyphHints hints,
+ AF_Dimension dim );
+
+#ifdef AF_USE_WARPER
+ FT_LOCAL( void )
+ af_glyph_hints_scale_dim( AF_GlyphHints hints,
+ AF_Dimension dim,
+ FT_Fixed scale,
+ FT_Pos delta );
+#endif
+
+ FT_LOCAL( void )
+ af_glyph_hints_done( AF_GlyphHints hints );
+
+/* */
+
+#define AF_SEGMENT_LEN( seg ) ( (seg)->max_coord - (seg)->min_coord )
+
+#define AF_SEGMENT_DIST( seg1, seg2 ) ( ( (seg1)->pos > (seg2)->pos ) \
+ ? (seg1)->pos - (seg2)->pos \
+ : (seg2)->pos - (seg1)->pos )
+
+
+FT_END_HEADER
+
+#endif /* __AFHINTS_H__ */
+
+
+/* END */