19 #include FT_ADVANCES_H 27 #ifdef AF_CONFIG_OPTION_USE_WARPER 39 #define FT_COMPONENT trace_aflatin2 80 metrics->root.clazz->standard_char );
81 if ( glyph_index == 0 )
85 if ( error || face->glyph->outline.n_points <= 0 )
122 for ( ; seg <
limit; seg++ )
127 if ( link && link->
link == seg && link > seg )
132 dist = seg->
pos - link->
pos;
137 axis->
widths[num_widths++].org = dist;
141 af_sort_widths( num_widths, axis->
widths );
168 #define AF_LATIN_MAX_TEST_CHARACTERS 12 203 "======================\n\n" ));
207 const char*
p = af_latin2_blue_chars[bb];
218 for ( ; p < limit && *
p; p++ )
221 FT_Int best_point, best_y, best_first, best_last;
228 if ( glyph_index == 0 )
250 FT_Int old_best_point = best_point;
264 for ( pp = first; pp <= last; pp++ )
265 if ( best_point < 0 || points[pp].
y > best_y )
268 best_y = points[pp].
y;
273 for ( pp = first; pp <= last; pp++ )
274 if ( best_point < 0 || points[pp].
y < best_y )
277 best_y = points[pp].
y;
281 if ( best_point != old_best_point )
294 FT_Pos best_x = points[best_point].
x;
301 start = end = best_point;
306 if ( prev < best_first )
309 dist =
FT_ABS( points[prev].
y - best_y );
313 if (
FT_ABS( points[prev].
x - best_x ) <= 20 * dist )
318 }
while ( start != best_point );
323 if ( next > best_last )
326 dist =
FT_ABS( points[next].
y - best_y );
328 if (
FT_ABS( points[next].
x - best_x ) <= 20 * dist )
333 }
while ( end != best_point );
340 FT_TRACE5((
" (%s)\n", round ?
"round" :
"flat" ));
344 rounds[num_rounds++] = best_y;
346 flats[num_flats++] = best_y;
349 if ( num_flats == 0 && num_rounds == 0 )
366 blue_ref = & blue->
ref.org;
367 blue_shoot = & blue->
shoot.org;
371 if ( num_flats == 0 )
374 *blue_shoot = rounds[num_rounds / 2];
376 else if ( num_rounds == 0 )
379 *blue_shoot = flats[num_flats / 2];
383 *blue_ref = flats[num_flats / 2];
384 *blue_shoot = rounds[num_rounds / 2];
390 if ( *blue_shoot != *blue_ref )
393 FT_Pos shoot = *blue_shoot;
400 *blue_shoot = ( shoot +
ref ) / 2;
402 FT_TRACE5((
" [overshoot smaller than reference," 403 " taking mean value]\n" ));
420 " overshoot = %ld\n",
421 *blue_ref, *blue_shoot ));
433 FT_Bool started = 0, same_width = 1;
439 for (
i = 0x30;
i <= 0x39;
i++ )
445 if ( glyph_index == 0 )
457 if ( advance != old_advance )
465 old_advance = advance;
485 FT_ENCODING_APPLE_ROMAN,
486 FT_ENCODING_ADOBE_STANDARD,
487 FT_ENCODING_ADOBE_LATIN_1,
495 for ( ee = 0; latin_encodings[ee] != FT_ENCODING_NONE; ee++ )
505 af_latin2_metrics_init_blues( metrics, face );
536 axis = &metrics->
axis[dim];
558 blue = &vaxis->
blues[nn];
584 fitted = ( scaled + threshold ) & ~63;
587 if ( scaled != fitted )
589 scale =
FT_MulDiv( scale, fitted, scaled );
591 " fitted = %.2g, scaling = %.4g\n",
592 scaled / 64.0, fitted / 64.0,
593 ( fitted * 1.0 ) / scaled ));
619 width->cur =
FT_MulFix( width->org, scale );
620 width->fit = width->cur;
638 blue->
ref.fit = blue->
ref.cur;
645 if ( dist <= 48 && dist >= -48 )
649 delta1 = blue->
shoot.org - blue->
ref.org;
658 else if ( delta2 < 64 )
659 delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 );
667 blue->
shoot.fit = blue->
ref.fit + delta2;
669 FT_TRACE5((
">> activating blue zone %d:" 670 " ref.cur=%.2g ref.fit=%.2g" 671 " shoot.cur=%.2g shoot.fit=%.2g\n",
672 nn, blue->
ref.cur / 64.0, blue->
ref.fit / 64.0,
673 blue->
shoot.cur / 64.0, blue->
shoot.fit / 64.0 ));
703 #define SORT_SEGMENTS 714 AF_Point* contour = hints->contours;
715 AF_Point* contour_limit = contour + hints->num_contours;
724 segment_dir = major_dir;
735 for ( ; point <
limit; point++ )
737 point->
u = point->
fx;
738 point->
v = point->
fy;
747 for ( ; point <
limit; point++ )
749 point->
u = point->
fy;
750 point->
v = point->
fx;
755 for ( ; contour < contour_limit; contour++ )
779 if ( point == start )
789 FT_Pos min_u, min_v, max_u, max_v;
796 min_u = max_u = point->
u;
797 min_v = max_v = point->
v;
805 if ( point->
u < min_u )
808 if ( point->
u > max_u )
812 if ( point->
v < min_v )
815 if ( point->
v > max_v )
826 segment->
last = point;
827 segment->
pos = (
FT_Short)( ( min_u + max_u ) >> 1 );
843 for ( ; pt != last; f0 = f1 )
859 if ( point == start )
867 if ( point == start )
883 for ( segment = segments; segment < segments_end; segment++ )
895 if ( first_v < last_v )
898 if ( p->
v < first_v )
900 ( ( first_v - p->
v ) >> 1 ) );
905 ( ( p->
v - last_v ) >> 1 ) );
910 if ( p->
v > first_v )
912 ( ( p->
v - first_v ) >> 1 ) );
917 ( ( last_v - p->
v ) >> 1 ) );
922 #ifdef AF_SORT_SEGMENTS 931 for ( ii = 0; ii <
count; ii++ )
933 if ( segments[ii].dir > 0 )
935 for ( jj = ii + 1; jj <
count; jj++ )
937 if ( segments[jj].dir < 0 )
943 segments[ii] = segments[jj];
954 axis->mid_segments = ii;
970 #ifdef AF_SORT_SEGMENTS 971 AF_Segment segment_mid = segments + axis->mid_segments;
973 FT_Pos len_threshold, len_score;
978 if ( len_threshold == 0 )
983 #ifdef AF_SORT_SEGMENTS 984 for ( seg1 = segments; seg1 < segment_mid; seg1++ )
989 for ( seg2 = segment_mid; seg2 < segment_limit; seg2++ )
992 for ( seg1 = segments; seg1 < segment_limit; seg1++ )
999 for ( seg2 = segments; seg2 < segment_limit; seg2++ )
1000 if ( seg1->
dir + seg2->
dir == 0 && seg2->
pos > seg1->
pos )
1005 FT_Pos dist = pos2 - pos1;
1017 if ( min < seg2->min_coord )
1024 if ( len >= len_threshold )
1026 score = dist + len_score /
len;
1027 if ( score < seg1->score )
1029 seg1->
score = score;
1033 if ( score < seg2->score )
1035 seg2->
score = score;
1047 for ( seg1 = segments; seg1 < segment_limit; seg1++ )
1053 if ( seg2->
link != seg1 )
1078 FT_Pos edge_distance_threshold;
1079 FT_Pos segment_length_threshold;
1104 segment_length_threshold =
FT_DivFix( 64, hints->y_scale );
1107 segment_length_threshold = 0;
1127 if ( edge_distance_threshold > 64 / 4 )
1128 edge_distance_threshold = 64 / 4;
1130 edge_distance_threshold =
FT_DivFix( edge_distance_threshold,
1133 for ( seg = segments; seg < segment_limit; seg++ )
1139 if ( seg->
height < segment_length_threshold )
1157 else if ( 2*seg->
height < 3 * segment_length_threshold )
1162 for ( ee = 0; ee < axis->
num_edges; ee++ )
1172 if ( dist < edge_distance_threshold && edge->dir == seg->
dir )
1238 for ( edge = edges; edge < edge_limit; edge++ )
1247 }
while ( seg != edge->
first );
1251 for ( edge = edges; edge < edge_limit; edge++ )
1276 if ( seg->
dir == up_dir )
1300 edge2 = edge->
serif;
1309 edge_delta = edge->
fpos - edge2->
fpos;
1310 if ( edge_delta < 0 )
1311 edge_delta = -edge_delta;
1313 seg_delta = seg->
pos - seg2->
pos;
1314 if ( seg_delta < 0 )
1315 seg_delta = -seg_delta;
1317 if ( seg_delta < edge_delta )
1325 edge->
serif = edge2;
1334 }
while ( seg != edge->
first );
1339 if ( is_round > 0 && is_round >= is_straight )
1349 else if ( ups < downs )
1352 else if ( ups == downs )
1403 if ( best_dist0 > 64 / 2 )
1404 best_dist0 = 64 / 2;
1410 for ( ; edge < edge_limit; edge++ )
1414 FT_Pos best_dist = best_dist0;
1419 FT_Bool is_top_blue, is_major_dir;
1436 if ( is_top_blue ^ is_major_dir )
1445 compare = &blue->
shoot;
1447 compare = &blue->
ref;
1449 dist = edge->
fpos - compare->org;
1454 if ( dist < best_dist )
1457 best_blue = compare;
1469 if ( is_top_blue ^ is_under_ref )
1471 blue = latin->
blues + bb;
1477 if ( dist < best_dist )
1480 best_blue = & blue->
shoot;
1577 af_latin2_snap_width(
AF_Width widths,
1582 FT_Pos best = 64 + 32 + 2;
1587 for ( n = 0; n <
count; n++ )
1606 if ( width >= reference )
1608 if ( width < scaled + 48 )
1613 if ( width > scaled - 48 )
1656 if ( ( stem_flags &
AF_EDGE_SERIF ) && vertical && ( dist < 3 * 64 ) )
1665 else if ( dist < 56 )
1668 if ( axis->width_count > 0 )
1674 if ( axis->width_count > 0 )
1676 delta = dist - axis->widths[0].cur;
1683 dist = axis->widths[0].cur;
1691 if ( dist < 3 * 64 )
1699 else if ( delta < 32 )
1702 else if ( delta < 54 )
1709 dist = ( dist + 32 ) & ~63;
1718 dist = af_latin2_snap_width( axis->widths, axis->width_count, dist );
1726 dist = ( dist + 16 ) & ~63;
1740 dist = ( dist + 32 ) & ~63;
1749 dist = ( dist + 64 ) >> 1;
1751 else if ( dist < 128 )
1762 dist = ( dist + 22 ) & ~63;
1763 delta = dist - org_dist;
1771 dist = ( dist + 64 ) >> 1;
1776 dist = ( dist + 32 ) & ~63;
1799 FT_Pos fitted_width = af_latin2_compute_stem_width(
1805 stem_edge->
pos = base_edge->
pos + fitted_width;
1807 FT_TRACE5((
"LINK: edge %d (opos=%.2f) linked to (%.2f), " 1808 "dist was %.2f, now %.2f\n",
1810 stem_edge->
pos / 64.0, dist / 64.0, fitted_width / 64.0 ));
1850 FT_TRACE5((
"==== hinting %s edges =====\n",
1858 for ( edge = edges; edge < edge_limit; edge++ )
1885 FT_TRACE5((
"BLUE: edge %d (opos=%.2f) snapped to (%.2f), " 1887 edge1-edges, edge1->
opos / 64.0, blue->fit / 64.0,
1888 edge1->
pos / 64.0 ));
1890 edge1->
pos = blue->fit;
1895 af_latin2_align_linked_edge( hints, dim, edge1, edge2 );
1903 anchor_drift = ( anchor->
pos - anchor->
opos );
1905 anchor_drift = ( anchor_drift +
1906 ( edge2->
pos - edge2->
opos ) ) >> 1;
1913 for ( edge = edges; edge < edge_limit; edge++ )
1934 FT_TRACE5((
"ASSERTION FAILED for edge %d\n", edge2-edges ));
1936 af_latin2_align_linked_edge( hints, dim, edge2, edge );
1943 FT_Pos org_len, org_center, cur_len;
1944 FT_Pos cur_pos1, error1, error2, u_off, d_off;
1947 org_len = edge2->
opos - edge->
opos;
1948 cur_len = af_latin2_compute_stem_width(
1949 hints, dim, org_len,
1952 if ( cur_len <= 64 )
1962 org_center = edge->
opos + ( org_len >> 1 );
1966 error1 = org_center - ( cur_pos1 - u_off );
1970 error2 = org_center - ( cur_pos1 + d_off );
1974 if ( error1 < error2 )
1979 edge->
pos = cur_pos1 - cur_len / 2;
1980 edge2->
pos = edge->
pos + cur_len;
1985 FT_TRACE5((
"ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f)" 1986 " snapped to (%.2f) (%.2f)\n",
1987 edge-edges, edge->
opos / 64.0,
1988 edge2-edges, edge2->
opos / 64.0,
1989 edge->
pos / 64.0, edge2->
pos / 64.0 ));
1994 af_latin2_align_linked_edge( hints, dim, edge, edge2 );
1998 anchor_drift = ( ( anchor->
pos - anchor->
opos ) +
1999 ( edge2->
pos - edge2->
opos ) ) >> 1;
2001 FT_TRACE5((
"DRIFT: %.2f\n", anchor_drift/64.0 ));
2005 FT_Pos org_pos, org_len, org_center, cur_center, cur_len;
2006 FT_Pos org_left, org_right;
2009 org_pos = edge->
opos + anchor_drift;
2010 org_len = edge2->
opos - edge->
opos;
2011 org_center = org_pos + ( org_len >> 1 );
2013 cur_len = af_latin2_compute_stem_width(
2014 hints, dim, org_len,
2018 org_left = org_pos + ( ( org_len - cur_len ) >> 1 );
2019 org_right = org_pos + ( ( org_len + cur_len ) >> 1 );
2021 FT_TRACE5((
"ALIGN: left=%.2f right=%.2f ",
2022 org_left / 64.0, org_right / 64.0 ));
2023 cur_center = org_center;
2028 edge->
pos = edge2->
pos - cur_len;
2036 FT_Pos displacements[6], scores[6], org, fit, delta;
2053 if ( cur_len <= 96 )
2061 FT_Pos frac_left = org_left & 63;
2062 FT_Pos frac_right = org_right & 63;
2064 if ( frac_left >= 22 && frac_left <= 42 &&
2065 frac_right >= 22 && frac_right <= 42 )
2068 fit = ( org <= 32 ) ? 16 : 48;
2069 delta =
FT_ABS( fit - org );
2070 displacements[
count] = fit - org;
2071 scores[count++] = delta;
2072 FT_TRACE5((
"dispA=%.2f (%d) ", ( fit - org ) / 64.0, delta ));
2075 fit = ( org <= 32 ) ? 16 : 48;
2076 delta =
FT_ABS( fit - org );
2077 displacements[
count] = fit - org;
2078 scores[count++] = delta;
2079 FT_TRACE5((
"dispB=%.2f (%d) ", ( fit - org ) / 64.0, delta ));
2086 delta =
FT_ABS( fit - org );
2087 displacements[
count] = fit - org;
2088 scores[count++] = delta;
2089 FT_TRACE5((
"dispC=%.2f (%d) ", ( fit - org ) / 64.0, delta ));
2094 delta =
FT_ABS( fit - org );
2095 displacements[
count] = fit - org;
2096 scores[count++] = delta;
2097 FT_TRACE5((
"dispD=%.2f (%d) ", ( fit - org ) / 64.0, delta ));
2101 FT_Pos best_score = scores[0];
2102 FT_Pos best_disp = displacements[0];
2105 for ( nn = 1; nn <
count; nn++ )
2107 if ( scores[nn] < best_score )
2109 best_score = scores[nn];
2110 best_disp = displacements[nn];
2114 cur_center = org_center + best_disp;
2120 edge->
pos = cur_center - ( cur_len >> 1 );
2121 edge2->
pos = edge->
pos + cur_len;
2123 FT_TRACE5((
"STEM1: %d (opos=%.2f) to %d (opos=%.2f)" 2124 " snapped to (%.2f) and (%.2f)," 2125 " org_len=%.2f cur_len=%.2f\n",
2126 edge-edges, edge->
opos / 64.0,
2127 edge2-edges, edge2->
opos / 64.0,
2128 edge->
pos / 64.0, edge2->
pos / 64.0,
2129 org_len / 64.0, cur_len / 64.0 ));
2134 if ( edge > edges && edge->
pos < edge[-1].
pos )
2136 FT_TRACE5((
"BOUND: %d (pos=%.2f) to (%.2f)\n",
2137 edge-edges, edge->
pos / 64.0, edge[-1].
pos / 64.0 ));
2138 edge->
pos = edge[-1].
pos;
2160 FT_Int n_edges = edge_limit - edges;
2185 span = dist1 - dist2;
2191 delta = edge3->
pos - ( 2 * edge2->
pos - edge1->
pos );
2192 edge3->
pos -= delta;
2197 if ( n_edges == 12 )
2199 ( edges + 8 )->pos -= delta;
2200 ( edges + 11 )->pos -= delta;
2211 if ( has_serifs || !anchor )
2217 for ( edge = edges; edge < edge_limit; edge++ )
2234 if ( delta < 64 + 16 )
2236 af_latin2_align_serif_edge( hints, edge->
serif, edge );
2237 FT_TRACE5((
"SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f)" 2238 " aligned to (%.2f)\n",
2239 edge-edges, edge->
opos / 64.0,
2241 edge->
pos / 64.0 ));
2245 FT_TRACE5((
"SERIF_ANCHOR: edge %d (opos=%.2f)" 2246 " snapped to (%.2f)\n",
2247 edge-edges, edge->
opos / 64.0, edge->
pos / 64.0 ));
2256 for ( before = edge - 1; before >= edges; before-- )
2260 for ( after = edge + 1; after < edge_limit; after++ )
2264 if ( before >= edges && before < edge &&
2265 after < edge_limit && after > edge )
2270 edge->pos = before->
pos +
2272 after->
pos - before->
pos,
2274 FT_TRACE5((
"SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f)" 2275 " from %d (opos=%.2f)\n",
2276 edge-edges, edge->
opos / 64.0, edge->pos / 64.0,
2277 before - edges, before->
opos / 64.0 ));
2281 edge->pos = anchor->
pos +
2282 ( ( edge->opos - anchor->
opos + 16 ) & ~31 );
2284 FT_TRACE5((
"SERIF_LINK2: edge %d (opos=%.2f)" 2285 " snapped to (%.2f)\n",
2286 edge-edges, edge->
opos / 64.0, edge->pos / 64.0 ));
2292 if ( edge > edges && edge->
pos < edge[-1].
pos )
2293 edge->
pos = edge[-1].
pos;
2295 if ( edge + 1 < edge_limit &&
2297 edge->
pos > edge[1].
pos )
2318 #ifdef AF_CONFIG_OPTION_USE_WARPER 2342 #ifdef AF_CONFIG_OPTION_USE_WARPER 2352 af_glyph_hints_scale_dim( hints, dim, scale, delta );
2392 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)
GLenum GLenum GLenum GLenum GLenum scale
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
GLsizei const GLfloat * points
FT_Bool digits_have_same_width
GLint GLint GLint GLint GLint GLint y
af_glyph_hints_init(AF_GlyphHints hints, FT_Memory memory)
enum FT_Render_Mode_ FT_Render_Mode
void(* AF_Script_DoneMetricsFunc)(AF_ScriptMetrics metrics)
#define FT_LOAD_NO_HINTING
af_latin2_hint_edges(AF_GlyphHints hints, AF_Dimension dim)
struct AF_LatinMetricsRec_ * AF_LatinMetrics
GLint GLint GLsizei width
enum AF_Direction_ AF_Direction
GLenum GLenum GLvoid GLvoid GLvoid * span
GLint GLint GLint GLint GLint x
#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
FT_Error(* AF_Script_InitHintsFunc)(AF_GlyphHints hints, AF_ScriptMetrics metrics)
FT_UInt increase_x_height
af_latin2_hints_compute_edges(AF_GlyphHints hints, AF_Dimension dim)
af_latin2_metrics_scale(AF_LatinMetrics metrics, AF_Scaler scaler)
GLenum GLuint GLint GLenum face
af_latin2_hints_compute_blue_edges(AF_GlyphHints hints, AF_LatinMetrics metrics)
AF_LatinAxisRec axis[AF_DIMENSION_MAX]
#define FT_ASSERT(condition)
FT_Load_Glyph(FT_Face face, FT_UInt glyph_index, FT_Int32 load_flags)
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)
af_axis_hints_new_edge(AF_AxisHints axis, FT_Int fpos, AF_Direction dir, FT_Memory memory, AF_Edge *anedge)
FT_Get_Char_Index(FT_Face face, FT_ULong charcode)
#define AF_DEFINE_SCRIPT_CLASS(script_class, script_, ranges, def_char, m_size, m_init, m_scale, m_done, h_init, h_apply)
af_glyph_hints_align_strong_points(AF_GlyphHints hints, AF_Dimension dim)
FT_MulDiv(FT_Long a, FT_Long b, FT_Long c)
#define AF_HINTS_DO_BLUES(h)
enum AF_Edge_Flags_ AF_Edge_Flags
#define AF_LATIN_CONSTANT(metrics, c)
FT_Select_Charmap(FT_Face face, FT_Encoding encoding)
float min(float a, float b)
#define AF_LATIN_HINTS_DO_MONO(h)
void(* AF_Script_ApplyHintsFunc)(AF_GlyphHints hints, FT_Outline *outline, AF_ScriptMetrics metrics)
#define AF_LATIN_HINTS_DO_VERT_SNAP(h)
af_latin2_metrics_check_digits(AF_LatinMetrics metrics, FT_Face face)
enum FT_Encoding_ FT_Encoding
#define AF_LATIN_MAX_BLUES
FT_Set_Charmap(FT_Face face, FT_CharMap charmap)
AF_WidthRec widths[AF_LATIN_MAX_WIDTHS]
typedefFT_BEGIN_HEADER struct FT_MemoryRec_ * FT_Memory
#define AF_PROP_INCREASE_X_HEIGHT_MIN
af_latin2_metrics_init(AF_LatinMetrics metrics, FT_Face face)
af_latin2_hints_compute_segments(AF_GlyphHints hints, AF_Dimension dim)
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)
FT_BEGIN_HEADER enum AF_Dimension_ AF_Dimension
GLubyte GLubyte GLubyte GLubyte w
FT_BEGIN_HEADER struct AF_WidthRec_ * AF_Width
af_latin2_hints_link_segments(AF_GlyphHints hints, AF_Dimension dim)
FT_Error(* AF_Script_InitMetricsFunc)(AF_ScriptMetrics metrics, FT_Face face)
#define FT_TRACE5(varformat)
GLuint GLuint GLsizei count
af_latin2_metrics_init_widths(AF_LatinMetrics metrics, FT_Face face)
AF_AxisHintsRec axis[AF_DIMENSION_MAX]
af_glyph_hints_align_weak_points(AF_GlyphHints hints, AF_Dimension dim)
FT_Pos edge_distance_threshold
GLsizei GLenum const GLvoid GLuint GLsizei GLfloat * metrics
#define FT_CURVE_TAG(flag)
FT_Render_Mode render_mode
#define AF_LATIN_HINTS_DO_HORZ_SNAP(h)
af_sort_pos(FT_UInt count, FT_Pos *table)
void(* AF_Script_ScaleMetricsFunc)(AF_ScriptMetrics metrics, AF_Scaler scaler)
#define FT_STYLE_FLAG_ITALIC
#define FT_LOAD_IGNORE_TRANSFORM
af_glyph_hints_rescale(AF_GlyphHints hints, AF_ScriptMetrics metrics)
AF_LatinBlueRec blues[AF_LATIN_BLUE_MAX]
#define AF_LATIN_IS_TOP_BLUE(b)