26 #include FT_ADVANCES_H
27 #include FT_INTERNAL_DEBUG_H
33 #ifdef AF_CONFIG_OPTION_CJK
35 #undef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT
41 #ifdef AF_CONFIG_OPTION_USE_WARPER
53 #define FT_COMPONENT trace_afcjk
91 if ( glyph_index == 0 )
95 if ( error || face->glyph->outline.n_points <= 0 )
134 for ( ; seg <
limit; seg++ )
139 if ( link && link->
link == seg && link > seg )
144 dist = seg->
pos - link->
pos;
149 axis->
widths[num_widths++].org = dist;
178 #define AF_CJK_MAX_TEST_CHARACTERS 32
186 AF_CJK_BLUE_TYPE_FILL,
187 AF_CJK_BLUE_TYPE_UNFILL,
194 [AF_CJK_BLUE_TYPE_MAX]
195 [AF_CJK_MAX_TEST_CHARACTERS] =
199 0x4ED6, 0x4EEC, 0x4F60, 0x4F86, 0x5011, 0x5230, 0x548C, 0x5730,
200 0x5BF9, 0x5C0D, 0x5C31, 0x5E2D, 0x6211, 0x65F6, 0x6642, 0x6703,
201 0x6765, 0x70BA, 0x80FD, 0x8230, 0x8AAA, 0x8BF4, 0x8FD9, 0x9019,
205 0x519B, 0x540C, 0x5DF2, 0x613F, 0x65E2, 0x661F, 0x662F, 0x666F,
206 0x6C11, 0x7167, 0x73B0, 0x73FE, 0x7406, 0x7528, 0x7F6E, 0x8981,
207 0x8ECD, 0x90A3, 0x914D, 0x91CC, 0x958B, 0x96F7, 0x9732, 0x9762,
213 0x4E2A, 0x4E3A, 0x4EBA, 0x4ED6, 0x4EE5, 0x4EEC, 0x4F60, 0x4F86,
214 0x500B, 0x5011, 0x5230, 0x548C, 0x5927, 0x5BF9, 0x5C0D, 0x5C31,
215 0x6211, 0x65F6, 0x6642, 0x6709, 0x6765, 0x70BA, 0x8981, 0x8AAA,
219 0x4E3B, 0x4E9B, 0x56E0, 0x5B83, 0x60F3, 0x610F, 0x7406, 0x751F,
220 0x7576, 0x770B, 0x7740, 0x7F6E, 0x8005, 0x81EA, 0x8457, 0x88E1,
221 0x8FC7, 0x8FD8, 0x8FDB, 0x9032, 0x904E, 0x9053, 0x9084, 0x91CC,
225 #ifndef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT
226 { {0x0000}, {0x0000} },
227 { {0x0000}, {0x0000} }
231 0x4E9B, 0x4EEC, 0x4F60, 0x4F86, 0x5011, 0x5230, 0x548C, 0x5730,
232 0x5979, 0x5C06, 0x5C07, 0x5C31, 0x5E74, 0x5F97, 0x60C5, 0x6700,
233 0x6837, 0x6A23, 0x7406, 0x80FD, 0x8AAA, 0x8BF4, 0x8FD9, 0x9019,
237 0x5373, 0x5417, 0x5427, 0x542C, 0x5462, 0x54C1, 0x54CD, 0x55CE,
238 0x5E08, 0x5E2B, 0x6536, 0x65AD, 0x65B7, 0x660E, 0x773C, 0x9593,
239 0x95F4, 0x9645, 0x9648, 0x9650, 0x9664, 0x9673, 0x968F, 0x969B,
245 0x4E8B, 0x524D, 0x5B78, 0x5C06, 0x5C07, 0x60C5, 0x60F3, 0x6216,
246 0x653F, 0x65AF, 0x65B0, 0x6837, 0x6A23, 0x6C11, 0x6C92, 0x6CA1,
247 0x7136, 0x7279, 0x73B0, 0x73FE, 0x7403, 0x7B2C, 0x7D93, 0x8C01,
251 0x4F8B, 0x5225, 0x522B, 0x5236, 0x52A8, 0x52D5, 0x5417, 0x55CE,
252 0x589E, 0x6307, 0x660E, 0x671D, 0x671F, 0x6784, 0x7269, 0x786E,
253 0x79CD, 0x8ABF, 0x8C03, 0x8CBB, 0x8D39, 0x90A3, 0x90FD, 0x9593,
268 [AF_CJK_BLUE_TYPE_MAX]
269 [AF_CJK_MAX_TEST_CHARACTERS] )
271 FT_Pos fills[AF_CJK_MAX_TEST_CHARACTERS];
272 FT_Pos flats[AF_CJK_MAX_TEST_CHARACTERS];
283 #ifdef FT_DEBUG_LEVEL_TRACE
290 FT_String* cjk_blue_type_name[AF_CJK_BLUE_TYPE_MAX] = {
301 FT_TRACE5((
"cjk blue zones computation\n" ));
302 FT_TRACE5((
"------------------------------------------------\n" ));
314 for ( fill_type = 0; fill_type < AF_CJK_BLUE_TYPE_MAX; fill_type++ )
316 const FT_ULong*
p = blue_chars[bb][fill_type];
317 const FT_ULong* limit = p + AF_CJK_MAX_TEST_CHARACTERS;
319 fill_type == AF_CJK_BLUE_TYPE_FILL );
322 FT_TRACE5((
"cjk blue %s/%s\n", cjk_blue_name[bb],
323 cjk_blue_type_name[fill_type] ));
326 for ( ; p < limit && *
p; p++ )
338 if ( glyph_index == 0 )
364 first = last + 1, nn++ )
381 for ( pp = first; pp <= last; pp++ )
382 if ( best_point < 0 || points[pp].
y > best_pos )
385 best_pos = points[
pp].
y;
390 for ( pp = first; pp <= last; pp++ )
391 if ( best_point < 0 || points[pp].
y < best_pos )
394 best_pos = points[
pp].
y;
399 for ( pp = first; pp <= last; pp++ )
400 if ( best_point < 0 || points[pp].
x < best_pos )
403 best_pos = points[
pp].
x;
408 for ( pp = first; pp <= last; pp++ )
409 if ( best_point < 0 || points[pp].
x > best_pos )
412 best_pos = points[
pp].
x;
420 FT_TRACE5((
"best_pos=%5ld\n", best_pos ));
424 fills[num_fills++] = best_pos;
426 flats[num_flats++] = best_pos;
430 if ( num_flats == 0 && num_fills == 0 )
452 blue_ref = & blue->
ref.org;
453 blue_shoot = & blue->
shoot.org;
456 if ( num_flats == 0 )
458 *blue_ref = fills[num_fills / 2];
459 *blue_shoot = fills[num_fills / 2];
461 else if ( num_fills == 0 )
463 *blue_ref = flats[num_flats / 2];
464 *blue_shoot = flats[num_flats / 2];
468 *blue_ref = fills[num_fills / 2];
469 *blue_shoot = flats[num_flats / 2];
474 if ( *blue_shoot != *blue_ref )
477 FT_Pos shoot = *blue_shoot;
482 *blue_shoot = *blue_ref = ( shoot +
ref ) / 2;
491 FT_TRACE5((
"-- cjk %s bluezone ref = %ld shoot = %ld\n",
492 cjk_blue_name[bb], *blue_ref, *blue_shoot ));
505 FT_Bool started = 0, same_width = 1;
511 for ( i = 0x30; i <= 0x39; i++ )
517 if ( glyph_index == 0 )
529 if ( advance != old_advance )
537 old_advance = advance;
542 metrics->root.digits_have_same_width = same_width;
553 metrics->units_per_em = face->units_per_EM;
556 face->charmap =
NULL;
560 af_cjk_metrics_init_blues( metrics, face, af_cjk_hani_blue_chars );
581 axis = &metrics->
axis[dim];
611 blue->
ref.fit = blue->
ref.cur;
618 if ( dist <= 48 && dist >= -48 )
637 else if ( delta2 < 64 )
638 delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 );
647 blue->
shoot.fit = blue->
ref.fit - delta2;
649 FT_TRACE5((
">> active cjk blue zone %c%d[%ld/%ld]: "
650 "ref: cur=%.2f fit=%.2f shoot: cur=%.2f fit=%.2f\n",
653 blue->
ref.cur / 64.0, blue->
ref.fit / 64.0,
654 blue->
shoot.cur / 64.0, blue->
shoot.fit / 64.0 ));
666 metrics->root.scaler = *scaler;
698 for ( seg = segments; seg < segment_limit; seg++ )
708 for ( ; pt != last; f0 = f1 )
742 dist_threshold =
FT_DivFix( 64 * 3, dist_threshold );
745 for ( seg1 = segments; seg1 < segment_limit; seg1++ )
751 if ( seg1->
dir != major_dir )
754 for ( seg2 = segments; seg2 < segment_limit; seg2++ )
755 if ( seg2 != seg1 && seg1->
dir + seg2->
dir == 0 )
769 if ( min < seg2->min_coord )
776 if ( len >= len_threshold )
778 if ( dist * 8 < seg1->
score * 9 &&
779 ( dist * 8 < seg1->
score * 7 || seg1->
len < len ) )
786 if ( dist * 8 < seg2->
score * 9 &&
787 ( dist * 8 < seg2->
score * 7 || seg2->
len < len ) )
811 for ( seg1 = segments; seg1 < segment_limit; seg1++ )
814 if ( !link1 || link1->
link != seg1 || link1->
pos <= seg1->
pos )
817 if ( seg1->
score >= dist_threshold )
820 for ( seg2 = segments; seg2 < segment_limit; seg2++ )
822 if ( seg2->
pos > seg1->
pos || seg1 == seg2 )
826 if ( !link2 || link2->
link != seg2 || link2->
pos < link1->
pos )
829 if ( seg1->
pos == seg2->
pos && link1->
pos == link2->
pos )
837 if ( seg1->
len >= seg2->
len * 3 )
842 for ( seg = segments; seg < segment_limit; seg++ )
852 else if ( link == link2 )
869 for ( seg1 = segments; seg1 < segment_limit; seg1++ )
876 if ( seg2->
link != seg1 )
904 FT_Pos edge_distance_threshold;
930 if ( edge_distance_threshold > 64 / 4 )
931 edge_distance_threshold =
FT_DivFix( 64 / 4, scale );
935 for ( seg = segments; seg < segment_limit; seg++ )
943 for ( ee = 0; ee < axis->
num_edges; ee++ )
949 if ( edge->
dir != seg->
dir )
956 if ( dist < edge_distance_threshold && dist < best )
976 if ( dist2 >= edge_distance_threshold )
982 if ( dist2 >= edge_distance_threshold )
1049 for ( edge = edges; edge < edge_limit; edge++ )
1058 }
while ( seg != edge->
first );
1062 for ( edge = edges; edge < edge_limit; edge++ )
1085 if ( seg->
link || is_serif )
1097 edge2 = edge->
serif;
1106 edge_delta = edge->
fpos - edge2->
fpos;
1107 if ( edge_delta < 0 )
1108 edge_delta = -edge_delta;
1112 if ( seg_delta < edge_delta )
1120 edge->
serif = edge2;
1129 }
while ( seg != edge->
first );
1134 if ( is_round > 0 && is_round >= is_straight )
1158 error = af_cjk_hints_compute_segments( hints, dim );
1161 af_cjk_hints_link_segments( hints, dim );
1163 error = af_cjk_hints_compute_edges( hints, dim );
1183 best_dist0 =
FT_MulFix( metrics->units_per_em / 40, scale );
1185 if ( best_dist0 > 64 / 2 )
1186 best_dist0 = 64 / 2;
1195 for ( ; edge < edge_limit; edge++ )
1199 FT_Pos best_dist = best_dist0;
1205 FT_Bool is_top_right_blue, is_major_dir;
1224 if ( is_top_right_blue ^ is_major_dir )
1233 compare = &blue->
shoot;
1235 compare = &blue->
ref;
1237 dist = edge->
fpos - compare->org;
1242 if ( dist < best_dist )
1245 best_blue = compare;
1261 FT_UInt32 scaler_flags, other_flags;
1276 mode = metrics->root.scaler.render_mode;
1278 #ifdef AF_CONFIG_OPTION_USE_WARPER
1283 scaler_flags = hints->scaler_flags;
1311 hints->scaler_flags = scaler_flags;
1312 hints->other_flags = other_flags;
1330 af_cjk_snap_width(
AF_Width widths,
1335 FT_Pos best = 64 + 32 + 2;
1340 for ( n = 0; n <
count; n++ )
1359 if ( width >= reference )
1361 if ( width < scaled + 48 )
1366 if ( width > scaled - 48 )
1407 if ( axis->width_count > 0 )
1409 if (
FT_ABS( dist - axis->widths[0].cur ) < 40 )
1411 dist = axis->widths[0].cur;
1420 dist += ( 54 - dist ) / 2 ;
1421 else if ( dist < 3 * 64 )
1431 else if ( delta < 22 )
1433 else if ( delta < 42 )
1435 else if ( delta < 54 )
1445 dist = af_cjk_snap_width( axis->widths, axis->width_count, dist );
1453 dist = ( dist + 16 ) & ~63;
1467 dist = ( dist + 32 ) & ~63;
1476 dist = ( dist + 64 ) >> 1;
1478 else if ( dist < 128 )
1479 dist = ( dist + 22 ) & ~63;
1482 dist = ( dist + 32 ) & ~63;
1505 FT_Pos fitted_width = af_cjk_compute_stem_width(
1511 stem_edge->
pos = base_edge->
pos + fitted_width;
1537 #define AF_LIGHT_MODE_MAX_HORZ_GAP 9
1538 #define AF_LIGHT_MODE_MAX_VERT_GAP 15
1539 #define AF_LIGHT_MODE_MAX_DELTA_ABS 14
1549 FT_Pos org_len, cur_len, org_center;
1550 FT_Pos cur_pos1, cur_pos2;
1551 FT_Pos d_off1, u_off1, d_off2, u_off2, delta;
1562 threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP;
1564 threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP;
1569 threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP / 3;
1571 threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP / 3;
1575 org_len = edge2->
opos - edge->
opos;
1576 cur_len = af_cjk_compute_stem_width( hints, dim, org_len,
1580 org_center = ( edge->
opos + edge2->
opos ) / 2 + anchor;
1581 cur_pos1 = org_center - cur_len / 2;
1582 cur_pos2 = cur_pos1 + cur_len;
1585 u_off1 = 64 - d_off1;
1586 u_off2 = 64 - d_off2;
1590 if ( d_off1 == 0 || d_off2 == 0 )
1593 if ( cur_len <= threshold )
1595 if ( d_off2 < cur_len )
1597 if ( u_off1 <= d_off2 )
1606 if ( threshold < 64 )
1608 if ( d_off1 >= threshold || u_off1 >= threshold ||
1609 d_off2 >= threshold || u_off2 >= threshold )
1613 offset = cur_len & 63;
1617 if ( u_off1 <= offset || d_off2 <= offset )
1621 offset = 64 - threshold;
1623 d_off1 = threshold - u_off1;
1624 u_off1 = u_off1 -
offset;
1625 u_off2 = threshold - d_off2;
1626 d_off2 = d_off2 -
offset;
1628 if ( d_off1 <= u_off1 )
1631 if ( d_off2 <= u_off2 )
1644 if ( delta > AF_LIGHT_MODE_MAX_DELTA_ABS )
1645 delta = AF_LIGHT_MODE_MAX_DELTA_ABS;
1646 else if ( delta < -AF_LIGHT_MODE_MAX_DELTA_ABS )
1647 delta = -AF_LIGHT_MODE_MAX_DELTA_ABS;
1655 edge->
pos = cur_pos1;
1656 edge2->
pos = cur_pos1 + cur_len;
1660 edge->
pos = cur_pos1 + cur_len;
1661 edge2->
pos = cur_pos1;
1681 FT_Pos last_stem_pos = 0;
1685 FT_TRACE5((
"==== cjk hinting %s edges =====\n",
1690 for ( edge = edges; edge < edge_limit; edge++ )
1717 FT_TRACE5((
"CJKBLUE: edge %d @%d (opos=%.2f) snapped to (%.2f), "
1719 edge1-edges, edge1->
fpos, edge1->
opos / 64.0, blue->fit / 64.0,
1720 edge1->
pos / 64.0 ));
1722 edge1->
pos = blue->fit;
1727 af_cjk_align_linked_edge( hints, dim, edge1, edge2 );
1737 for ( edge = edges; edge < edge_limit; edge++ )
1761 if ( has_last_stem &&
1762 ( edge->
pos < last_stem_pos + 64 ||
1763 edge2->
pos < last_stem_pos + 64 ) )
1773 FT_TRACE5((
"ASSERTION FAILED for edge %d\n", edge2-edges ));
1775 af_cjk_align_linked_edge( hints, dim, edge2, edge );
1782 af_cjk_align_linked_edge( hints, dim, edge2, edge );
1788 has_last_stem =
TRUE;
1789 last_stem_pos = edge->
pos;
1803 FT_Pos delta1, delta2, d1, d2;
1806 while ( right > left && !right->
link )
1810 left2 = *left->
link;
1811 right1 = *right->
link;
1814 delta = ( ( ( hinter->pp2.x + 32 ) & -64 ) - hinter->pp2.x ) / 2;
1815 target = left->
opos + ( right->
opos - left->
opos ) / 2 + delta - 16;
1818 delta1 += af_hint_normal_stem( hints, left, left->
link,
1821 if ( left->
link != right )
1822 af_hint_normal_stem( hints, right->
link, right, delta1, 0 );
1824 center1 = left->
pos + ( right->
pos - left->
pos ) / 2;
1826 if ( center1 >= target )
1827 delta2 = delta - 32;
1829 delta2 = delta + 32;
1831 delta2 += af_hint_normal_stem( hints, &left1, &left2, delta2, 0 );
1833 if ( delta1 != delta2 )
1835 if ( left->
link != right )
1836 af_hint_normal_stem( hints, &right1, &right2, delta2, 0 );
1838 center2 = left1.
pos + ( right2.
pos - left1.
pos ) / 2;
1848 if ( left->
link != right )
1866 delta = af_hint_normal_stem( hints, edge, edge2, 0,
1870 af_hint_normal_stem( hints, edge, edge2, delta, dim );
1873 printf(
"stem (%d,%d) adjusted (%.1f,%.1f)\n",
1874 edge - edges, edge2 - edges,
1875 ( edge->
pos - edge->
opos ) / 64.0,
1876 ( edge2->
pos - edge2->
opos ) / 64.0 );
1882 has_last_stem =
TRUE;
1883 last_stem_pos = edge2->
pos;
1901 n_edges = edge_limit - edges;
1924 span = dist1 - dist2;
1928 if ( edge1->
link == edge1 + 1 &&
1929 edge2->
link == edge2 + 1 &&
1930 edge3->
link == edge3 + 1 && span < 8 )
1932 delta = edge3->
pos - ( 2 * edge2->
pos - edge1->
pos );
1933 edge3->
pos -= delta;
1938 if ( n_edges == 12 )
1940 ( edges + 8 )->pos -= delta;
1941 ( edges + 11 )->pos -= delta;
1957 for ( edge = edges; edge < edge_limit; edge++ )
1964 af_cjk_align_serif_edge( hints, edge->
serif, edge );
1973 for ( edge = edges; edge < edge_limit; edge++ )
1981 before = after = edge;
1983 while ( --before >= edges )
1987 while ( ++after < edge_limit )
1991 if ( before >= edges || after < edge_limit )
1993 if ( before < edges )
1994 af_cjk_align_serif_edge( hints, after, edge );
1995 else if ( after >= edge_limit )
1996 af_cjk_align_serif_edge( hints, before, edge );
2002 edge->
pos = before->
pos +
2004 after->
pos - before->
pos,
2028 for ( edge = edges; edge < edge_limit; edge++ )
2046 point->
x = edge->
pos;
2051 point->
y = edge->
pos;
2055 if ( point == seg->
last )
2058 point = point->
next;
2063 }
while ( seg != edge->
first );
2088 if ( point == seg->
last )
2091 point = point->
next;
2096 }
while ( seg != edge->
first );
2143 #ifdef AF_CONFIG_OPTION_USE_WARPER
AF_CJKAxisRec axis[AF_DIMENSION_MAX]
af_glyph_hints_save(AF_GlyphHints hints, FT_Outline *outline)
af_cjk_metrics_check_digits(AF_CJKMetrics metrics, FT_Face face)
#define AF_HINTS_DO_VERTICAL(h)
FT_DivFix(FT_Long a, FT_Long b)
af_cjk_metrics_init(AF_CJKMetrics metrics, FT_Face face)
af_glyph_hints_done(AF_GlyphHints hints)
FT_BEGIN_HEADER typedef signed long FT_Pos
AF_CJKBlueRec blues[AF_CJK_BLUE_MAX]
void(* AF_Script_ApplyHintsFunc)(AF_GlyphHints hints, FT_Outline *outline, AF_ScriptMetrics metrics)
struct AF_CJKMetricsRec_ * AF_CJKMetrics
af_cjk_metrics_scale(AF_CJKMetrics metrics, AF_Scaler scaler)
af_cjk_hints_apply(AF_GlyphHints hints, FT_Outline *outline, AF_CJKMetrics metrics)
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_latin_hints_compute_segments(AF_GlyphHints hints, AF_Dimension dim)
enum AF_Direction_ AF_Direction
af_sort_widths(FT_UInt count, AF_Width table)
#define AF_UNIRANGE_REC(a, b)
af_glyph_hints_reload(AF_GlyphHints hints, FT_Outline *outline)
static const AF_Script_UniRangeRec af_cjk_uniranges[]
AF_WidthRec widths[AF_CJK_MAX_WIDTHS]
FT_BEGIN_HEADER typedef unsigned char FT_Bool
af_axis_hints_new_edge(AF_AxisHints axis, FT_Int fpos, AF_Direction dir, FT_Memory memory, AF_Edge *aedge)
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)
EGLContext EGLenum target
#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
void af_glyph_hints_dump_points(AF_GlyphHints hints)
#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)
FT_Pos edge_distance_threshold
#define AF_LATIN_HINTS_DO_MONO(h)
af_latin_hints_link_segments(AF_GlyphHints hints, AF_Dimension dim)
#define AF_LATIN_HINTS_DO_VERT_SNAP(h)
#define AF_CJK_MAX_WIDTHS
void(* AF_Script_ScaleMetricsFunc)(AF_ScriptMetrics metrics, AF_Scaler scaler)
GLenum const void GLuint GLint reference
FT_Set_Charmap(FT_Face face, FT_CharMap charmap)
GLenum GLenum GLenum GLenum GLenum scale
typedefFT_BEGIN_HEADER struct FT_MemoryRec_ * FT_Memory
void af_glyph_hints_dump_edges(AF_GlyphHints hints)
EGLSurface EGLint EGLint y
void af_glyph_hints_dump_segments(AF_GlyphHints hints)
FT_MulFix(FT_Long a, FT_Long b)
af_cjk_metrics_init_widths(AF_CJKMetrics metrics, FT_Face face, FT_ULong charcode)
#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
FT_BEGIN_HEADER struct AF_WidthRec_ * AF_Width
af_cjk_hints_init(AF_GlyphHints hints, AF_CJKMetrics metrics)
#define FT_TRACE5(varformat)
GLint GLint GLint GLint GLint w
GLuint GLdouble GLdouble GLint GLint const GLdouble * points
#define AF_SEGMENT_DIST(seg1, seg2)
AF_AxisHintsRec axis[AF_DIMENSION_MAX]
af_glyph_hints_align_weak_points(AF_GlyphHints hints, AF_Dimension dim)
FT_Render_Mode render_mode
#define AF_LATIN_HINTS_DO_HORZ_SNAP(h)
af_sort_pos(FT_UInt count, FT_Pos *table)
#define FT_LOAD_IGNORE_TRANSFORM
GLenum GLenum GLvoid GLvoid GLvoid * span
af_glyph_hints_rescale(AF_GlyphHints hints, AF_ScriptMetrics metrics)
void(* AF_Script_DoneMetricsFunc)(AF_ScriptMetrics metrics)