Move offset overflow fixing logic where it belongs
diff --git a/Lib/fontTools/ttLib/tables/otBase.py b/Lib/fontTools/ttLib/tables/otBase.py
index cac10f5..434abb4 100644
--- a/Lib/fontTools/ttLib/tables/otBase.py
+++ b/Lib/fontTools/ttLib/tables/otBase.py
@@ -77,10 +77,32 @@
def __init__(self, tableType):
self.tableType = tableType
globalState = GlobalState(tableType=self.tableTag)
- writer = OTTableWriter(globalState)
- writer.parent = None
- self.table.compile(writer, font)
- return writer.getAllData()
+ overflowRecord = None
+
+ while True:
+ try:
+ writer = OTTableWriter(globalState)
+ self.table.compile(writer, font)
+ return writer.getAllData()
+
+ except OTLOffsetOverflowError as e:
+
+ if overflowRecord == e.value:
+ raise # Oh well...
+
+ overflowRecord = e.value
+ print("Attempting to fix OTLOffsetOverflowError", e)
+ lastItem = overflowRecord
+
+ ok = 0
+ if overflowRecord.itemName is None:
+ from .otTables import fixLookupOverFlows
+ ok = fixLookupOverFlows(font, overflowRecord)
+ else:
+ from .otTables import fixSubTableOverFlows
+ ok = fixSubTableOverFlows(font, overflowRecord)
+ if not ok:
+ raise
def toXML(self, writer, font):
self.table.toXML2(writer, font)
@@ -174,6 +196,7 @@
self.pos = None
self.globalState = globalState
self.localState = localState
+ self.parent = None
def __setitem__(self, name, value):
state = self.localState.copy() if self.localState else dict()
diff --git a/Lib/fontTools/ttx.py b/Lib/fontTools/ttx.py
index 5690e7f..8618a46 100644
--- a/Lib/fontTools/ttx.py
+++ b/Lib/fontTools/ttx.py
@@ -69,8 +69,6 @@
from __future__ import print_function, division
from fontTools.misc.py23 import *
from fontTools.ttLib import TTFont, TTLibError
-from fontTools.ttLib.tables.otBase import OTLOffsetOverflowError
-from fontTools.ttLib.tables.otTables import fixLookupOverFlows, fixSubTableOverFlows
from fontTools.misc.macCreatorType import getMacCreatorAndType
import os
import sys
@@ -215,31 +213,7 @@
recalcBBoxes=options.recalcBBoxes,
verbose=options.verbose, allowVID=options.allowVID)
ttf.importXML(input, quiet=options.quiet)
- try:
- ttf.save(output)
- except OTLOffsetOverflowError as e:
- # XXX This shouldn't be here at all, it should be as close to the
- # OTL code as possible.
- overflowRecord = e.value
- print("Attempting to fix OTLOffsetOverflowError", e)
- lastItem = overflowRecord
- while True:
- ok = 0
- if overflowRecord.itemName is None:
- ok = fixLookupOverFlows(ttf, overflowRecord)
- else:
- ok = fixSubTableOverFlows(ttf, overflowRecord)
- if not ok:
- raise
-
- try:
- ttf.save(output)
- break
- except OTLOffsetOverflowError as e:
- print("Attempting to fix OTLOffsetOverflowError", e)
- overflowRecord = e.value
- if overflowRecord == lastItem:
- raise
+ ttf.save(output)
if options.verbose:
import time