[varLib] Add optimizeVarData()

Though not really effective right now since we don't split into
multiple VarData sets.
This commit is contained in:
Behdad Esfahbod 2016-08-11 01:02:52 -07:00
parent 3064985880
commit 32bd6bcc31
3 changed files with 44 additions and 2 deletions

View File

@ -193,11 +193,14 @@ class VarData(BaseTable):
rawTable = self.__dict__.copy()
numShorts = 0
count = self.VarRegionCount
for item in self.Item:
for i in range(len(item) - 1, numShorts - 1, -1):
for i in range(count - 1, numShorts - 1, -1):
if not (-128 <= item[i] <= 127):
numShorts = i + 1
break
if numShorts == count:
break
rawTable['NumShorts'] = numShorts
return rawTable

View File

@ -488,6 +488,11 @@ def _add_HVAR(font, model, master_ttfs, axes):
items.append(hAdvanceDeltas.get(glyphName, zeroes))
while items and items[-1] is zeroes:
del items[-1]
# TODO Add indirect mapping to save on duplicates
#uniq = set(items)
#if (len(items) - len(uniq)) * len(varTupleIndexs)) > len(items) * 2:
varData = builder.buildVarData(varTupleIndexes, items)
varStore = builder.buildVarStore(varTupleList, [varData])

View File

@ -26,7 +26,38 @@ def buildVarRegionList(supports, axisTags):
self.VarRegionCount = len(self.VarRegion)
return self
def buildVarData(varRegionIndices, items):
def _reorderItem(lst, narrows):
out = []
count = len(lst)
for i in range(count):
if i not in narrows:
out.append(lst[i])
for i in range(count):
if i in narrows:
out.append(lst[i])
return out
def optimizeVarData(self):
# Reorder columns such that all SHORT columns come before UINT8
count = self.VarRegionCount
items = self.Item
narrows = set(range(count))
for item in items:
for i in narrows:
if not (-128 <= item[i] <= 127):
narrows.remove(i)
break
if not narrows:
break
self.VarRegionIndex = _reorderItem(self.VarRegionIndex, narrows)
for i in range(self.ItemCount):
items[i] = _reorderItem(items[i], narrows)
return self
def buildVarData(varRegionIndices, items, optimize=True):
self = ot.VarData()
self.VarRegionIndex = list(varRegionIndices)
regionCount = self.VarRegionCount = len(self.VarRegionIndex)
@ -35,8 +66,11 @@ def buildVarData(varRegionIndices, items):
assert len(item) == regionCount
records.append(list(item))
self.ItemCount = len(self.Item)
if optimize:
optimizeVarData(self)
return self
def buildVarStore(varTupleList, varDataList):
self = ot.VarStore()
self.Format = 1