[ot] Add support for long counts

This commit is contained in:
Behdad Esfahbod 2016-09-04 20:00:21 -07:00
parent 846d969209
commit 0c577bb7da
2 changed files with 16 additions and 9 deletions

View File

@ -466,8 +466,8 @@ class OTTableWriter(object):
def writeSubTable(self, subWriter): def writeSubTable(self, subWriter):
self.items.append(subWriter) self.items.append(subWriter)
def writeCountReference(self, table, name): def writeCountReference(self, table, name, size=2):
ref = CountReference(table, name) ref = CountReference(table, name, size=size)
self.items.append(ref) self.items.append(ref)
return ref return ref
@ -514,9 +514,10 @@ class OTTableWriter(object):
class CountReference(object): class CountReference(object):
"""A reference to a Count value, not a count of references.""" """A reference to a Count value, not a count of references."""
def __init__(self, table, name): def __init__(self, table, name, size=None):
self.table = table self.table = table
self.name = name self.name = name
self.size = size
def setValue(self, value): def setValue(self, value):
table = self.table table = self.table
name = self.name name = self.name
@ -525,9 +526,10 @@ class CountReference(object):
else: else:
assert table[name] == value, (name, table[name], value) assert table[name] == value, (name, table[name], value)
def getCountData(self): def getCountData(self):
assert self.size in (2, 4)
v = self.table[self.name] v = self.table[self.name]
if v is None: v = 0 if v is None: v = 0
return packUShort(v) return packUShort(v) if self.size == 2 else packULong(v)
def packUShort(value): def packUShort(value):
@ -657,12 +659,12 @@ class BaseTable(object):
# table. We will later store it here. # table. We will later store it here.
# We add a reference: by the time the data is assembled # We add a reference: by the time the data is assembled
# the Count value will be filled in. # the Count value will be filled in.
ref = writer.writeCountReference(table, conv.name) ref = writer.writeCountReference(table, conv.name, conv.staticSize)
table[conv.name] = None table[conv.name] = None
if conv.isPropagated: if conv.isPropagated:
writer[conv.name] = ref writer[conv.name] = ref
elif conv.isLookupType: elif conv.isLookupType:
ref = writer.writeCountReference(table, conv.name) ref = writer.writeCountReference(table, conv.name, conv.staticSize)
table[conv.name] = None table[conv.name] = None
writer['LookupType'] = ref writer['LookupType'] = ref
else: else:

View File

@ -22,8 +22,8 @@ def buildConverters(tableSpec, tableNamespace):
assert tp == "uint16" assert tp == "uint16"
converterClass = ValueFormat converterClass = ValueFormat
elif name.endswith("Count") or name.endswith("LookupType"): elif name.endswith("Count") or name.endswith("LookupType"):
assert tp == "uint16" assert tp in ("uint16", "uint32")
converterClass = ComputedUShort converterClass = ComputedUShort if tp == 'uint16' else ComputedULong
elif name == "SubTable": elif name == "SubTable":
converterClass = SubTable converterClass = SubTable
elif name == "ExtSubTable": elif name == "ExtSubTable":
@ -203,11 +203,16 @@ class UInt24(IntValue):
def write(self, writer, font, tableDict, value, repeatIndex=None): def write(self, writer, font, tableDict, value, repeatIndex=None):
writer.writeUInt24(value) writer.writeUInt24(value)
class ComputedUShort(UShort): class ComputedInt(IntValue):
def xmlWrite(self, xmlWriter, font, value, name, attrs): def xmlWrite(self, xmlWriter, font, value, name, attrs):
xmlWriter.comment("%s=%s" % (name, value)) xmlWriter.comment("%s=%s" % (name, value))
xmlWriter.newline() xmlWriter.newline()
class ComputedUShort(ComputedInt, UShort):
pass
class ComputedULong(ComputedInt, ULong):
pass
class Tag(SimpleValue): class Tag(SimpleValue):
staticSize = 4 staticSize = 4
def read(self, reader, font, tableDict): def read(self, reader, font, tableDict):