From 1deed38b8d191303b9163e424c99e4aa3cd9fd03 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 14 Mar 2023 13:46:39 -0600 Subject: [PATCH] [avar2] Add compile test --- Lib/fontTools/ttLib/tables/_a_v_a_r.py | 2 + Tests/ttLib/tables/_a_v_a_r_test.py | 79 ++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/Lib/fontTools/ttLib/tables/_a_v_a_r.py b/Lib/fontTools/ttLib/tables/_a_v_a_r.py index 087a552d5..39039cf73 100644 --- a/Lib/fontTools/ttLib/tables/_a_v_a_r.py +++ b/Lib/fontTools/ttLib/tables/_a_v_a_r.py @@ -52,6 +52,7 @@ class table__a_v_a_r(BaseTTXConverter): axisTags = [axis.axisTag for axis in ttFont["fvar"].axes] if not hasattr(self, "table"): self.table = otTables.avar() + if not hasattr(self.table, "Reserved"): self.table.Reserved = 0 self.table.Version = (getattr(self, "majorVersion", 1) << 16) | getattr( self, "minorVersion", 0 @@ -111,6 +112,7 @@ class table__a_v_a_r(BaseTTXConverter): def fromXML(self, name, attrs, content, ttFont): if not hasattr(self, "table"): self.table = otTables.avar() + if not hasattr(self.table, "Reserved"): self.table.Reserved = 0 if name == "version": self.majorVersion = safeEval(attrs["major"]) diff --git a/Tests/ttLib/tables/_a_v_a_r_test.py b/Tests/ttLib/tables/_a_v_a_r_test.py index bf7871f88..76528d18f 100644 --- a/Tests/ttLib/tables/_a_v_a_r_test.py +++ b/Tests/ttLib/tables/_a_v_a_r_test.py @@ -2,8 +2,11 @@ from fontTools.misc.testTools import parseXML from fontTools.misc.textTools import deHexStr from fontTools.misc.xmlWriter import XMLWriter from fontTools.ttLib import TTFont, TTLibError +import fontTools.ttLib.tables.otTables as otTables from fontTools.ttLib.tables._a_v_a_r import table__a_v_a_r from fontTools.ttLib.tables._f_v_a_r import table__f_v_a_r, Axis +import fontTools.varLib.models as models +import fontTools.varLib.varStore as varStore from io import BytesIO import unittest @@ -95,6 +98,82 @@ class AxisVariationTableTest(unittest.TestCase): return [line.strip() for line in content.splitlines()][1:] +class Avar2Test(unittest.TestCase): + def test(self): + + axisTags = ["wght", "wdth"] + fvar = table__f_v_a_r() + for tag in axisTags: + axis = Axis() + axis.axisTag = tag + fvar.axes.append(axis) + + master_locations_normalized = [ + {}, + {"wght": 1, "wdth": -1}, + ] + data = [ + {}, + {"wdth": -0.8}, + ] + + model = models.VariationModel(master_locations_normalized, axisTags) + store_builder = varStore.OnlineVarStoreBuilder(axisTags) + store_builder.setModel(model) + varIdxes = {} + for axis in axisTags: + masters = [m.get(axis, 0) * (1 << 14) for m in data] + varIdxes[axis] = store_builder.storeMasters(masters)[1] + store = store_builder.finish() + mapping = store.optimize() + varIdxes = {axis: mapping[value] for axis, value in varIdxes.items()} + del model, store_builder, mapping + + varIdxMap = otTables.DeltaSetIndexMap() + varIdxMap.mapping = [] + for tag in axisTags: + varIdxMap.mapping.append(varIdxes[tag]) + + avar = table__a_v_a_r() + avar.segments["wght"] = {} + avar.segments["wdth"] = {-1.0: -1.0, 0.0: 0.0, 0.4: 0.5, 1.0: 1.0} + + avar.majorVersion = 2 + avar.table = otTables.avar() + avar.table.VarIdxMap = varIdxMap + avar.table.VarStore = store + + font = TTFont() + font["fvar"] = fvar + font["avar"] = avar + + b = BytesIO() + font.save(b) + b.seek(0) + font2 = TTFont(b) + + assert font2["avar"].table.VarStore.VarRegionList.RegionAxisCount == 2 + assert font2["avar"].table.VarStore.VarRegionList.RegionCount == 1 + + xml1 = BytesIO() + writer = XMLWriter(xml1) + font["avar"].toXML(writer, font) + + xml2 = BytesIO() + writer = XMLWriter(xml2) + font2["avar"].toXML(writer, font2) + + # We can't compare because VarStore goes through transformation during compile :( + # assert xml1.getvalue() == xml2.getvalue(), (xml1.getvalue(), xml2.getvalue()) + + avar = table__a_v_a_r() + xml = b"".join(xml2.getvalue().splitlines()[1:]) + for name, attrs, content in parseXML(xml): + avar.fromXML(name, attrs, content, ttFont=TTFont()) + assert avar.table.VarStore.VarRegionList.RegionAxisCount == 2 + assert avar.table.VarStore.VarRegionList.RegionCount == 1 + + if __name__ == "__main__": import sys