[varLib] When optimizing NumShorts, drop zero columns

Related to https://github.com/fonttools/fonttools/issues/1184
This commit is contained in:
Behdad Esfahbod 2018-02-20 20:49:00 -08:00
parent 38a0ffb815
commit d5efd2b7ee
5 changed files with 36 additions and 52 deletions

View File

@ -28,14 +28,14 @@ def buildVarRegionList(supports, axisTags):
return self
def _reorderItem(lst, narrows):
def _reorderItem(lst, narrows, zeroes):
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:
if i in narrows and i not in zeroes:
out.append(lst[i])
return out
@ -43,16 +43,20 @@ def VarData_CalculateNumShorts(self, optimize=True):
count = self.VarRegionCount
items = self.Item
narrows = set(range(count))
zeroes = set(range(count))
for item in items:
wides = [i for i in narrows if not (-128 <= item[i] <= 127)]
narrows.difference_update(wides)
if not narrows:
nonzeroes = [i for i in zeroes if item[i]]
zeroes.difference_update(nonzeroes)
if not narrows and not zeroes:
break
if optimize:
# Reorder columns such that all SHORT columns come before UINT8
self.VarRegionIndex = _reorderItem(self.VarRegionIndex, narrows)
self.VarRegionIndex = _reorderItem(self.VarRegionIndex, narrows, zeroes)
self.VarRegionCount = len(self.VarRegionIndex)
for i in range(self.ItemCount):
items[i] = _reorderItem(items[i], narrows)
items[i] = _reorderItem(items[i], narrows, zeroes)
self.NumShorts = count - len(narrows)
else:
wides = set(range(count)) - narrows

View File

@ -40,12 +40,15 @@ def test_buildVarData_no_optimize(region_indices, items, expected_num_shorts):
[0, 2, 1], [[128, -129, 1], [3, 5, 4], [6, 8, 7]]),
([0, 1, 2], [[0, 1, 128], [3, -129, 5], [256, 7, 8]], 3,
[0, 1, 2], [[0, 1, 128], [3, -129, 5], [256, 7, 8]]),
([0, 1, 2], [[0, 128, 2], [0, 4, 5], [0, 7, 8]], 1,
[1, 2], [[128, 2], [4, 5], [7, 8]]),
], ids=[
"0/3_shorts_no_reorder",
"1/3_shorts_reorder",
"2/3_shorts_reorder",
"2/3_shorts_same_row_reorder",
"3/3_shorts_no_reorder",
"1/3_shorts_1/3_zeroes",
])
def test_buildVarData_optimize(
region_indices, items, expected_num_shorts, expected_regions,
@ -54,7 +57,7 @@ def test_buildVarData_optimize(
assert data.ItemCount == len(items)
assert data.NumShorts == expected_num_shorts
assert data.VarRegionCount == len(region_indices)
assert data.VarRegionCount == len(expected_regions)
assert data.VarRegionIndex == expected_regions
assert data.Item == expected_items

View File

@ -73,12 +73,7 @@
<VarData index="0">
<!-- ItemCount=0 -->
<NumShorts value="0"/>
<!-- VarRegionCount=5 -->
<VarRegionIndex index="0" value="0"/>
<VarRegionIndex index="1" value="1"/>
<VarRegionIndex index="2" value="2"/>
<VarRegionIndex index="3" value="3"/>
<VarRegionIndex index="4" value="4"/>
<!-- VarRegionCount=0 -->
</VarData>
</VarStore>
</GDEF>
@ -155,18 +150,15 @@
<VarData index="0">
<!-- ItemCount=6 -->
<NumShorts value="0"/>
<!-- VarRegionCount=5 -->
<!-- VarRegionCount=2 -->
<VarRegionIndex index="0" value="0"/>
<VarRegionIndex index="1" value="1"/>
<VarRegionIndex index="2" value="2"/>
<VarRegionIndex index="3" value="3"/>
<VarRegionIndex index="4" value="4"/>
<Item index="0" value="[0, 0, 0, 0, 0]"/>
<Item index="1" value="[14, -28, 0, 0, 0]"/>
<Item index="2" value="[-10, 17, 0, 0, 0]"/>
<Item index="3" value="[-3, 32, 0, 0, 0]"/>
<Item index="4" value="[-7, 63, 0, 0, 0]"/>
<Item index="5" value="[-7, 63, 0, 0, 0]"/>
<Item index="0" value="[0, 0]"/>
<Item index="1" value="[14, -28]"/>
<Item index="2" value="[-10, 17]"/>
<Item index="3" value="[-3, 32]"/>
<Item index="4" value="[-7, 63]"/>
<Item index="5" value="[-7, 63]"/>
</VarData>
</VarStore>
</HVAR>
@ -246,14 +238,11 @@
<VarData index="0">
<!-- ItemCount=2 -->
<NumShorts value="0"/>
<!-- VarRegionCount=5 -->
<!-- VarRegionCount=2 -->
<VarRegionIndex index="0" value="0"/>
<VarRegionIndex index="1" value="1"/>
<VarRegionIndex index="2" value="2"/>
<VarRegionIndex index="3" value="3"/>
<VarRegionIndex index="4" value="4"/>
<Item index="0" value="[-4, 13, 0, 0, 0]"/>
<Item index="1" value="[-2, 8, 0, 0, 0]"/>
<Item index="0" value="[-4, 13]"/>
<Item index="1" value="[-2, 8]"/>
</VarData>
</VarStore>
<ValueRecord index="0">

View File

@ -20,8 +20,7 @@
<VarData index="0">
<!-- ItemCount=0 -->
<NumShorts value="0"/>
<!-- VarRegionCount=1 -->
<VarRegionIndex index="0" value="0"/>
<!-- VarRegionCount=0 -->
</VarData>
</VarStore>
</GDEF>

View File

@ -688,12 +688,7 @@
<VarData index="0">
<!-- ItemCount=0 -->
<NumShorts value="0"/>
<!-- VarRegionCount=5 -->
<VarRegionIndex index="0" value="0"/>
<VarRegionIndex index="1" value="1"/>
<VarRegionIndex index="2" value="2"/>
<VarRegionIndex index="3" value="3"/>
<VarRegionIndex index="4" value="4"/>
<!-- VarRegionCount=0 -->
</VarData>
</VarStore>
</GDEF>
@ -770,18 +765,15 @@
<VarData index="0">
<!-- ItemCount=6 -->
<NumShorts value="0"/>
<!-- VarRegionCount=5 -->
<!-- VarRegionCount=2 -->
<VarRegionIndex index="0" value="0"/>
<VarRegionIndex index="1" value="1"/>
<VarRegionIndex index="2" value="2"/>
<VarRegionIndex index="3" value="3"/>
<VarRegionIndex index="4" value="4"/>
<Item index="0" value="[0, 0, 0, 0, 0]"/>
<Item index="1" value="[14, -28, 0, 0, 0]"/>
<Item index="2" value="[-10, 17, 0, 0, 0]"/>
<Item index="3" value="[-3, 32, 0, 0, 0]"/>
<Item index="4" value="[-7, 63, 0, 0, 0]"/>
<Item index="5" value="[-7, 63, 0, 0, 0]"/>
<Item index="0" value="[0, 0]"/>
<Item index="1" value="[14, -28]"/>
<Item index="2" value="[-10, 17]"/>
<Item index="3" value="[-3, 32]"/>
<Item index="4" value="[-7, 63]"/>
<Item index="5" value="[-7, 63]"/>
</VarData>
</VarStore>
</HVAR>
@ -861,14 +853,11 @@
<VarData index="0">
<!-- ItemCount=2 -->
<NumShorts value="0"/>
<!-- VarRegionCount=5 -->
<!-- VarRegionCount=2 -->
<VarRegionIndex index="0" value="0"/>
<VarRegionIndex index="1" value="1"/>
<VarRegionIndex index="2" value="2"/>
<VarRegionIndex index="3" value="3"/>
<VarRegionIndex index="4" value="4"/>
<Item index="0" value="[-4, 13, 0, 0, 0]"/>
<Item index="1" value="[-2, 8, 0, 0, 0]"/>
<Item index="0" value="[-4, 13]"/>
<Item index="1" value="[-2, 8]"/>
</VarData>
</VarStore>
<ValueRecord index="0">