43#include FT_INTERNAL_DEBUG_H
44#include FT_CONFIG_CONFIG_H
45#include FT_INTERNAL_STREAM_H
46#include FT_INTERNAL_SFNT_H
47#include FT_TRUETYPE_TAGS_H
48#include FT_TRUETYPE_IDS_H
49#include FT_MULTIPLE_MASTERS_H
58#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
61#define FT_Stream_FTell( stream ) \
62 (FT_ULong)( (stream)->cursor - (stream)->base )
63#define FT_Stream_SeekSet( stream, off ) \
65 ( (off) < (FT_ULong)( (stream)->limit - (stream)->base ) ) \
66 ? (stream)->base + (off) \
77#define FT_COMPONENT trace_ttgxvar
97#define ALL_POINTS (FT_UShort*)~(FT_PtrDist)0
100#define GX_PT_POINTS_ARE_WORDS 0x80U
101#define GX_PT_POINT_RUN_COUNT_MASK 0x7FU
149 if (
n & GX_PT_POINTS_ARE_WORDS )
151 n &= GX_PT_POINT_RUN_COUNT_MASK;
158 FT_TRACE1((
"ft_var_readpackedpoints: number of points too large\n" ));
175 if ( runcnt & GX_PT_POINTS_ARE_WORDS )
177 runcnt &= GX_PT_POINT_RUN_COUNT_MASK;
182 for (
j = 0;
j < runcnt;
j++ )
195 for (
j = 0;
j < runcnt;
j++ )
209#define GX_DT_DELTAS_ARE_ZERO 0x80U
210#define GX_DT_DELTAS_ARE_WORDS 0x40U
211#define GX_DT_DELTA_RUN_COUNT_MASK 0x3FU
250 if ( delta_cnt >
size )
252 FT_TRACE1((
"ft_var_readpackeddeltas: number of points too large\n" ));
260 while (
i < delta_cnt )
263 cnt = runcnt & GX_DT_DELTA_RUN_COUNT_MASK;
265 if ( runcnt & GX_DT_DELTAS_ARE_ZERO )
268 for (
j = 0;
j <=
cnt &&
i < delta_cnt;
j++ )
271 else if ( runcnt & GX_DT_DELTAS_ARE_WORDS )
274 for (
j = 0;
j <=
cnt &&
i < delta_cnt;
j++ )
280 for (
j = 0;
j <=
cnt &&
i < delta_cnt;
j++ )
313 GX_Blend blend =
face->blend;
314 GX_AVarSegment segment;
326 blend->avar_loaded =
TRUE;
348 if ( axisCount != (
FT_Long)blend->mmvar->num_axis )
350 FT_TRACE2((
"ft_var_load_avar: number of axes in `avar' and `fvar'\n"
351 " table are different\n" ));
358 segment = &blend->avar_segment[0];
359 for (
i = 0;
i < axisCount;
i++, segment++ )
364 if ( (
FT_ULong)segment->pairCount * 4 > table_len ||
365 FT_NEW_ARRAY( segment->correspondence, segment->pairCount ) )
370 for (
j =
i - 1;
j >= 0;
j-- )
371 FT_FREE( blend->avar_segment[
j].correspondence );
373 FT_FREE( blend->avar_segment );
374 blend->avar_segment =
NULL;
378 for (
j = 0;
j < segment->pairCount;
j++ )
385 segment->correspondence[
j].fromCoord / 65536.0,
386 segment->correspondence[
j].toCoord / 65536.0 ));
398#define FT_FIXED_ONE ( (FT_Fixed)0x10000 )
400#define FT_fdot14ToFixed( x ) \
401 ( (FT_Fixed)( (FT_ULong)(x) << 2 ) )
402#define FT_intToFixed( i ) \
403 ( (FT_Fixed)( (FT_ULong)(i) << 16 ) )
404#define FT_fixedToInt( x ) \
405 ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) )
411 GX_ItemVarStore itemStore )
422 GX_Blend blend =
face->blend;
423 GX_ItemVarData varData;
434 FT_TRACE2((
"ft_var_load_item_variation_store: bad store format %d\n",
446 if ( !itemStore->dataCount )
448 FT_TRACE2((
"ft_var_load_item_variation_store: missing varData\n" ));
455 if (
FT_NEW_ARRAY( dataOffsetArray, itemStore->dataCount ) )
458 for (
i = 0;
i < itemStore->dataCount;
i++ )
472 if ( itemStore->axisCount != (
FT_Long)blend->mmvar->num_axis )
474 FT_TRACE2((
"ft_var_load_item_variation_store:"
475 " number of axes in item variation store\n"
477 " and `fvar' table are different\n" ));
482 if (
FT_NEW_ARRAY( itemStore->varRegionList, itemStore->regionCount ) )
485 for (
i = 0;
i < itemStore->regionCount;
i++ )
487 GX_AxisCoords axisCoords;
491 itemStore->axisCount ) )
494 axisCoords = itemStore->varRegionList[
i].axisList;
496 for (
j = 0;
j < itemStore->axisCount;
j++ )
515 if (
FT_NEW_ARRAY( itemStore->varData, itemStore->dataCount ) )
518 for (
i = 0;
i < itemStore->dataCount;
i++ )
520 varData = &itemStore->varData[
i];
531 if ( shortDeltaCount > varData->regionIdxCount )
533 FT_TRACE2((
"bad short count %d or region count %d\n",
535 varData->regionIdxCount ));
540 if ( varData->regionIdxCount > itemStore->regionCount )
542 FT_TRACE2((
"inconsistent regionCount %d in varData[%d]\n",
543 varData->regionIdxCount,
551 varData->regionIdxCount ) )
554 for (
j = 0;
j < varData->regionIdxCount;
j++ )
559 if ( varData->regionIndices[
j] >= itemStore->regionCount )
562 varData->regionIndices[
j] ));
574 varData->regionIdxCount * varData->itemCount ) )
579 for (
j = 0;
j < varData->itemCount * varData->regionIdxCount; )
581 for (
k = 0;
k < shortDeltaCount;
k++,
j++ )
590 varData->deltaSet[
j] = delta;
593 for ( ;
k < varData->regionIdxCount;
k++,
j++ )
602 varData->deltaSet[
j] = delta;
617 GX_DeltaSetIdxMap
map,
618 GX_ItemVarStore itemStore )
645 entrySize = ( (
format & 0x0030 ) >> 4 ) + 1;
646 innerBitCount = (
format & 0x000F ) + 1;
647 innerIndexMask = ( 1 << innerBitCount ) - 1;
655 for (
i = 0;
i <
map->mapCount;
i++ )
658 FT_UInt outerIndex, innerIndex;
662 for (
j = 0;
j < entrySize;
j++ )
670 mapData = ( mapData << 8 ) |
data;
673 outerIndex = mapData >> innerBitCount;
675 if ( outerIndex >= itemStore->dataCount )
677 FT_TRACE2((
"outerIndex[%d] == %d out of range\n",
684 map->outerIndex[
i] = outerIndex;
686 innerIndex = mapData & innerIndexMask;
688 if ( innerIndex >= itemStore->varData[outerIndex].itemCount )
690 FT_TRACE2((
"innerIndex[%d] == %d out of range\n",
697 map->innerIndex[
i] = innerIndex;
735 GX_Blend blend =
face->blend;
749 blend->vvar_loaded =
TRUE;
757 blend->hvar_loaded =
TRUE;
777 if ( majorVersion != 1 )
779 FT_TRACE2((
"bad table version %d\n", majorVersion ));
790 if (
FT_NEW( blend->vvar_table ) )
792 table = blend->vvar_table;
796 if (
FT_NEW( blend->hvar_table ) )
798 table = blend->hvar_table;
801 error = ft_var_load_item_variation_store(
803 table_offset + store_offset,
808 if ( widthMap_offset )
810 error = ft_var_load_delta_set_index_mapping(
812 table_offset + widthMap_offset,
827 blend->vvar_checked =
TRUE;
837 blend->hvar_checked =
TRUE;
853 GX_ItemVarStore itemStore,
857 GX_ItemVarData varData;
869 varData = &itemStore->varData[outerIndex];
870 deltaSet = &varData->deltaSet[varData->regionIdxCount * innerIndex];
873 for ( master = 0; master < varData->regionIdxCount; master++ )
876 FT_UInt regionIndex = varData->regionIndices[master];
878 GX_AxisCoords axis = itemStore->varRegionList[regionIndex].axisList;
882 for (
j = 0;
j < itemStore->axisCount;
j++, axis++ )
889 if ( axis->startCoord > axis->peakCoord ||
890 axis->peakCoord > axis->endCoord )
893 else if ( axis->startCoord < 0 &&
894 axis->endCoord > 0 &&
895 axis->peakCoord != 0 )
899 else if ( axis->peakCoord == 0 )
903 else if (
face->blend->normalizedcoords[
j] < axis->startCoord ||
904 face->blend->normalizedcoords[
j] > axis->endCoord )
910 if (
face->blend->normalizedcoords[
j] == axis->peakCoord )
912 else if (
face->blend->normalizedcoords[
j] < axis->peakCoord )
915 axis->peakCoord - axis->startCoord );
919 axis->endCoord - axis->peakCoord );
923 scalar =
FT_MulFix( scalar, axisScalar );
928 delta = FT_intToFixed( deltaSet[master] );
929 scaledDelta =
FT_MulFix( scalar, delta );
932 netAdjustment = netAdjustment + scaledDelta;
936 return FT_fixedToInt( netAdjustment );
966 FT_UInt innerIndex, outerIndex;
972 if ( !
face->doblend || !
face->blend )
977 if ( !
face->blend->vvar_loaded )
980 face->blend->vvar_error = ft_var_load_hvvar(
face, 1 );
983 if ( !
face->blend->vvar_checked )
993 if ( !
face->blend->hvar_loaded )
996 face->blend->hvar_error = ft_var_load_hvvar(
face, 0 );
999 if ( !
face->blend->hvar_checked )
1011 if (
table->widthMap.innerIndex )
1016 if (
idx >=
table->widthMap.mapCount )
1017 idx =
table->widthMap.mapCount - 1;
1020 outerIndex =
table->widthMap.outerIndex[
idx];
1021 innerIndex =
table->widthMap.innerIndex[
idx];
1025 GX_ItemVarData varData;
1030 innerIndex = gindex;
1032 varData = &
table->itemStore.varData[outerIndex];
1033 if ( gindex >= varData->itemCount )
1035 FT_TRACE2((
"gindex %d out of range\n", gindex ));
1041 delta = ft_var_get_item_delta(
face,
1046 FT_TRACE5((
"%s value %d adjusted by %d unit%s (%s)\n",
1047 vertical ?
"vertical height" :
"horizontal width",
1050 delta == 1 ?
"" :
"s",
1051 vertical ?
"VVAR" :
"HVAR" ));
1065 return tt_hvadvance_adjust(
face, gindex, avalue, 0 );
1074 return tt_hvadvance_adjust(
face, gindex, avalue, 1 );
1078#define GX_VALUE_SIZE 8
1082#define GX_VALUE_CASE( tag, dflt ) \
1083 case MVAR_TAG_ ## tag : \
1084 p = (FT_Short*)&face->dflt; \
1087#define GX_GASP_CASE( idx ) \
1088 case MVAR_TAG_GASP_ ## idx : \
1089 if ( idx < face->gasp.numRanges - 1 ) \
1090 p = (FT_Short*)&face->gasp.gaspRanges[idx].maxPPEM; \
1116 GX_VALUE_CASE( CPHT, os2.sCapHeight );
1117 GX_VALUE_CASE( HASC, os2.sTypoAscender );
1118 GX_VALUE_CASE( HCLA, os2.usWinAscent );
1119 GX_VALUE_CASE( HCLD, os2.usWinDescent );
1120 GX_VALUE_CASE( HCOF, horizontal.caret_Offset );
1121 GX_VALUE_CASE( HCRN, horizontal.caret_Slope_Run );
1122 GX_VALUE_CASE( HCRS, horizontal.caret_Slope_Rise );
1123 GX_VALUE_CASE( HDSC, os2.sTypoDescender );
1124 GX_VALUE_CASE( HLGP, os2.sTypoLineGap );
1125 GX_VALUE_CASE( SBXO, os2.ySubscriptXOffset);
1126 GX_VALUE_CASE( SBXS, os2.ySubscriptXSize );
1127 GX_VALUE_CASE( SBYO, os2.ySubscriptYOffset );
1128 GX_VALUE_CASE( SBYS, os2.ySubscriptYSize );
1129 GX_VALUE_CASE( SPXO, os2.ySuperscriptXOffset );
1130 GX_VALUE_CASE( SPXS, os2.ySuperscriptXSize );
1131 GX_VALUE_CASE( SPYO, os2.ySuperscriptYOffset );
1132 GX_VALUE_CASE( SPYS, os2.ySuperscriptYSize );
1133 GX_VALUE_CASE( STRO, os2.yStrikeoutPosition );
1134 GX_VALUE_CASE( STRS, os2.yStrikeoutSize );
1135 GX_VALUE_CASE( UNDO, postscript.underlinePosition );
1136 GX_VALUE_CASE( UNDS, postscript.underlineThickness );
1137 GX_VALUE_CASE( VASC, vertical.Ascender );
1138 GX_VALUE_CASE( VCOF, vertical.caret_Offset );
1139 GX_VALUE_CASE( VCRN, vertical.caret_Slope_Run );
1140 GX_VALUE_CASE( VCRS, vertical.caret_Slope_Rise );
1141 GX_VALUE_CASE( VDSC, vertical.Descender );
1142 GX_VALUE_CASE( VLGP, vertical.Line_Gap );
1143 GX_VALUE_CASE( XHGT, os2.sxHeight );
1174 GX_Blend blend =
face->blend;
1175 GX_ItemVarStore itemStore;
1202 if ( majorVersion != 1 )
1204 FT_TRACE2((
"bad table version %d\n", majorVersion ));
1208 if (
FT_NEW( blend->mvar_table ) )
1219 error = ft_var_load_item_variation_store(
1221 table_offset + store_offset,
1222 &blend->mvar_table->itemStore );
1227 blend->mvar_table->valueCount ) )
1231 FT_FRAME_ENTER( blend->mvar_table->valueCount * GX_VALUE_SIZE ) )
1234 value = blend->mvar_table->values;
1235 limit =
value + blend->mvar_table->valueCount;
1236 itemStore = &blend->mvar_table->itemStore;
1244 if (
value->outerIndex >= itemStore->dataCount ||
1245 value->innerIndex >= itemStore->varData[
value->outerIndex]
1260 value = blend->mvar_table->values;
1261 limit =
value + blend->mvar_table->valueCount;
1271#ifdef FT_DEBUG_LEVEL_TRACE
1273 FT_TRACE1((
"ft_var_load_mvar: Ignoring unknown tag `%c%c%c%c'\n",
1314 GX_Blend blend =
face->blend;
1321 value = blend->mvar_table->values;
1322 limit =
value + blend->mvar_table->valueCount;
1330 delta = ft_var_get_item_delta(
face,
1331 &blend->mvar_table->itemStore,
1333 value->innerIndex );
1337 FT_TRACE5((
"value %c%c%c%c (%d unit%s) adjusted by %d unit%s (MVAR)\n",
1343 value->unmodified == 1 ?
"" :
"s",
1345 delta == 1 ?
"" :
"s" ));
1358 if (
face->os2.version != 0xFFFFU )
1360 if (
face->os2.sTypoAscender ||
face->os2.sTypoDescender )
1362 root->ascender =
face->os2.sTypoAscender;
1363 root->descender =
face->os2.sTypoDescender;
1366 face->os2.sTypoLineGap;
1377 root->underline_position =
face->postscript.underlinePosition -
1378 face->postscript.underlineThickness / 2;
1379 root->underline_thickness =
face->postscript.underlineThickness;
1384 tt_size_reset_iterator,
1390 typedef struct GX_GVar_Head_
1423 GX_Blend blend =
face->blend;
1429 GX_GVar_Head gvar_head;
1435#define FT_STRUCTURE GX_GVar_Head
1464 if ( gvar_head.version != 0x00010000L )
1471 if ( gvar_head.axisCount != (
FT_UShort)blend->mmvar->num_axis )
1473 FT_TRACE1((
"ft_var_load_gvar: number of axes in `gvar' and `cvar'\n"
1474 " table are different\n" ));
1480 if ( (
FT_ULong)gvar_head.globalCoordCount * gvar_head.axisCount >
1484 " invalid number of global coordinates\n" ));
1490 if ( (
FT_ULong)gvar_head.glyphCount *
1491 ( ( gvar_head.flags & 1 ) ? 4 : 2 ) > table_len )
1493 FT_TRACE1((
"ft_var_load_gvar: invalid number of glyphs\n" ));
1500 blend->gvar_size = table_len;
1501 blend->tuplecount = gvar_head.globalCoordCount;
1502 blend->gv_glyphcnt = gvar_head.glyphCount;
1503 offsetToData = gvar_start + gvar_head.offsetToData;
1505 FT_TRACE5((
"gvar: there %s %d shared coordinate%s:\n",
1506 blend->tuplecount == 1 ?
"is" :
"are",
1508 blend->tuplecount == 1 ?
"" :
"s" ));
1510 if (
FT_NEW_ARRAY( blend->glyphoffsets, blend->gv_glyphcnt + 1 ) )
1513 if ( gvar_head.flags & 1 )
1519 for (
i = 0;
i <= blend->gv_glyphcnt;
i++ )
1530 for (
i = 0;
i <= blend->gv_glyphcnt;
i++ )
1537 if ( blend->tuplecount != 0 )
1540 gvar_head.axisCount * blend->tuplecount ) )
1547 for (
i = 0;
i < blend->tuplecount;
i++ )
1550 for (
j = 0;
j < (
FT_UInt)gvar_head.axisCount;
j++ )
1552 blend->tuplecoords[
i * gvar_head.axisCount +
j] =
1555 blend->tuplecoords[
i * gvar_head.axisCount +
j] / 65536.0 ));
1598 ft_var_apply_tuple( GX_Blend blend,
1608 for (
i = 0;
i < blend->num_axis;
i++ )
1610 FT_TRACE6((
" axis coordinate %d (%.5f):\n",
1611 i, blend->normalizedcoords[
i] / 65536.0 ));
1612 if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) )
1613 FT_TRACE6((
" intermediate coordinates %d (%.5f, %.5f):\n",
1615 im_start_coords[
i] / 65536.0,
1616 im_end_coords[
i] / 65536.0 ));
1623 if ( tuple_coords[
i] == 0 )
1625 FT_TRACE6((
" tuple coordinate is zero, ignored\n",
i ));
1629 if ( blend->normalizedcoords[
i] == 0 )
1631 FT_TRACE6((
" axis coordinate is zero, stop\n" ));
1636 if ( blend->normalizedcoords[
i] == tuple_coords[
i] )
1638 FT_TRACE6((
" tuple coordinate value %.5f fits perfectly\n",
1639 tuple_coords[
i] / 65536.0 ));
1644 if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) )
1648 if ( blend->normalizedcoords[
i] <
FT_MIN( 0, tuple_coords[
i] ) ||
1649 blend->normalizedcoords[
i] >
FT_MAX( 0, tuple_coords[
i] ) )
1651 FT_TRACE6((
" tuple coordinate value %.5f is exceeded, stop\n",
1652 tuple_coords[
i] / 65536.0 ));
1657 FT_TRACE6((
" tuple coordinate value %.5f fits\n",
1658 tuple_coords[
i] / 65536.0 ));
1660 blend->normalizedcoords[
i],
1667 if ( blend->normalizedcoords[
i] < im_start_coords[
i] ||
1668 blend->normalizedcoords[
i] > im_end_coords[
i] )
1670 FT_TRACE6((
" intermediate tuple range [%.5f;%.5f] is exceeded,"
1672 im_start_coords[
i] / 65536.0,
1673 im_end_coords[
i] / 65536.0 ));
1678 else if ( blend->normalizedcoords[
i] < tuple_coords[
i] )
1680 FT_TRACE6((
" intermediate tuple range [%.5f;%.5f] fits\n",
1681 im_start_coords[
i] / 65536.0,
1682 im_end_coords[
i] / 65536.0 ));
1684 blend->normalizedcoords[
i] - im_start_coords[
i],
1685 tuple_coords[
i] - im_start_coords[
i] );
1690 FT_TRACE6((
" intermediate tuple range [%.5f;%.5f] fits\n",
1691 im_start_coords[
i] / 65536.0,
1692 im_end_coords[
i] / 65536.0 ));
1694 im_end_coords[
i] - blend->normalizedcoords[
i],
1695 im_end_coords[
i] - tuple_coords[
i] );
1700 FT_TRACE6((
" apply factor is %.5f\n", apply / 65536.0 ));
1721 blend =
face->blend;
1722 mmvar = blend->mmvar;
1724 if ( num_coords > mmvar->
num_axis )
1727 " only using first %d of %d coordinates\n",
1736 FT_TRACE5((
"%d design coordinate%s:\n",
1738 num_coords == 1 ?
"" :
"s" ));
1741 for (
i = 0;
i < num_coords;
i++,
a++ )
1747 if (
coord >
a->maximum || coord < a->minimum )
1750 "ft_var_to_normalized: design coordinate %.5f\n"
1751 " is out of range [%.5f;%.5f]; clamping\n",
1753 a->minimum / 65536.0,
1754 a->maximum / 65536.0 ));
1756 if (
coord >
a->maximum )
1762 if ( coord < a->def )
1764 a->minimum -
a->def );
1765 else if (
coord >
a->def )
1767 a->maximum -
a->def );
1777 if ( blend->avar_segment )
1779 FT_TRACE5((
"normalized design coordinates"
1780 " before applying `avar' data:\n" ));
1782 av = blend->avar_segment;
1785 for (
j = 1;
j < (
FT_UInt)av->pairCount;
j++ )
1793 av->correspondence[
j].toCoord -
1794 av->correspondence[
j - 1].toCoord,
1795 av->correspondence[
j].fromCoord -
1796 av->correspondence[
j - 1].fromCoord ) +
1797 av->correspondence[
j - 1].toCoord;
1821 blend =
face->blend;
1824 if ( num_coords > blend->num_axis )
1827 " only using first %d of %d coordinates\n",
1828 blend->num_axis, num_coords ));
1829 nc = blend->num_axis;
1832 for (
i = 0;
i < nc;
i++ )
1835 for ( ;
i < num_coords;
i++ )
1838 if ( blend->avar_segment )
1840 GX_AVarSegment av = blend->avar_segment;
1844 " after removing `avar' distortion:\n" ));
1846 for (
i = 0;
i < nc;
i++, av++ )
1848 for (
j = 1;
j < (
FT_UInt)av->pairCount;
j++ )
1850 if ( design[
i] < av->correspondence[
j].toCoord )
1853 FT_MulDiv( design[
i] - av->correspondence[
j - 1].toCoord,
1854 av->correspondence[
j].fromCoord -
1855 av->correspondence[
j - 1].fromCoord,
1856 av->correspondence[
j].toCoord -
1857 av->correspondence[
j - 1].toCoord ) +
1858 av->correspondence[
j - 1].fromCoord;
1860 FT_TRACE5((
" %.5f\n", design[
i] / 65536.0 ));
1867 mmvar = blend->mmvar;
1870 for (
i = 0;
i < nc;
i++,
a++ )
1872 if ( design[
i] < 0 )
1874 a->def -
a->minimum );
1875 else if ( design[
i] > 0 )
1877 a->maximum -
a->def );
1893 typedef struct GX_FVar_Head_
1905 typedef struct fvar_axis_
1955 GX_FVar_Head fvar_head;
1974#define FT_STRUCTURE GX_FVar_Head
1991#define FT_STRUCTURE GX_FVar_Axis
2007 need_init = !
face->blend;
2022 "TT_Get_MM_Var: `gvar' or `CFF2' table is missing\n" ));
2041 usePsName =
FT_BOOL( fvar_head.instanceSize ==
2042 6 + 4 * fvar_head.axisCount );
2046 FT_TRACE5((
"number of GX style axes: %d\n", fvar_head.axisCount ));
2051 num_axes = fvar_head.axisCount;
2054 num_axes =
face->blend->num_axis;
2059 num_instances = (
FT_UInt)
face->root.style_flags >> 16;
2072 ( ( (
n) +
sizeof (
void*) - 1 ) & ~(
sizeof (
void*) - 1 ) )
2079 namedstyle_size =
ALIGN_SIZE( num_instances *
2081 next_coords_size =
ALIGN_SIZE( num_instances *
2084 next_name_size = num_axes * 5;
2088 face->blend->mmvar_len = mmvar_size +
2097 face->blend->mmvar = mmvar;
2113 (
FT_UShort*)( (
char*)mmvar + mmvar_size );
2115 (
FT_Var_Axis*)( (
char*)axis_flags + axis_flags_size );
2121 for (
i = 0;
i < num_instances;
i++ )
2124 next_coords += num_axes;
2128 namedstyle_size + next_coords_size );
2129 for (
i = 0;
i < num_axes;
i++ )
2141 for (
i = 0;
i < num_axes;
i++ )
2143 GX_FVar_Axis axis_rec;
2148 a->tag = axis_rec.axisTag;
2149 a->minimum = axis_rec.minValue;
2150 a->def = axis_rec.defaultValue;
2151 a->maximum = axis_rec.maxValue;
2152 a->strid = axis_rec.nameID;
2155 a->name[1] = (
FT_String)( (
a->tag >> 16 ) & 0xFF );
2156 a->name[2] = (
FT_String)( (
a->tag >> 8 ) & 0xFF );
2160 *axis_flags = axis_rec.flags;
2162 if (
a->minimum >
a->def ||
2163 a->def >
a->maximum )
2166 " invalid \"%s\" axis record; disabling\n",
2169 a->minimum =
a->def;
2170 a->maximum =
a->def;
2174 " minimum=%.5f, default=%.5f, maximum=%.5f,"
2177 a->minimum / 65536.0,
2179 a->maximum / 65536.0,
2191 num_axes * num_instances ) )
2194 if ( fvar_head.instanceCount && !
face->blend->avar_loaded )
2199 ft_var_load_avar(
face );
2206 nsc =
face->blend->normalized_stylecoords;
2207 for (
i = 0;
i < fvar_head.instanceCount;
i++,
ns++ )
2218 for (
j = 0;
j < num_axes;
j++,
c++ )
2227 ft_var_to_normalized(
face, num_axes,
ns->coords, nsc );
2233 if ( num_instances != fvar_head.instanceCount )
2237 FT_Int found, dummy1, dummy2;
2268 " Adding default instance to named instances\n" ));
2277 for (
j = 0;
j < num_axes;
j++,
a++,
c++ )
2283 ft_var_load_mvar(
face );
2298 (
FT_UShort*)( (
char*)mmvar + mmvar_size );
2300 (
FT_Var_Axis*)( (
char*)axis_flags + axis_flags_size );
2309 next_coords += num_axes;
2314 namedstyle_size + next_coords_size );
2315 for (
n = 0;
n < num_axes;
n++ )
2317 a->
name = next_name;
2320 if (
a->tag == TTAG_wght )
2321 a->name = (
char*)
"Weight";
2322 else if (
a->tag == TTAG_wdth )
2323 a->name = (
char*)
"Width";
2324 else if (
a->tag == TTAG_opsz )
2325 a->name = (
char*)
"OpticalSize";
2326 else if (
a->tag == TTAG_slnt )
2327 a->name = (
char*)
"Slant";
2373 blend =
face->blend;
2374 mmvar = blend->mmvar;
2376 if ( num_coords > mmvar->
num_axis )
2379 " only using first %d of %d coordinates\n",
2384 FT_TRACE5((
"normalized design coordinates:\n" ));
2386 for (
i = 0;
i < num_coords;
i++ )
2391 FT_TRACE1((
"TT_Set_MM_Blend: normalized design coordinate %.5f\n"
2392 " is out of range [-1;1]\n",
2401 if ( !
face->is_cff2 && !blend->glyphoffsets )
2405 if ( !blend->coords )
2411 all_design_coords =
TRUE;
2414 if ( !blend->normalizedcoords )
2419 manageCvt = mcvt_modify;
2433 manageCvt = mcvt_retain;
2435 for (
i = 0;
i < num_coords;
i++ )
2437 if ( blend->normalizedcoords[
i] !=
coords[
i] )
2439 manageCvt = mcvt_load;
2450 c = blend->normalizedcoords +
i;
2451 n = blend->normalized_stylecoords +
idx * mmvar->
num_axis +
i;
2458 c = blend->normalizedcoords +
i;
2470 if ( blend->normalizedcoords[
i] != 0 )
2472 manageCvt = mcvt_load;
2488 if ( set_design_coords )
2489 ft_var_to_design(
face,
2490 all_design_coords ? blend->num_axis : num_coords,
2491 blend->normalizedcoords,
2498 switch ( manageCvt )
2570 face->root.face_flags &= ~FT_FACE_FLAG_VARIATION;
2615 blend =
face->blend;
2617 if ( !blend->coords )
2626 if ( num_coords > blend->num_axis )
2629 " only using first %d of %d coordinates\n",
2630 blend->num_axis, num_coords ));
2631 nc = blend->num_axis;
2634 if (
face->doblend )
2636 for (
i = 0;
i < nc;
i++ )
2637 coords[
i] = blend->normalizedcoords[
i];
2641 for (
i = 0;
i < nc;
i++ )
2645 for ( ;
i < num_coords;
i++ )
2701 blend =
face->blend;
2702 mmvar = blend->mmvar;
2704 if ( num_coords > mmvar->
num_axis )
2707 " only using first %d of %d coordinates\n",
2712 if ( !blend->coords )
2720 for (
i = 0;
i < num_coords;
i++,
n++,
c++ )
2735 instance_index = (
FT_UInt)
face->root.face_index >> 16;
2736 named_style = mmvar->
namedstyle + instance_index - 1;
2738 n = named_style->
coords + num_coords;
2753 a = mmvar->
axis + num_coords;
2771 if ( !
face->blend->avar_loaded )
2772 ft_var_load_avar(
face );
2774 ft_var_to_normalized(
face, num_coords, blend->coords,
normalized );
2783 face->root.face_flags &= ~FT_FACE_FLAG_VARIATION;
2829 blend =
face->blend;
2831 if ( !blend->coords )
2840 if ( num_coords > blend->num_axis )
2843 " only using first %d of %d coordinates\n",
2844 blend->num_axis, num_coords ));
2845 nc = blend->num_axis;
2848 if (
face->doblend )
2850 for (
i = 0;
i < nc;
i++ )
2855 for (
i = 0;
i < nc;
i++ )
2859 for ( ;
i < num_coords;
i++ )
2901 blend =
face->blend;
2902 mmvar = blend->mmvar;
2904 num_instances = (
FT_UInt)
face->root.style_flags >> 16;
2907 if ( instance_index > num_instances )
2910 if ( instance_index > 0 && mmvar->
namedstyle )
2919 named_style = mmvar->
namedstyle + instance_index - 1;
2929 face->root.style_name = style_name;
2941 face->root.face_index = ( instance_index << 16 ) |
2942 (
face->root.face_index & 0xFFFFL );
2943 face->root.face_flags &= ~FT_FACE_FLAG_VARIATION;
2995 GX_Blend blend =
face->blend;
2996 FT_UInt point_count, spoint_count = 0;
3008 "tt_face_vary_cvt: no blend specified\n" ));
3016 "tt_face_vary_cvt: no `cvt ' table\n" ));
3036 table_start = FT_Stream_FTell(
stream );
3056 if ( offsetToData + ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) * 4 >
3060 " invalid CVT variation array header\n" ));
3066 offsetToData += table_start;
3068 if ( tupleCount & GX_TC_TUPLES_SHARE_POINT_NUMBERS )
3070 here = FT_Stream_FTell(
stream );
3072 FT_Stream_SeekSet(
stream, offsetToData );
3074 sharedpoints = ft_var_readpackedpoints(
stream,
3077 offsetToData = FT_Stream_FTell(
stream );
3079 FT_Stream_SeekSet(
stream, here );
3082 FT_TRACE5((
"cvar: there %s %d tuple%s:\n",
3083 ( tupleCount & 0xFFF ) == 1 ?
"is" :
"are",
3085 ( tupleCount & 0xFFF ) == 1 ?
"" :
"s" ));
3087 for (
i = 0;
i < ( tupleCount & 0xFFF );
i++ )
3099 if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD )
3101 for (
j = 0;
j < blend->num_axis;
j++ )
3105 else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount )
3108 " invalid tuple index\n" ));
3116 &blend->tuplecoords[( tupleIndex & 0xFFF ) * blend->num_axis],
3119 if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
3121 for (
j = 0;
j < blend->num_axis;
j++ )
3123 for (
j = 0;
j < blend->num_axis;
j++ )
3127 apply = ft_var_apply_tuple( blend,
3135 offsetToData += tupleDataSize;
3139 here = FT_Stream_FTell(
stream );
3141 FT_Stream_SeekSet(
stream, offsetToData );
3143 if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS )
3145 localpoints = ft_var_readpackedpoints(
stream,
3153 point_count = spoint_count;
3156 deltas = ft_var_readpackeddeltas(
stream,
3158 point_count == 0 ?
face->cvt_size
3163 ( localpoints == ALL_POINTS && point_count !=
face->cvt_size ) )
3166 else if ( localpoints == ALL_POINTS )
3168#ifdef FT_DEBUG_LEVEL_TRACE
3176 for (
j = 0;
j <
face->cvt_size;
j++ )
3184#ifdef FT_DEBUG_LEVEL_TRACE
3185 if ( orig_cvt !=
face->cvt[
j] )
3188 j, orig_cvt,
face->cvt[
j] ));
3194#ifdef FT_DEBUG_LEVEL_TRACE
3202#ifdef FT_DEBUG_LEVEL_TRACE
3209 for (
j = 0;
j < point_count;
j++ )
3219 orig_cvt =
face->cvt[pindex];
3223#ifdef FT_DEBUG_LEVEL_TRACE
3224 if ( orig_cvt !=
face->cvt[pindex] )
3227 pindex, orig_cvt,
face->cvt[pindex] ));
3233#ifdef FT_DEBUG_LEVEL_TRACE
3239 if ( localpoints != ALL_POINTS )
3243 offsetToData += tupleDataSize;
3245 FT_Stream_SeekSet(
stream, here );
3254 if ( sharedpoints != ALL_POINTS )
3270 tt_delta_shift(
int p1,
3280 delta.
x = out_points[
ref].
x - in_points[
ref].
x;
3281 delta.
y = out_points[
ref].
y - in_points[
ref].
y;
3283 if ( delta.
x == 0 && delta.
y == 0 )
3286 for (
p = p1;
p <
ref;
p++ )
3288 out_points[
p].
x += delta.
x;
3289 out_points[
p].
y += delta.
y;
3292 for (
p =
ref + 1;
p <= p2;
p++ )
3294 out_points[
p].
x += delta.
x;
3295 out_points[
p].
y += delta.
y;
3308 tt_delta_interpolate(
int p1,
3317 FT_Pos out, in1, in2, out1, out2, d1, d2;
3324 for (
i = 0;
i <= 1;
i++ )
3330 if ( in_points[ref1].
x > in_points[ref2].
x )
3337 in1 = in_points[ref1].
x;
3338 in2 = in_points[ref2].
x;
3339 out1 = out_points[ref1].
x;
3340 out2 = out_points[ref2].
x;
3346 if ( in1 != in2 || out1 == out2 )
3352 for (
p = p1;
p <= p2;
p++ )
3354 out = in_points[
p].
x;
3358 else if (
out >= in2 )
3363 out_points[
p].
x =
out;
3400 end_point =
outline->contours[contour];
3401 first_point =
point;
3404 while (
point <= end_point && !has_delta[
point] )
3407 if (
point <= end_point )
3409 first_delta =
point;
3414 while (
point <= end_point )
3418 if ( has_delta[
point] )
3420 tt_delta_interpolate( cur_delta + 1,
3433 if ( cur_delta == first_delta )
3434 tt_delta_shift( first_point,
3443 tt_delta_interpolate( cur_delta + 1,
3450 if ( first_delta > 0 )
3451 tt_delta_interpolate( first_point,
3461 }
while ( contour < outline->n_contours );
3495 GX_Blend blend =
face->blend;
3510 FT_UInt point_count, spoint_count = 0;
3517 if ( !
face->doblend || !blend )
3518 return FT_THROW( Invalid_Argument );
3520 if ( glyph_index >= blend->gv_glyphcnt ||
3521 blend->glyphoffsets[glyph_index] ==
3522 blend->glyphoffsets[glyph_index + 1] )
3524 FT_TRACE2((
"TT_Vary_Apply_Glyph_Deltas:"
3525 " no variation data for this glyph\n" ));
3536 blend->glyphoffsets[glyph_index] ) )
3539 glyph_start = FT_Stream_FTell(
stream );
3552 if ( offsetToData + ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) * 4 >
3555 FT_TRACE2((
"TT_Vary_Apply_Glyph_Deltas:"
3556 " invalid glyph variation array header\n" ));
3562 offsetToData += glyph_start;
3564 if ( tupleCount & GX_TC_TUPLES_SHARE_POINT_NUMBERS )
3566 here = FT_Stream_FTell(
stream );
3568 FT_Stream_SeekSet(
stream, offsetToData );
3570 sharedpoints = ft_var_readpackedpoints(
stream,
3573 offsetToData = FT_Stream_FTell(
stream );
3575 FT_Stream_SeekSet(
stream, here );
3578 FT_TRACE5((
"gvar: there %s %d tuple%s:\n",
3579 ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ?
"is" :
"are",
3580 tupleCount & GX_TC_TUPLE_COUNT_MASK,
3581 ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ?
"" :
"s" ));
3583 for (
j = 0;
j < n_points;
j++ )
3586 for (
i = 0;
i < ( tupleCount & GX_TC_TUPLE_COUNT_MASK );
i++ )
3598 if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD )
3600 for (
j = 0;
j < blend->num_axis;
j++ )
3604 else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount )
3606 FT_TRACE2((
"TT_Vary_Apply_Glyph_Deltas:"
3607 " invalid tuple index\n" ));
3615 &blend->tuplecoords[( tupleIndex & 0xFFF ) * blend->num_axis],
3618 if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
3620 for (
j = 0;
j < blend->num_axis;
j++ )
3622 for (
j = 0;
j < blend->num_axis;
j++ )
3626 apply = ft_var_apply_tuple( blend,
3634 offsetToData += tupleDataSize;
3638 here = FT_Stream_FTell(
stream );
3640 FT_Stream_SeekSet(
stream, offsetToData );
3642 if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS )
3644 localpoints = ft_var_readpackedpoints(
stream,
3652 point_count = spoint_count;
3655 deltas_x = ft_var_readpackeddeltas(
stream,
3657 point_count == 0 ? n_points
3659 deltas_y = ft_var_readpackeddeltas(
stream,
3661 point_count == 0 ? n_points
3664 if ( !
points || !deltas_y || !deltas_x )
3667 else if (
points == ALL_POINTS )
3669#ifdef FT_DEBUG_LEVEL_TRACE
3677 for (
j = 0;
j < n_points;
j++ )
3683 if (
j < n_points - 4 )
3693 if (
j == ( n_points - 4 ) &&
3694 !(
face->variation_support &
3698 else if (
j == ( n_points - 3 ) &&
3699 !(
face->variation_support &
3703 else if (
j == ( n_points - 2 ) &&
3704 !(
face->variation_support &
3708 else if (
j == ( n_points - 1 ) &&
3709 !(
face->variation_support &
3714#ifdef FT_DEBUG_LEVEL_TRACE
3715 if ( delta_x || delta_y )
3717 FT_TRACE7((
" %d: (%d, %d) -> (%d, %d)\n",
3728#ifdef FT_DEBUG_LEVEL_TRACE
3736#ifdef FT_DEBUG_LEVEL_TRACE
3743 for (
j = 0;
j < n_points;
j++ )
3746 points_out[
j] = points_org[
j];
3749 for (
j = 0;
j < point_count;
j++ )
3754 if (
idx >= n_points )
3765 tt_interpolate_deltas(
outline,
3772 for (
j = 0;
j < n_points;
j++ )
3774 FT_Pos delta_x = points_out[
j].
x - points_org[
j].
x;
3775 FT_Pos delta_y = points_out[
j].
y - points_org[
j].
y;
3778 if (
j < n_points - 4 )
3788 if (
j == ( n_points - 4 ) &&
3789 !(
face->variation_support &
3793 else if (
j == ( n_points - 3 ) &&
3794 !(
face->variation_support &
3798 else if (
j == ( n_points - 2 ) &&
3799 !(
face->variation_support &
3803 else if (
j == ( n_points - 1 ) &&
3804 !(
face->variation_support &
3809#ifdef FT_DEBUG_LEVEL_TRACE
3810 if ( delta_x || delta_y )
3812 FT_TRACE7((
" %d: (%d, %d) -> (%d, %d)\n",
3823#ifdef FT_DEBUG_LEVEL_TRACE
3829 if ( localpoints != ALL_POINTS )
3834 offsetToData += tupleDataSize;
3836 FT_Stream_SeekSet(
stream, here );
3842 if ( sharedpoints != ALL_POINTS )
3879 *num_coords =
face->blend->num_axis;
3882 if ( normalizedcoords )
3883 *normalizedcoords =
face->blend->normalizedcoords;
3885 *mm_var =
face->blend->mmvar;
3903 GX_ItemVarStore itemStore )
3909 if ( itemStore->varData )
3911 for (
i = 0;
i < itemStore->dataCount;
i++ )
3913 FT_FREE( itemStore->varData[
i].regionIndices );
3914 FT_FREE( itemStore->varData[
i].deltaSet );
3917 FT_FREE( itemStore->varData );
3920 if ( itemStore->varRegionList )
3922 for (
i = 0;
i < itemStore->regionCount;
i++ )
3923 FT_FREE( itemStore->varRegionList[
i].axisList );
3925 FT_FREE( itemStore->varRegionList );
3942 GX_Blend blend =
face->blend;
3951 num_axes = blend->mmvar->num_axis;
3954 FT_FREE( blend->normalizedcoords );
3955 FT_FREE( blend->normalized_stylecoords );
3958 if ( blend->avar_segment )
3960 for (
i = 0;
i < num_axes;
i++ )
3961 FT_FREE( blend->avar_segment[
i].correspondence );
3962 FT_FREE( blend->avar_segment );
3965 if ( blend->hvar_table )
3967 ft_var_done_item_variation_store(
face,
3968 &blend->hvar_table->itemStore );
3970 FT_FREE( blend->hvar_table->widthMap.innerIndex );
3971 FT_FREE( blend->hvar_table->widthMap.outerIndex );
3975 if ( blend->vvar_table )
3977 ft_var_done_item_variation_store(
face,
3978 &blend->vvar_table->itemStore );
3980 FT_FREE( blend->vvar_table->widthMap.innerIndex );
3981 FT_FREE( blend->vvar_table->widthMap.outerIndex );
3985 if ( blend->mvar_table )
3987 ft_var_done_item_variation_store(
face,
3988 &blend->mvar_table->itemStore );
3990 FT_FREE( blend->mvar_table->values );
3994 FT_FREE( blend->tuplecoords );
3995 FT_FREE( blend->glyphoffsets );
void user(int argc, const char *argv[])
#define FT_fdot14ToFixed(x)
static const WCHAR version[]
FT_DivFix(FT_Long a, FT_Long b)
#define FT_FACE_FLAG_VARIATION
#define FT_IS_NAMED_INSTANCE(face)
FT_MulDiv(FT_Long a, FT_Long b, FT_Long c)
FT_MulFix(FT_Long a, FT_Long b)
#define FT_TRACE5(varformat)
#define FT_TRACE7(varformat)
#define FT_TRACE6(varformat)
#define FT_TRACE2(varformat)
#define FT_TRACE1(varformat)
FT_BEGIN_HEADER typedef signed long FT_Pos
FT_List_Iterate(FT_List list, FT_List_Iterator iterator, void *user)
#define FT_NEW_ARRAY(ptr, count)
#define FT_SET_ERROR(expression)
#define FT_ALLOC(ptr, size)
#define FT_MEM_COPY(dest, source, count)
#define FT_FACE_STREAM(x)
#define FT_FACE_MEMORY(x)
#define FT_FRAME_ENTER(size)
#define FT_READ_USHORT(var)
#define FT_FRAME_SKIP_SHORT
#define FT_STREAM_SEEK(position)
#define FT_READ_ULONG(var)
#define FT_FRAME_ULONG(f)
#define FT_READ_BYTE(var)
#define FT_READ_CHAR(var)
#define FT_STREAM_READ_FIELDS(fields, object)
#define FT_STREAM_SKIP(distance)
#define FT_FRAME_START(size)
#define FT_FRAME_USHORT(f)
#define FT_READ_SHORT(var)
typedefFT_BEGIN_HEADER struct FT_MemoryRec_ * FT_Memory
FT_BEGIN_HEADER typedef unsigned char FT_Bool
GLint GLint GLint GLint GLint x
GLuint GLuint GLsizei count
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLenum GLenum GLenum GLenum GLenum scale
GLenum GLuint GLint GLenum face
GLint GLenum GLboolean normalized
GLboolean GLboolean GLboolean GLboolean a
GLsizei const GLfloat * points
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
#define TT_NAME_ID_FONT_SUBFAMILY
#define ALIGN_SIZE(size, alignment)
static char memory[1024 *256]
SFNT_Interface * SFNT_Service
FT_Var_Named_Style * namedstyle
TT_Get_Name_ID_Func get_name_id
TT_Get_Name_Func get_name
#define TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY
#define TT_NAME_ID_PS_NAME
tt_size_reset(TT_Size size, FT_Bool only_height)
tt_face_load_cvt(TT_Face face, FT_Stream stream)
#define TT_FACE_FLAG_VAR_HADVANCE
#define TT_FACE_FLAG_VAR_LSB
#define TT_FACE_FLAG_VAR_TSB
struct TT_SizeRec_ * TT_Size
#define TT_FACE_FLAG_VAR_VADVANCE
#define TT_FACE_FLAG_VAR_MVAR
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList