Merge pull request #2803 from fonttools/colr-without-varidxmap

don't add no-op DeltaSetIndexMap when not needed
This commit is contained in:
Cosimo Lupo 2022-09-05 18:38:18 +01:00 committed by GitHub
commit ebeffeba13
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 42 additions and 2 deletions

View File

@ -722,8 +722,11 @@ def _add_COLR(font, model, master_fonts, axisTags, colr_layer_reuse=True):
if store:
mapping = store.optimize()
colr.VarStore = store
# don't add DeltaSetIndexMap for identity mapping
colr.VarIndexMap = None
varIdxes = [mapping[v] for v in merger.varIdxes]
colr.VarIndexMap = builder.buildDeltaSetIndexMap(varIdxes)
if any(i != varIdxes[i] for i in range(len(varIdxes))):
colr.VarIndexMap = builder.buildDeltaSetIndexMap(varIdxes)
def load_designspace(designspace):

View File

@ -1,7 +1,10 @@
from fontTools.colorLib.builder import buildCOLR
from fontTools.ttLib import TTFont, newTable
from fontTools.varLib import build, load_designspace
from fontTools.ttLib.tables import otTables as ot
from fontTools.varLib import build, load_designspace, _add_COLR
from fontTools.varLib.errors import VarLibValidationError
import fontTools.varLib.errors as varLibErrors
from fontTools.varLib.models import VariationModel
from fontTools.varLib.mutator import instantiateVariableFont
from fontTools.varLib import main as varLib_main, load_masters
from fontTools.varLib import set_default_weight_width_slant
@ -10,6 +13,7 @@ from fontTools.designspaceLib import (
)
from fontTools.feaLib.builder import addOpenTypeFeaturesFromString
import difflib
from copy import deepcopy
from io import BytesIO
import os
import shutil
@ -985,5 +989,38 @@ class SetDefaultWeightWidthSlantTest(object):
assert ttFont["post"].italicAngle == -12.0
def test_variable_COLR_without_VarIndexMap():
# test we don't add a no-op VarIndexMap to variable COLR when not needed
# https://github.com/fonttools/fonttools/issues/2800
font1 = TTFont()
font1.setGlyphOrder([".notdef", "A"])
font1["COLR"] = buildCOLR({"A": (ot.PaintFormat.PaintSolid, 0, 1.0)})
# font2 == font1 except for PaintSolid.Alpha
font2 = deepcopy(font1)
font2["COLR"].table.BaseGlyphList.BaseGlyphPaintRecord[0].Paint.Alpha = 0.0
master_fonts = [font1, font2]
varfont = deepcopy(font1)
axis_order = ["XXXX"]
model = VariationModel([{}, {"XXXX": 1.0}], axis_order)
_add_COLR(varfont, model, master_fonts, axis_order)
colr = varfont["COLR"].table
assert len(colr.BaseGlyphList.BaseGlyphPaintRecord) == 1
baserec = colr.BaseGlyphList.BaseGlyphPaintRecord[0]
assert baserec.Paint.Format == ot.PaintFormat.PaintVarSolid
assert baserec.Paint.VarIndexBase == 0
assert colr.VarStore is not None
assert len(colr.VarStore.VarData) == 1
assert len(colr.VarStore.VarData[0].Item) == 1
assert colr.VarStore.VarData[0].Item[0] == [-16384]
assert colr.VarIndexMap is None
if __name__ == "__main__":
sys.exit(unittest.main())