[ot] Add support for long counts
This commit is contained in:
parent
846d969209
commit
0c577bb7da
@ -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:
|
||||
|
@ -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):
|
||||
|
Loading…
x
Reference in New Issue
Block a user