usp10: Break out a function to apply a GSUB feature to an entire string of glyphs.
This commit is contained in:
parent
fd5e732a39
commit
5ad2f6e152
|
@ -549,6 +549,57 @@ static VOID *load_gsub_table(HDC hdc)
|
||||||
return GSUB_Table;
|
return GSUB_Table;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int apply_GSUB_feature(HDC hdc, SCRIPT_ANALYSIS *psa, void* GSUB_Table, WORD *pwOutGlyphs, int write_dir, INT* pcGlyphs, const char* feat)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (GSUB_Table)
|
||||||
|
{
|
||||||
|
const GSUB_Header *header;
|
||||||
|
const GSUB_Script *script;
|
||||||
|
const GSUB_LangSys *language;
|
||||||
|
const GSUB_Feature *feature;
|
||||||
|
|
||||||
|
if (!GSUB_Table)
|
||||||
|
return GSUB_E_NOFEATURE;
|
||||||
|
|
||||||
|
header = GSUB_Table;
|
||||||
|
|
||||||
|
script = GSUB_get_script_table(header, get_opentype_script(hdc,psa));
|
||||||
|
if (!script)
|
||||||
|
{
|
||||||
|
TRACE("Script not found\n");
|
||||||
|
return GSUB_E_NOFEATURE;
|
||||||
|
}
|
||||||
|
language = GSUB_get_lang_table(script, "xxxx");
|
||||||
|
if (!language)
|
||||||
|
{
|
||||||
|
TRACE("Language not found\n");
|
||||||
|
return GSUB_E_NOFEATURE;
|
||||||
|
}
|
||||||
|
feature = GSUB_get_feature(header, language, feat);
|
||||||
|
if (!feature)
|
||||||
|
{
|
||||||
|
TRACE("%s feature not found\n",feat);
|
||||||
|
return GSUB_E_NOFEATURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
TRACE("applying feature %s\n",feat);
|
||||||
|
while(i < *pcGlyphs)
|
||||||
|
{
|
||||||
|
INT nextIndex;
|
||||||
|
nextIndex = GSUB_apply_feature(header, feature, pwOutGlyphs, i, write_dir, pcGlyphs);
|
||||||
|
if (nextIndex > GSUB_E_NOGLYPH)
|
||||||
|
i = nextIndex;
|
||||||
|
else
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return *pcGlyphs;
|
||||||
|
}
|
||||||
|
return GSUB_E_NOFEATURE;
|
||||||
|
}
|
||||||
|
|
||||||
static CHAR neighbour_joining_type(int i, int delta, const CHAR* context_type, INT cchLen, SCRIPT_ANALYSIS *psa)
|
static CHAR neighbour_joining_type(int i, int delta, const CHAR* context_type, INT cchLen, SCRIPT_ANALYSIS *psa)
|
||||||
{
|
{
|
||||||
if (i + delta < 0)
|
if (i + delta < 0)
|
||||||
|
@ -668,22 +719,7 @@ void SHAPE_ShapeArabicGlyphs(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WC
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Required ligature substitution */
|
apply_GSUB_feature(hdc, psa, psc->GSUB_Table, pwOutGlyphs, dirL, pcGlyphs, "rlig");
|
||||||
if (psc->GSUB_Table)
|
|
||||||
{
|
|
||||||
i = 0;
|
|
||||||
while(i < *pcGlyphs)
|
|
||||||
{
|
|
||||||
INT nextIndex;
|
|
||||||
nextIndex = apply_GSUB_feature_to_glyph(hdc, psa, psc->GSUB_Table, pwOutGlyphs, i, dirL, pcGlyphs, "rlig");
|
|
||||||
if (nextIndex > GSUB_E_NOGLYPH)
|
|
||||||
i = nextIndex;
|
|
||||||
else if (nextIndex == GSUB_E_NOFEATURE)
|
|
||||||
break;
|
|
||||||
else
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
HeapFree(GetProcessHeap(),0,context_shape);
|
HeapFree(GetProcessHeap(),0,context_shape);
|
||||||
HeapFree(GetProcessHeap(),0,context_type);
|
HeapFree(GetProcessHeap(),0,context_type);
|
||||||
|
|
Loading…
Reference in New Issue