[GX] Add 'fvar' table support
I might change the table format in the future, but it's functional now.
This commit is contained in:
parent
61cda14c1b
commit
b9ac90a8f9
@ -42,7 +42,7 @@ When using TTX from the command line there are a bunch of extra options, these a
|
||||
The following tables are currently supported:
|
||||
<BLOCKQUOTE><TT>
|
||||
<!-- begin table list -->
|
||||
BASE, CBDT, CBLC, CFF, COLR, CPAL, DSIG, EBDT, EBLC, FFTM, GDEF, GMAP, GPKG, GPOS, GSUB, JSTF, LTSH, MATH, META, OS/2, SING, SVG, TSI0, TSI1, TSI2, TSI3, TSI5, TSIB, TSID, TSIJ, TSIP, TSIS, TSIV, VDMX, VORG, cmap, cvt, feat, fpgm, gasp, glyf, hdmx, head, hhea, hmtx, kern, loca, maxp, name, post, prep, sbix, vhea and vmtx
|
||||
BASE, CBDT, CBLC, CFF, COLR, CPAL, DSIG, EBDT, EBLC, FFTM, GDEF, GMAP, GPKG, GPOS, GSUB, JSTF, LTSH, MATH, META, OS/2, SING, SVG, TSI0, TSI1, TSI2, TSI3, TSI5, TSIB, TSID, TSIJ, TSIP, TSIS, TSIV, VDMX, VORG, cmap, cvt, feat, fpgm, fvar, gasp, glyf, hdmx, head, hhea, hmtx, kern, loca, maxp, name, post, prep, sbix, vhea and vmtx
|
||||
<!-- end table list -->
|
||||
</TT></BLOCKQUOTE>
|
||||
Other tables are dumped as hexadecimal data.
|
||||
|
@ -42,6 +42,7 @@ def _moduleFinderHint():
|
||||
from . import _c_v_t
|
||||
from . import _f_e_a_t
|
||||
from . import _f_p_g_m
|
||||
from . import _f_v_a_r
|
||||
from . import _g_a_s_p
|
||||
from . import _g_l_y_f
|
||||
from . import _h_d_m_x
|
||||
|
@ -62,7 +62,7 @@ class BaseConverter(object):
|
||||
self.tableClass = tableClass
|
||||
self.isCount = name.endswith("Count")
|
||||
self.isLookupType = name.endswith("LookupType")
|
||||
self.isPropagated = name in ["ClassCount", "Class2Count", "FeatureTag", "SettingsCount"]
|
||||
self.isPropagated = name in ["ClassCount", "Class2Count", "FeatureTag", "SettingsCount", "AxisCount"]
|
||||
|
||||
def read(self, reader, font, tableDict):
|
||||
"""Read a value from the reader."""
|
||||
@ -104,32 +104,6 @@ class ULong(IntValue):
|
||||
def write(self, writer, font, tableDict, value, repeatIndex=None):
|
||||
writer.writeULong(value)
|
||||
|
||||
class Version(BaseConverter):
|
||||
def read(self, reader, font, tableDict):
|
||||
value = reader.readLong()
|
||||
assert (value >> 16) == 1, "Unsupported version 0x%08x" % value
|
||||
return fi2fl(value, 16)
|
||||
def write(self, writer, font, tableDict, value, repeatIndex=None):
|
||||
if value < 0x10000:
|
||||
value = fl2fi(value, 16)
|
||||
value = int(round(value))
|
||||
assert (value >> 16) == 1, "Unsupported version 0x%08x" % value
|
||||
writer.writeLong(value)
|
||||
def xmlRead(self, attrs, content, font):
|
||||
value = attrs["value"]
|
||||
value = float(int(value, 0)) if value.startswith("0") else float(value)
|
||||
if value >= 0x10000:
|
||||
value = fi2fl(value, 16)
|
||||
return value
|
||||
def xmlWrite(self, xmlWriter, font, value, name, attrs):
|
||||
if value >= 0x10000:
|
||||
value = fi2fl(value, 16)
|
||||
if value % 1 != 0:
|
||||
# Write as hex
|
||||
value = "0x%08x" % fl2fi(value, 16)
|
||||
xmlWriter.simpletag(name, attrs + [("value", value)])
|
||||
xmlWriter.newline()
|
||||
|
||||
class Short(IntValue):
|
||||
def read(self, reader, font, tableDict):
|
||||
return reader.readShort()
|
||||
@ -181,6 +155,41 @@ class DeciPoints(FloatValue):
|
||||
def write(self, writer, font, tableDict, value, repeatIndex=None):
|
||||
writer.writeUShort(int(round(value * 10)))
|
||||
|
||||
class Fixed(FloatValue):
|
||||
def read(self, reader, font, tableDict):
|
||||
value = reader.readLong()
|
||||
return fi2fl(value, 16)
|
||||
def write(self, writer, font, tableDict, value, repeatIndex=None):
|
||||
value = fl2fi(value, 16)
|
||||
writer.writeLong(value)
|
||||
|
||||
class Version(BaseConverter):
|
||||
def read(self, reader, font, tableDict):
|
||||
value = reader.readLong()
|
||||
assert (value >> 16) == 1, "Unsupported version 0x%08x" % value
|
||||
return fi2fl(value, 16)
|
||||
def write(self, writer, font, tableDict, value, repeatIndex=None):
|
||||
if value < 0x10000:
|
||||
value = fl2fi(value, 16)
|
||||
value = int(round(value))
|
||||
assert (value >> 16) == 1, "Unsupported version 0x%08x" % value
|
||||
writer.writeLong(value)
|
||||
def xmlRead(self, attrs, content, font):
|
||||
value = attrs["value"]
|
||||
value = float(int(value, 0)) if value.startswith("0") else float(value)
|
||||
if value >= 0x10000:
|
||||
value = fi2fl(value, 16)
|
||||
return value
|
||||
def xmlWrite(self, xmlWriter, font, value, name, attrs):
|
||||
if value >= 0x10000:
|
||||
value = fi2fl(value, 16)
|
||||
if value % 1 != 0:
|
||||
# Write as hex
|
||||
value = "0x%08x" % fl2fi(value, 16)
|
||||
xmlWriter.simpletag(name, attrs + [("value", value)])
|
||||
xmlWriter.newline()
|
||||
|
||||
|
||||
class Struct(BaseConverter):
|
||||
|
||||
def read(self, reader, font, tableDict):
|
||||
@ -383,6 +392,7 @@ converterMapping = {
|
||||
"Tag": Tag,
|
||||
"GlyphID": GlyphID,
|
||||
"DeciPoints": DeciPoints,
|
||||
"Fixed": Fixed,
|
||||
"struct": Struct,
|
||||
"Offset": Table,
|
||||
"LOffset": LTable,
|
||||
|
@ -1017,4 +1017,39 @@ otData = [
|
||||
('uint16', 'SettingNameID', None, None, 'The name table index for the setting name.'),
|
||||
]),
|
||||
|
||||
##
|
||||
## Apple TrueType GX tables
|
||||
##
|
||||
|
||||
#
|
||||
# fvar
|
||||
#
|
||||
|
||||
('fvar', [
|
||||
('Version', 'Version', None, None, 'Version of the fvar table-initially set to 0x00010000.'),
|
||||
('uint16', 'OffsetToData', None, None, 'Set to 16.'),
|
||||
('uint16', 'CountSizePairs', None, None, 'Set to 2.'),
|
||||
('uint16', 'AxisCount', None, None, 'Number of style axes in this font.'),
|
||||
('uint16', 'AxisSize', None, None, 'Set to 20.'),
|
||||
('uint16', 'InstanceCount', None, None, 'Number of named instances in this font.'),
|
||||
('uint16', 'InstanceSize', None, None, 'Number of bytes in each instance.'),
|
||||
('VariationAxis', 'VariationAxis', 'AxisCount', 0, 'The variation axes array.'),
|
||||
('NamedInstance', 'NamedInstance', 'InstanceCount', 0, 'The named instances array.'),
|
||||
]),
|
||||
|
||||
('VariationAxis', [
|
||||
('Tag', 'AxisTag', None, None, '4-byte AxisTag identifier'),
|
||||
('Fixed', 'MinValue', None, None, 'The minimum style coordinate for the axis.'),
|
||||
('Fixed', 'DefaultValue', None, None, 'The default style coordinate for the axis.'),
|
||||
('Fixed', 'MaxValue', None, None, 'The maximum style coordinate for the axis.'),
|
||||
('uint16', 'Flags', None, None, 'Set to zero.'),
|
||||
('uint16', 'NameID', None, None, 'The name table index for the setting name.'),
|
||||
]),
|
||||
|
||||
('NamedInstance', [
|
||||
('uint16', 'NameID', None, None, 'The name table index for the instance name.'),
|
||||
('uint16', 'Flags', None, None, 'Set to zero.'),
|
||||
('Fixed', 'Coords', 'AxisCount', 0, 'The maximum style coordinate for the axis.'),
|
||||
]),
|
||||
|
||||
]
|
||||
|
Loading…
x
Reference in New Issue
Block a user