From e88e47f8ffb783c2e9b17b8cbe8939f87dbfb8d7 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 20 Dec 2023 13:00:15 -0700 Subject: [PATCH] [VARC] Take a stab at instancing --- Lib/fontTools/varLib/instancer/__init__.py | 69 +++++----------------- Tests/varLib/instancer/instancer_test.py | 18 ++++-- 2 files changed, 27 insertions(+), 60 deletions(-) diff --git a/Lib/fontTools/varLib/instancer/__init__.py b/Lib/fontTools/varLib/instancer/__init__.py index c692433ed..92e9c4737 100644 --- a/Lib/fontTools/varLib/instancer/__init__.py +++ b/Lib/fontTools/varLib/instancer/__init__.py @@ -475,70 +475,31 @@ def instantiateVARC(varfont, axisLimits): varc = varfont["VARC"].table fvarAxes = varfont["fvar"].axes if "fvar" in varfont else [] - if varc.VarCompositeGlyphs is not None: - for glyph in varc.VarCompositeGlyphs.VarCompositeGlyph: - for comp in glyph.components: - if comp.axisIndicesIndex is None: - continue - axisIndices = varc.AxisIndicesList.Item[comp.axisIndicesIndex] - axisValues = comp.axisValues + location = axisLimits.pinnedLocation() + axisMap = [i for i, axis in enumerate(fvarAxes) if axis.axisTag not in location] + reverseAxisMap = {i: j for j, i in enumerate(axisMap)} - comp.axisValues = [] - for axisIndex, axisValue in zip(axisIndices, axisValues): - tag = fvarAxes[axisIndex].axisTag - if tag in axisLimits: - axisValue = axisLimits[tag].renormalizeValue( - axisValue, extrapolate=False - ) - comp.axisValues.append(axisValue) - - """ - newLocation = {} - for tag, loc in component.location.items(): - if tag not in axisLimits: - newLocation[tag] = loc - continue - if comp.flags & VarComponentFlags.AXIS_VALUES_HAVE_VARIATION: - raise NotImplementedError( - "Instancing accross VarComponent axes with variation is not supported." - ) - limits = axisLimits[tag] - loc = limits.renormalizeValue(loc, extrapolate=False) - newLocation[tag] = loc - component.location = newLocation - """ + if varc.AxisIndicesList: + axisIndicesList = varc.AxisIndicesList.Item + for i, axisIndices in enumerate(axisIndicesList): + if any(fvarAxes[j].axisTag in axisLimits for j in axisIndices): + raise NotImplementedError( + "Instancing across VarComponent axes is not supported." + ) + axisIndicesList[i] = [reverseAxisMap[j] for j in axisIndices] store = varc.MultiVarStore if store: - store.prune_regions() # Needed? - - fvar = varfont["fvar"] - location = axisLimits.pinnedLocation() for region in store.SparseVarRegionList.Region: newRegionAxis = [] for regionRecord in region.SparseVarRegionAxis: - tag = fvar.axes[regionRecord.AxisIndex].axisTag - if tag in location: - continue + tag = fvarAxes[regionRecord.AxisIndex].axisTag if tag in axisLimits: - limits = axisLimits[tag] - triple = ( - regionRecord.StartCoord, - regionRecord.PeakCoord, - regionRecord.EndCoord, + raise NotImplementedError( + "Instancing across VarComponent axes is not supported." ) - triple = tuple( - limits.renormalizeValue(v, extrapolate=False) for v in triple - ) - ( - regionRecord.StartCoord, - regionRecord.PeakCoord, - regionRecord.EndCoord, - ) = triple - newRegionAxis.append(regionRecord) - region.VarRegionAxis = newRegionAxis - region.VarRegionAxisCount = len(newRegionAxis) + regionRecord.AxisIndex = reverseAxisMap[regionRecord.AxisIndex] def instantiateTupleVariationStore( diff --git a/Tests/varLib/instancer/instancer_test.py b/Tests/varLib/instancer/instancer_test.py index 809d6bd35..b9a45058b 100644 --- a/Tests/varLib/instancer/instancer_test.py +++ b/Tests/varLib/instancer/instancer_test.py @@ -1699,22 +1699,28 @@ class InstantiateVariableFontTest(object): def test_varComposite(self): input_path = os.path.join( - TESTDATA, "..", "..", "..", "ttLib", "data", "varc-ac00-ac01.ttf" + TESTDATA, "..", "..", "..", "ttLib", "data", "varc-6868.ttf" ) varfont = ttLib.TTFont(input_path) location = {"wght": 600} - instance = instancer.instantiateVariableFont( - varfont, - location, - ) + # We currently do not allow this either; although in theory + # it should be possible. + with pytest.raises( + NotImplementedError, + match="is not supported.", + ): + instance = instancer.instantiateVariableFont( + varfont, + location, + ) location = {"0000": 0.5} with pytest.raises( NotImplementedError, - match="Instancing accross VarComponent axes with variation is not supported.", + match="is not supported.", ): instance = instancer.instantiateVariableFont( varfont,