varLib: build variable COLR table when master fonts contain COLRv1

This commit is contained in:
Cosimo Lupo 2022-06-21 11:23:14 +01:00
parent e58c43d187
commit 00959d3132

View File

@ -30,13 +30,15 @@ from fontTools.ttLib.tables.TupleVariation import TupleVariation
from fontTools.ttLib.tables import otTables as ot from fontTools.ttLib.tables import otTables as ot
from fontTools.ttLib.tables.otBase import OTTableWriter from fontTools.ttLib.tables.otBase import OTTableWriter
from fontTools.varLib import builder, models, varStore from fontTools.varLib import builder, models, varStore
from fontTools.varLib.merger import VariationMerger from fontTools.varLib.merger import VariationMerger, COLRVariationMerger
from fontTools.varLib.mvar import MVAR_ENTRIES from fontTools.varLib.mvar import MVAR_ENTRIES
from fontTools.varLib.iup import iup_delta_optimize from fontTools.varLib.iup import iup_delta_optimize
from fontTools.varLib.featureVars import addFeatureVariations from fontTools.varLib.featureVars import addFeatureVariations
from fontTools.designspaceLib import DesignSpaceDocument, InstanceDescriptor from fontTools.designspaceLib import DesignSpaceDocument, InstanceDescriptor
from fontTools.designspaceLib.split import splitInterpolable, splitVariableFonts from fontTools.designspaceLib.split import splitInterpolable, splitVariableFonts
from fontTools.varLib.stat import buildVFStatTable from fontTools.varLib.stat import buildVFStatTable
from fontTools.colorLib.builder import buildColrV1
from fontTools.colorLib.unbuilder import unbuildColrV1
from functools import partial from functools import partial
from collections import OrderedDict, namedtuple from collections import OrderedDict, namedtuple
import os.path import os.path
@ -711,6 +713,28 @@ def _add_CFF2(varFont, model, master_fonts):
merge_region_fonts(varFont, model, ordered_fonts_list, glyphOrder) merge_region_fonts(varFont, model, ordered_fonts_list, glyphOrder)
def _add_COLR(font, model, master_fonts, axisTags):
merger = COLRVariationMerger(model, axisTags, font)
merger.mergeTables(font, master_fonts)
store = merger.store_builder.finish()
colr = font["COLR"].table
if store.VarData:
mapping = store.optimize()
colr.VarStore = store
# the special 0xFFFF/0xFFFF (for no variations) always maps to itself
mapping[ot.NO_VARIATION_INDEX] = ot.NO_VARIATION_INDEX
varIdxes = [mapping[v] for v in merger.varIdxes]
# TODO: Optimize reusable runs of delta-set indices from multiple paints
colr.VarIndexMap = builder.buildDeltaSetIndexMap(varIdxes)
# rebuild LayerList to optimize PaintColrLayers layer reuse
# TODO: Perhaps make it optional?
if colr.LayerList:
colorGlyphs = unbuildColrV1(colr.LayerList, colr.BaseGlyphList)
colr.LayerList, colr.BaseGlyphList = buildColrV1(colorGlyphs, allowLayerReuse=True)
def load_designspace(designspace): def load_designspace(designspace):
# TODO: remove this and always assume 'designspace' is a DesignSpaceDocument, # TODO: remove this and always assume 'designspace' is a DesignSpaceDocument,
# never a file path, as that's already handled by caller # never a file path, as that's already handled by caller
@ -975,6 +999,8 @@ def build(designspace, master_finder=lambda s:s, exclude=[], optimize=True):
post.formatType = 2.0 post.formatType = 2.0
post.extraNames = [] post.extraNames = []
post.mapping = {} post.mapping = {}
if 'COLR' not in exclude and 'COLR' in vf and vf['COLR'].version > 0:
_add_COLR(vf, model, master_fonts, axisTags)
set_default_weight_width_slant( set_default_weight_width_slant(
vf, location={axis.axisTag: axis.defaultValue for axis in vf["fvar"].axes} vf, location={axis.axisTag: axis.defaultValue for axis in vf["fvar"].axes}