static int
-gstring_subst (OTF_GlyphString *gstring, int from, int to, int flag,
+gstring_subst (OTF *otf, OTF_GlyphString *gstring, int from, int to, int flag,
OTF_GlyphID *ids, int num)
{
int errret = -1;
int len = to - from;
int i;
- int c = gstring->glyphs[from].c;
int from_idx = gstring->glyphs[from].f.index.from;
int to_idx = gstring->glyphs[to - 1].f.index.to;
int non_ignored_idx;
GSTRING_DELETE (gstring, from, (len - num));
for (i = 0; i < num; i++)
{
- gstring->glyphs[from + i].c = c;
+ gstring->glyphs[from + i].c = otf->cmap->decode_table[ids[i]];
gstring->glyphs[from + i].glyph_id = ids[i];
gstring->glyphs[from + i].f.index.from = from_idx;
gstring->glyphs[from + i].f.index.to = to_idx;
}
static int
-lookup_gsub (OTF_LookupList *lookup_list, unsigned lookup_list_index,
+lookup_gsub (OTF *otf, OTF_LookupList *lookup_list, unsigned lookup_list_index,
OTF_GlyphString *gstring, int gidx, int alternate_subst)
{
char *errfmt = "GSUB Looking up%s";
OTF_GSUB_Multiple1 *multiple1 = &subtable->u.multiple1;
OTF_Sequence *seq = multiple1->Sequence + coverage_idx;
- gstring_subst (gstring, gidx, gidx + 1, flag,
+ gstring_subst (otf, gstring, gidx, gidx + 1, flag,
seq->Substitute, seq->GlyphCount);
gidx += seq->GlyphCount;
}
OTF_GSUB_Alternate1 *alt1 = &subtable->u.alternate1;
OTF_AlternateSet *altset = alt1->AlternateSet + coverage_idx;
- gstring_subst (gstring, gidx + 1, gidx + 1, flag,
+ gstring_subst (otf, gstring, gidx + 1, gidx + 1, flag,
altset->Alternate, altset->GlyphCount);
gidx += altset->GlyphCount;;
}
lig->CompCount - 1, lig->Component);
if (n < 0)
continue;
- gstring_subst (gstring, gidx, gidx + 1 + n, flag,
+ gstring_subst (otf, gstring, gidx, gidx + 1 + n, flag,
&lig->LigGlyph, 1);
gidx += lig->CompCount;
break;
continue;
orig_used = gstring->used;
for (k = 0; k < rule->LookupCount; k++)
- lookup_gsub (lookup_list,
+ lookup_gsub (otf, lookup_list,
rule->LookupRecord[k].LookupListIndex,
gstring,
gidx + rule->LookupRecord[k].SequenceIndex,
continue;
orig_used = gstring->used;
for (k = 0; k < rule->LookupCount; k++)
- lookup_gsub (lookup_list,
+ lookup_gsub (otf, lookup_list,
rule->LookupRecord[k].LookupListIndex,
gstring,
gidx + rule->LookupRecord[k].SequenceIndex,
continue;
orig_used = gstring->used;
for (j = 0; j < context3->LookupCount; j++)
- lookup_gsub (lookup_list,
+ lookup_gsub (otf, lookup_list,
context3->LookupRecord[j].LookupListIndex,
gstring,
gidx + context3->LookupRecord[j].SequenceIndex,
continue;
orig_used = gstring->used;
for (k = 0; k < rule->LookupCount; k++)
- lookup_gsub (lookup_list,
+ lookup_gsub (otf, lookup_list,
rule->LookupRecord[k].LookupListIndex,
gstring,
gidx + rule->LookupRecord[k].SequenceIndex,
continue;
orig_used = gstring->used;
for (k = 0; k < rule->LookupCount; k++)
- lookup_gsub (lookup_list,
+ lookup_gsub (otf, lookup_list,
rule->LookupRecord[k].LookupListIndex,
gstring,
gidx + rule->LookupRecord[k].SequenceIndex,
continue;
orig_used = gstring->used;
for (j = 0; j < context3->LookupCount; j++)
- lookup_gsub (lookup_list,
+ lookup_gsub (otf, lookup_list,
context3->LookupRecord[j].LookupListIndex,
gstring,
gidx + context3->LookupRecord[j].SequenceIndex,
gidx = 0;
while (gidx < gstring->used)
{
- gidx = lookup_gsub (&gsub->LookupList, index, gstring, gidx,
+ gidx = lookup_gsub (otf, &gsub->LookupList, index, gstring, gidx,
alternate_subst);
if (gidx < 0)
return errret;
gidx = gstring->used - 1;
while (gidx >= 0)
{
- gidx = lookup_gsub (&gsub->LookupList, index, gstring, gidx,
+ gidx = lookup_gsub (otf, &gsub->LookupList, index, gstring, gidx,
alternate_subst);
if (gidx < 0)
return errret;