aboutsummaryrefslogtreecommitdiff
path: root/Lib/fontTools/varLib/varStore.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/fontTools/varLib/varStore.py')
-rw-r--r--Lib/fontTools/varLib/varStore.py24
1 files changed, 20 insertions, 4 deletions
diff --git a/Lib/fontTools/varLib/varStore.py b/Lib/fontTools/varLib/varStore.py
index bcf81b39..2ffc6b13 100644
--- a/Lib/fontTools/varLib/varStore.py
+++ b/Lib/fontTools/varLib/varStore.py
@@ -7,6 +7,10 @@ from functools import partial
from collections import defaultdict
+NO_VARIATION_INDEX = ot.NO_VARIATION_INDEX
+ot.VarStore.NO_VARIATION_INDEX = NO_VARIATION_INDEX
+
+
def _getLocationKey(loc):
return tuple(sorted(loc.items(), key=lambda kv: kv[0]))
@@ -135,6 +139,11 @@ def VarRegion_get_support(self, fvar_axes):
ot.VarRegion.get_support = VarRegion_get_support
+def VarStore___bool__(self):
+ return bool(self.VarData)
+
+ot.VarStore.__bool__ = VarStore___bool__
+
class VarStoreInstancer(object):
def __init__(self, varstore, fvar_axes, location={}):
@@ -169,6 +178,7 @@ class VarStoreInstancer(object):
def __getitem__(self, varidx):
major, minor = varidx >> 16, varidx & 0xFFFF
+ if varidx == NO_VARIATION_INDEX: return 0.
varData = self._varData
scalars = [self._getScalar(ri) for ri in varData[major].VarRegionIndex]
deltas = varData[major].Item[minor]
@@ -192,6 +202,8 @@ def VarStore_subset_varidxes(self, varIdxes, optimize=True, retainFirstMap=False
# Sort out used varIdxes by major/minor.
used = {}
for varIdx in varIdxes:
+ if varIdx == NO_VARIATION_INDEX:
+ continue
major = varIdx >> 16
minor = varIdx & 0xFFFF
d = used.get(major)
@@ -206,7 +218,7 @@ def VarStore_subset_varidxes(self, varIdxes, optimize=True, retainFirstMap=False
varData = self.VarData
newVarData = []
- varDataMap = {}
+ varDataMap = {NO_VARIATION_INDEX: NO_VARIATION_INDEX}
for major,data in enumerate(varData):
usedMinors = used.get(major)
if usedMinors is None:
@@ -431,7 +443,7 @@ class _EncodingDict(dict):
return chars
-def VarStore_optimize(self):
+def VarStore_optimize(self, use_NO_VARIATION_INDEX=True):
"""Optimize storage. Returns mapping from old VarIdxes to new ones."""
# TODO
@@ -455,6 +467,10 @@ def VarStore_optimize(self):
row[regionIdx] += v
row = tuple(row)
+ if use_NO_VARIATION_INDEX and not any(row):
+ front_mapping[(major<<16)+minor] = None
+ continue
+
encodings.add_row(row)
front_mapping[(major<<16)+minor] = row
@@ -537,9 +553,9 @@ def VarStore_optimize(self):
back_mapping[item] = (major<<16)+minor
# Compile final mapping.
- varidx_map = {}
+ varidx_map = {NO_VARIATION_INDEX:NO_VARIATION_INDEX}
for k,v in front_mapping.items():
- varidx_map[k] = back_mapping[v]
+ varidx_map[k] = back_mapping[v] if v is not None else NO_VARIATION_INDEX
# Remove unused regions.
self.prune_regions()