diff options
author | robot-piglet <[email protected]> | 2025-07-18 09:09:17 +0300 |
---|---|---|
committer | robot-piglet <[email protected]> | 2025-07-18 09:21:36 +0300 |
commit | b27290b9f146a42ce239e15c67cf203f4a151aa7 (patch) | |
tree | f1aea70e5c4f342eb93a862e4ed3b5714b353cce /contrib/python/fonttools/fontTools/varLib/instancer/__init__.py | |
parent | 9976b916cb8114c23b8b981651f6c4b6256a502a (diff) |
Intermediate changes
commit_hash:134fe147a2593cd4e39895d6b77ac876aa724f8b
Diffstat (limited to 'contrib/python/fonttools/fontTools/varLib/instancer/__init__.py')
-rw-r--r-- | contrib/python/fonttools/fontTools/varLib/instancer/__init__.py | 58 |
1 files changed, 33 insertions, 25 deletions
diff --git a/contrib/python/fonttools/fontTools/varLib/instancer/__init__.py b/contrib/python/fonttools/fontTools/varLib/instancer/__init__.py index a0b832a3c18..76901880553 100644 --- a/contrib/python/fonttools/fontTools/varLib/instancer/__init__.py +++ b/contrib/python/fonttools/fontTools/varLib/instancer/__init__.py @@ -723,9 +723,7 @@ def instantiateCFF2( minor = varDataCursor[major] varDataCursor[major] += 1 - varIdx = (major << 16) + minor - - defaultValue += round(defaultDeltas[varIdx]) + defaultValue += round(defaultDeltas[major][minor]) newDefaults.append(defaultValue) varData = varStore.VarData[major] @@ -781,7 +779,9 @@ def instantiateCFF2( storeBlendsToVarStore(value + [count]) # Instantiate VarStore - defaultDeltas = instantiateItemVariationStore(varStore, fvarAxes, axisLimits) + defaultDeltas = instantiateItemVariationStore( + varStore, fvarAxes, axisLimits, hierarchical=True + ) # Read back new charstring blends from the instantiated VarStore varDataCursor = [0] * len(varStore.VarData) @@ -839,18 +839,13 @@ def instantiateCFF2( varData.Item = [] varData.ItemCount = 0 - # Remove vsindex commands that are no longer needed, collect those that are. - usedVsindex = set() - for commands in allCommands: - if any(isinstance(arg, list) for command in commands for arg in command[1]): - vsindex = 0 - for command in commands: - if command[0] == "vsindex": - vsindex = command[1][0] - continue - if any(isinstance(arg, list) for arg in command[1]): - usedVsindex.add(vsindex) - else: + # Collect surviving vsindexes + usedVsindex = set( + i for i in range(len(varStore.VarData)) if varStore.VarData[i].VarRegionCount + ) + # Remove vsindex commands that are no longer needed + for commands, private in zip(allCommands, allCommandPrivates): + if not any(isinstance(arg, list) for command in commands for arg in command[1]): commands[:] = [command for command in commands if command[0] != "vsindex"] # Remove unused VarData and update vsindex values @@ -863,10 +858,14 @@ def instantiateCFF2( for command in commands: if command[0] == "vsindex": command[1][0] = vsindexMapping[command[1][0]] + for private in privateDicts: + if hasattr(private, "vsindex"): + private.vsindex = vsindexMapping[private.vsindex] # Remove initial vsindex commands that are implied - for commands in allCommands: - if commands and commands[0] == ("vsindex", [0]): + for commands, private in zip(allCommands, allCommandPrivates): + vsindex = getattr(private, "vsindex", 0) + if commands and commands[0] == ("vsindex", [vsindex]): commands.pop(0) # Ship the charstrings! @@ -1247,7 +1246,9 @@ class _TupleVarStoreAdapter(object): return itemVarStore -def instantiateItemVariationStore(itemVarStore, fvarAxes, axisLimits): +def instantiateItemVariationStore( + itemVarStore, fvarAxes, axisLimits, hierarchical=False +): """Compute deltas at partial location, and update varStore in-place. Remove regions in which all axes were instanced, or fall outside the new axis @@ -1279,12 +1280,19 @@ def instantiateItemVariationStore(itemVarStore, fvarAxes, axisLimits): assert itemVarStore.VarDataCount == newItemVarStore.VarDataCount itemVarStore.VarData = newItemVarStore.VarData - defaultDeltas = { - ((major << 16) + minor): delta - for major, deltas in enumerate(defaultDeltaArray) - for minor, delta in enumerate(deltas) - } - defaultDeltas[itemVarStore.NO_VARIATION_INDEX] = 0 + if not hierarchical: + defaultDeltas = { + ((major << 16) + minor): delta + for major, deltas in enumerate(defaultDeltaArray) + for minor, delta in enumerate(deltas) + } + defaultDeltas[itemVarStore.NO_VARIATION_INDEX] = 0 + else: + defaultDeltas = {0xFFFF: {0xFFFF: 0}} # NO_VARIATION_INDEX + for major, deltas in enumerate(defaultDeltaArray): + defaultDeltasForMajor = defaultDeltas.setdefault(major, {}) + for minor, delta in enumerate(deltas): + defaultDeltasForMajor[minor] = delta return defaultDeltas |