20 #include FT_INTERNAL_DEBUG_H
21 #include FT_INTERNAL_CALC_H
22 #include FT_INTERNAL_STREAM_H
23 #include FT_INTERNAL_SFNT_H
24 #include FT_TRUETYPE_TAGS_H
30 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
44 #define FT_COMPONENT trace_ttgload
51 #define ARGS_ARE_WORDS 0x0001
52 #define ARGS_ARE_XY_VALUES 0x0002
53 #define ROUND_XY_TO_GRID 0x0004
54 #define WE_HAVE_A_SCALE 0x0008
56 #define MORE_COMPONENTS 0x0020
57 #define WE_HAVE_AN_XY_SCALE 0x0040
58 #define WE_HAVE_A_2X2 0x0080
59 #define WE_HAVE_INSTR 0x0100
60 #define USE_MY_METRICS 0x0200
61 #define OVERLAP_COMPOUND 0x0400
62 #define SCALED_COMPONENT_OFFSET 0x0800
63 #define UNSCALED_COMPONENT_OFFSET 0x1000
76 ( (
SFNT_Service)face->sfnt )->get_metrics( face, 0, idx, lsb, aw );
78 FT_TRACE5((
" advance width (font units): %d\n", *aw ));
79 FT_TRACE5((
" left side bearing (font units): %d\n", *lsb ));
99 if ( face->vertical_info )
100 ( (
SFNT_Service)face->sfnt )->get_metrics( face, 1, idx, tsb, ah );
107 *ah = face->root.units_per_EM;
112 else if ( face->os2.version != 0xFFFFU )
114 *tsb = face->os2.sTypoAscender;
115 *ah = face->os2.sTypoAscender - face->os2.sTypoDescender;
119 *tsb = face->horizontal.Ascender;
120 *ah = face->horizontal.Ascender - face->horizontal.Descender;
125 FT_TRACE5((
" advance height (font units): %d\n", *ah ));
126 FT_TRACE5((
" top side bearing (font units): %d\n", *tsb ));
136 FT_Short left_bearing = 0, top_bearing = 0;
137 FT_UShort advance_width = 0, advance_height = 0;
148 loader->
advance = advance_width;
155 loader->
linear = advance_width;
160 #ifdef FT_CONFIG_OPTION_INCREMENTAL
163 tt_get_metrics_incr_overrides(
TT_Loader loader,
168 FT_Short left_bearing = 0, top_bearing = 0;
169 FT_UShort advance_width = 0, advance_height = 0;
175 face->
root.
internal->incremental_interface->funcs->get_glyph_metrics )
186 error = face->
root.
internal->incremental_interface->funcs->get_glyph_metrics(
188 glyph_index,
FALSE, &metrics );
202 error = face->
root.
internal->incremental_interface->funcs->get_glyph_metrics(
204 glyph_index,
TRUE, &metrics );
214 loader->
advance = advance_width;
221 loader->
linear = advance_width;
246 for ( k = 0; k <
n; k++ )
247 coords[k].
x += delta_x;
250 for ( k = 0; k <
n; k++ )
251 coords[k].
y += delta_y;
256 #define IS_HINTED( flags ) ( ( flags & FT_LOAD_NO_HINTING ) == 0 )
280 FT_TRACE4((
"Glyph %ld\n", glyph_index ));
286 loader->cursor = stream->
cursor;
287 loader->limit = stream->
limit;
310 if ( p + 10 > limit )
311 return TT_Err_Invalid_Outline;
320 FT_TRACE5((
" # of contours: %d\n", loader->n_contours ));
321 FT_TRACE5((
" xMin: %4d xMax: %4d\n", loader->bbox.xMin,
322 loader->bbox.xMax ));
323 FT_TRACE5((
" yMin: %4d yMax: %4d\n", loader->bbox.yMin,
324 loader->bbox.yMax ));
338 FT_Int n_contours = load->n_contours;
348 FT_Short *cont, *cont_limit, prev_cont;
358 cont = gloader->current.outline.contours;
359 cont_limit = cont + n_contours;
362 if ( n_contours >= 0xFFF || p + ( n_contours + 1 ) * 2 >
limit )
363 goto Invalid_Outline;
367 if ( n_contours > 0 )
371 goto Invalid_Outline;
373 for ( cont++; cont < cont_limit; cont++ )
376 if ( cont[0] <= prev_cont )
379 goto Invalid_Outline;
385 if ( n_contours > 0 )
387 n_points = cont[-1] + 1;
389 goto Invalid_Outline;
398 load->glyph->control_len = 0;
399 load->glyph->control_data = 0;
402 goto Invalid_Outline;
406 FT_TRACE5((
" Instructions size: %u\n", n_ins ));
410 FT_TRACE0((
"TT_Load_Simple_Glyph: too many instructions (%d)\n",
412 error = TT_Err_Too_Many_Hints;
416 if ( ( limit - p ) < n_ins )
418 FT_TRACE0((
"TT_Load_Simple_Glyph: instruction count mismatch\n" ));
419 error = TT_Err_Too_Many_Hints;
423 #ifdef TT_USE_BYTECODE_INTERPRETER
427 load->glyph->control_len = n_ins;
428 load->glyph->control_data = load->exec->glyphIns;
437 outline = &gloader->current.outline;
441 flag_limit = flag + n_points;
445 while ( flag < flag_limit )
448 goto Invalid_Outline;
454 goto Invalid_Outline;
458 goto Invalid_Outline;
468 vec_limit = vec + n_points;
472 if ( p + xy_size > limit )
473 goto Invalid_Outline;
475 for ( ; vec < vec_limit; vec++, flag++ )
484 goto Invalid_Outline;
487 if ( ( f & 16 ) == 0 )
490 else if ( ( f & 16 ) == 0 )
493 goto Invalid_Outline;
501 *flag = (
FT_Byte)( f & ~( 2 | 16 ) );
506 vec = gloader->current.outline.points;
507 vec_limit = vec + n_points;
511 for ( ; vec < vec_limit; vec++, flag++ )
520 goto Invalid_Outline;
523 if ( ( f & 32 ) == 0 )
526 else if ( ( f & 32 ) == 0 )
529 goto Invalid_Outline;
549 error = TT_Err_Invalid_Outline;
580 goto Invalid_Composite;
582 subglyph = gloader->current.subglyphs + num_subglyphs;
584 subglyph->
arg1 = subglyph->
arg2 = 0;
600 if ( p + count > limit )
601 goto Invalid_Composite;
646 gloader->current.num_subglyphs = num_subglyphs;
648 #ifdef TT_USE_BYTECODE_INTERPRETER
670 error = TT_Err_Invalid_Composite;
720 #ifdef TT_USE_BYTECODE_INTERPRETER
727 #ifdef TT_USE_BYTECODE_INTERPRETER
730 FT_TRACE1((
"TT_Hint_Glyph: too long instructions " ));
731 FT_TRACE1((
"(0x%lx byte) is truncated\n",
742 #ifdef TT_USE_BYTECODE_INTERPRETER
774 #ifdef TT_USE_BYTECODE_INTERPRETER
782 FT_Outline current_outline = gloader->current.outline;
801 current_outline.
tags[0] |=
839 outline = &gloader->current.outline;
844 outline->
points[n_points ] = loader->
pp1;
845 outline->
points[n_points + 1] = loader->
pp2;
846 outline->
points[n_points + 2] = loader->
pp3;
847 outline->
points[n_points + 3] = loader->
pp4;
849 outline->
tags[n_points ] = 0;
850 outline->
tags[n_points + 1] = 0;
851 outline->
tags[n_points + 2] = 0;
852 outline->
tags[n_points + 3] = 0;
856 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
873 for ( i = 0; i < n_points; ++
i )
901 for ( ; vec <
limit; vec++ )
907 loader->
pp1 = outline->
points[n_points - 4];
908 loader->
pp2 = outline->
points[n_points - 3];
909 loader->
pp3 = outline->
points[n_points - 2];
910 loader->
pp4 = outline->
points[n_points - 1];
940 FT_Vector* base_vec = gloader->base.outline.points;
941 FT_UInt num_points = gloader->base.outline.n_points;
956 for ( i = num_base_points; i < num_points; i++ )
974 l += num_base_points;
975 if ( k >= num_base_points ||
977 return TT_Err_Invalid_Composite;
979 p1 = gloader->base.outline.points +
k;
980 p2 = gloader->base.outline.points +
l;
998 #ifdef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
1019 int m = a > b ? a :
b;
1020 int n = c > d ? c :
d;
1025 if ( c - d <= 33 && c - d >= -33 )
1074 base_vec + num_base_points,
1101 outline = &loader->
gloader->base.outline;
1120 #ifdef TT_USE_BYTECODE_INTERPRETER
1134 FT_TRACE5((
" Instructions size = %d\n", n_ins ));
1137 max_ins = ((
TT_Face)loader->
face)->max_profile.maxSizeOfInstructions;
1138 if ( n_ins > max_ins )
1143 FT_TRACE1((
"TT_Process_Composite_Glyph: "
1144 "too many instructions (%d) for glyph with length %d\n",
1146 return TT_Err_Too_Many_Hints;
1159 else if ( n_ins == 0 )
1172 start_point, start_contour );
1176 for ( i = start_point; i < loader->
zone.
n_points; i++ )
1188 #define TT_LOADER_SET_PP( loader ) \
1190 (loader)->pp1.x = (loader)->bbox.xMin - (loader)->left_bearing; \
1191 (loader)->pp1.y = 0; \
1192 (loader)->pp2.x = (loader)->pp1.x + (loader)->advance; \
1193 (loader)->pp2.y = 0; \
1194 (loader)->pp3.x = 0; \
1195 (loader)->pp3.y = (loader)->top_bearing + (loader)->bbox.yMax; \
1196 (loader)->pp4.x = 0; \
1197 (loader)->pp4.y = (loader)->pp3.y - (loader)->vadvance; \
1230 FT_Bool glyph_data_loaded = 0;
1236 if ( recurse_count > 1 &&
1239 error = TT_Err_Invalid_Composite;
1246 error = TT_Err_Invalid_Glyph_Index;
1254 x_scale = ((
TT_Size)loader->
size)->metrics.x_scale;
1255 y_scale = ((
TT_Size)loader->
size)->metrics.y_scale;
1269 #ifdef FT_CONFIG_OPTION_INCREMENTAL
1276 error = face->
root.
internal->incremental_interface->funcs->get_glyph_data(
1278 glyph_index, &glyph_data );
1282 glyph_data_loaded = 1;
1284 loader->
byte_len = glyph_data.length;
1286 FT_MEM_ZERO( &inc_stream,
sizeof ( inc_stream ) );
1288 glyph_data.pointer, glyph_data.length );
1290 loader->
stream = &inc_stream;
1301 #ifdef FT_CONFIG_OPTION_INCREMENTAL
1309 FT_TRACE2((
"no `glyf' table but non-zero `loca' entry\n" ));
1310 error = TT_Err_Invalid_Table;
1324 if ( error || header_only )
1342 #ifdef FT_CONFIG_OPTION_INCREMENTAL
1343 tt_get_metrics_incr_overrides( loader, glyph_index );
1346 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
1355 glyph_index, &deltas, 4 );
1359 loader->
pp1.
x += deltas[0].x; loader->
pp1.
y += deltas[0].y;
1360 loader->
pp2.
x += deltas[1].x; loader->
pp2.
y += deltas[1].y;
1361 loader->
pp3.
x += deltas[2].x; loader->
pp3.
y += deltas[2].y;
1362 loader->
pp4.
x += deltas[3].x; loader->
pp4.
y += deltas[3].y;
1385 #ifdef FT_CONFIG_OPTION_INCREMENTAL
1386 tt_get_metrics_incr_overrides( loader, glyph_index );
1424 start_point = gloader->base.outline.n_points;
1425 start_contour = gloader->base.outline.n_contours;
1439 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
1441 if ( face->doblend )
1455 gloader->current.num_subglyphs + 4 )) != 0 )
1458 subglyph = gloader->current.subglyphs + gloader->base.num_subglyphs;
1459 limit = gloader->current.num_subglyphs;
1461 for ( i = 0; i <
limit; ++
i, ++subglyph )
1473 loader->
pp1.
x += deltas[i + 0].x; loader->
pp1.
y += deltas[i + 0].y;
1474 loader->
pp2.
x += deltas[i + 1].x; loader->
pp2.
y += deltas[i + 1].y;
1475 loader->
pp3.
x += deltas[i + 2].x; loader->
pp3.
y += deltas[i + 2].y;
1476 loader->
pp4.
x += deltas[i + 3].x; loader->
pp4.
y += deltas[i + 3].y;
1497 loader->
glyph->
format = FT_GLYPH_FORMAT_COMPOSITE;
1510 FT_UInt num_points = start_point;
1511 FT_UInt num_subglyphs = gloader->current.num_subglyphs;
1512 FT_UInt num_base_subgs = gloader->base.num_subglyphs;
1521 for ( n = 0; n < num_subglyphs; n++ )
1530 subglyph = gloader->base.subglyphs + num_base_subgs +
n;
1532 pp[0] = loader->
pp1;
1533 pp[1] = loader->
pp2;
1534 pp[2] = loader->
pp3;
1535 pp[3] = loader->
pp4;
1537 num_base_points = gloader->base.outline.n_points;
1540 recurse_count + 1,
FALSE );
1545 subglyph = gloader->base.subglyphs + num_base_subgs +
n;
1549 loader->
pp1 = pp[0];
1550 loader->
pp2 = pp[1];
1551 loader->
pp3 = pp[2];
1552 loader->
pp4 = pp[3];
1555 num_points = gloader->base.outline.n_points;
1557 if ( num_points == num_base_points )
1570 loader->
stream = old_stream;
1583 num_points > start_point )
1591 error = TT_Err_Invalid_Outline;
1604 #ifdef FT_CONFIG_OPTION_INCREMENTAL
1606 if ( glyph_data_loaded )
1607 face->
root.
internal->incremental_interface->funcs->free_glyph_data(
1632 if ( glyph->format != FT_GLYPH_FORMAT_COMPOSITE )
1635 bbox = loader->
bbox;
1639 glyph->linearHoriAdvance = loader->
linear;
1641 glyph->metrics.horiBearingX = bbox.
xMin;
1642 glyph->metrics.horiBearingY = bbox.
yMax;
1643 glyph->metrics.horiAdvance = loader->
pp2.
x - loader->
pp1.
x;
1657 glyph->metrics.horiAdvance = *widthp << 6;
1661 glyph->metrics.width = bbox.
xMax - bbox.
xMin;
1662 glyph->metrics.height = bbox.
yMax - bbox.
yMin;
1679 if ( loader->
pp3.
y <= loader->
pp4.
y )
1707 top = ( advance -
height ) / 2;
1710 #ifdef FT_CONFIG_OPTION_INCREMENTAL
1743 glyph->linearVertAdvance = advance;
1749 advance =
FT_MulFix( advance, y_scale );
1755 glyph->metrics.vertBearingX = glyph->metrics.horiBearingX -
1756 glyph->metrics.horiAdvance / 2;
1757 glyph->metrics.vertBearingY =
top;
1758 glyph->metrics.vertAdvance = advance;
1765 #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
1771 FT_Int32 load_flags )
1807 glyph->
format = FT_GLYPH_FORMAT_BITMAP;
1831 FT_Int32 load_flags,
1844 #ifdef TT_USE_BYTECODE_INTERPRETER
1847 if (
IS_HINTED( load_flags ) && !glyf_table_only )
1853 if ( !size->cvt_ready )
1855 FT_Error error = tt_size_ready_bytecode( size, pedantic );
1863 exec = size->debug ? size->context
1866 return TT_Err_Could_Not_Find_Context;
1880 FT_TRACE4((
"tt_loader_init: grayscale change,"
1881 " re-executing `prep' table\n" ));
1885 for ( i = 0; i < size->cvt_size; i++ )
1887 tt_size_run_prep( size, pedantic );
1899 loader->
exec = exec;
1909 #ifdef FT_CONFIG_OPTION_INCREMENTAL
1921 if ( error == TT_Err_Table_Missing )
1925 FT_ERROR((
"tt_loader_init: could not access glyph table\n" ));
1933 if ( !glyf_table_only )
1984 FT_Int32 load_flags )
2000 if ( size->strike_index != 0xFFFFFFFFUL &&
2003 error = load_sbit_image( size, glyph, glyph_index, load_flags );
2014 glyph->linearHoriAdvance = loader.
linear;
2027 return TT_Err_Invalid_Size_Handle;
2030 return TT_Err_Invalid_Argument;
2037 glyph->num_subglyphs = 0;
2038 glyph->outline.flags = 0;
2044 if ( glyph->format == FT_GLYPH_FORMAT_COMPOSITE )
2046 glyph->num_subglyphs = loader.
gloader->base.num_subglyphs;
2047 glyph->subglyphs = loader.
gloader->base.subglyphs;
2051 glyph->outline = loader.
gloader->base.outline;
2062 #ifdef TT_USE_BYTECODE_INTERPRETER
2103 if ( !( load_flags & FT_LOAD_NO_SCALE ) &&
2104 size->root.metrics.y_ppem < 24 )
TT_Loader_EndGlyphFunc forget_glyph_frame
#define UNSCALED_COMPONENT_OFFSET
const TT_GraphicsState tt_default_graphics_state
TT_Load_Glyph_Header(TT_Loader loader)
#define FT_OUTLINE_SINGLE_PASS
#define FT_LOAD_VERTICAL_LAYOUT
FT_DivFix(FT_Long a, FT_Long b)
SFNT_Interface * SFNT_Service
#define FT_LOAD_SBITS_ONLY
FT_BEGIN_HEADER typedef signed long FT_Pos
#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS
GLvoid **typedef void(GLAPIENTRY *PFNGLGETVERTEXATTRIBDVPROC)(GLuint
#define TT_CONFIG_OPTION_GX_VAR_SUPPORT
#define FT_MEM_ZERO(dest, count)
#define FT_OUTLINE_IGNORE_DROPOUTS
TT_Load_Context(TT_ExecContext exec, TT_Face face, TT_Size size)
#define FT_ARRAY_COPY(dest, source, count)
FT_UShort maxComponentDepth
#define SCALED_COMPONENT_OFFSET
#define FT_CURVE_TAG_TOUCH_BOTH
#define FT_LOAD_NO_HINTING
TT_Loader_StartGlyphFunc access_glyph_frame
#define FT_NEXT_BYTE(buffer)
GLuint GLsizei GLsizei GLfloat * metrics
#define FT_LOAD_NO_RECURSE
TT_Init_Glyph_Loading(TT_Face face)
EGLSurface EGLint EGLint EGLint EGLint height
FT_Incremental_GetGlyphMetricsFunc get_glyph_metrics
GLboolean GLboolean GLboolean GLboolean a
typedefFT_BEGIN_HEADER struct TT_DriverRec_ * TT_Driver
#define FT_READ_USHORT(var)
#define TT_USE_BYTECODE_INTERPRETER
tt_face_get_device_metrics(TT_Face face, FT_UInt ppem, FT_UInt gindex)
return Display return Display Bool Bool int d
#define ARGS_ARE_XY_VALUES
TT_Loader_GotoTableFunc goto_table
#define FT_FACE_DRIVER(x)
#define FT_CONFIG_OPTION_INCREMENTAL
FT_BEGIN_HEADER typedef unsigned char FT_Bool
FT_Face_Internal internal
#define FT_TRACE1(varformat)
#define FT_CURVE_TAG_HAS_SCANMODE
typedefFT_BEGIN_HEADER struct FT_GlyphLoaderRec_ * FT_GlyphLoader
#define FT_ERROR(varformat)
#define FT_ASSERT(condition)
#define FT_TRACE4(varformat)
TT_Forget_Glyph_Frame(TT_Loader loader)
TT_Load_SBit_Image_Func load_sbit_image
FT_Outline_Get_CBox(const FT_Outline *outline, FT_BBox *acbox)
FT_GlyphLoader_Add(FT_GlyphLoader loader)
TT_Vary_Get_Glyph_Deltas(TT_Face face, FT_UInt glyph_index, FT_Vector **deltas, FT_UInt n_points)
TT_Load_Composite_Glyph(TT_Loader loader)
TT_Run_Context(TT_ExecContext exec, FT_Bool debug)
static FT_Error TT_Process_Composite_Glyph(TT_Loader loader, FT_UInt start_point, FT_UInt start_contour)
TT_Get_VMetrics(TT_Face face, FT_UInt idx, FT_Short *tsb, FT_UShort *ah)
struct TT_FaceRec_ * TT_Face
Update_Max(FT_Memory memory, FT_ULong *size, FT_Long multiplier, void *_pbuff, FT_ULong new_max)
#define WE_HAVE_AN_XY_SCALE
TT_MaxProfile max_profile
FT_GlyphLoader_CheckSubGlyphs(FT_GlyphLoader loader, FT_UInt n_subs)
static void translate_array(FT_UInt n, FT_Vector *coords, FT_Pos delta_x, FT_Pos delta_y)
#define FT_TRACE0(varformat)
TT_Get_HMetrics(TT_Face face, FT_UInt idx, FT_Short *lsb, FT_UShort *aw)
#define FT_OUTLINE_HIGH_PRECISION
TT_Load_Simple_Glyph(TT_Loader load)
TT_Loader_ReadGlyphFunc read_composite_glyph
#define FT_TRACE2(varformat)
static FT_Error TT_Process_Composite_Component(TT_Loader loader, FT_SubGlyph subglyph, FT_UInt start_point, FT_UInt num_base_points)
FT_UShort maxSizeOfInstructions
struct FT_FaceRec_ * FT_Face
TT_Size_Metrics ttmetrics
static void tt_prepare_zone(TT_GlyphZone zone, FT_GlyphLoad load, FT_UInt start_point, FT_UInt start_contour)
static void tt_get_metrics(TT_Loader loader, FT_UInt glyph_index)
#define FT_CALLBACK_DEF(x)
GLfloat GLfloat GLfloat top
FT_BEGIN_HEADER FT_SqrtFixed(FT_Int32 x)
typedefFT_BEGIN_HEADER struct FT_MemoryRec_ * FT_Memory
static FT_Error compute_glyph_metrics(TT_Loader loader, FT_UInt glyph_index)
const FT_Incremental_FuncsRec * funcs
#define FT_OUTLINE_INCLUDE_STUBS
EGLSurface EGLint EGLint y
#define FT_STREAM_SEEK(position)
FT_MulFix(FT_Long a, FT_Long b)
#define FT_NEXT_USHORT(buffer)
FT_Vector_Transform(FT_Vector *vec, const FT_Matrix *matrix)
static FT_Error TT_Process_Simple_Glyph(TT_Loader loader)
struct FT_SizeRec_ * FT_Size
struct FT_GlyphSlotRec_ * FT_GlyphSlot
TT_Loader_ReadGlyphFunc read_simple_glyph
static FT_Error load_truetype_glyph(TT_Loader loader, FT_UInt glyph_index, FT_UInt recurse_count, FT_Bool header_only)
FT_GlyphLoader_Rewind(FT_GlyphLoader loader)
#define TT_LOADER_SET_PP(loader)
FT_Slot_Internal internal
#define FT_TRACE5(varformat)
#define FT_OUTLINE_SMART_DROPOUTS
GLdouble GLdouble GLdouble b
FT_Outline_Translate(const FT_Outline *outline, FT_Pos xOffset, FT_Pos yOffset)
FT_Stream_OpenMemory(FT_Stream stream, const FT_Byte *base, FT_ULong size)
#define FT_FRAME_ENTER(size)
#define FT_MEM_COPY(dest, source, count)
#define FT_NEXT_SHORT(buffer)
#define FT_LOAD_NO_BITMAP
TT_Access_Glyph_Frame(TT_Loader loader, FT_UInt glyph_index, FT_ULong offset, FT_UInt byte_count)
TT_Load_Glyph(TT_Size size, TT_GlyphSlot glyph, FT_UInt glyph_index, FT_Int32 load_flags)
#define FT_GLYPHLOADER_CHECK_POINTS(_loader, _points, _contours)
static FT_Error tt_loader_init(TT_Loader loader, TT_Size size, TT_GlyphSlot glyph, FT_Int32 load_flags, FT_Bool glyf_table_only)
FT_Vector * extra_points2
TT_Loader_ReadGlyphFunc read_glyph_header
#define FT_IS_SCALABLE(face)
#define FT_STREAM_READ(buffer, count)
#define FT_NEXT_CHAR(buffer)
TT_Set_CodeRange(TT_ExecContext exec, FT_Int range, void *base, FT_Long length)
struct TT_SizeRec_ * TT_Size
FT_Module_Constructor FT_GLYPH_FORMAT_OUTLINE
tt_face_get_location(TT_Face face, FT_UInt gindex, FT_UInt *asize)
static FT_Error TT_Hint_Glyph(TT_Loader loader, FT_Bool is_composite)
#define FT_LOAD_TARGET_MODE(x)