From 297e0bd2574f2b1565871325215d3933521a5ff0 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 21 Dec 2023 00:41:27 -0700 Subject: [PATCH] [VARC] Use var-int encoding for AxisIndicesIndex Slightly larger fonts, but more consistency, and freed a flag bit. --- Lib/fontTools/ttLib/tables/otTables.py | 60 +++++++------------- Tests/ttLib/data/varc-6868.ttf | Bin 9836 -> 9836 bytes Tests/ttLib/data/varc-ac00-ac01-500upem.ttx | 12 ++-- Tests/ttLib/data/varc-ac00-ac01.ttf | Bin 3384 -> 3384 bytes 4 files changed, 28 insertions(+), 44 deletions(-) diff --git a/Lib/fontTools/ttLib/tables/otTables.py b/Lib/fontTools/ttLib/tables/otTables.py index d354f6ff6..1a5fb39c7 100644 --- a/Lib/fontTools/ttLib/tables/otTables.py +++ b/Lib/fontTools/ttLib/tables/otTables.py @@ -49,10 +49,12 @@ log = logging.getLogger(__name__) 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 - RESET_UNSPECIFIED_AXES = 0x0008 + GID_IS_24BIT = 0x0004 + + HAVE_AXES = 0x0008 AXIS_VALUES_HAVE_VARIATION = 0x0010 TRANSFORM_HAS_VARIATION = 0x0020 @@ -67,7 +69,7 @@ class VarComponentFlags(IntFlag): HAVE_TCENTER_X = 0x2000 HAVE_TCENTER_Y = 0x4000 - GID_IS_24BIT = 0x8000 + RESERVED = 0x8000 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. Return the number and the next index. @@ -129,7 +131,7 @@ def _read_var_length_number(data, i): ] << 8 | data[i + 4], i + 5 -def _write_var_length_number(v): +def _writeVarInt32(v): """Write a variable-length number. Return the data. @@ -166,14 +168,10 @@ class VarComponent: i += gidSize self.glyphName = font.glyphOrder[glyphID] - axisIndicesIndexSize = flags & VarComponentFlags.AXIS_INDICES_INDEX_SIZE - axisIndicesIndexSize = {0: 0, 1: 1, 2: 2, 3: 4}[axisIndicesIndexSize] - self.axisIndicesIndex = ( - None - if axisIndicesIndexSize == 0 - else _unpacker[axisIndicesIndexSize](data[i : i + axisIndicesIndexSize]) - ) - i += axisIndicesIndexSize + if flags & VarComponentFlags.HAVE_AXES: + self.axisIndicesIndex, i = _readVarInt32(data, i) + else: + self.axisIndicesIndex = None if self.axisIndicesIndex is None: numAxes = 0 @@ -186,11 +184,11 @@ class VarComponent: self.axisValues = tuple(axisValues) if flags & VarComponentFlags.AXIS_VALUES_HAVE_VARIATION: - self.axisValuesVarIndex, i = _read_var_length_number(data, i) + self.axisValuesVarIndex, i = _readVarInt32(data, i) else: self.axisValuesVarIndex = NO_VARIATION_INDEX if flags & VarComponentFlags.TRANSFORM_HAS_VARIATION: - self.transformVarIndex, i = _read_var_length_number(data, i) + self.transformVarIndex, i = _readVarInt32(data, i) else: self.transformVarIndex = NO_VARIATION_INDEX @@ -234,35 +232,21 @@ class VarComponent: numAxes = len(self.axisValues) - axisIndicesIndexSize = ( - 0 - if self.axisIndicesIndex == None - else 1 - if self.axisIndicesIndex < 256 - else 2 - 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 numAxes: + flags |= VarComponentFlags.HAVE_AXES + data.append(_writeVarInt32(self.axisIndicesIndex)) + data.append(TupleVariation.compileDeltaValues_(self.axisValues)) + else: + flags &= ~VarComponentFlags.HAVE_AXES if self.axisValuesVarIndex != NO_VARIATION_INDEX: flags |= VarComponentFlags.AXIS_VALUES_HAVE_VARIATION - data.append(_write_var_length_number(self.axisValuesVarIndex)) + data.append(_writeVarInt32(self.axisValuesVarIndex)) else: flags &= ~VarComponentFlags.AXIS_VALUES_HAVE_VARIATION if self.transformVarIndex != NO_VARIATION_INDEX: flags |= VarComponentFlags.TRANSFORM_HAS_VARIATION - data.append(_write_var_length_number(self.transformVarIndex)) + data.append(_writeVarInt32(self.transformVarIndex)) else: flags &= ~VarComponentFlags.TRANSFORM_HAS_VARIATION diff --git a/Tests/ttLib/data/varc-6868.ttf b/Tests/ttLib/data/varc-6868.ttf index b2c49f9789abbe8b1471ace718d17152d62543c0..4006191880ee013a7c2d4d835c1b2c8e6065f467 100644 GIT binary patch delta 252 zcmaFk^TtPnfsuiMfrp`iftkS}%rVG$9^0YJjUq9eEN^e@sM}n^$;YM2#3`w+V{Y#e z6qi@az{JYL%)-jX&Ih45IJvlac=`ARCNCG3oBTvreezLZc@dzIEKES6lHnd>0^=vP zUkuD#ljTM97=KOn6Om*2#lXTnxj;lk@)ZL+gM$LYAqEB}`Tx5(7?@`<*rxwtU}c-U zRzw-7jFo-z6%kdSu3sWrKrRQMD%h42}eCNCG3oBT#te)3UabrGPEEKES6lHnd>0^=vP zpA5`wljTM97=KRo6Om*2$-u%sxj;lk@+AX1lY;`oAqEB}`Tx5(7?@`<*rxwvVC9&+ zRzw-7jFofp6%kdSu3sWrKrRQvWDQXbAU9AH#AV}}Tra8tVsKAhEvlgoHSGuk3*!YQ cD+UinE;hIjD}xu4E^``#2iwohzeI}!0JGRVp#T5? diff --git a/Tests/ttLib/data/varc-ac00-ac01-500upem.ttx b/Tests/ttLib/data/varc-ac00-ac01-500upem.ttx index a4931bcdf..a4d572ed4 100644 --- a/Tests/ttLib/data/varc-ac00-ac01-500upem.ttx +++ b/Tests/ttLib/data/varc-ac00-ac01-500upem.ttx @@ -1,5 +1,5 @@ - + @@ -313,19 +313,19 @@ - + - + - + - + - + diff --git a/Tests/ttLib/data/varc-ac00-ac01.ttf b/Tests/ttLib/data/varc-ac00-ac01.ttf index 8c10394f71625250ba21b8e3c8416ec4cf7379c7..2cccc232f48e6a4b65814b0a33714598af25dbcc 100644 GIT binary patch delta 107 zcmV-x0F?i@8n_x10096101N`_y7q3Lfvr!kKWvY1p@!}05Aaf015y>&Q|FyfCd8q NYW^|+__K8e!v^VfBt-xK delta 107 zcmV-x0F?i@8n_x10096101N`@c;<{Lfvr!kKWvY1p@!}05AaY015y>&Q|FyfCd8q NYW^|+@w0UX!v^g;Bt-xK