Merge pull request #2662 from fonttools/varstore-empty
[varLib.varStore] Support NO_VARIATION_INDEX
This commit is contained in:
commit
97958a95e1
@ -764,7 +764,7 @@ class Builder(object):
|
|||||||
gdef.Version = 0x00010002 if gdef.MarkGlyphSetsDef else 0x00010000
|
gdef.Version = 0x00010002 if gdef.MarkGlyphSetsDef else 0x00010000
|
||||||
if self.varstorebuilder:
|
if self.varstorebuilder:
|
||||||
store = self.varstorebuilder.finish()
|
store = self.varstorebuilder.finish()
|
||||||
if store.VarData:
|
if store:
|
||||||
gdef.Version = 0x00010003
|
gdef.Version = 0x00010003
|
||||||
gdef.VarStore = store
|
gdef.VarStore = store
|
||||||
varidx_map = store.optimize()
|
varidx_map = store.optimize()
|
||||||
|
@ -486,7 +486,7 @@ def _get_advance_metrics(font, masterModel, master_ttfs,
|
|||||||
vOrigMap[glyphName] = storeBuilder.storeDeltas(deltas, round=noRound)
|
vOrigMap[glyphName] = storeBuilder.storeDeltas(deltas, round=noRound)
|
||||||
|
|
||||||
indirectStore = storeBuilder.finish()
|
indirectStore = storeBuilder.finish()
|
||||||
mapping2 = indirectStore.optimize()
|
mapping2 = indirectStore.optimize(use_NO_VARIATION_INDEX=False)
|
||||||
advMapping = [mapping2[advMapping[g]] for g in glyphOrder]
|
advMapping = [mapping2[advMapping[g]] for g in glyphOrder]
|
||||||
advanceMapping = builder.buildVarIdxMap(advMapping, glyphOrder)
|
advanceMapping = builder.buildVarIdxMap(advMapping, glyphOrder)
|
||||||
|
|
||||||
@ -606,7 +606,7 @@ def _add_BASE(font, masterModel, master_ttfs, axisTags):
|
|||||||
merger.mergeTables(font, master_ttfs, ['BASE'])
|
merger.mergeTables(font, master_ttfs, ['BASE'])
|
||||||
store = merger.store_builder.finish()
|
store = merger.store_builder.finish()
|
||||||
|
|
||||||
if not store.VarData:
|
if not store:
|
||||||
return
|
return
|
||||||
base = font['BASE'].table
|
base = font['BASE'].table
|
||||||
assert base.Version == 0x00010000
|
assert base.Version == 0x00010000
|
||||||
@ -621,7 +621,7 @@ def _merge_OTL(font, model, master_fonts, axisTags):
|
|||||||
|
|
||||||
merger.mergeTables(font, master_fonts, ['GSUB', 'GDEF', 'GPOS'])
|
merger.mergeTables(font, master_fonts, ['GSUB', 'GDEF', 'GPOS'])
|
||||||
store = merger.store_builder.finish()
|
store = merger.store_builder.finish()
|
||||||
if not store.VarData:
|
if not store:
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
GDEF = font['GDEF'].table
|
GDEF = font['GDEF'].table
|
||||||
|
@ -633,6 +633,7 @@ def instantiateItemVariationStore(itemVarStore, fvarAxes, axisLimits):
|
|||||||
for major, deltas in enumerate(defaultDeltaArray)
|
for major, deltas in enumerate(defaultDeltaArray)
|
||||||
for minor, delta in enumerate(deltas)
|
for minor, delta in enumerate(deltas)
|
||||||
}
|
}
|
||||||
|
defaultDeltas[itemVarStore.NO_VARIATION_INDEX] = 0
|
||||||
return defaultDeltas
|
return defaultDeltas
|
||||||
|
|
||||||
|
|
||||||
|
@ -7,6 +7,10 @@ from functools import partial
|
|||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
|
||||||
|
|
||||||
|
NO_VARIATION_INDEX = 0xFFFFFFFF
|
||||||
|
ot.VarStore.NO_VARIATION_INDEX = NO_VARIATION_INDEX
|
||||||
|
|
||||||
|
|
||||||
def _getLocationKey(loc):
|
def _getLocationKey(loc):
|
||||||
return tuple(sorted(loc.items(), key=lambda kv: kv[0]))
|
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
|
ot.VarRegion.get_support = VarRegion_get_support
|
||||||
|
|
||||||
|
def VarStore___bool__(self):
|
||||||
|
return bool(self.VarData)
|
||||||
|
|
||||||
|
ot.VarStore.__bool__ = VarStore___bool__
|
||||||
|
|
||||||
class VarStoreInstancer(object):
|
class VarStoreInstancer(object):
|
||||||
|
|
||||||
def __init__(self, varstore, fvar_axes, location={}):
|
def __init__(self, varstore, fvar_axes, location={}):
|
||||||
@ -169,6 +178,7 @@ class VarStoreInstancer(object):
|
|||||||
|
|
||||||
def __getitem__(self, varidx):
|
def __getitem__(self, varidx):
|
||||||
major, minor = varidx >> 16, varidx & 0xFFFF
|
major, minor = varidx >> 16, varidx & 0xFFFF
|
||||||
|
if varidx == NO_VARIATION_INDEX: return 0.
|
||||||
varData = self._varData
|
varData = self._varData
|
||||||
scalars = [self._getScalar(ri) for ri in varData[major].VarRegionIndex]
|
scalars = [self._getScalar(ri) for ri in varData[major].VarRegionIndex]
|
||||||
deltas = varData[major].Item[minor]
|
deltas = varData[major].Item[minor]
|
||||||
@ -431,7 +441,7 @@ class _EncodingDict(dict):
|
|||||||
return chars
|
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."""
|
"""Optimize storage. Returns mapping from old VarIdxes to new ones."""
|
||||||
|
|
||||||
# TODO
|
# TODO
|
||||||
@ -455,6 +465,10 @@ def VarStore_optimize(self):
|
|||||||
row[regionIdx] += v
|
row[regionIdx] += v
|
||||||
row = tuple(row)
|
row = tuple(row)
|
||||||
|
|
||||||
|
if use_NO_VARIATION_INDEX and not any(row):
|
||||||
|
front_mapping[(major<<16)+minor] = None
|
||||||
|
continue
|
||||||
|
|
||||||
encodings.add_row(row)
|
encodings.add_row(row)
|
||||||
front_mapping[(major<<16)+minor] = row
|
front_mapping[(major<<16)+minor] = row
|
||||||
|
|
||||||
@ -537,9 +551,9 @@ def VarStore_optimize(self):
|
|||||||
back_mapping[item] = (major<<16)+minor
|
back_mapping[item] = (major<<16)+minor
|
||||||
|
|
||||||
# Compile final mapping.
|
# Compile final mapping.
|
||||||
varidx_map = {}
|
varidx_map = {NO_VARIATION_INDEX:NO_VARIATION_INDEX}
|
||||||
for k,v in front_mapping.items():
|
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.
|
# Remove unused regions.
|
||||||
self.prune_regions()
|
self.prune_regions()
|
||||||
|
@ -360,7 +360,7 @@ class InstantiateHVARTest(object):
|
|||||||
assert support == pytest.approx(expectedRegion[axisTag])
|
assert support == pytest.approx(expectedRegion[axisTag])
|
||||||
|
|
||||||
assert len(varStore.VarData) == 1
|
assert len(varStore.VarData) == 1
|
||||||
assert varStore.VarData[0].ItemCount == 2
|
assert varStore.VarData[0].ItemCount == 1
|
||||||
|
|
||||||
assert hvar.AdvWidthMap is not None
|
assert hvar.AdvWidthMap is not None
|
||||||
advWithMap = hvar.AdvWidthMap.mapping
|
advWithMap = hvar.AdvWidthMap.mapping
|
||||||
@ -368,9 +368,7 @@ class InstantiateHVARTest(object):
|
|||||||
assert advWithMap[".notdef"] == advWithMap["space"]
|
assert advWithMap[".notdef"] == advWithMap["space"]
|
||||||
varIdx = advWithMap[".notdef"]
|
varIdx = advWithMap[".notdef"]
|
||||||
# these glyphs have no metrics variations in the test font
|
# these glyphs have no metrics variations in the test font
|
||||||
assert varStore.VarData[varIdx >> 16].Item[varIdx & 0xFFFF] == (
|
assert varIdx == varStore.NO_VARIATION_INDEX
|
||||||
[0] * varStore.VarData[0].VarRegionCount
|
|
||||||
)
|
|
||||||
|
|
||||||
varIdx = advWithMap["hyphen"]
|
varIdx = advWithMap["hyphen"]
|
||||||
assert varStore.VarData[varIdx >> 16].Item[varIdx & 0xFFFF] == expectedDeltas
|
assert varStore.VarData[varIdx >> 16].Item[varIdx & 0xFFFF] == expectedDeltas
|
||||||
@ -458,6 +456,8 @@ class InstantiateItemVariationStoreTest(object):
|
|||||||
|
|
||||||
defaultDeltaArray = []
|
defaultDeltaArray = []
|
||||||
for varidx, delta in sorted(defaultDeltas.items()):
|
for varidx, delta in sorted(defaultDeltas.items()):
|
||||||
|
if varidx == varStore.NO_VARIATION_INDEX:
|
||||||
|
continue
|
||||||
major, minor = varidx >> 16, varidx & 0xFFFF
|
major, minor = varidx >> 16, varidx & 0xFFFF
|
||||||
if major == len(defaultDeltaArray):
|
if major == len(defaultDeltaArray):
|
||||||
defaultDeltaArray.append([])
|
defaultDeltaArray.append([])
|
||||||
|
@ -13,7 +13,7 @@ from fontTools.ttLib.tables.otTables import VarStore
|
|||||||
(
|
(
|
||||||
[{}, {"a": 1}],
|
[{}, {"a": 1}],
|
||||||
[
|
[
|
||||||
[10, 20],
|
[10, 10], # Test NO_VARIATION_INDEX
|
||||||
[100, 2000],
|
[100, 2000],
|
||||||
[100, 22000],
|
[100, 22000],
|
||||||
],
|
],
|
||||||
|
Loading…
x
Reference in New Issue
Block a user