From: handa Date: Wed, 3 Dec 2008 00:40:58 +0000 (+0000) Subject: (setup_lookup_flags): The last argument changed X-Git-Tag: REL-0-9-9~41 X-Git-Url: http://git.chise.org/gitweb/?a=commitdiff_plain;h=f6a21ea45ac71f03dee2af5b7f491d4c88a65a47;p=m17n%2Flibotf.git (setup_lookup_flags): The last argument changed to lookup_flags. Just set the elements to 1 or 0. (gstring_insert_for_gpos): New function. (lookup_gpos): New arg accumulate. Insert pseudo glyphs to accumulate positioning if necessary. (OTF_drive_gsub_internal): Adjusted for the change of setup_lookup_flags. (OTF_drive_gpos_internal): Renamed from OTF_drive_gpos. Adjusted for the change of setup_lookup_flags and lookup_gpos. (OTF_drive_gpos): Just call OTF_drive_gpos_internal with accumulate == 0. (OTF_drive_gpos2): New function. --- diff --git a/src/otfdrive.c b/src/otfdrive.c index e843967..a32f6a4 100644 --- a/src/otfdrive.c +++ b/src/otfdrive.c @@ -203,16 +203,19 @@ get_langsys (OTF_ScriptList *script_list, } static int -setup_lookup_indices (OTF_LookupList *LookupList, OTF_FeatureList *FeatureList, - OTF_LangSys *LangSys, - const char *features, int *lookup_indices) +setup_lookup_flags (OTF_LookupList *LookupList, OTF_FeatureList *FeatureList, + OTF_LangSys *LangSys, + const char *features, char *lookup_flags) { int i, j, n = 0; OTF_Feature *feature; int *feature_table = alloca (sizeof (int) * FeatureList->FeatureCount); + if (! feature_table) + return -1; for (i = 0; i < FeatureList->FeatureCount; i++) feature_table[i] = 0; + memset (lookup_flags, 0, LookupList->LookupCount); while (*features) { @@ -231,7 +234,7 @@ setup_lookup_indices (OTF_LookupList *LookupList, OTF_FeatureList *FeatureList, { feature = FeatureList->Feature + index; for (j = 0; j < feature->LookupCount; j++) - lookup_indices[n++] = feature->LookupListIndex[j]; + lookup_flags[feature->LookupListIndex[j]] = 1; } } break; @@ -256,14 +259,13 @@ setup_lookup_indices (OTF_LookupList *LookupList, OTF_FeatureList *FeatureList, break; if (use_it > 0) for (j = 0; j < feature->LookupCount; j++) - lookup_indices[n++] = feature->LookupListIndex[j]; + lookup_flags[feature->LookupListIndex[j]] = 1; feature_table[i] = use_it; break; } } } - - return n; + return 0; } static int @@ -753,10 +755,25 @@ get_anchor (OTF_Anchor *anchor, OTF_ValueRecord *rec) return value_format; } +static int +gstring_insert_for_gpos (OTF_GlyphString *gstring, int gidx) +{ + int errret = -1; + int orig_gidx = gidx++; + + while (gidx < gstring->used + && ! gstring->glyphs[gidx].glyph_id + && gstring->glyphs[gidx].positioning_type) + gidx++; + GSTRING_INSERT (gstring, gidx, 1); + gstring->glyphs[gidx] = gstring->glyphs[orig_gidx]; + gstring->glyphs[gidx].glyph_id = 0; + return gidx; +} static int lookup_gpos (OTF_LookupList *lookup_list, unsigned lookup_list_index, - OTF_GlyphString *gstring, int gidx) + OTF_GlyphString *gstring, int gidx, int accumulate) { char *errfmt = "GPOS Looking up%s"; int errret = -1; @@ -767,8 +784,7 @@ lookup_gpos (OTF_LookupList *lookup_list, unsigned lookup_list_index, OTF_Glyph *g = gstring->glyphs + gidx; int i; - if (IGNORED_GLYPH (g, flag) - || (0 & g->positioning_type)) + if (IGNORED_GLYPH (g, flag)) return (gidx + 1); /* Try all subtables until one of them handles the current glyph. */ @@ -777,6 +793,10 @@ lookup_gpos (OTF_LookupList *lookup_list, unsigned lookup_list_index, unsigned lookup_type = lookup->LookupType; OTF_LookupSubTableGPOS *subtable = lookup->SubTable.gpos + i; int coverage_idx; + int positioning_type; + enum OTF_ValueFormat format; + OTF_ValueRecord *value; + OTF_Anchor *anchor1, *anchor2; if (lookup_type == 9) { @@ -797,21 +817,30 @@ lookup_gpos (OTF_LookupList *lookup_list, unsigned lookup_list_index, switch (lookup_type) { case 1: - g->positioning_type = lookup_type; + positioning_type = lookup_type; if (subtable->Format == 1) { OTF_GPOS_Single1 *single1 = &subtable->u.single1; - g->f.f1.format = single1->ValueFormat; - g->f.f1.value = &single1->Value; + format = single1->ValueFormat; + value = &single1->Value; } else if (subtable->Format == 2) { OTF_GPOS_Single2 *single2 = &subtable->u.single2; - g->f.f1.format = single2->ValueFormat; - g->f.f1.value = single2->Value + coverage_idx; + format = single2->ValueFormat; + value = single2->Value + coverage_idx; } + if (accumulate && g->positioning_type) + { + gidx = gstring_insert_for_gpos (gstring, gidx); + g = gstring->glyphs + gidx; + } + g->positioning_type = positioning_type; + g->f.f1.format = format; + g->f.f1.value = value; + gidx++; break; case 2: @@ -837,16 +866,29 @@ lookup_gpos (OTF_LookupList *lookup_list, unsigned lookup_list_index, { if (pair1->ValueFormat1) { + if (accumulate && g->positioning_type) + { + gidx = gstring_insert_for_gpos (gstring, gidx); + g = gstring->glyphs + gidx; + next_gidx += gidx - orig_gidx; + nextg = gstring->glyphs + next_gidx; + } g->positioning_type = lookup_type; g->f.f2.format = pair1->ValueFormat1; g->f.f2.value = &set->PairValueRecord[j].Value1; } gidx = next_gidx; + g = nextg; if (pair1->ValueFormat2) { - nextg->positioning_type = lookup_type; - nextg->f.f2.format = pair1->ValueFormat2; - nextg->f.f2.value = &set->PairValueRecord[j].Value2; + if (accumulate && g->positioning_type) + { + gidx = gstring_insert_for_gpos (gstring, gidx); + g = gstring->glyphs + gidx; + } + g->positioning_type = lookup_type; + g->f.f2.format = pair1->ValueFormat2; + g->f.f2.value = &set->PairValueRecord[j].Value2; gidx++; } break; @@ -861,17 +903,30 @@ lookup_gpos (OTF_LookupList *lookup_list, unsigned lookup_list_index, class2 = get_class_def (&pair2->ClassDef2, nextg->glyph_id); if (pair2->ValueFormat1) { + if (accumulate && g->positioning_type) + { + gidx = gstring_insert_for_gpos (gstring, gidx); + g = gstring->glyphs + gidx; + next_gidx += gidx - orig_gidx; + nextg = gstring->glyphs + next_gidx; + } g->positioning_type = lookup_type; g->f.f2.format = pair2->ValueFormat1; g->f.f2.value = &pair2->Class1Record[class1].Class2Record[class2].Value1; } gidx = next_gidx; + g = nextg; if (pair2->ValueFormat2) { - nextg->positioning_type = lookup_type; - nextg->f.f2.format = pair2->ValueFormat2; - nextg->f.f2.value + if (accumulate && g->positioning_type) + { + gidx = gstring_insert_for_gpos (gstring, gidx); + g = gstring->glyphs + gidx; + } + g->positioning_type = lookup_type; + g->f.f2.format = pair2->ValueFormat2; + g->f.f2.value = &pair2->Class1Record[class1].Class2Record[class2].Value2; gidx++; } @@ -883,6 +938,11 @@ lookup_gpos (OTF_LookupList *lookup_list, unsigned lookup_list_index, { OTF_GPOS_Cursive1 *cursive1 = &subtable->u.cursive1; + if (accumulate && g->positioning_type) + { + gidx = gstring_insert_for_gpos (gstring, gidx); + g = gstring->glyphs + gidx; + } g->positioning_type = lookup_type; g->f.f3.entry_anchor = &cursive1->EntryExitRecord[coverage_idx].EntryAnchor; @@ -916,6 +976,11 @@ lookup_gpos (OTF_LookupList *lookup_list, unsigned lookup_list_index, mark_record = mark_base1->MarkArray.MarkRecord + coverage_idx; base_record = mark_base1->BaseArray.AnchorRecord + coverage_idx_base; + if (accumulate && g->positioning_type) + { + gidx = gstring_insert_for_gpos (gstring, gidx); + g = gstring->glyphs + gidx; + } g->f.f4.mark_anchor = &mark_record->MarkAnchor; g->f.f4.base_anchor = &base_record->Anchor[mark_record->Class]; @@ -966,6 +1031,11 @@ lookup_gpos (OTF_LookupList *lookup_list, unsigned lookup_list_index, if (lig_anchor[mark_record->Class].AnchorFormat && num_class[mark_record->Class]-- == 0) { + if (accumulate && g->positioning_type) + { + gidx = gstring_insert_for_gpos (gstring, gidx); + g = gstring->glyphs + gidx; + } g->positioning_type = lookup_type; g->f.f5.mark_anchor = &mark_record->MarkAnchor; g->f.f5.ligature_anchor = lig_anchor + mark_record->Class; @@ -999,6 +1069,11 @@ lookup_gpos (OTF_LookupList *lookup_list, unsigned lookup_list_index, mark1_record = mark_mark1->Mark1Array.MarkRecord + coverage_idx; mark2_record = mark_mark1->Mark2Array.AnchorRecord + coverage_idx_base; + if (accumulate && g->positioning_type) + { + gidx = gstring_insert_for_gpos (gstring, gidx); + g = gstring->glyphs + gidx; + } g->f.f6.mark1_anchor = &mark1_record->MarkAnchor; g->f.f6.mark2_anchor = &mark2_record->Anchor[mark1_record->Class]; @@ -1027,7 +1102,8 @@ lookup_gpos (OTF_LookupList *lookup_list, unsigned lookup_list_index, lookup_gpos (lookup_list, rule->LookupRecord[k].LookupListIndex, gstring, - gidx + rule->LookupRecord[k].SequenceIndex); + gidx + rule->LookupRecord[k].SequenceIndex, + accumulate); gidx += rule->GlyphCount + (gstring->used - orig_used); break; } @@ -1057,7 +1133,8 @@ lookup_gpos (OTF_LookupList *lookup_list, unsigned lookup_list_index, lookup_gpos (lookup_list, rule->LookupRecord[k].LookupListIndex, gstring, - gidx + rule->LookupRecord[k].SequenceIndex); + gidx + rule->LookupRecord[k].SequenceIndex, + accumulate); gidx += rule->GlyphCount + (gstring->used - orig_used); break; } @@ -1077,7 +1154,8 @@ lookup_gpos (OTF_LookupList *lookup_list, unsigned lookup_list_index, lookup_gpos (lookup_list, context3->LookupRecord[j].LookupListIndex, gstring, - gidx + context3->LookupRecord[j].SequenceIndex); + gidx + context3->LookupRecord[j].SequenceIndex, + accumulate); gidx += context3->GlyphCount + (gstring->used - orig_used); } break; @@ -1105,7 +1183,8 @@ lookup_gpos (OTF_LookupList *lookup_list, unsigned lookup_list_index, lookup_gpos (lookup_list, rule->LookupRecord[k].LookupListIndex, gstring, - gidx + rule->LookupRecord[k].SequenceIndex); + gidx + rule->LookupRecord[k].SequenceIndex, + accumulate); gidx += rule->InputGlyphCount + (gstring->used - orig_used); break; } @@ -1140,7 +1219,8 @@ lookup_gpos (OTF_LookupList *lookup_list, unsigned lookup_list_index, lookup_gpos (lookup_list, rule->LookupRecord[k].LookupListIndex, gstring, - gidx + rule->LookupRecord[k].SequenceIndex); + gidx + rule->LookupRecord[k].SequenceIndex, + accumulate); gidx += rule->InputGlyphCount + (gstring->used - orig_used); break; } @@ -1162,7 +1242,8 @@ lookup_gpos (OTF_LookupList *lookup_list, unsigned lookup_list_index, lookup_gpos (lookup_list, context3->LookupRecord[j].LookupListIndex, gstring, - gidx + context3->LookupRecord[j].SequenceIndex); + gidx + context3->LookupRecord[j].SequenceIndex, + accumulate); gidx += context3->InputGlyphCount + (gstring->used - orig_used); } else @@ -1368,8 +1449,8 @@ OTF_drive_gsub_internal (OTF *otf, OTF_GlyphString *gstring, int errret = -1; OTF_GSUB *gsub; OTF_LangSys *LangSys; - int *lookup_indices; - int i, n; + char *lookup_flags; + int i; for (i = 0; i < gstring->used; i++) { @@ -1388,28 +1469,24 @@ OTF_drive_gsub_internal (OTF *otf, OTF_GlyphString *gstring, if (! LangSys) return errret; - /* One lookup may be used by multiple features. */ - lookup_indices = alloca (sizeof (int) - * gsub->LookupList.LookupCount - * (gsub->FeatureList.FeatureCount + 1)); - if (! lookup_indices) + lookup_flags = alloca (gsub->LookupList.LookupCount); + if (! lookup_flags + || setup_lookup_flags (&gsub->LookupList, &gsub->FeatureList, LangSys, + features, lookup_flags) < 0) OTF_ERROR (OTF_ERROR_MEMORY, " feature list"); - n = setup_lookup_indices (&gsub->LookupList, &gsub->FeatureList, LangSys, - features, lookup_indices); - if (n < 0) - return errret; - for (i = 0; i < n; i++) + for (i = 0; i < gsub->LookupList.LookupCount; i++) { - int index = lookup_indices[i]; int gidx; - if (gsub->LookupList.Lookup[index].LookupType != 8) + if (! lookup_flags[i]) continue; + + if (gsub->LookupList.Lookup[i].LookupType != 8) { gidx = 0; while (gidx < gstring->used) { - gidx = lookup_gsub (otf, &gsub->LookupList, index, gstring, gidx, + gidx = lookup_gsub (otf, &gsub->LookupList, i, gstring, gidx, alternate_subst); if (gidx < 0) return errret; @@ -1420,7 +1497,7 @@ OTF_drive_gsub_internal (OTF *otf, OTF_GlyphString *gstring, gidx = gstring->used - 1; while (gidx >= 0) { - gidx = lookup_gsub (otf, &gsub->LookupList, index, gstring, gidx, + gidx = lookup_gsub (otf, &gsub->LookupList, i, gstring, gidx, alternate_subst); if (gidx < 0) return errret; @@ -1441,14 +1518,16 @@ OTF_drive_gsub (OTF *otf, OTF_GlyphString *gstring, } int -OTF_drive_gpos (OTF *otf, OTF_GlyphString *gstring, - const char *script, const char *language, const char *features) +OTF_drive_gpos_internal (OTF *otf, OTF_GlyphString *gstring, + const char *script, const char *language, + const char *features, + int accumulate) { char *errfmt = "GPOS driving%s"; int errret = -1; OTF_GPOS *gpos; OTF_LangSys *LangSys; - int *lookup_indices; + char *lookup_flags; int i, n; for (i = 0; i < gstring->used; i++) @@ -1465,25 +1544,21 @@ OTF_drive_gpos (OTF *otf, OTF_GlyphString *gstring, if (! LangSys) return errret; - /* One lookup may be used by multiple features. */ - lookup_indices = alloca (sizeof (int) - * gpos->LookupList.LookupCount - * (gpos->FeatureList.FeatureCount + 1)); - if (! lookup_indices) + lookup_flags = alloca (gpos->LookupList.LookupCount); + if (! lookup_flags + || setup_lookup_flags (&gpos->LookupList, &gpos->FeatureList, LangSys, + features, lookup_flags) < 0) OTF_ERROR (OTF_ERROR_MEMORY, " feature list"); - n = setup_lookup_indices (&gpos->LookupList, &gpos->FeatureList, LangSys, - features, lookup_indices); - if (n < 0) - return errret; - for (i = 0; i < n; i++) + for (i = 0; i < gpos->LookupList.LookupCount; i++) { - int index = lookup_indices[i]; int gidx = 0; + if (! lookup_flags[i]) continue; + while (gidx < gstring->used) { - gidx = lookup_gpos (&gpos->LookupList, index, gstring, gidx); + gidx = lookup_gpos (&gpos->LookupList, i, gstring, gidx, accumulate); if (gidx < 0) return errret; } @@ -1493,6 +1568,24 @@ OTF_drive_gpos (OTF *otf, OTF_GlyphString *gstring, } int +OTF_drive_gpos (OTF *otf, OTF_GlyphString *gstring, + const char *script, const char *language, const char *features) +{ + if (! otf->cmap) + OTF_get_table (otf, "cmap"); + return OTF_drive_gpos_internal (otf, gstring, script, language, features, 0); +} + +int +OTF_drive_gpos2 (OTF *otf, OTF_GlyphString *gstring, + const char *script, const char *language, const char *features) +{ + if (! otf->cmap) + OTF_get_table (otf, "cmap"); + return OTF_drive_gpos_internal (otf, gstring, script, language, features, 1); +} + +int OTF_drive_tables (OTF *otf, OTF_GlyphString *gstring, const char *script, const char *language, const char *gsub_features, const char *gpos_features)