[varLib] When optimizing NumShorts, drop zero columns
Related to https://github.com/fonttools/fonttools/issues/1184
This commit is contained in:
parent
38a0ffb815
commit
d5efd2b7ee
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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">
|
||||
|
@ -20,8 +20,7 @@
|
||||
<VarData index="0">
|
||||
<!-- ItemCount=0 -->
|
||||
<NumShorts value="0"/>
|
||||
<!-- VarRegionCount=1 -->
|
||||
<VarRegionIndex index="0" value="0"/>
|
||||
<!-- VarRegionCount=0 -->
|
||||
</VarData>
|
||||
</VarStore>
|
||||
</GDEF>
|
||||
|
@ -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">
|
||||
|
Loading…
x
Reference in New Issue
Block a user