summaryrefslogtreecommitdiffstats
path: root/contrib/python/fonttools/fontTools/varLib/instancer/__init__.py
diff options
context:
space:
mode:
authorrobot-piglet <[email protected]>2025-07-18 09:09:17 +0300
committerrobot-piglet <[email protected]>2025-07-18 09:21:36 +0300
commitb27290b9f146a42ce239e15c67cf203f4a151aa7 (patch)
treef1aea70e5c4f342eb93a862e4ed3b5714b353cce /contrib/python/fonttools/fontTools/varLib/instancer/__init__.py
parent9976b916cb8114c23b8b981651f6c4b6256a502a (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__.py58
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