[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):
|
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:
|
||||||
|
@ -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):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user