20 #include FT_ADVANCES_H 21 #include FT_INTERNAL_DEBUG_H 28 #ifdef AF_CONFIG_OPTION_USE_WARPER 40 #define FT_COMPONENT trace_aflatin 63 FT_TRACE5((
"standard widths computation\n" 64 "===========================\n\n" ));
80 metrics->root.clazz->standard_char );
81 if ( glyph_index == 0 )
84 FT_TRACE5((
"standard character: 0x%X (glyph index %d)\n",
85 metrics->root.clazz->standard_char, glyph_index ));
88 if ( error || face->glyph->outline.n_points <= 0 )
129 for ( ; seg <
limit; seg++ )
134 if ( link && link->
link == seg && link > seg )
139 dist = seg->
pos - link->
pos;
144 axis->
widths[num_widths++].org = dist;
151 dummy->units_per_em / 100 );
171 #ifdef FT_DEBUG_LEVEL_TRACE 197 #define AF_LATIN_MAX_TEST_CHARACTERS 12 235 "======================\n\n" ));
239 const char*
p = af_latin_blue_chars[bb];
250 for ( ; p < limit && *
p; p++ )
254 FT_Int best_point, best_contour_first, best_contour_last;
261 if ( glyph_index == 0 )
266 if ( error || outline.
n_points <= 0 )
273 best_contour_first = 0;
274 best_contour_last = 0;
282 for ( nn = 0; nn < outline.
n_contours; first = last + 1, nn++ )
284 FT_Int old_best_point = best_point;
298 for ( pp = first; pp <= last; pp++ )
299 if ( best_point < 0 || points[pp].
y > best_y )
302 best_y = points[pp].
y;
307 for ( pp = first; pp <= last; pp++ )
308 if ( best_point < 0 || points[pp].
y < best_y )
311 best_y = points[pp].
y;
315 if ( best_point != old_best_point )
317 best_contour_first =
first;
318 best_contour_last = last;
327 if ( best_point >= 0 )
329 FT_Pos best_x = points[best_point].
x;
331 FT_Int best_on_point_first, best_on_point_last;
337 best_on_point_first = best_point;
338 best_on_point_last = best_point;
342 best_on_point_first = -1;
343 best_on_point_last = -1;
353 if ( prev > best_contour_first )
356 prev = best_contour_last;
358 dist =
FT_ABS( points[prev].
y - best_y );
362 if (
FT_ABS( points[prev].
x - best_x ) <= 20 * dist )
367 best_on_point_first = prev;
368 if ( best_on_point_last < 0 )
369 best_on_point_last = prev;
372 }
while ( prev != best_point );
376 if ( next < best_contour_last )
379 next = best_contour_first;
381 dist =
FT_ABS( points[next].
y - best_y );
383 if (
FT_ABS( points[next].
x - best_x ) <= 20 * dist )
388 best_on_point_last = next;
389 if ( best_on_point_first < 0 )
390 best_on_point_first = next;
393 }
while ( next != best_point );
397 if ( best_on_point_first >= 0 &&
398 best_on_point_last >= 0 &&
400 points[best_on_point_first].
x ) ) >
408 FT_TRACE5((
" (%s)\n", round ?
"round" :
"flat" ));
412 rounds[num_rounds++] = best_y;
414 flats[num_flats++] = best_y;
417 if ( num_flats == 0 && num_rounds == 0 )
434 blue_ref = &blue->
ref.org;
435 blue_shoot = &blue->
shoot.org;
439 if ( num_flats == 0 )
442 *blue_shoot = rounds[num_rounds / 2];
444 else if ( num_rounds == 0 )
447 *blue_shoot = flats[num_flats / 2];
451 *blue_ref = flats[num_flats / 2];
452 *blue_shoot = rounds[num_rounds / 2];
458 if ( *blue_shoot != *blue_ref )
461 FT_Pos shoot = *blue_shoot;
468 *blue_shoot = ( shoot +
ref ) / 2;
470 FT_TRACE5((
" [overshoot smaller than reference," 471 " taking mean value]\n" ));
488 " overshoot = %ld\n",
489 *blue_ref, *blue_shoot ));
505 FT_Bool started = 0, same_width = 1;
510 for (
i = 0x30;
i <= 0x39;
i++ )
516 if ( glyph_index == 0 )
528 if ( advance != old_advance )
536 old_advance = advance;
559 af_latin_metrics_init_blues( metrics, face );
593 axis = &metrics->
axis[dim];
614 blue = &Axis->
blues[nn];
640 fitted = ( scaled + threshold ) & ~63;
642 if ( scaled != fitted )
647 if ( fitted < scaled )
653 scale =
FT_MulDiv( scale, fitted, scaled );
678 width->cur =
FT_MulFix( width->org, scale );
679 width->fit = width->cur;
697 blue->
ref.fit = blue->
ref.cur;
704 if ( dist <= 48 && dist >= -48 )
717 delta1 = blue->
shoot.org - blue->
ref.org;
726 else if ( delta2 < 64 )
727 delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 );
735 blue->
shoot.fit = blue->
ref.fit + delta2;
746 else if ( delta2 < 48 )
755 blue->
shoot.fit = blue->
ref.fit - delta2;
801 AF_Point* contour = hints->contours;
802 AF_Point* contour_limit = contour + hints->num_contours;
811 segment_dir = major_dir;
822 for ( ; point <
limit; point++ )
824 point->
u = point->
fx;
825 point->
v = point->
fy;
834 for ( ; point <
limit; point++ )
836 point->
u = point->
fy;
837 point->
v = point->
fx;
842 for ( ; contour < contour_limit; contour++ )
890 if ( point->
out_dir != segment_dir || point == last )
893 segment->
last = point;
894 segment->
pos = (
FT_Short)( ( min_pos + max_pos ) >> 1 );
903 min_pos = max_pos = point->
v;
942 min_pos = max_pos = point->
u;
943 segment->
first = point;
944 segment->
last = point;
961 for ( segment = segments; segment < segments_end; segment++ )
972 if ( first_v < last_v )
978 if ( p->
v < first_v )
980 ( ( first_v - p->
v ) >> 1 ) );
985 ( ( p->
v - last_v ) >> 1 ) );
993 if ( p->
v > first_v )
995 ( ( p->
v - first_v ) >> 1 ) );
1000 ( ( last_v - p->
v ) >> 1 ) );
1019 FT_Pos len_threshold, len_score;
1024 if ( len_threshold == 0 )
1030 for ( seg1 = segments; seg1 < segment_limit; seg1++ )
1039 for ( seg2 = segments; seg2 < segment_limit; seg2++ )
1045 if ( seg1->
dir + seg2->
dir == 0 && pos2 > pos1 )
1048 FT_Pos dist = pos2 - pos1;
1054 if ( min < seg2->min_coord )
1062 if ( len >= len_threshold )
1066 score = dist + len_score /
len;
1070 if ( score < seg1->score )
1072 seg1->
score = score;
1076 if ( score < seg2->score )
1078 seg2->
score = score;
1087 for ( seg1 = segments; seg1 < segment_limit; seg1++ )
1093 if ( seg2->
link != seg1 )
1122 FT_Pos edge_distance_threshold;
1123 FT_Pos segment_length_threshold;
1142 segment_length_threshold =
FT_DivFix( 64, hints->y_scale );
1144 segment_length_threshold = 0;
1165 if ( edge_distance_threshold > 64 / 4 )
1166 edge_distance_threshold = 64 / 4;
1168 edge_distance_threshold =
FT_DivFix( edge_distance_threshold,
1171 for ( seg = segments; seg < segment_limit; seg++ )
1177 if ( seg->
height < segment_length_threshold )
1183 2 * seg->
height < 3 * segment_length_threshold )
1187 for ( ee = 0; ee < axis->
num_edges; ee++ )
1197 if ( dist < edge_distance_threshold && edge->dir == seg->
dir )
1265 for ( edge = edges; edge < edge_limit; edge++ )
1274 }
while ( seg != edge->
first );
1278 for ( edge = edges; edge < edge_limit; edge++ )
1303 if ( seg->
dir == up_dir )
1327 edge2 = edge->
serif;
1336 edge_delta = edge->
fpos - edge2->
fpos;
1337 if ( edge_delta < 0 )
1338 edge_delta = -edge_delta;
1340 seg_delta = seg->
pos - seg2->
pos;
1341 if ( seg_delta < 0 )
1342 seg_delta = -seg_delta;
1344 if ( seg_delta < edge_delta )
1352 edge->
serif = edge2;
1361 }
while ( seg != edge->
first );
1366 if ( is_round > 0 && is_round >= is_straight )
1376 else if ( ups < downs )
1379 else if ( ups == downs )
1435 for ( ; edge < edge_limit; edge++ )
1447 if ( best_dist > 64 / 2 )
1453 FT_Bool is_top_blue, is_major_dir;
1470 if ( is_top_blue ^ is_major_dir )
1476 dist = edge->
fpos - blue->
ref.org;
1481 if ( dist < best_dist )
1484 best_blue = &blue->
ref;
1496 if ( is_top_blue ^ is_under_ref )
1503 if ( dist < best_dist )
1506 best_blue = &blue->
shoot;
1602 af_latin_snap_width(
AF_Width widths,
1607 FT_Pos best = 64 + 32 + 2;
1612 for ( n = 0; n <
count; n++ )
1631 if ( width >= reference )
1633 if ( width < scaled + 48 )
1638 if ( width > scaled - 48 )
1690 else if ( dist < 56 )
1693 if ( axis->width_count > 0 )
1699 delta = dist - axis->widths[0].cur;
1706 dist = axis->widths[0].cur;
1713 if ( dist < 3 * 64 )
1721 else if ( delta < 32 )
1724 else if ( delta < 54 )
1731 dist = ( dist + 32 ) & ~63;
1741 dist = af_latin_snap_width( axis->widths, axis->width_count, dist );
1749 dist = ( dist + 16 ) & ~63;
1763 dist = ( dist + 32 ) & ~63;
1772 dist = ( dist + 64 ) >> 1;
1774 else if ( dist < 128 )
1785 dist = ( dist + 22 ) & ~63;
1786 delta = dist - org_dist;
1794 dist = ( dist + 64 ) >> 1;
1799 dist = ( dist + 32 ) & ~63;
1822 FT_Pos fitted_width = af_latin_compute_stem_width(
1828 stem_edge->
pos = base_edge->
pos + fitted_width;
1830 FT_TRACE5((
" LINK: edge %d (opos=%.2f) linked to %.2f," 1831 " dist was %.2f, now %.2f\n",
1833 stem_edge->
pos / 64.0, dist / 64.0, fitted_width / 64.0 ));
1876 #ifdef FT_DEBUG_LEVEL_TRACE 1889 for ( edge = edges; edge < edge_limit; edge++ )
1916 #ifdef FT_DEBUG_LEVEL_TRACE 1918 FT_TRACE5((
" BLUE_ANCHOR: edge %d (opos=%.2f) snapped to %.2f," 1919 " was %.2f (anchor=edge %d)\n",
1920 edge1 - edges, edge1->
opos / 64.0, blue->fit / 64.0,
1921 edge1->
pos / 64.0, edge - edges ));
1923 FT_TRACE5((
" BLUE: edge %d (opos=%.2f) snapped to %.2f," 1925 edge1 - edges, edge1->
opos / 64.0, blue->fit / 64.0,
1926 edge1->
pos / 64.0 ));
1931 edge1->
pos = blue->fit;
1936 af_latin_align_linked_edge( hints, dim, edge1, edge2 );
1939 #ifdef FT_DEBUG_LEVEL_TRACE 1951 for ( edge = edges; edge < edge_limit; edge++ )
1972 FT_TRACE5((
" ASSERTION FAILED for edge %d\n", edge2-edges ));
1974 af_latin_align_linked_edge( hints, dim, edge2, edge );
1977 #ifdef FT_DEBUG_LEVEL_TRACE 1987 FT_Pos org_len, org_center, cur_len;
1988 FT_Pos cur_pos1, error1, error2, u_off, d_off;
1991 org_len = edge2->
opos - edge->
opos;
1992 cur_len = af_latin_compute_stem_width(
1993 hints, dim, org_len,
2000 if ( cur_len <= 64 )
2015 org_center = edge->
opos + ( org_len >> 1 );
2018 error1 = org_center - ( cur_pos1 - u_off );
2022 error2 = org_center - ( cur_pos1 + d_off );
2026 if ( error1 < error2 )
2031 edge->
pos = cur_pos1 - cur_len / 2;
2032 edge2->
pos = edge->
pos + cur_len;
2040 FT_TRACE5((
" ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f)" 2041 " snapped to %.2f and %.2f\n",
2042 edge - edges, edge->
opos / 64.0,
2043 edge2 - edges, edge2->
opos / 64.0,
2044 edge->
pos / 64.0, edge2->
pos / 64.0 ));
2046 af_latin_align_linked_edge( hints, dim, edge, edge2 );
2048 #ifdef FT_DEBUG_LEVEL_TRACE 2054 FT_Pos org_pos, org_len, org_center, cur_len;
2055 FT_Pos cur_pos1, cur_pos2, delta1, delta2;
2058 org_pos = anchor->
pos + ( edge->
opos - anchor->
opos );
2059 org_len = edge2->
opos - edge->
opos;
2060 org_center = org_pos + ( org_len >> 1 );
2062 cur_len = af_latin_compute_stem_width(
2063 hints, dim, org_len,
2069 FT_TRACE5((
" ADJUST: edge %d (pos=%.2f) moved to %.2f\n",
2070 edge - edges, edge->
pos / 64.0,
2071 ( edge2->
pos - cur_len ) / 64.0 ));
2073 edge->
pos = edge2->
pos - cur_len;
2076 else if ( cur_len < 96 )
2083 if ( cur_len <= 64 )
2094 delta1 = org_center - ( cur_pos1 - u_off );
2098 delta2 = org_center - ( cur_pos1 + d_off );
2102 if ( delta1 < delta2 )
2107 edge->
pos = cur_pos1 - cur_len / 2;
2108 edge2->
pos = cur_pos1 + cur_len / 2;
2110 FT_TRACE5((
" STEM: edge %d (opos=%.2f) linked to %d (opos=%.2f)" 2111 " snapped to %.2f and %.2f\n",
2112 edge - edges, edge->
opos / 64.0,
2113 edge2 - edges, edge2->
opos / 64.0,
2114 edge->
pos / 64.0, edge2->
pos / 64.0 ));
2119 org_pos = anchor->
pos + ( edge->
opos - anchor->
opos );
2120 org_len = edge2->
opos - edge->
opos;
2121 org_center = org_pos + ( org_len >> 1 );
2123 cur_len = af_latin_compute_stem_width(
2124 hints, dim, org_len,
2129 delta1 = cur_pos1 + ( cur_len >> 1 ) - org_center;
2133 cur_pos2 =
FT_PIX_ROUND( org_pos + org_len ) - cur_len;
2134 delta2 = cur_pos2 + ( cur_len >> 1 ) - org_center;
2138 edge->
pos = ( delta1 < delta2 ) ? cur_pos1 : cur_pos2;
2139 edge2->
pos = edge->
pos + cur_len;
2141 FT_TRACE5((
" STEM: edge %d (opos=%.2f) linked to %d (opos=%.2f)" 2142 " snapped to %.2f and %.2f\n",
2143 edge - edges, edge->
opos / 64.0,
2144 edge2 - edges, edge2->
opos / 64.0,
2145 edge->
pos / 64.0, edge2->
pos / 64.0 ));
2148 #ifdef FT_DEBUG_LEVEL_TRACE 2155 if ( edge > edges && edge->
pos < edge[-1].
pos )
2157 #ifdef FT_DEBUG_LEVEL_TRACE 2158 FT_TRACE5((
" BOUND: edge %d (pos=%.2f) moved to %.2f\n",
2159 edge - edges, edge->
pos / 64.0, edge[-1].
pos / 64.0 ));
2164 edge->
pos = edge[-1].
pos;
2184 n_edges = edge_limit - edges;
2207 span = dist1 - dist2;
2213 delta = edge3->
pos - ( 2 * edge2->
pos - edge1->
pos );
2214 edge3->
pos -= delta;
2219 if ( n_edges == 12 )
2221 ( edges + 8 )->pos -= delta;
2222 ( edges + 11 )->pos -= delta;
2231 if ( has_serifs || !anchor )
2237 for ( edge = edges; edge < edge_limit; edge++ )
2254 if ( delta < 64 + 16 )
2256 af_latin_align_serif_edge( hints, edge->
serif, edge );
2257 FT_TRACE5((
" SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f)" 2258 " aligned to %.2f\n",
2259 edge - edges, edge->
opos / 64.0,
2261 edge->
pos / 64.0 ));
2267 FT_TRACE5((
" SERIF_ANCHOR: edge %d (opos=%.2f)" 2268 " snapped to %.2f\n",
2269 edge-edges, edge->
opos / 64.0, edge->
pos / 64.0 ));
2276 for ( before = edge - 1; before >= edges; before-- )
2280 for ( after = edge + 1; after < edge_limit; after++ )
2284 if ( before >= edges && before < edge &&
2285 after < edge_limit && after > edge )
2290 edge->pos = before->
pos +
2292 after->
pos - before->
pos,
2295 FT_TRACE5((
" SERIF_LINK1: edge %d (opos=%.2f) snapped to %.2f" 2296 " from %d (opos=%.2f)\n",
2297 edge - edges, edge->
opos / 64.0,
2299 before - edges, before->
opos / 64.0 ));
2303 edge->pos = anchor->
pos +
2304 ( ( edge->opos - anchor->
opos + 16 ) & ~31 );
2305 FT_TRACE5((
" SERIF_LINK2: edge %d (opos=%.2f)" 2306 " snapped to %.2f\n",
2307 edge - edges, edge->
opos / 64.0, edge->pos / 64.0 ));
2311 #ifdef FT_DEBUG_LEVEL_TRACE 2316 if ( edge > edges && edge->
pos < edge[-1].
pos )
2318 #ifdef FT_DEBUG_LEVEL_TRACE 2319 FT_TRACE5((
" BOUND: edge %d (pos=%.2f) moved to %.2f\n",
2320 edge - edges, edge->
pos / 64.0, edge[-1].
pos / 64.0 ));
2324 edge->
pos = edge[-1].
pos;
2327 if ( edge + 1 < edge_limit &&
2329 edge->
pos > edge[1].
pos )
2331 #ifdef FT_DEBUG_LEVEL_TRACE 2332 FT_TRACE5((
" BOUND: edge %d (pos=%.2f) moved to %.2f\n",
2333 edge - edges, edge->
pos / 64.0, edge[1].
pos / 64.0 ));
2343 #ifdef FT_DEBUG_LEVEL_TRACE 2367 #ifdef AF_CONFIG_OPTION_USE_WARPER 2391 #ifdef AF_CONFIG_OPTION_USE_WARPER
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
af_latin_hints_compute_blue_edges(AF_GlyphHints hints, AF_LatinMetrics metrics)
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_latin_metrics_init_widths(AF_LatinMetrics metrics, FT_Face face)
af_latin_metrics_check_digits(AF_LatinMetrics metrics, FT_Face face)
af_latin_hints_compute_segments(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)
af_glyph_hints_reload(AF_GlyphHints hints, FT_Outline *outline)
#define AF_LATIN_MAX_TEST_CHARACTERS
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_sort_and_quantize_widths(FT_UInt *count, AF_Width table, FT_Pos threshold)
GLenum GLuint GLint GLenum face
AF_LatinAxisRec axis[AF_DIMENSION_MAX]
FT_Load_Glyph(FT_Face face, FT_UInt glyph_index, FT_Int32 load_flags)
af_latin_metrics_scale(AF_LatinMetrics metrics, AF_Scaler scaler)
FT_Get_Advance(FT_Face face, FT_UInt gindex, FT_Int32 load_flags, FT_Fixed *padvance)
#define AF_LATIN_MAX_WIDTHS
af_latin_metrics_init(AF_LatinMetrics metrics, FT_Face face)
#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)
af_latin_hints_link_segments(AF_GlyphHints hints, AF_Dimension dim)
void(* AF_Script_ApplyHintsFunc)(AF_GlyphHints hints, FT_Outline *outline, AF_ScriptMetrics metrics)
#define AF_LATIN_HINTS_DO_VERT_SNAP(h)
#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
FT_MulFix(FT_Long a, FT_Long b)
af_axis_hints_new_segment(AF_AxisHints axis, FT_Memory memory, AF_Segment *asegment)
if(!abbox) return FT_THROW(Invalid_Argument)
#define AF_HINTS_DO_HORIZONTAL(h)
FT_BEGIN_HEADER enum AF_Dimension_ AF_Dimension
af_latin_hint_edges(AF_GlyphHints hints, AF_Dimension dim)
GLubyte GLubyte GLubyte GLubyte w
af_latin_hints_detect_features(AF_GlyphHints hints, AF_Dimension dim)
FT_BEGIN_HEADER struct AF_WidthRec_ * AF_Width
FT_Error(* AF_Script_InitMetricsFunc)(AF_ScriptMetrics metrics, FT_Face face)
#define FT_TRACE5(varformat)
GLuint GLuint GLsizei count
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)
af_latin_hints_compute_edges(AF_GlyphHints hints, AF_Dimension dim)