19 #include FT_ADVANCES_H
26 #ifdef AF_CONFIG_OPTION_USE_WARPER
38 #define FT_COMPONENT trace_aflatin2
80 if ( glyph_index == 0 )
84 if ( error || face->glyph->outline.n_points <= 0 )
121 for ( ; seg <
limit; seg++ )
126 if ( link && link->
link == seg && link > seg )
131 dist = seg->
pos - link->
pos;
136 axis->
widths[num_widths++].org = dist;
167 #define AF_LATIN_MAX_TEST_CHARACTERS 12
201 FT_TRACE5((
"blue zones computation\n" ));
202 FT_TRACE5((
"------------------------------------------------\n" ));
217 for ( ; p < limit && *
p; p++ )
220 FT_Int best_point, best_y, best_first, best_last;
229 if ( glyph_index == 0 )
251 FT_Int old_best_point = best_point;
265 for ( pp = first; pp <= last; pp++ )
266 if ( best_point < 0 || points[pp].
y > best_y )
269 best_y = points[
pp].
y;
274 for ( pp = first; pp <= last; pp++ )
275 if ( best_point < 0 || points[pp].
y < best_y )
278 best_y = points[
pp].
y;
282 if ( best_point != old_best_point )
301 start = end = best_point;
306 if ( prev < best_first )
309 dist = points[prev].
y - best_y;
310 if ( dist < -5 || dist > 5 )
315 }
while ( start != best_point );
320 if ( next > best_last )
323 dist = points[next].
y - best_y;
324 if ( dist < -5 || dist > 5 )
329 }
while ( end != best_point );
340 rounds[num_rounds++] = best_y;
342 flats[num_flats++] = best_y;
347 if ( num_flats == 0 && num_rounds == 0 )
364 blue_ref = & blue->
ref.org;
365 blue_shoot = & blue->
shoot.org;
369 if ( num_flats == 0 )
372 *blue_shoot = rounds[num_rounds / 2];
374 else if ( num_rounds == 0 )
377 *blue_shoot = flats[num_flats / 2];
381 *blue_ref = flats[num_flats / 2];
382 *blue_shoot = rounds[num_rounds / 2];
388 if ( *blue_shoot != *blue_ref )
391 FT_Pos shoot = *blue_shoot;
396 *blue_shoot = *blue_ref = ( shoot +
ref ) / 2;
411 FT_TRACE5((
"-- ref = %ld, shoot = %ld\n", *blue_ref, *blue_shoot ));
423 FT_Bool started = 0, same_width = 1;
429 for ( i = 0x30; i <= 0x39; i++ )
435 if ( glyph_index == 0 )
447 if ( advance != old_advance )
455 old_advance = advance;
460 metrics->root.digits_have_same_width = same_width;
475 FT_ENCODING_APPLE_ROMAN,
476 FT_ENCODING_ADOBE_STANDARD,
477 FT_ENCODING_ADOBE_LATIN_1,
482 metrics->units_per_em = face->units_per_EM;
485 for ( ee = 0; latin_encodings[ee] != FT_ENCODING_NONE; ee++ )
527 axis = &metrics->
axis[dim];
549 blue = &vaxis->
blues[nn];
557 FT_Pos fitted = ( scaled + 40 ) & ~63;
560 if ( scaled != fitted )
562 scale =
FT_MulDiv( scale, fitted, scaled );
564 " fitted = %.2g, scaling = %.4g\n",
565 scaled / 64.0, fitted / 64.0,
566 ( fitted * 1.0 ) / scaled ));
592 width->cur =
FT_MulFix( width->org, scale );
593 width->fit = width->cur;
611 blue->
ref.fit = blue->
ref.cur;
618 if ( dist <= 48 && dist >= -48 )
622 delta1 = blue->
shoot.org - blue->
ref.org;
631 else if ( delta2 < 64 )
632 delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 );
640 blue->
shoot.fit = blue->
ref.fit + delta2;
642 FT_TRACE5((
">> activating blue zone %d:"
643 " ref.cur=%.2g ref.fit=%.2g"
644 " shoot.cur=%.2g shoot.fit=%.2g\n",
645 nn, blue->
ref.cur / 64.0, blue->
ref.fit / 64.0,
646 blue->
shoot.cur / 64.0, blue->
shoot.fit / 64.0 ));
659 metrics->root.scaler.render_mode = scaler->render_mode;
660 metrics->root.scaler.face = scaler->face;
675 #define SORT_SEGMENTS
686 AF_Point* contour = hints->contours;
687 AF_Point* contour_limit = contour + hints->num_contours;
696 segment_dir = major_dir;
707 for ( ; point <
limit; point++ )
709 point->
u = point->
fx;
710 point->
v = point->
fy;
719 for ( ; point <
limit; point++ )
721 point->
u = point->
fy;
722 point->
v = point->
fx;
727 for ( ; contour < contour_limit; contour++ )
751 if ( point == start )
761 FT_Pos min_u, min_v, max_u, max_v;
768 min_u = max_u = point->
u;
769 min_v = max_v = point->
v;
777 if ( point->
u < min_u )
780 if ( point->
u > max_u )
784 if ( point->
v < min_v )
787 if ( point->
v > max_v )
798 segment->
last = point;
815 for ( ; pt != last; f0 = f1 )
831 if ( point == start )
839 if ( point == start )
855 for ( segment = segments; segment < segments_end; segment++ )
867 if ( first_v < last_v )
870 if ( p->
v < first_v )
872 ( ( first_v - p->
v ) >> 1 ) );
877 ( ( p->
v - last_v ) >> 1 ) );
882 if ( p->
v > first_v )
884 ( ( p->
v - first_v ) >> 1 ) );
889 ( ( last_v - p->
v ) >> 1 ) );
894 #ifdef AF_SORT_SEGMENTS
903 for (ii = 0; ii <
count; ii++)
905 if ( segments[ii].dir > 0 )
907 for (jj = ii+1; jj <
count; jj++)
909 if ( segments[jj].dir < 0 )
914 segments[ii] = segments[jj];
925 axis->mid_segments = ii;
941 #ifdef AF_SORT_SEGMENTS
942 AF_Segment segment_mid = segments + axis->mid_segments;
944 FT_Pos len_threshold, len_score;
949 if ( len_threshold == 0 )
954 #ifdef AF_SORT_SEGMENTS
955 for ( seg1 = segments; seg1 < segment_mid; seg1++ )
960 for ( seg2 = segment_mid; seg2 < segment_limit; seg2++ )
963 for ( seg1 = segments; seg1 < segment_limit; seg1++ )
970 for ( seg2 = segments; seg2 < segment_limit; seg2++ )
971 if ( seg1->
dir + seg2->
dir == 0 && seg2->
pos > seg1->
pos )
976 FT_Pos dist = pos2 - pos1;
988 if ( min < seg2->min_coord )
995 if ( len >= len_threshold )
997 score = dist + len_score /
len;
998 if ( score < seg1->score )
1000 seg1->
score = score;
1004 if ( score < seg2->score )
1006 seg2->
score = score;
1018 for ( seg1 = segments; seg1 < segment_limit; seg1++ )
1024 if ( seg2->
link != seg1 )
1049 FT_Pos edge_distance_threshold;
1050 FT_Pos segment_length_threshold;
1075 segment_length_threshold =
FT_DivFix( 64, hints->y_scale );
1078 segment_length_threshold = 0;
1098 if ( edge_distance_threshold > 64 / 4 )
1099 edge_distance_threshold = 64 / 4;
1101 edge_distance_threshold =
FT_DivFix( edge_distance_threshold,
1104 for ( seg = segments; seg < segment_limit; seg++ )
1110 if ( seg->
height < segment_length_threshold )
1127 else if ( 2*seg->
height < 3 * segment_length_threshold )
1132 for ( ee = 0; ee < axis->
num_edges; ee++ )
1142 if ( dist < edge_distance_threshold && edge->dir == seg->
dir )
1208 for ( edge = edges; edge < edge_limit; edge++ )
1217 }
while ( seg != edge->
first );
1221 for ( edge = edges; edge < edge_limit; edge++ )
1246 if ( seg->
dir == up_dir )
1270 edge2 = edge->
serif;
1279 edge_delta = edge->
fpos - edge2->
fpos;
1280 if ( edge_delta < 0 )
1281 edge_delta = -edge_delta;
1283 seg_delta = seg->
pos - seg2->
pos;
1284 if ( seg_delta < 0 )
1285 seg_delta = -seg_delta;
1287 if ( seg_delta < edge_delta )
1295 edge->
serif = edge2;
1304 }
while ( seg != edge->
first );
1309 if ( is_round > 0 && is_round >= is_straight )
1319 else if ( ups < downs )
1322 else if ( ups == downs )
1371 best_dist0 =
FT_MulFix( metrics->units_per_em / 40, scale );
1373 if ( best_dist0 > 64 / 2 )
1374 best_dist0 = 64 / 2;
1380 for ( ; edge < edge_limit; edge++ )
1384 FT_Pos best_dist = best_dist0;
1389 FT_Bool is_top_blue, is_major_dir;
1406 if ( is_top_blue ^ is_major_dir )
1415 compare = &blue->
shoot;
1417 compare = &blue->
ref;
1419 dist = edge->
fpos - compare->org;
1424 if ( dist < best_dist )
1427 best_blue = compare;
1439 if ( is_top_blue ^ is_under_ref )
1441 blue = latin->
blues + bb;
1447 if ( dist < best_dist )
1450 best_blue = & blue->
shoot;
1469 FT_UInt32 scaler_flags, other_flags;
1552 FT_Pos best = 64 + 32 + 2;
1557 for ( n = 0; n <
count; n++ )
1576 if ( width >= reference )
1578 if ( width < scaled + 48 )
1583 if ( width > scaled - 48 )
1626 if ( ( stem_flags &
AF_EDGE_SERIF ) && vertical && ( dist < 3 * 64 ) )
1635 else if ( dist < 56 )
1638 if ( axis->width_count > 0 )
1644 if ( axis->width_count > 0 )
1646 delta = dist - axis->widths[0].cur;
1653 dist = axis->widths[0].cur;
1661 if ( dist < 3 * 64 )
1669 else if ( delta < 32 )
1672 else if ( delta < 54 )
1679 dist = ( dist + 32 ) & ~63;
1696 dist = ( dist + 16 ) & ~63;
1710 dist = ( dist + 32 ) & ~63;
1719 dist = ( dist + 64 ) >> 1;
1721 else if ( dist < 128 )
1732 dist = ( dist + 22 ) & ~63;
1733 delta = dist - org_dist;
1741 dist = ( dist + 64 ) >> 1;
1746 dist = ( dist + 32 ) & ~63;
1775 stem_edge->
pos = base_edge->
pos + fitted_width;
1777 FT_TRACE5((
"LINK: edge %d (opos=%.2f) linked to (%.2f), "
1778 "dist was %.2f, now %.2f\n",
1780 stem_edge->
pos / 64.0, dist / 64.0, fitted_width / 64.0 ));
1820 FT_TRACE5((
"==== hinting %s edges =====\n",
1828 for ( edge = edges; edge < edge_limit; edge++ )
1855 FT_TRACE5((
"BLUE: edge %d (opos=%.2f) snapped to (%.2f), "
1857 edge1-edges, edge1->
opos / 64.0, blue->fit / 64.0,
1858 edge1->
pos / 64.0 ));
1860 edge1->
pos = blue->fit;
1873 anchor_drift = (anchor->
pos - anchor->
opos);
1875 anchor_drift = (anchor_drift + (edge2->
pos - edge2->
opos)) >> 1;
1882 for ( edge = edges; edge < edge_limit; edge++ )
1903 FT_TRACE5((
"ASSERTION FAILED for edge %d\n", edge2-edges ));
1912 FT_Pos org_len, org_center, cur_len;
1913 FT_Pos cur_pos1, error1, error2, u_off, d_off;
1916 org_len = edge2->
opos - edge->
opos;
1918 hints, dim, org_len,
1921 if ( cur_len <= 64 )
1931 org_center = edge->
opos + ( org_len >> 1 );
1935 error1 = org_center - ( cur_pos1 - u_off );
1939 error2 = org_center - ( cur_pos1 + d_off );
1943 if ( error1 < error2 )
1948 edge->
pos = cur_pos1 - cur_len / 2;
1949 edge2->
pos = edge->
pos + cur_len;
1954 FT_TRACE5((
"ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f)"
1955 " snapped to (%.2f) (%.2f)\n",
1956 edge-edges, edge->
opos / 64.0,
1957 edge2-edges, edge2->
opos / 64.0,
1958 edge->
pos / 64.0, edge2->
pos / 64.0 ));
1967 anchor_drift = ( (anchor->
pos - anchor->
opos) +
1968 (edge2->
pos - edge2->
opos)) >> 1;
1970 FT_TRACE5((
"DRIFT: %.2f\n", anchor_drift/64.0 ));
1974 FT_Pos org_pos, org_len, org_center, cur_center, cur_len;
1975 FT_Pos org_left, org_right;
1978 org_pos = edge->
opos + anchor_drift;
1979 org_len = edge2->
opos - edge->
opos;
1980 org_center = org_pos + ( org_len >> 1 );
1983 hints, dim, org_len,
1987 org_left = org_pos + ((org_len - cur_len) >> 1);
1988 org_right = org_pos + ((org_len + cur_len) >> 1);
1990 FT_TRACE5((
"ALIGN: left=%.2f right=%.2f ",
1991 org_left / 64.0, org_right / 64.0 ));
1992 cur_center = org_center;
1997 edge->
pos = edge2->
pos - cur_len;
2005 FT_Pos displacements[6], scores[6], org, fit, delta;
2030 FT_Pos frac_left = (org_left) & 63;
2031 FT_Pos frac_right = (org_right) & 63;
2033 if ( frac_left >= 22 && frac_left <= 42 &&
2034 frac_right >= 22 && frac_right <= 42 )
2037 fit = (org <= 32) ? 16 : 48;
2038 delta =
FT_ABS(fit - org);
2039 displacements[
count] = fit - org;
2040 scores[count++] = delta;
2041 FT_TRACE5((
"dispA=%.2f (%d) ", (fit - org) / 64.0, delta ));
2044 fit = (org <= 32) ? 16 : 48;
2045 delta =
FT_ABS(fit - org);
2046 displacements[
count] = fit - org;
2047 scores[count++] = delta;
2048 FT_TRACE5((
"dispB=%.2f (%d) ", (fit - org) / 64.0, delta ));
2055 delta =
FT_ABS(fit - org);
2056 displacements[
count] = fit - org;
2057 scores[count++] = delta;
2058 FT_TRACE5((
"dispC=%.2f (%d) ", (fit - org) / 64.0, delta ));
2063 delta =
FT_ABS(fit - org);
2064 displacements[
count] = fit - org;
2065 scores[count++] = delta;
2066 FT_TRACE5((
"dispD=%.2f (%d) ", (fit - org) / 64.0, delta ));
2070 FT_Pos best_score = scores[0];
2071 FT_Pos best_disp = displacements[0];
2074 for (nn = 1; nn <
count; nn++)
2076 if (scores[nn] < best_score)
2078 best_score = scores[nn];
2079 best_disp = displacements[nn];
2083 cur_center = org_center + best_disp;
2089 edge->
pos = cur_center - (cur_len >> 1);
2090 edge2->
pos = edge->
pos + cur_len;
2092 FT_TRACE5((
"STEM1: %d (opos=%.2f) to %d (opos=%.2f)"
2093 " snapped to (%.2f) and (%.2f),"
2094 " org_len=%.2f cur_len=%.2f\n",
2095 edge-edges, edge->
opos / 64.0,
2096 edge2-edges, edge2->
opos / 64.0,
2097 edge->
pos / 64.0, edge2->
pos / 64.0,
2098 org_len / 64.0, cur_len / 64.0 ));
2103 if ( edge > edges && edge->
pos < edge[-1].
pos )
2105 FT_TRACE5((
"BOUND: %d (pos=%.2f) to (%.2f)\n",
2106 edge-edges, edge->
pos / 64.0, edge[-1].
pos / 64.0 ));
2107 edge->
pos = edge[-1].
pos;
2129 FT_Int n_edges = edge_limit - edges;
2154 span = dist1 - dist2;
2160 delta = edge3->
pos - ( 2 * edge2->
pos - edge1->
pos );
2161 edge3->
pos -= delta;
2166 if ( n_edges == 12 )
2168 ( edges + 8 )->pos -= delta;
2169 ( edges + 11 )->pos -= delta;
2180 if ( has_serifs || !anchor )
2186 for ( edge = edges; edge < edge_limit; edge++ )
2203 if ( delta < 64 + 16 )
2206 FT_TRACE5((
"SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f)"
2207 " aligned to (%.2f)\n",
2208 edge-edges, edge->
opos / 64.0,
2210 edge->
pos / 64.0 ));
2214 FT_TRACE5((
"SERIF_ANCHOR: edge %d (opos=%.2f)"
2215 " snapped to (%.2f)\n",
2216 edge-edges, edge->
opos / 64.0, edge->
pos / 64.0 ));
2225 for ( before = edge - 1; before >= edges; before-- )
2229 for ( after = edge + 1; after < edge_limit; after++ )
2233 if ( before >= edges && before < edge &&
2234 after < edge_limit && after > edge )
2239 edge->pos = before->
pos +
2241 after->
pos - before->
pos,
2243 FT_TRACE5((
"SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f)"
2244 " from %d (opos=%.2f)\n",
2245 edge-edges, edge->
opos / 64.0, edge->pos / 64.0,
2246 before - edges, before->
opos / 64.0 ));
2250 edge->pos = anchor->
pos +
2251 ( ( edge->opos - anchor->
opos + 16 ) & ~31 );
2253 FT_TRACE5((
"SERIF_LINK2: edge %d (opos=%.2f)"
2254 " snapped to (%.2f)\n",
2255 edge-edges, edge->
opos / 64.0, edge->pos / 64.0 ));
2261 if ( edge > edges && edge->
pos < edge[-1].
pos )
2262 edge->
pos = edge[-1].
pos;
2264 if ( edge + 1 < edge_limit &&
2266 edge->
pos > edge[1].
pos )
2287 #ifdef AF_CONFIG_OPTION_USE_WARPER
2311 #ifdef AF_CONFIG_OPTION_USE_WARPER
2321 af_glyph_hints_scale_dim( hints, dim, scale, delta );
2361 af_latin2_uniranges,
af_glyph_hints_save(AF_GlyphHints hints, FT_Outline *outline)
#define AF_HINTS_DO_VERTICAL(h)
FT_DivFix(FT_Long a, FT_Long b)
static FT_Error af_latin2_hints_init(AF_GlyphHints hints, AF_LatinMetrics metrics)
af_glyph_hints_align_edge_points(AF_GlyphHints hints, AF_Dimension dim)
af_glyph_hints_done(AF_GlyphHints hints)
FT_BEGIN_HEADER typedef signed long FT_Pos
void(* AF_Script_ApplyHintsFunc)(AF_GlyphHints hints, FT_Outline *outline, AF_ScriptMetrics metrics)
static void af_latin2_align_linked_edge(AF_GlyphHints hints, AF_Dimension dim, AF_Edge base_edge, AF_Edge stem_edge)
static FT_Pos af_latin2_snap_width(AF_Width widths, FT_Int count, FT_Pos width)
af_glyph_hints_init(AF_GlyphHints hints, FT_Memory memory)
enum FT_Render_Mode_ FT_Render_Mode
#define FT_LOAD_NO_HINTING
FT_Error(* AF_Script_InitHintsFunc)(AF_GlyphHints hints, AF_ScriptMetrics metrics)
GLuint GLsizei GLsizei GLfloat * metrics
af_latin2_hint_edges(AF_GlyphHints hints, AF_Dimension dim)
struct AF_LatinMetricsRec_ * AF_LatinMetrics
enum AF_Direction_ AF_Direction
af_sort_widths(FT_UInt count, AF_Width table)
#define AF_UNIRANGE_REC(a, b)
#define AF_LATIN_MAX_TEST_CHARACTERS
af_glyph_hints_reload(AF_GlyphHints hints, FT_Outline *outline)
af_latin2_hints_detect_features(AF_GlyphHints hints, AF_Dimension dim)
FT_BEGIN_HEADER typedef unsigned char FT_Bool
af_latin2_hints_compute_edges(AF_GlyphHints hints, AF_Dimension dim)
af_latin2_metrics_scale(AF_LatinMetrics metrics, AF_Scaler scaler)
af_latin2_hints_compute_blue_edges(AF_GlyphHints hints, AF_LatinMetrics metrics)
AF_LatinAxisRec axis[AF_DIMENSION_MAX]
#define FT_ASSERT(condition)
af_axis_hints_new_edge(AF_AxisHints axis, FT_Int fpos, AF_Direction dir, FT_Memory memory, AF_Edge *aedge)
static FT_Error af_latin2_hints_apply(AF_GlyphHints hints, FT_Outline *outline, AF_LatinMetrics metrics)
FT_Load_Glyph(FT_Face face, FT_UInt glyph_index, FT_Int32 load_flags)
FT_Error(* AF_Script_InitMetricsFunc)(AF_ScriptMetrics metrics, FT_Face face)
FT_Get_Advance(FT_Face face, FT_UInt gindex, FT_Int32 load_flags, FT_Fixed *padvance)
#define AF_LATIN_MAX_WIDTHS
#define AF_LATIN_HINTS_DO_STEM_ADJUST(h)
af_warper_compute(AF_Warper warper, AF_GlyphHints hints, AF_Dimension dim, FT_Fixed *a_scale, FT_Fixed *a_delta)
FT_Get_Char_Index(FT_Face face, FT_ULong charcode)
af_glyph_hints_align_strong_points(AF_GlyphHints hints, AF_Dimension dim)
FT_MulDiv(FT_Long a, FT_Long b, FT_Long c)
EGLSurface EGLint EGLint EGLint width
#define AF_HINTS_DO_BLUES(h)
static void af_latin2_metrics_init_blues(AF_LatinMetrics metrics, FT_Face face)
enum AF_Edge_Flags_ AF_Edge_Flags
#define AF_LATIN_CONSTANT(metrics, c)
FT_Select_Charmap(FT_Face face, FT_Encoding encoding)
#define AF_LATIN_HINTS_DO_MONO(h)
#define AF_LATIN_HINTS_DO_VERT_SNAP(h)
static FT_Pos af_latin2_compute_stem_width(AF_GlyphHints hints, AF_Dimension dim, FT_Pos width, AF_Edge_Flags base_flags, AF_Edge_Flags stem_flags)
af_latin2_metrics_check_digits(AF_LatinMetrics metrics, FT_Face face)
static const AF_Script_UniRangeRec af_latin2_uniranges[]
void(* AF_Script_ScaleMetricsFunc)(AF_ScriptMetrics metrics, AF_Scaler scaler)
GLenum const void GLuint GLint reference
enum FT_Encoding_ FT_Encoding
#define AF_LATIN_MAX_BLUES
FT_Set_Charmap(FT_Face face, FT_CharMap charmap)
GLenum GLenum GLenum GLenum GLenum scale
AF_WidthRec widths[AF_LATIN_MAX_WIDTHS]
typedefFT_BEGIN_HEADER struct FT_MemoryRec_ * FT_Memory
af_latin2_metrics_init_widths(AF_LatinMetrics metrics, FT_Face face, FT_ULong charcode)
af_latin2_metrics_init(AF_LatinMetrics metrics, FT_Face face)
af_latin2_hints_compute_segments(AF_GlyphHints hints, AF_Dimension dim)
EGLSurface EGLint EGLint y
FT_MulFix(FT_Long a, FT_Long b)
af_axis_hints_new_segment(AF_AxisHints axis, FT_Memory memory, AF_Segment *asegment)
#define AF_HINTS_DO_HORIZONTAL(h)
#define AF_DEFINE_SCRIPT_CLASS(script_class, script_, ranges, m_size,m_init, m_scale, m_done, h_init, h_apply)
FT_BEGIN_HEADER enum AF_Dimension_ AF_Dimension
GLenum GLsizei GLsizei GLsizei GLsizei GLbitfield flags
FT_BEGIN_HEADER struct AF_WidthRec_ * AF_Width
af_latin2_hints_link_segments(AF_GlyphHints hints, AF_Dimension dim)
static void af_latin2_align_serif_edge(AF_GlyphHints hints, AF_Edge base, AF_Edge serif)
static void af_latin2_metrics_scale_dim(AF_LatinMetrics metrics, AF_Scaler scaler, AF_Dimension dim)
#define FT_TRACE5(varformat)
GLint GLint GLint GLint GLint w
GLuint GLdouble GLdouble GLint GLint const GLdouble * points
AF_AxisHintsRec axis[AF_DIMENSION_MAX]
af_glyph_hints_align_weak_points(AF_GlyphHints hints, AF_Dimension dim)
FT_Pos edge_distance_threshold
#define FT_CURVE_TAG(flag)
FT_Render_Mode render_mode
static const char af_latin2_blue_chars[AF_LATIN_MAX_BLUES][AF_LATIN_MAX_TEST_CHARACTERS+1]
#define AF_LATIN_HINTS_DO_HORZ_SNAP(h)
af_sort_pos(FT_UInt count, FT_Pos *table)
#define FT_STYLE_FLAG_ITALIC
#define FT_LOAD_IGNORE_TRANSFORM
GLenum GLenum GLvoid GLvoid GLvoid * span
af_glyph_hints_rescale(AF_GlyphHints hints, AF_ScriptMetrics metrics)
AF_LatinBlueRec blues[AF_LATIN_BLUE_MAX]
#define AF_LATIN_IS_TOP_BLUE(b)
void(* AF_Script_DoneMetricsFunc)(AF_ScriptMetrics metrics)