diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index a68abb533..626abc557 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -1618,7 +1618,14 @@ struct Rule const UnsizedArrayOf &lookupRecord = StructAfter> (inputZ.as_array ((inputCount ? inputCount - 1 : 0))); for (unsigned i = 0; i < (unsigned) lookupCount; i++) + { + if (!lookup_map->has (lookupRecord[i].lookupListIndex)) + { + out->lookupCount--; + continue; + } c->copy (lookupRecord[i], lookup_map); + } return_trace (true); } @@ -2234,7 +2241,14 @@ struct ContextFormat3 const LookupRecord *lookupRecord = &StructAfter (coverageZ.as_array (glyphCount)); const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups; for (unsigned i = 0; i < (unsigned) lookupCount; i++) + { + if (!lookup_map->has (lookupRecord[i].lookupListIndex)) + { + out->lookupCount--; + continue; + } c->serializer->copy (lookupRecord[i], lookup_map); + } return_trace (true); } @@ -3303,13 +3317,21 @@ struct ChainContextFormat3 return_trace (false); const Array16Of &lookupRecord = StructAfter> (lookahead); + const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups; + hb_set_t lookup_indices; + for (unsigned i = 0; i < (unsigned) lookupRecord.len; i++) + if (lookup_map->has (lookupRecord[i].lookupListIndex)) + lookup_indices.add (i); + HBUINT16 lookupCount; - lookupCount = lookupRecord.len; + lookupCount = lookup_indices.get_population (); if (!c->serializer->copy (lookupCount)) return_trace (false); - const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups; - for (unsigned i = 0; i < (unsigned) lookupCount; i++) - if (!c->serializer->copy (lookupRecord[i], lookup_map)) return_trace (false); + for (unsigned i : lookup_indices.iter ()) + { + if (!c->serializer->copy (lookupRecord[i], lookup_map)) + return_trace (false); + } return_trace (true); } diff --git a/test/subset/data/Makefile.am b/test/subset/data/Makefile.am index 8490c3732..d7b05f4ce 100644 --- a/test/subset/data/Makefile.am +++ b/test/subset/data/Makefile.am @@ -34,6 +34,7 @@ EXTRA_DIST += \ expected/layout.gdef-varstore \ expected/layout.gdef-attachlist \ expected/layout.notonastaliqurdu \ + expected/layout.tinos \ expected/cmap \ expected/cmap14 \ expected/sbix \ diff --git a/test/subset/data/Makefile.sources b/test/subset/data/Makefile.sources index 17c9160a7..74b70799d 100644 --- a/test/subset/data/Makefile.sources +++ b/test/subset/data/Makefile.sources @@ -31,6 +31,7 @@ TESTS = \ tests/layout.khmer.tests \ tests/layout.notonastaliqurdu.tests \ tests/layout.tests \ + tests/layout.tinos.tests \ tests/sbix.tests \ tests/variable.tests \ tests/glyph_names.tests \ diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.default.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.default.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf new file mode 100644 index 000000000..d289df256 Binary files /dev/null and b/test/subset/data/expected/layout.tinos/Tinos-Italic.default.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf differ diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.default.retain-all-codepoint.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.default.retain-all-codepoint.ttf new file mode 100644 index 000000000..d28d567eb Binary files /dev/null and b/test/subset/data/expected/layout.tinos/Tinos-Italic.default.retain-all-codepoint.ttf differ diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf new file mode 100644 index 000000000..31b87eceb Binary files /dev/null and b/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf differ diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.retain-all-codepoint.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.retain-all-codepoint.ttf new file mode 100644 index 000000000..4a632a1c8 Binary files /dev/null and b/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.retain-all-codepoint.ttf differ diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf new file mode 100644 index 000000000..d289df256 Binary files /dev/null and b/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf differ diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.retain-all-codepoint.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.retain-all-codepoint.ttf new file mode 100644 index 000000000..d28d567eb Binary files /dev/null and b/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.retain-all-codepoint.ttf differ diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf new file mode 100644 index 000000000..6c9e2d344 Binary files /dev/null and b/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf differ diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.retain-all-codepoint.ttf new file mode 100644 index 000000000..78e92adb7 Binary files /dev/null and b/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.retain-all-codepoint.ttf differ diff --git a/test/subset/data/fonts/Tinos-Italic.ttf b/test/subset/data/fonts/Tinos-Italic.ttf new file mode 100644 index 000000000..851621eae Binary files /dev/null and b/test/subset/data/fonts/Tinos-Italic.ttf differ diff --git a/test/subset/data/tests/layout.tinos.tests b/test/subset/data/tests/layout.tinos.tests new file mode 100644 index 000000000..64a9dab73 --- /dev/null +++ b/test/subset/data/tests/layout.tinos.tests @@ -0,0 +1,12 @@ +FONTS: +Tinos-Italic.ttf + +PROFILES: +default.txt +retain-gids.txt +glyph-names.txt +notdef-outline.txt + +SUBSETS: +U+5bf,U+5f0,U+5f1,U+5f2,U+fb21,U+fb22,U+fb23,U+fb24,U+fb25,U+fb26,U+fb27,U+fb28 +* diff --git a/test/subset/meson.build b/test/subset/meson.build index c3ce6b2a4..4ed2fdd7f 100644 --- a/test/subset/meson.build +++ b/test/subset/meson.build @@ -26,6 +26,7 @@ tests = [ 'layout.gdef-varstore', 'layout.gdef-attachlist', 'layout.notonastaliqurdu', + 'layout.tinos', 'cmap', 'cmap14', 'sbix',