diff --git a/Lib/fontTools/ttLib/tables/TupleVariation.py b/Lib/fontTools/ttLib/tables/TupleVariation.py index bf627d993..b94cfd4b4 100644 --- a/Lib/fontTools/ttLib/tables/TupleVariation.py +++ b/Lib/fontTools/ttLib/tables/TupleVariation.py @@ -465,7 +465,8 @@ def compileSharedTuples(axisTags, variations): def compileTupleVariationStore(variations, pointCount, - axisTags, sharedTupleIndices): + axisTags, sharedTupleIndices, + useSharedPoints=True): variations = [v for v in variations if v.hasImpact()] if len(variations) == 0: return (0, b"", b"") @@ -515,7 +516,7 @@ def compileTupleVariationStore(variations, pointCount, axisTags, sharedTupleIndices, sharedPoints=None) sharedTuple, sharedData, usesSharedPoints = v.compile( axisTags, sharedTupleIndices, sharedPoints=usedPoints) - if (len(sharedTuple) + len(sharedData)) < (len(privateTuple) + len(privateData)): + if useSharedPoints and (len(sharedTuple) + len(sharedData)) < (len(privateTuple) + len(privateData)): tuples.append(sharedTuple) data.append(sharedData) someTuplesSharePoints |= usesSharedPoints diff --git a/Lib/fontTools/ttLib/tables/_c_v_a_r.py b/Lib/fontTools/ttLib/tables/_c_v_a_r.py index 518ac381b..d7e5553dd 100644 --- a/Lib/fontTools/ttLib/tables/_c_v_a_r.py +++ b/Lib/fontTools/ttLib/tables/_c_v_a_r.py @@ -30,12 +30,13 @@ class table__c_v_a_r(DefaultTable.DefaultTable): self.majorVersion, self.minorVersion = 1, 0 self.variations = [] - def compile(self, ttFont): + def compile(self, ttFont, useSharedPoints=False): tupleVariationCount, tuples, data = compileTupleVariationStore( variations=[v for v in self.variations if v.hasImpact()], pointCount=len(ttFont["cvt "].values), axisTags=[axis.axisTag for axis in ttFont["fvar"].axes], - sharedTupleIndices={}) + sharedTupleIndices={}, + useSharedPoints=useSharedPoints) header = { "majorVersion": self.majorVersion, "minorVersion": self.minorVersion, diff --git a/Tests/ttLib/tables/_c_v_a_r_test.py b/Tests/ttLib/tables/_c_v_a_r_test.py index d780807e1..0fd553138 100644 --- a/Tests/ttLib/tables/_c_v_a_r_test.py +++ b/Tests/ttLib/tables/_c_v_a_r_test.py @@ -18,31 +18,43 @@ CVAR_DATA = deHexStr( "0004 " # 16: tvHeader[1].variationDataSize=4 "8000 " # 18: tvHeader[1].tupleIndex=EMBEDDED_PEAK "C000 3333 " # 20: tvHeader[1].peakTuple=[-1.0, 0.8] - "00 " # 24: shared values = 00, all values + "03 02 02 01 01" # 24: shared_pointCount=03, run_count=2 cvt=[2, 3, 4] "02 03 01 04 " # 25: deltas=[3, 1, 4] "02 09 07 08") # 29: deltas=[9, 7, 8] +CVAR_PRIVATE_POINT_DATA = deHexStr( + "0001 0000 " # 0: majorVersion=1 minorVersion=0 + "0002 0018 " # 4: tupleVariationCount=2 offsetToData=24 + "0009 " # 8: tvHeader[0].variationDataSize=9 + "A000 " # 10: tvHeader[0].tupleIndex=EMBEDDED_PEAK|PRIVATE_POINT_NUMBERS + "4000 0000 " # 12: tvHeader[0].peakTuple=[1.0, 0.0] + "0009 " # 16: tvHeader[1].variationDataSize=9 + "A000 " # 18: tvHeader[1].tupleIndex=EMBEDDED_PEAK|PRIVATE_POINT_NUMBERS + "C000 3333 " # 20: tvHeader[1].peakTuple=[-1.0, 0.8] + "03 02 02 01 01 02 03 01 04 " # 24: pointCount=3 run_count=2 cvt=2 1 1 run_count=2 deltas=[3, 1, 4] + "03 02 02 01 01 02 09 07 08 ") # 33: pointCount=3 run_count=2 cvt=2 1 1 run_count=2 deltas=[9, 7, 8] + CVAR_XML = [ '', '', ' ', - ' ', - ' ', - ' ', + ' ', + ' ', + ' ', '', '', ' ', ' ', - ' ', - ' ', - ' ', + ' ', + ' ', + ' ', '', ] CVAR_VARIATIONS = [ - TupleVariation({"wght": (0.0, 1.0, 1.0)}, [3, 1, 4]), + TupleVariation({"wght": (0.0, 1.0, 1.0)}, [None, None, 3, 1, 4]), TupleVariation({"wght": (-1, -1.0, 0.0), "wdth": (0.0, 0.8, 0.8)}, - [9, 7, 8]), + [None, None, 9, 7, 8]), ] @@ -50,7 +62,7 @@ class CVARTableTest(unittest.TestCase): def makeFont(self): cvt, cvar, fvar = newTable("cvt "), newTable("cvar"), newTable("fvar") font = {"cvt ": cvt, "cvar": cvar, "fvar": fvar} - cvt.values = [0, 1000, -2000] + cvt.values = [0, 0, 0, 1000, -2000] Axis = getTableModule("fvar").Axis fvar.axes = [Axis(), Axis()] fvar.axes[0].axisTag, fvar.axes[1].axisTag = "wght", "wdth" @@ -59,9 +71,21 @@ class CVARTableTest(unittest.TestCase): def test_compile(self): font, cvar = self.makeFont() cvar.variations = CVAR_VARIATIONS - self.assertEqual(hexStr(cvar.compile(font)), hexStr(CVAR_DATA)) + self.assertEqual(hexStr(cvar.compile(font)), hexStr(CVAR_PRIVATE_POINT_DATA)) + + def test_compile_shared_points(self): + font, cvar = self.makeFont() + cvar.variations = CVAR_VARIATIONS + self.assertEqual(hexStr(cvar.compile(font, useSharedPoints=True)), hexStr(CVAR_DATA)) def test_decompile(self): + font, cvar = self.makeFont() + cvar.decompile(CVAR_PRIVATE_POINT_DATA, font) + self.assertEqual(cvar.majorVersion, 1) + self.assertEqual(cvar.minorVersion, 0) + self.assertEqual(cvar.variations, CVAR_VARIATIONS) + + def test_decompile_shared_points(self): font, cvar = self.makeFont() cvar.decompile(CVAR_DATA, font) self.assertEqual(cvar.majorVersion, 1)