Use enum's for repacker state.

This commit is contained in:
Garret Rieger 2022-06-27 18:18:20 +00:00
parent 4acad94b93
commit d92fd2665c

View File

@ -1,6 +1,7 @@
from fontTools.config import OPTIONS from fontTools.config import OPTIONS
from fontTools.misc.textTools import Tag, bytesjoin from fontTools.misc.textTools import Tag, bytesjoin
from .DefaultTable import DefaultTable from .DefaultTable import DefaultTable
from enum import IntEnum
import sys import sys
import array import array
import struct import struct
@ -36,6 +37,17 @@ class OTLOffsetOverflowError(Exception):
def __str__(self): def __str__(self):
return repr(self.value) return repr(self.value)
class RepackerState(IntEnum):
# Pack only with fontTools, don't allow sharing between extensions.
PURE_FT = 1
# Attempt to pack with harfbuzz (allowing sharing between extensions)
# use fontTools to attempt overflow resolution.
HB_FT = 2
# Fallback if HB/FT packing gets stuck. Pack only with fontTools, don't allow sharing between
# extensions.
FT_FALLBACK = 3
class BaseTTXConverter(DefaultTable): class BaseTTXConverter(DefaultTable):
@ -52,17 +64,6 @@ class BaseTTXConverter(DefaultTable):
self.table = tableClass() self.table = tableClass()
self.table.decompile(reader, font) self.table.decompile(reader, font)
# Pack only with fontTools, don't allow sharing between extensions.
MODE_PURE_FT = 1
# Attempt to pack with harfbuzz (allowing sharing between extensions)
# use fontTools to attempt overflow resolution.
MODE_HB_FT = 2
# Fallback if HB/FT packing gets stuck. Pack only with fontTools, don't allow sharing between
# extensions.
MODE_FT_FALLBACK = 3
def compile(self, font): def compile(self, font):
"""Compiles the table into binary. Called automatically on save.""" """Compiles the table into binary. Called automatically on save."""
@ -110,9 +111,9 @@ class BaseTTXConverter(DefaultTable):
if (use_hb_repack in (None, True) if (use_hb_repack in (None, True)
and have_uharfbuzz and have_uharfbuzz
and self.tableTag in ("GSUB", "GPOS")): and self.tableTag in ("GSUB", "GPOS")):
mode = self.MODE_HB_FT state = RepackerState.HB_FT
else: else:
mode = self.MODE_PURE_FT state = RepackerState.PURE_FT
hb_first_error_logged = False hb_first_error_logged = False
lastOverflowRecord = None lastOverflowRecord = None
@ -120,15 +121,15 @@ class BaseTTXConverter(DefaultTable):
try: try:
writer = OTTableWriter(tableTag=self.tableTag) writer = OTTableWriter(tableTag=self.tableTag)
self.table.compile(writer, font) self.table.compile(writer, font)
if mode == self.MODE_HB_FT: if state == RepackerState.HB_FT:
return self.tryPackingHarfbuzz(writer, hb_first_error_logged) return self.tryPackingHarfbuzz(writer, hb_first_error_logged)
elif mode == self.MODE_PURE_FT: elif state == RepackerState.PURE_FT:
return self.tryPackingFontTools(writer) return self.tryPackingFontTools(writer)
elif mode == self.MODE_FT_FALLBACK: elif state == RepackerState.FT_FALLBACK:
self.tryPackingFontTools(writer) self.tryPackingFontTools(writer)
log.info("Re-enabling sharing between extensions and switching back to " log.debug("Re-enabling sharing between extensions and switching back to "
"harfbuzz+fontTools packing.") "harfbuzz+fontTools packing.")
mode = self.MODE_HB_FT state = RepackerState.HB_FT
except OTLOffsetOverflowError as e: except OTLOffsetOverflowError as e:
hb_first_error_logged = True hb_first_error_logged = True
@ -138,10 +139,10 @@ class BaseTTXConverter(DefaultTable):
if ok: if ok:
continue continue
if mode is self.MODE_HB_FT: if state is RepackerState.HB_FT:
log.info("Harfbuzz packing out of resolutions, disabling sharing between extensions and " log.debug("Harfbuzz packing out of resolutions, disabling sharing between extensions and "
"switching to fontTools only packing.") "switching to fontTools only packing.")
mode = self.MODE_FT_FALLBACK state = RepackerState.FT_FALLBACK
else: else:
raise raise