From b14a29c353959b145ec8a70a817a53615bd8f63b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jul 2023 05:43:23 -0600 Subject: [PATCH] [varLib.merger] Support sparse CursivePos Part of https://github.com/fonttools/fonttools/issues/3168 --- Lib/fontTools/varLib/merger.py | 24 ++++++++++++++ Tests/varLib/merger_test.py | 57 +++++++++++++++++++++++++++++++++- 2 files changed, 80 insertions(+), 1 deletion(-) diff --git a/Lib/fontTools/varLib/merger.py b/Lib/fontTools/varLib/merger.py index c3366cbcd..a4db492b7 100644 --- a/Lib/fontTools/varLib/merger.py +++ b/Lib/fontTools/varLib/merger.py @@ -912,6 +912,30 @@ def _Lookup_SinglePos_subtables_flatten(lst, font, min_inclusive_rec_format): return [new] +@AligningMerger.merger(ot.CursivePos) +def merge(merger, self, lst): + # Align them + glyphs, padded = _merge_GlyphOrders( + merger.font, + [l.Coverage.glyphs for l in lst], + [l.EntryExitRecord for l in lst], + ) + + self.Format = 1 + self.Coverage = ot.Coverage() + self.Coverage.glyphs = glyphs + self.EntryExitRecord = [] + for _ in glyphs: + rec = ot.EntryExitRecord() + rec.EntryAnchor = ot.Anchor() + rec.EntryAnchor.Format = 1 + rec.ExitAnchor = ot.Anchor() + rec.ExitAnchor.Format = 1 + self.EntryExitRecord.append(rec) + merger.mergeLists(self.EntryExitRecord, padded) + self.EntryExitCount = len(self.EntryExitRecord) + + @AligningMerger.merger(ot.Lookup) def merge(merger, self, lst): subtables = merger.lookup_subtables = [l.SubTable for l in lst] diff --git a/Tests/varLib/merger_test.py b/Tests/varLib/merger_test.py index c92921248..e5ae61c60 100644 --- a/Tests/varLib/merger_test.py +++ b/Tests/varLib/merger_test.py @@ -1846,7 +1846,7 @@ class COLRVariationMergerTest: class SparsePositioningMergerTest: - def test_sparse_positioning_at_default(self): + def test_zero_kern_at_default(self): # https://github.com/fonttools/fonttools/issues/3111 pytest.importorskip("ufo2ft") @@ -1881,3 +1881,58 @@ class SparsePositioningMergerTest: font.save(b) assert font["GDEF"].table.VarStore.VarData[0].Item[0] == [100, -100] + + def test_sparse_cursive(self): + # https://github.com/fonttools/fonttools/issues/3168 + + pytest.importorskip("ufo2ft") + pytest.importorskip("ufoLib2") + + from fontTools.designspaceLib import DesignSpaceDocument + from ufo2ft import compileVariableTTF + from ufoLib2 import Font + + ds = DesignSpaceDocument() + ds.addAxisDescriptor( + name="wght", tag="wght", minimum=100, maximum=900, default=400 + ) + ds.addSourceDescriptor(font=Font(), location=dict(wght=100)) + ds.addSourceDescriptor(font=Font(), location=dict(wght=400)) + ds.addSourceDescriptor(font=Font(), location=dict(wght=900)) + + ds.sources[0].font.newGlyph("a").unicode = ord("a") + ds.sources[0].font.newGlyph("b").unicode = ord("b") + ds.sources[ + 0 + ].font.features.text = """ + feature curs { + position cursive a ; + } curs; + """ + + ds.sources[1].font.newGlyph("a").unicode = ord("a") + ds.sources[1].font.newGlyph("b").unicode = ord("b") + ds.sources[ + 1 + ].font.features.text = """ + feature curs { + position cursive a ; + position cursive b ; + } curs; + """ + + ds.sources[2].font.newGlyph("a").unicode = ord("a") + ds.sources[2].font.newGlyph("b").unicode = ord("b") + ds.sources[ + 2 + ].font.features.text = """ + feature curs { + position cursive b ; + } curs; + """ + + font = compileVariableTTF(ds, inplace=True) + b = BytesIO() + font.save(b) + + assert font["GDEF"].table.VarStore.VarData[0].Item[0] == [-100, 0]