Merge pull request #1782 from anthrotype/subset-feature-vars-remap-indices

[subset] remap FeatureVariations SubstitutionRecord.FeatureIndex
This commit is contained in:
Cosimo Lupo 2019-12-12 13:51:59 +00:00 committed by GitHub
commit 3b9a94d659
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 0 deletions

View File

@ -1307,6 +1307,9 @@ def subset_features(self, feature_indices):
self.ensureDecompiled() self.ensureDecompiled()
self.SubstitutionRecord = [r for r in self.SubstitutionRecord self.SubstitutionRecord = [r for r in self.SubstitutionRecord
if r.FeatureIndex in feature_indices] if r.FeatureIndex in feature_indices]
# remap feature indices
for r in self.SubstitutionRecord:
r.FeatureIndex = feature_indices.index(r.FeatureIndex)
self.SubstitutionCount = len(self.SubstitutionRecord) self.SubstitutionCount = len(self.SubstitutionRecord)
return bool(self.SubstitutionCount) return bool(self.SubstitutionCount)

View File

@ -1,5 +1,7 @@
import io
from fontTools.misc.py23 import * from fontTools.misc.py23 import *
from fontTools import subset from fontTools import subset
from fontTools.fontBuilder import FontBuilder
from fontTools.ttLib import TTFont, newTable from fontTools.ttLib import TTFont, newTable
from fontTools.misc.loggingTools import CapturingLogHandler from fontTools.misc.loggingTools import CapturingLogHandler
import difflib import difflib
@ -728,5 +730,43 @@ class SubsetTest(unittest.TestCase):
self.assertEqual(ttf.flavor, None) self.assertEqual(ttf.flavor, None)
def test_subset_feature_variations():
fb = FontBuilder(unitsPerEm=100)
fb.setupGlyphOrder([".notdef", "f", "f_f", "dollar", "dollar.rvrn"])
fb.setupCharacterMap({ord("f"): "f", ord("$"): "dollar"})
fb.setupNameTable({"familyName": "TestFeatureVars", "styleName": "Regular"})
fb.setupPost()
fb.setupFvar(axes=[("wght", 100, 400, 900, "Weight")], instances=[])
fb.addOpenTypeFeatures("""\
feature dlig {
sub f f by f_f;
} dlig;
""")
fb.addFeatureVariations(
[([{"wght": (0.20886, 1.0)}], {"dollar": "dollar.rvrn"})],
featureTag="rvrn"
)
buf = io.BytesIO()
fb.save(buf)
buf.seek(0)
font = TTFont(buf)
options = subset.Options()
subsetter = subset.Subsetter(options)
subsetter.populate(unicodes=[ord("f"), ord("$")])
subsetter.subset(font)
featureTags = {
r.FeatureTag for r in font["GSUB"].table.FeatureList.FeatureRecord
}
# 'dlig' is discretionary so it is dropped by default
assert "dlig" not in featureTags
assert "f_f" not in font.getGlyphOrder()
# 'rvrn' is required so it is kept by default
assert "rvrn" in featureTags
assert "dollar.rvrn" in font.getGlyphOrder()
if __name__ == "__main__": if __name__ == "__main__":
sys.exit(unittest.main()) sys.exit(unittest.main())