[VARC] Use var-int encoding for AxisIndicesIndex

Slightly larger fonts, but more consistency, and freed
a flag bit.
This commit is contained in:
Behdad Esfahbod 2023-12-21 00:41:27 -07:00
parent 6a09096800
commit 297e0bd257
4 changed files with 28 additions and 44 deletions

View File

@ -49,10 +49,12 @@ log = logging.getLogger(__name__)
class VarComponentFlags(IntFlag): class VarComponentFlags(IntFlag):
AXIS_INDICES_INDEX_SIZE = 0x0003 # Keep it first; we rely on that. USE_MY_METRICS = 0x0001
RESET_UNSPECIFIED_AXES = 0x0002
USE_MY_METRICS = 0x0004 GID_IS_24BIT = 0x0004
RESET_UNSPECIFIED_AXES = 0x0008
HAVE_AXES = 0x0008
AXIS_VALUES_HAVE_VARIATION = 0x0010 AXIS_VALUES_HAVE_VARIATION = 0x0010
TRANSFORM_HAS_VARIATION = 0x0020 TRANSFORM_HAS_VARIATION = 0x0020
@ -67,7 +69,7 @@ class VarComponentFlags(IntFlag):
HAVE_TCENTER_X = 0x2000 HAVE_TCENTER_X = 0x2000
HAVE_TCENTER_Y = 0x4000 HAVE_TCENTER_Y = 0x4000
GID_IS_24BIT = 0x8000 RESERVED = 0x8000
VarTransformMappingValues = namedtuple( VarTransformMappingValues = namedtuple(
@ -106,7 +108,7 @@ _unpacker = {
} }
def _read_var_length_number(data, i): def _readVarInt32(data, i):
"""Read a variable-length number from data starting at index i. """Read a variable-length number from data starting at index i.
Return the number and the next index. Return the number and the next index.
@ -129,7 +131,7 @@ def _read_var_length_number(data, i):
] << 8 | data[i + 4], i + 5 ] << 8 | data[i + 4], i + 5
def _write_var_length_number(v): def _writeVarInt32(v):
"""Write a variable-length number. """Write a variable-length number.
Return the data. Return the data.
@ -166,14 +168,10 @@ class VarComponent:
i += gidSize i += gidSize
self.glyphName = font.glyphOrder[glyphID] self.glyphName = font.glyphOrder[glyphID]
axisIndicesIndexSize = flags & VarComponentFlags.AXIS_INDICES_INDEX_SIZE if flags & VarComponentFlags.HAVE_AXES:
axisIndicesIndexSize = {0: 0, 1: 1, 2: 2, 3: 4}[axisIndicesIndexSize] self.axisIndicesIndex, i = _readVarInt32(data, i)
self.axisIndicesIndex = ( else:
None self.axisIndicesIndex = None
if axisIndicesIndexSize == 0
else _unpacker[axisIndicesIndexSize](data[i : i + axisIndicesIndexSize])
)
i += axisIndicesIndexSize
if self.axisIndicesIndex is None: if self.axisIndicesIndex is None:
numAxes = 0 numAxes = 0
@ -186,11 +184,11 @@ class VarComponent:
self.axisValues = tuple(axisValues) self.axisValues = tuple(axisValues)
if flags & VarComponentFlags.AXIS_VALUES_HAVE_VARIATION: if flags & VarComponentFlags.AXIS_VALUES_HAVE_VARIATION:
self.axisValuesVarIndex, i = _read_var_length_number(data, i) self.axisValuesVarIndex, i = _readVarInt32(data, i)
else: else:
self.axisValuesVarIndex = NO_VARIATION_INDEX self.axisValuesVarIndex = NO_VARIATION_INDEX
if flags & VarComponentFlags.TRANSFORM_HAS_VARIATION: if flags & VarComponentFlags.TRANSFORM_HAS_VARIATION:
self.transformVarIndex, i = _read_var_length_number(data, i) self.transformVarIndex, i = _readVarInt32(data, i)
else: else:
self.transformVarIndex = NO_VARIATION_INDEX self.transformVarIndex = NO_VARIATION_INDEX
@ -234,35 +232,21 @@ class VarComponent:
numAxes = len(self.axisValues) numAxes = len(self.axisValues)
axisIndicesIndexSize = ( if numAxes:
0 flags |= VarComponentFlags.HAVE_AXES
if self.axisIndicesIndex == None data.append(_writeVarInt32(self.axisIndicesIndex))
else 1 data.append(TupleVariation.compileDeltaValues_(self.axisValues))
if self.axisIndicesIndex < 256 else:
else 2 flags &= ~VarComponentFlags.HAVE_AXES
if self.axisIndicesIndex < 65536
else 3
)
assert (
axisIndicesIndexSize & VarComponentFlags.AXIS_INDICES_INDEX_SIZE
== axisIndicesIndexSize
)
flags &= ~VarComponentFlags.AXIS_INDICES_INDEX_SIZE
flags |= axisIndicesIndexSize
axisIndicesIndexSize = {0: 0, 1: 1, 2: 2, 3: 4}[axisIndicesIndexSize]
if axisIndicesIndexSize:
data.append(_packer[axisIndicesIndexSize](self.axisIndicesIndex))
data.append(TupleVariation.compileDeltaValues_(self.axisValues))
if self.axisValuesVarIndex != NO_VARIATION_INDEX: if self.axisValuesVarIndex != NO_VARIATION_INDEX:
flags |= VarComponentFlags.AXIS_VALUES_HAVE_VARIATION flags |= VarComponentFlags.AXIS_VALUES_HAVE_VARIATION
data.append(_write_var_length_number(self.axisValuesVarIndex)) data.append(_writeVarInt32(self.axisValuesVarIndex))
else: else:
flags &= ~VarComponentFlags.AXIS_VALUES_HAVE_VARIATION flags &= ~VarComponentFlags.AXIS_VALUES_HAVE_VARIATION
if self.transformVarIndex != NO_VARIATION_INDEX: if self.transformVarIndex != NO_VARIATION_INDEX:
flags |= VarComponentFlags.TRANSFORM_HAS_VARIATION flags |= VarComponentFlags.TRANSFORM_HAS_VARIATION
data.append(_write_var_length_number(self.transformVarIndex)) data.append(_writeVarInt32(self.transformVarIndex))
else: else:
flags &= ~VarComponentFlags.TRANSFORM_HAS_VARIATION flags &= ~VarComponentFlags.TRANSFORM_HAS_VARIATION

Binary file not shown.

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="4.46"> <ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="4.47">
<GlyphOrder> <GlyphOrder>
<!-- The 'id' attribute is only for humans; it is ignored when parsed. --> <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
@ -313,19 +313,19 @@
<VarComponent index="2" glyphName="glyph00006" flags="0"/> <VarComponent index="2" glyphName="glyph00006" flags="0"/>
</VarCompositeGlyph> </VarCompositeGlyph>
<VarCompositeGlyph index="2"> <VarCompositeGlyph index="2">
<VarComponent index="0" glyphName="glyph00008" flags="65" axisIndicesIndex="2" axisValues="(3537,)" translateX="-6.0"/> <VarComponent index="0" glyphName="glyph00008" flags="72" axisIndicesIndex="2" axisValues="(3537,)" translateX="-6.0"/>
</VarCompositeGlyph> </VarCompositeGlyph>
<VarCompositeGlyph index="3"> <VarCompositeGlyph index="3">
<VarComponent index="0" glyphName="glyph00008" flags="81" axisIndicesIndex="0" axisValues="(-13184, 0, 7928)" axisValuesVarIndex="0" translateX="-3.0"/> <VarComponent index="0" glyphName="glyph00008" flags="88" axisIndicesIndex="0" axisValues="(-13184, 0, 7928)" axisValuesVarIndex="0" translateX="-3.0"/>
</VarCompositeGlyph> </VarCompositeGlyph>
<VarCompositeGlyph index="4"> <VarCompositeGlyph index="4">
<VarComponent index="0" glyphName="glyph00009" flags="241" axisIndicesIndex="1" axisValues="(-8847, 655, -8484, 0, 0)" axisValuesVarIndex="1" transformVarIndex="2" translateX="-5.0" translateY="24.0"/> <VarComponent index="0" glyphName="glyph00009" flags="248" axisIndicesIndex="1" axisValues="(-8847, 655, -8484, 0, 0)" axisValuesVarIndex="1" transformVarIndex="2" translateX="-5.0" translateY="24.0"/>
</VarCompositeGlyph> </VarCompositeGlyph>
<VarCompositeGlyph index="5"> <VarCompositeGlyph index="5">
<VarComponent index="0" glyphName="glyph00010" flags="241" axisIndicesIndex="0" axisValues="(-12714, -5843, 0)" axisValuesVarIndex="3" transformVarIndex="4" translateX="53.0" translateY="-231.0"/> <VarComponent index="0" glyphName="glyph00010" flags="248" axisIndicesIndex="0" axisValues="(-12714, -5843, 0)" axisValuesVarIndex="3" transformVarIndex="4" translateX="53.0" translateY="-231.0"/>
</VarCompositeGlyph> </VarCompositeGlyph>
<VarCompositeGlyph index="6"> <VarCompositeGlyph index="6">
<VarComponent index="0" glyphName="glyph00009" flags="241" axisIndicesIndex="0" axisValues="(-4227, 819, -8484)" axisValuesVarIndex="5" transformVarIndex="6" translateX="-5.0" translateY="12.0"/> <VarComponent index="0" glyphName="glyph00009" flags="248" axisIndicesIndex="0" axisValues="(-4227, 819, -8484)" axisValuesVarIndex="5" transformVarIndex="6" translateX="-5.0" translateY="12.0"/>
</VarCompositeGlyph> </VarCompositeGlyph>
</VarCompositeGlyphs> </VarCompositeGlyphs>
</VARC> </VARC>

Binary file not shown.