[subset] fox for (Chain)ContextFormat3: subset lookupRecord
skip copying a lookupRecord if lookup referenced in the lookupRecord is
not retained after subset
diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh
index a68abb5..626abc5 100644
--- a/src/hb-ot-layout-gsubgpos.hh
+++ b/src/hb-ot-layout-gsubgpos.hh
@@ -1618,7 +1618,14 @@
const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>>
(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 @@
const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (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 @@
return_trace (false);
const Array16Of<LookupRecord> &lookupRecord = StructAfter<Array16Of<LookupRecord>> (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 8490c37..d7b05f4 100644
--- a/test/subset/data/Makefile.am
+++ b/test/subset/data/Makefile.am
@@ -34,6 +34,7 @@
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 17c9160..74b7079 100644
--- a/test/subset/data/Makefile.sources
+++ b/test/subset/data/Makefile.sources
@@ -31,6 +31,7 @@
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 0000000..d289df2
--- /dev/null
+++ b/test/subset/data/expected/layout.tinos/Tinos-Italic.default.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf
Binary files 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 0000000..d28d567
--- /dev/null
+++ b/test/subset/data/expected/layout.tinos/Tinos-Italic.default.retain-all-codepoint.ttf
Binary files 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 0000000..31b87ec
--- /dev/null
+++ b/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf
Binary files 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 0000000..4a632a1
--- /dev/null
+++ b/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.retain-all-codepoint.ttf
Binary files 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 0000000..d289df2
--- /dev/null
+++ b/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf
Binary files 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 0000000..d28d567
--- /dev/null
+++ b/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.retain-all-codepoint.ttf
Binary files 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 0000000..6c9e2d3
--- /dev/null
+++ b/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf
Binary files 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 0000000..78e92ad
--- /dev/null
+++ b/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.retain-all-codepoint.ttf
Binary files differ
diff --git a/test/subset/data/fonts/Tinos-Italic.ttf b/test/subset/data/fonts/Tinos-Italic.ttf
new file mode 100644
index 0000000..851621e
--- /dev/null
+++ b/test/subset/data/fonts/Tinos-Italic.ttf
Binary files differ
diff --git a/test/subset/data/tests/layout.tinos.tests b/test/subset/data/tests/layout.tinos.tests
new file mode 100644
index 0000000..64a9dab
--- /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 c3ce6b2..4ed2fdd 100644
--- a/test/subset/meson.build
+++ b/test/subset/meson.build
@@ -26,6 +26,7 @@
'layout.gdef-varstore',
'layout.gdef-attachlist',
'layout.notonastaliqurdu',
+ 'layout.tinos',
'cmap',
'cmap14',
'sbix',