usp10: Move GDEF functions to opentype.c.
This commit is contained in:
parent
6311ccfe97
commit
bf1ef214e6
|
@ -73,6 +73,37 @@ typedef struct {
|
||||||
CMAP_SegmentedCoverage_group groups[1];
|
CMAP_SegmentedCoverage_group groups[1];
|
||||||
} CMAP_SegmentedCoverage;
|
} CMAP_SegmentedCoverage;
|
||||||
|
|
||||||
|
/* These are all structures needed for the GDEF table */
|
||||||
|
#define GDEF_TAG MS_MAKE_TAG('G', 'D', 'E', 'F')
|
||||||
|
|
||||||
|
enum {BaseGlyph=1, LigatureGlyph, MarkGlyph, ComponentGlyph};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
DWORD Version;
|
||||||
|
WORD GlyphClassDef;
|
||||||
|
WORD AttachList;
|
||||||
|
WORD LigCaretList;
|
||||||
|
WORD MarkAttachClassDef;
|
||||||
|
} GDEF_Header;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
WORD ClassFormat;
|
||||||
|
WORD StartGlyph;
|
||||||
|
WORD GlyphCount;
|
||||||
|
WORD ClassValueArray[1];
|
||||||
|
} GDEF_ClassDefFormat1;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
WORD Start;
|
||||||
|
WORD End;
|
||||||
|
WORD Class;
|
||||||
|
} GDEF_ClassRangeRecord;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
WORD ClassFormat;
|
||||||
|
WORD ClassRangeCount;
|
||||||
|
GDEF_ClassRangeRecord ClassRangeRecord[1];
|
||||||
|
} GDEF_ClassDefFormat2;
|
||||||
|
|
||||||
/**********
|
/**********
|
||||||
* CMAP
|
* CMAP
|
||||||
|
@ -160,3 +191,118 @@ DWORD OpenType_CMAP_GetGlyphIndex(HDC hdc, ScriptCache *psc, DWORD utf32c, LPWOR
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**********
|
||||||
|
* GDEF
|
||||||
|
**********/
|
||||||
|
|
||||||
|
static WORD GDEF_get_glyph_class(const GDEF_Header *header, WORD glyph)
|
||||||
|
{
|
||||||
|
int offset;
|
||||||
|
WORD class = 0;
|
||||||
|
const GDEF_ClassDefFormat1 *cf1;
|
||||||
|
|
||||||
|
if (!header)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
offset = GET_BE_WORD(header->GlyphClassDef);
|
||||||
|
if (!offset)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
cf1 = (GDEF_ClassDefFormat1*)(((BYTE*)header)+offset);
|
||||||
|
if (GET_BE_WORD(cf1->ClassFormat) == 1)
|
||||||
|
{
|
||||||
|
if (glyph >= GET_BE_WORD(cf1->StartGlyph))
|
||||||
|
{
|
||||||
|
int index = glyph - GET_BE_WORD(cf1->StartGlyph);
|
||||||
|
if (index < GET_BE_WORD(cf1->GlyphCount))
|
||||||
|
class = GET_BE_WORD(cf1->ClassValueArray[index]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (GET_BE_WORD(cf1->ClassFormat) == 2)
|
||||||
|
{
|
||||||
|
const GDEF_ClassDefFormat2 *cf2 = (GDEF_ClassDefFormat2*)cf1;
|
||||||
|
int i, top;
|
||||||
|
top = GET_BE_WORD(cf2->ClassRangeCount);
|
||||||
|
for (i = 0; i < top; i++)
|
||||||
|
{
|
||||||
|
if (glyph >= GET_BE_WORD(cf2->ClassRangeRecord[i].Start) &&
|
||||||
|
glyph <= GET_BE_WORD(cf2->ClassRangeRecord[i].End))
|
||||||
|
{
|
||||||
|
class = GET_BE_WORD(cf2->ClassRangeRecord[i].Class);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ERR("Unknown Class Format %i\n",GET_BE_WORD(cf1->ClassFormat));
|
||||||
|
|
||||||
|
return class;
|
||||||
|
}
|
||||||
|
|
||||||
|
static VOID *load_gdef_table(HDC hdc)
|
||||||
|
{
|
||||||
|
VOID* GDEF_Table = NULL;
|
||||||
|
int length = GetFontData(hdc, GDEF_TAG , 0, NULL, 0);
|
||||||
|
if (length != GDI_ERROR)
|
||||||
|
{
|
||||||
|
GDEF_Table = HeapAlloc(GetProcessHeap(),0,length);
|
||||||
|
GetFontData(hdc, GDEF_TAG , 0, GDEF_Table, length);
|
||||||
|
TRACE("Loaded GDEF table of %i bytes\n",length);
|
||||||
|
}
|
||||||
|
return GDEF_Table;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OpenType_GDEF_UpdateGlyphProps(HDC hdc, ScriptCache *psc, const WORD *pwGlyphs, const WORD cGlyphs, WORD* pwLogClust, const WORD cChars, SCRIPT_GLYPHPROP *pGlyphProp)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (!psc->GDEF_Table)
|
||||||
|
psc->GDEF_Table = load_gdef_table(hdc);
|
||||||
|
|
||||||
|
for (i = 0; i < cGlyphs; i++)
|
||||||
|
{
|
||||||
|
WORD class;
|
||||||
|
int char_count = 0;
|
||||||
|
int k;
|
||||||
|
|
||||||
|
for (k = 0; k < cChars; k++)
|
||||||
|
if (pwLogClust[k] == i)
|
||||||
|
char_count++;
|
||||||
|
|
||||||
|
class = GDEF_get_glyph_class(psc->GDEF_Table, pwGlyphs[i]);
|
||||||
|
|
||||||
|
switch (class)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
case BaseGlyph:
|
||||||
|
pGlyphProp[i].sva.fClusterStart = 1;
|
||||||
|
pGlyphProp[i].sva.fDiacritic = 0;
|
||||||
|
pGlyphProp[i].sva.fZeroWidth = 0;
|
||||||
|
break;
|
||||||
|
case LigatureGlyph:
|
||||||
|
pGlyphProp[i].sva.fClusterStart = 1;
|
||||||
|
pGlyphProp[i].sva.fDiacritic = 0;
|
||||||
|
pGlyphProp[i].sva.fZeroWidth = 0;
|
||||||
|
break;
|
||||||
|
case MarkGlyph:
|
||||||
|
pGlyphProp[i].sva.fClusterStart = 0;
|
||||||
|
pGlyphProp[i].sva.fDiacritic = 1;
|
||||||
|
pGlyphProp[i].sva.fZeroWidth = 1;
|
||||||
|
break;
|
||||||
|
case ComponentGlyph:
|
||||||
|
pGlyphProp[i].sva.fClusterStart = 0;
|
||||||
|
pGlyphProp[i].sva.fDiacritic = 0;
|
||||||
|
pGlyphProp[i].sva.fZeroWidth = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ERR("Unknown glyph class %i\n",class);
|
||||||
|
pGlyphProp[i].sva.fClusterStart = 1;
|
||||||
|
pGlyphProp[i].sva.fDiacritic = 0;
|
||||||
|
pGlyphProp[i].sva.fZeroWidth = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (char_count == 0)
|
||||||
|
pGlyphProp[i].sva.fClusterStart = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -283,38 +283,6 @@ typedef struct{
|
||||||
WORD Alternate[1];
|
WORD Alternate[1];
|
||||||
} GSUB_AlternateSet;
|
} GSUB_AlternateSet;
|
||||||
|
|
||||||
/* These are all structures needed for the GDEF table */
|
|
||||||
#define GDEF_TAG MS_MAKE_TAG('G', 'D', 'E', 'F')
|
|
||||||
|
|
||||||
enum {BaseGlyph=1, LigatureGlyph, MarkGlyph, ComponentGlyph};
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
DWORD Version;
|
|
||||||
WORD GlyphClassDef;
|
|
||||||
WORD AttachList;
|
|
||||||
WORD LigCaretList;
|
|
||||||
WORD MarkAttachClassDef;
|
|
||||||
} GDEF_Header;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
WORD ClassFormat;
|
|
||||||
WORD StartGlyph;
|
|
||||||
WORD GlyphCount;
|
|
||||||
WORD ClassValueArray[1];
|
|
||||||
} GDEF_ClassDefFormat1;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
WORD Start;
|
|
||||||
WORD End;
|
|
||||||
WORD Class;
|
|
||||||
} GDEF_ClassRangeRecord;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
WORD ClassFormat;
|
|
||||||
WORD ClassRangeCount;
|
|
||||||
GDEF_ClassRangeRecord ClassRangeRecord[1];
|
|
||||||
} GDEF_ClassDefFormat2;
|
|
||||||
|
|
||||||
static INT GSUB_apply_lookup(const GSUB_LookupList* lookup, INT lookup_index, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count);
|
static INT GSUB_apply_lookup(const GSUB_LookupList* lookup, INT lookup_index, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count);
|
||||||
static HRESULT GSUB_GetFontScriptTags(ScriptCache *psc, OPENTYPE_TAG searchingFor, int cMaxTags, OPENTYPE_TAG *pScriptTags, int *pcTags, LPCVOID* script_table);
|
static HRESULT GSUB_GetFontScriptTags(ScriptCache *psc, OPENTYPE_TAG searchingFor, int cMaxTags, OPENTYPE_TAG *pScriptTags, int *pcTags, LPCVOID* script_table);
|
||||||
static HRESULT GSUB_GetFontLanguageTags(ScriptCache *psc, OPENTYPE_TAG script_tag, OPENTYPE_TAG searchingFor, int cMaxTags, OPENTYPE_TAG *pLanguageTags, int *pcTags, LPCVOID* language_table);
|
static HRESULT GSUB_GetFontLanguageTags(ScriptCache *psc, OPENTYPE_TAG script_tag, OPENTYPE_TAG searchingFor, int cMaxTags, OPENTYPE_TAG *pLanguageTags, int *pcTags, LPCVOID* language_table);
|
||||||
|
@ -1210,117 +1178,6 @@ INT SHAPE_does_GSUB_feature_apply_to_chars(HDC hdc, SCRIPT_ANALYSIS *psa, Script
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static WORD GDEF_get_glyph_class(const GDEF_Header *header, WORD glyph)
|
|
||||||
{
|
|
||||||
int offset;
|
|
||||||
WORD class = 0;
|
|
||||||
const GDEF_ClassDefFormat1 *cf1;
|
|
||||||
|
|
||||||
if (!header)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
offset = GET_BE_WORD(header->GlyphClassDef);
|
|
||||||
if (!offset)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
cf1 = (GDEF_ClassDefFormat1*)(((BYTE*)header)+offset);
|
|
||||||
if (GET_BE_WORD(cf1->ClassFormat) == 1)
|
|
||||||
{
|
|
||||||
if (glyph >= GET_BE_WORD(cf1->StartGlyph))
|
|
||||||
{
|
|
||||||
int index = glyph - GET_BE_WORD(cf1->StartGlyph);
|
|
||||||
if (index < GET_BE_WORD(cf1->GlyphCount))
|
|
||||||
class = GET_BE_WORD(cf1->ClassValueArray[index]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (GET_BE_WORD(cf1->ClassFormat) == 2)
|
|
||||||
{
|
|
||||||
const GDEF_ClassDefFormat2 *cf2 = (GDEF_ClassDefFormat2*)cf1;
|
|
||||||
int i, top;
|
|
||||||
top = GET_BE_WORD(cf2->ClassRangeCount);
|
|
||||||
for (i = 0; i < top; i++)
|
|
||||||
{
|
|
||||||
if (glyph >= GET_BE_WORD(cf2->ClassRangeRecord[i].Start) &&
|
|
||||||
glyph <= GET_BE_WORD(cf2->ClassRangeRecord[i].End))
|
|
||||||
{
|
|
||||||
class = GET_BE_WORD(cf2->ClassRangeRecord[i].Class);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ERR("Unknown Class Format %i\n",GET_BE_WORD(cf1->ClassFormat));
|
|
||||||
|
|
||||||
return class;
|
|
||||||
}
|
|
||||||
|
|
||||||
static VOID *load_gdef_table(HDC hdc)
|
|
||||||
{
|
|
||||||
VOID* GDEF_Table = NULL;
|
|
||||||
int length = GetFontData(hdc, GDEF_TAG , 0, NULL, 0);
|
|
||||||
if (length != GDI_ERROR)
|
|
||||||
{
|
|
||||||
GDEF_Table = HeapAlloc(GetProcessHeap(),0,length);
|
|
||||||
GetFontData(hdc, GDEF_TAG , 0, GDEF_Table, length);
|
|
||||||
TRACE("Loaded GDEF table of %i bytes\n",length);
|
|
||||||
}
|
|
||||||
return GDEF_Table;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void GDEF_UpdateGlyphProps(HDC hdc, ScriptCache *psc, const WORD *pwGlyphs, const WORD cGlyphs, WORD* pwLogClust, const WORD cChars, SCRIPT_GLYPHPROP *pGlyphProp)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (!psc->GDEF_Table)
|
|
||||||
psc->GDEF_Table = load_gdef_table(hdc);
|
|
||||||
|
|
||||||
for (i = 0; i < cGlyphs; i++)
|
|
||||||
{
|
|
||||||
WORD class;
|
|
||||||
int char_count = 0;
|
|
||||||
int k;
|
|
||||||
|
|
||||||
for (k = 0; k < cChars; k++)
|
|
||||||
if (pwLogClust[k] == i)
|
|
||||||
char_count++;
|
|
||||||
|
|
||||||
class = GDEF_get_glyph_class(psc->GDEF_Table, pwGlyphs[i]);
|
|
||||||
|
|
||||||
switch (class)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
case BaseGlyph:
|
|
||||||
pGlyphProp[i].sva.fClusterStart = 1;
|
|
||||||
pGlyphProp[i].sva.fDiacritic = 0;
|
|
||||||
pGlyphProp[i].sva.fZeroWidth = 0;
|
|
||||||
break;
|
|
||||||
case LigatureGlyph:
|
|
||||||
pGlyphProp[i].sva.fClusterStart = 1;
|
|
||||||
pGlyphProp[i].sva.fDiacritic = 0;
|
|
||||||
pGlyphProp[i].sva.fZeroWidth = 0;
|
|
||||||
break;
|
|
||||||
case MarkGlyph:
|
|
||||||
pGlyphProp[i].sva.fClusterStart = 0;
|
|
||||||
pGlyphProp[i].sva.fDiacritic = 1;
|
|
||||||
pGlyphProp[i].sva.fZeroWidth = 1;
|
|
||||||
break;
|
|
||||||
case ComponentGlyph:
|
|
||||||
pGlyphProp[i].sva.fClusterStart = 0;
|
|
||||||
pGlyphProp[i].sva.fDiacritic = 0;
|
|
||||||
pGlyphProp[i].sva.fZeroWidth = 0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ERR("Unknown glyph class %i\n",class);
|
|
||||||
pGlyphProp[i].sva.fClusterStart = 1;
|
|
||||||
pGlyphProp[i].sva.fDiacritic = 0;
|
|
||||||
pGlyphProp[i].sva.fZeroWidth = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (char_count == 0)
|
|
||||||
pGlyphProp[i].sva.fClusterStart = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void UpdateClustersFromGlyphProp(const int cGlyphs, const int cChars, WORD* pwLogClust, SCRIPT_GLYPHPROP *pGlyphProp)
|
static void UpdateClustersFromGlyphProp(const int cGlyphs, const int cChars, WORD* pwLogClust, SCRIPT_GLYPHPROP *pGlyphProp)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -3087,7 +2944,7 @@ static void ShapeCharGlyphProp_Default( HDC hdc, ScriptCache* psc, SCRIPT_ANALYS
|
||||||
pGlyphProp[i].sva.uJustification = SCRIPT_JUSTIFY_CHARACTER;
|
pGlyphProp[i].sva.uJustification = SCRIPT_JUSTIFY_CHARACTER;
|
||||||
}
|
}
|
||||||
|
|
||||||
GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp);
|
OpenType_GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp);
|
||||||
UpdateClustersFromGlyphProp(cGlyphs, cChars, pwLogClust, pGlyphProp);
|
UpdateClustersFromGlyphProp(cGlyphs, cChars, pwLogClust, pGlyphProp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3198,7 +3055,7 @@ static void ShapeCharGlyphProp_Arabic( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSI
|
||||||
pGlyphProp[i].sva.uJustification = SCRIPT_JUSTIFY_NONE;
|
pGlyphProp[i].sva.uJustification = SCRIPT_JUSTIFY_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp);
|
OpenType_GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp);
|
||||||
UpdateClustersFromGlyphProp(cGlyphs, cChars, pwLogClust, pGlyphProp);
|
UpdateClustersFromGlyphProp(cGlyphs, cChars, pwLogClust, pGlyphProp);
|
||||||
HeapFree(GetProcessHeap(),0,spaces);
|
HeapFree(GetProcessHeap(),0,spaces);
|
||||||
}
|
}
|
||||||
|
@ -3234,7 +3091,7 @@ static void ShapeCharGlyphProp_Thai( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp);
|
OpenType_GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp);
|
||||||
|
|
||||||
for (i = 0; i < cGlyphs; i++)
|
for (i = 0; i < cGlyphs; i++)
|
||||||
{
|
{
|
||||||
|
@ -3308,7 +3165,7 @@ static void ShapeCharGlyphProp_None( HDC hdc, ScriptCache* psc, SCRIPT_ANALYSIS*
|
||||||
else
|
else
|
||||||
pGlyphProp[i].sva.uJustification = SCRIPT_JUSTIFY_NONE;
|
pGlyphProp[i].sva.uJustification = SCRIPT_JUSTIFY_NONE;
|
||||||
}
|
}
|
||||||
GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp);
|
OpenType_GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp);
|
||||||
UpdateClustersFromGlyphProp(cGlyphs, cChars, pwLogClust, pGlyphProp);
|
UpdateClustersFromGlyphProp(cGlyphs, cChars, pwLogClust, pGlyphProp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3341,7 +3198,7 @@ static void ShapeCharGlyphProp_Tibet( HDC hdc, ScriptCache* psc, SCRIPT_ANALYSIS
|
||||||
else
|
else
|
||||||
pGlyphProp[i].sva.uJustification = SCRIPT_JUSTIFY_NONE;
|
pGlyphProp[i].sva.uJustification = SCRIPT_JUSTIFY_NONE;
|
||||||
}
|
}
|
||||||
GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp);
|
OpenType_GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp);
|
||||||
UpdateClustersFromGlyphProp(cGlyphs, cChars, pwLogClust, pGlyphProp);
|
UpdateClustersFromGlyphProp(cGlyphs, cChars, pwLogClust, pGlyphProp);
|
||||||
|
|
||||||
/* Tibeten script does not set sva.fDiacritic or sva.fZeroWidth */
|
/* Tibeten script does not set sva.fDiacritic or sva.fZeroWidth */
|
||||||
|
@ -3359,7 +3216,7 @@ static void ShapeCharGlyphProp_BaseIndic( HDC hdc, ScriptCache *psc, SCRIPT_ANAL
|
||||||
{
|
{
|
||||||
int i,k;
|
int i,k;
|
||||||
|
|
||||||
GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp);
|
OpenType_GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp);
|
||||||
for (i = 0; i < cGlyphs; i++)
|
for (i = 0; i < cGlyphs; i++)
|
||||||
{
|
{
|
||||||
int char_index[20];
|
int char_index[20];
|
||||||
|
|
|
@ -222,3 +222,4 @@ void Indic_ParseSyllables( HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCache* psc, LPCW
|
||||||
void BREAK_line(const WCHAR *chars, int count, const SCRIPT_ANALYSIS *sa, SCRIPT_LOGATTR *la) DECLSPEC_HIDDEN;
|
void BREAK_line(const WCHAR *chars, int count, const SCRIPT_ANALYSIS *sa, SCRIPT_LOGATTR *la) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
DWORD OpenType_CMAP_GetGlyphIndex(HDC hdc, ScriptCache *psc, DWORD utf32c, LPWORD pgi, DWORD flags) DECLSPEC_HIDDEN;
|
DWORD OpenType_CMAP_GetGlyphIndex(HDC hdc, ScriptCache *psc, DWORD utf32c, LPWORD pgi, DWORD flags) DECLSPEC_HIDDEN;
|
||||||
|
void OpenType_GDEF_UpdateGlyphProps(HDC hdc, ScriptCache *psc, const WORD *pwGlyphs, const WORD cGlyphs, WORD* pwLogClust, const WORD cChars, SCRIPT_GLYPHPROP *pGlyphProp) DECLSPEC_HIDDEN;
|
||||||
|
|
Loading…
Reference in New Issue