X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fotfdrive.c;h=3dc6eda562dcb4bb1b150b539c509e3a072da933;hb=092c77ce9d2bd59339ae4a99cc27d2b78318cf06;hp=2449faa0686c71ee0a7fefa40c5b5f8798827c53;hpb=8a36b1a236434d406737e27628ecb90307ff52cc;p=m17n%2Flibotf.git diff --git a/src/otfdrive.c b/src/otfdrive.c index 2449faa..3dc6eda 100644 --- a/src/otfdrive.c +++ b/src/otfdrive.c @@ -29,14 +29,14 @@ write to the Free Software Foundation, Inc., 59 Temple Place, Suite #include "otf.h" #include "otferror.h" -/* Return nonzero if OTF_Glyph *G should be ignored according to - LookupFlag FLAG. */ -#define IGNORED_GLYPH(g, flag) \ - ((g)->glyph_id == 0 \ - || ((flag) & (1 << (g)->GlyphClass)) \ - || (((flag) & OTF_MarkAttachmentType) \ - && (g)->GlyphClass == OTF_GlyphClassMark \ - && ((flag) >> 8) != (g)->MarkAttachClass)) +/* Return nonzero (-1 if ID is zero, 1 otherwise) if OTF_Glyph *G + should be ignored according to LookupFlag FLAG. */ +#define IGNORED_GLYPH(g, flag) \ + ((g)->glyph_id == 0 ? -1 \ + : (((flag) & (1 << (g)->GlyphClass)) \ + || (((flag) & OTF_MarkAttachmentType) \ + && (g)->GlyphClass == OTF_GlyphClassMark \ + && ((flag) >> 8) != (g)->MarkAttachClass))) #define GSTRING_DELETE(gstring, from, len) \ do { \ @@ -65,6 +65,8 @@ write to the Free Software Foundation, Inc., 59 Temple Place, Suite } while (0) +static unsigned get_class_def (OTF_ClassDef *, OTF_GlyphID); + static int gstring_subst (OTF *otf, OTF_GlyphString *gstring, int from, int to, int flag, OTF_GlyphID *ids, int num) @@ -79,8 +81,11 @@ gstring_subst (OTF *otf, OTF_GlyphString *gstring, int from, int to, int flag, for (i = non_ignored_idx = to - 1; i >= from; i--) { OTF_Glyph *g = gstring->glyphs + i; - if (IGNORED_GLYPH (g, flag)) + + if (IGNORED_GLYPH (g, flag) == 1) { + /* Move this glyph to the next of the current target of + substitution. */ OTF_Glyph temp = *g; memmove (g, g + 1, sizeof (OTF_Glyph) * (non_ignored_idx - i)); @@ -97,8 +102,17 @@ gstring_subst (OTF *otf, OTF_GlyphString *gstring, int from, int to, int flag, GSTRING_DELETE (gstring, from, (len - num)); for (i = 0; i < num; i++) { - gstring->glyphs[from + i].c = otf->cmap->decode_table[ids[i]]; + if (gstring->glyphs[from + i].glyph_id != ids[i]) + { + gstring->glyphs[from + i].c = 0; + if (otf->gdef) + gstring->glyphs[from + i].GlyphClass + = get_class_def (&otf->gdef->glyph_class_def, ids[i]); + else + gstring->glyphs[from + i].GlyphClass = 0; + } gstring->glyphs[from + i].glyph_id = ids[i]; + gstring->glyphs[from + i].positioning_type = 0; gstring->glyphs[from + i].f.index.from = from_idx; gstring->glyphs[from + i].f.index.to = to_idx; } @@ -151,7 +165,8 @@ get_class_def (OTF_ClassDef *class_def, OTF_GlyphID glyph_id) } static OTF_LangSys * -get_langsys (OTF_ScriptList *script_list, char *script, char *language) +get_langsys (OTF_ScriptList *script_list, + const char *script, const char *language) { OTF_Tag script_tag = OTF_tag (script); @@ -189,7 +204,7 @@ get_langsys (OTF_ScriptList *script_list, char *script, char *language) static int setup_lookup_indices (OTF_LookupList *LookupList, OTF_FeatureList *FeatureList, - char *features, int *lookup_indices) + const char *features, int *lookup_indices) { int i, j, n = 0; OTF_Feature *feature; @@ -473,7 +488,7 @@ lookup_gsub (OTF *otf, OTF_LookupList *lookup_list, unsigned lookup_list_index, OTF_GSUB_Alternate1 *alt1 = &subtable->u.alternate1; OTF_AlternateSet *altset = alt1->AlternateSet + coverage_idx; - gstring_subst (otf, gstring, gidx + 1, gidx + 1, flag, + gstring_subst (otf, gstring, gidx, gidx + 1, flag, altset->Alternate, altset->GlyphCount); gidx += altset->GlyphCount;; } @@ -500,7 +515,7 @@ lookup_gsub (OTF *otf, OTF_LookupList *lookup_list, unsigned lookup_list_index, continue; gstring_subst (otf, gstring, gidx, gidx + 1 + n, flag, &lig->LigGlyph, 1); - gidx += lig->CompCount; + gidx++; break; } } @@ -748,7 +763,7 @@ lookup_gpos (OTF_LookupList *lookup_list, unsigned lookup_list_index, int i; if (IGNORED_GLYPH (g, flag) - || g->positioning_type) + || (0 & g->positioning_type)) return (gidx + 1); /* Try all subtables until one of them handles the current glyph. */ @@ -800,7 +815,7 @@ lookup_gpos (OTF_LookupList *lookup_list, unsigned lookup_list_index, OTF_Glyph *nextg; for (next_gidx = gidx + 1, nextg = gstring->glyphs + next_gidx; - next_gidx < gstring->used && ! IGNORED_GLYPH (nextg, flag); + next_gidx < gstring->used && IGNORED_GLYPH (nextg, flag); next_gidx++, nextg++); if (next_gidx >= gstring->used @@ -881,9 +896,10 @@ lookup_gpos (OTF_LookupList *lookup_list, unsigned lookup_list_index, OTF_AnchorRecord *base_record; OTF_Glyph *baseg; int coverage_idx_base; + unsigned int this_flag = flag | OTF_IgnoreMarks; for (baseg = g - 1; - baseg >= gstring->glyphs && IGNORED_GLYPH (baseg, flag); + baseg >= gstring->glyphs && IGNORED_GLYPH (baseg, this_flag); baseg--); if (baseg < gstring->glyphs) continue; @@ -1339,7 +1355,8 @@ OTF_drive_gdef (OTF *otf, OTF_GlyphString *gstring) static int OTF_drive_gsub_internal (OTF *otf, OTF_GlyphString *gstring, - char *script, char *language, char *features, + const char *script, const char *language, + const char *features, int alternate_subst) { char *errfmt = "GSUB driving%s"; @@ -1350,10 +1367,12 @@ OTF_drive_gsub_internal (OTF *otf, OTF_GlyphString *gstring, int i, n; for (i = 0; i < gstring->used; i++) - gstring->glyphs[i].f.index.from = gstring->glyphs[i].f.index.to = i; + { + gstring->glyphs[i].positioning_type = 0; + gstring->glyphs[i].f.index.from = gstring->glyphs[i].f.index.to = i; + } - if (! otf->gsub - && OTF_get_table (otf, "GSUB") < 0) + if (OTF_get_table (otf, "GSUB") < 0) return errret; gsub = otf->gsub; if (gsub->FeatureList.FeatureCount == 0 @@ -1409,14 +1428,16 @@ OTF_drive_gsub_internal (OTF *otf, OTF_GlyphString *gstring, int OTF_drive_gsub (OTF *otf, OTF_GlyphString *gstring, - char *script, char *language, char *features) + const char *script, const char *language, const char *features) { + if (! otf->cmap) + OTF_get_table (otf, "cmap"); return OTF_drive_gsub_internal (otf, gstring, script, language, features, 0); } int OTF_drive_gpos (OTF *otf, OTF_GlyphString *gstring, - char *script, char *language, char *features) + const char *script, const char *language, const char *features) { char *errfmt = "GPOS driving%s"; int errret = -1; @@ -1425,8 +1446,10 @@ OTF_drive_gpos (OTF *otf, OTF_GlyphString *gstring, int *lookup_indices; int i, n; - if (! otf->gpos - && OTF_get_table (otf, "GPOS") < 0) + for (i = 0; i < gstring->used; i++) + gstring->glyphs[i].positioning_type = 0; + + if (OTF_get_table (otf, "GPOS") < 0) return errret; gpos = otf->gpos; if (gpos->FeatureList.FeatureCount == 0 @@ -1448,9 +1471,6 @@ OTF_drive_gpos (OTF *otf, OTF_GlyphString *gstring, if (n < 0) return errret; - for (i = 0; i < gstring->used; i++) - gstring->glyphs[i].positioning_type = 0; - for (i = 0; i < n; i++) { int index = lookup_indices[i]; @@ -1469,8 +1489,8 @@ OTF_drive_gpos (OTF *otf, OTF_GlyphString *gstring, int OTF_drive_tables (OTF *otf, OTF_GlyphString *gstring, - char *script, char *language, - char *gsub_features, char *gpos_features) + const char *script, const char *language, + const char *gsub_features, const char *gpos_features) { if (OTF_drive_cmap (otf, gstring) < 0) return -1; @@ -1487,7 +1507,8 @@ OTF_drive_tables (OTF *otf, OTF_GlyphString *gstring, int OTF_drive_gsub_alternate (OTF *otf, OTF_GlyphString *gstring, - char *script, char *language, char *features) + const char *script, const char *language, + const char *features) { return OTF_drive_gsub_internal (otf, gstring, script, language, features, 1); }