[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):
self.items.append(subWriter)
def writeCountReference(self, table, name):
ref = CountReference(table, name)
def writeCountReference(self, table, name, size=2):
ref = CountReference(table, name, size=size)
self.items.append(ref)
return ref
@ -514,9 +514,10 @@ class OTTableWriter(object):
class CountReference(object):
"""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.name = name
self.size = size
def setValue(self, value):
table = self.table
name = self.name
@ -525,9 +526,10 @@ class CountReference(object):
else:
assert table[name] == value, (name, table[name], value)
def getCountData(self):
assert self.size in (2, 4)
v = self.table[self.name]
if v is None: v = 0
return packUShort(v)
return packUShort(v) if self.size == 2 else packULong(v)
def packUShort(value):
@ -657,12 +659,12 @@ class BaseTable(object):
# table. We will later store it here.
# We add a reference: by the time the data is assembled
# 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
if conv.isPropagated:
writer[conv.name] = ref
elif conv.isLookupType:
ref = writer.writeCountReference(table, conv.name)
ref = writer.writeCountReference(table, conv.name, conv.staticSize)
table[conv.name] = None
writer['LookupType'] = ref
else:

View File

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