_f_v_a_r: use floatToFixedToStr and strToFixedToFloat in Axis and NamedInstance
This commit is contained in:
parent
b50c10af7a
commit
d66c92fbe0
@ -1,6 +1,11 @@
|
||||
from fontTools.misc.py23 import *
|
||||
from fontTools.misc import sstruct
|
||||
from fontTools.misc.fixedTools import fixedToFloat, floatToFixed
|
||||
from fontTools.misc.fixedTools import (
|
||||
fixedToFloat as fi2fl,
|
||||
floatToFixed as fl2fi,
|
||||
floatToFixedToStr as fl2str,
|
||||
strToFixedToFloat as str2fl,
|
||||
)
|
||||
from fontTools.misc.textTools import safeEval, num2binary, binary2num
|
||||
from fontTools.ttLib import TTLibError
|
||||
from . import DefaultTable
|
||||
@ -129,9 +134,9 @@ class Axis(object):
|
||||
writer.newline()
|
||||
for tag, value in [("AxisTag", self.axisTag),
|
||||
("Flags", "0x%X" % self.flags),
|
||||
("MinValue", str(self.minValue)),
|
||||
("DefaultValue", str(self.defaultValue)),
|
||||
("MaxValue", str(self.maxValue)),
|
||||
("MinValue", fl2str(self.minValue, 16)),
|
||||
("DefaultValue", fl2str(self.defaultValue, 16)),
|
||||
("MaxValue", fl2str(self.maxValue, 16)),
|
||||
("AxisNameID", str(self.axisNameID))]:
|
||||
writer.begintag(tag)
|
||||
writer.write(value)
|
||||
@ -148,7 +153,11 @@ class Axis(object):
|
||||
self.axisTag = Tag(value)
|
||||
elif tag in {"Flags", "MinValue", "DefaultValue", "MaxValue",
|
||||
"AxisNameID"}:
|
||||
setattr(self, tag[0].lower() + tag[1:], safeEval(value))
|
||||
setattr(
|
||||
self,
|
||||
tag[0].lower() + tag[1:],
|
||||
str2fl(value, 16) if tag.endswith("Value") else safeEval(value)
|
||||
)
|
||||
|
||||
|
||||
class NamedInstance(object):
|
||||
@ -161,7 +170,7 @@ class NamedInstance(object):
|
||||
def compile(self, axisTags, includePostScriptName):
|
||||
result = [sstruct.pack(FVAR_INSTANCE_FORMAT, self)]
|
||||
for axis in axisTags:
|
||||
fixedCoord = floatToFixed(self.coordinates[axis], 16)
|
||||
fixedCoord = fl2fi(self.coordinates[axis], 16)
|
||||
result.append(struct.pack(">l", fixedCoord))
|
||||
if includePostScriptName:
|
||||
result.append(struct.pack(">H", self.postscriptNameID))
|
||||
@ -172,7 +181,7 @@ class NamedInstance(object):
|
||||
pos = sstruct.calcsize(FVAR_INSTANCE_FORMAT)
|
||||
for axis in axisTags:
|
||||
value = struct.unpack(">l", data[pos : pos + 4])[0]
|
||||
self.coordinates[axis] = fixedToFloat(value, 16)
|
||||
self.coordinates[axis] = fi2fl(value, 16)
|
||||
pos += 4
|
||||
if pos + 2 <= len(data):
|
||||
self.postscriptNameID = struct.unpack(">H", data[pos : pos + 2])[0]
|
||||
@ -199,7 +208,7 @@ class NamedInstance(object):
|
||||
writer.newline()
|
||||
for axis in ttFont["fvar"].axes:
|
||||
writer.simpletag("coord", axis=axis.axisTag,
|
||||
value=self.coordinates[axis.axisTag])
|
||||
value=fl2str(self.coordinates[axis.axisTag], 16))
|
||||
writer.newline()
|
||||
writer.endtag("NamedInstance")
|
||||
writer.newline()
|
||||
@ -215,4 +224,5 @@ class NamedInstance(object):
|
||||
|
||||
for tag, elementAttrs, _ in filter(lambda t: type(t) is tuple, content):
|
||||
if tag == "coord":
|
||||
self.coordinates[elementAttrs["axis"]] = safeEval(elementAttrs["value"])
|
||||
value = str2fl(elementAttrs["value"], 16)
|
||||
self.coordinates[elementAttrs["axis"]] = value
|
||||
|
@ -119,7 +119,7 @@ class AxisTest(unittest.TestCase):
|
||||
self.assertEqual("opsz", axis.axisTag)
|
||||
self.assertEqual(345, axis.axisNameID)
|
||||
self.assertEqual(-0.5, axis.minValue)
|
||||
self.assertEqual(1.3, axis.defaultValue)
|
||||
self.assertAlmostEqual(1.3000031, axis.defaultValue)
|
||||
self.assertEqual(1.5, axis.maxValue)
|
||||
|
||||
def test_toXML(self):
|
||||
@ -165,6 +165,11 @@ class AxisTest(unittest.TestCase):
|
||||
|
||||
|
||||
class NamedInstanceTest(unittest.TestCase):
|
||||
def assertDictAlmostEqual(self, dict1, dict2):
|
||||
self.assertEqual(set(dict1.keys()), set(dict2.keys()))
|
||||
for key in dict1:
|
||||
self.assertAlmostEqual(dict1[key], dict2[key])
|
||||
|
||||
def test_compile_withPostScriptName(self):
|
||||
inst = NamedInstance()
|
||||
inst.subfamilyNameID = 345
|
||||
@ -186,14 +191,14 @@ class NamedInstanceTest(unittest.TestCase):
|
||||
inst.decompile(FVAR_INSTANCE_DATA_WITH_PSNAME, ["wght", "wdth"])
|
||||
self.assertEqual(564, inst.postscriptNameID)
|
||||
self.assertEqual(345, inst.subfamilyNameID)
|
||||
self.assertEqual({"wght": 0.7, "wdth": 0.5}, inst.coordinates)
|
||||
self.assertDictAlmostEqual({"wght": 0.6999969, "wdth": 0.5}, inst.coordinates)
|
||||
|
||||
def test_decompile_withoutPostScriptName(self):
|
||||
inst = NamedInstance()
|
||||
inst.decompile(FVAR_INSTANCE_DATA_WITHOUT_PSNAME, ["wght", "wdth"])
|
||||
self.assertEqual(0xFFFF, inst.postscriptNameID)
|
||||
self.assertEqual(345, inst.subfamilyNameID)
|
||||
self.assertEqual({"wght": 0.7, "wdth": 0.5}, inst.coordinates)
|
||||
self.assertDictAlmostEqual({"wght": 0.6999969, "wdth": 0.5}, inst.coordinates)
|
||||
|
||||
def test_toXML_withPostScriptName(self):
|
||||
font = MakeFont()
|
||||
@ -243,7 +248,7 @@ class NamedInstanceTest(unittest.TestCase):
|
||||
inst.fromXML(name, attrs, content, ttFont=MakeFont())
|
||||
self.assertEqual(257, inst.postscriptNameID)
|
||||
self.assertEqual(345, inst.subfamilyNameID)
|
||||
self.assertEqual({"wght": 0.7, "wdth": 0.5}, inst.coordinates)
|
||||
self.assertDictAlmostEqual({"wght": 0.6999969, "wdth": 0.5}, inst.coordinates)
|
||||
|
||||
def test_fromXML_withoutPostScriptName(self):
|
||||
inst = NamedInstance()
|
||||
@ -255,7 +260,7 @@ class NamedInstanceTest(unittest.TestCase):
|
||||
inst.fromXML(name, attrs, content, ttFont=MakeFont())
|
||||
self.assertEqual(0x123ABC, inst.flags)
|
||||
self.assertEqual(345, inst.subfamilyNameID)
|
||||
self.assertEqual({"wght": 0.7, "wdth": 0.5}, inst.coordinates)
|
||||
self.assertDictAlmostEqual({"wght": 0.6999969, "wdth": 0.5}, inst.coordinates)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
Loading…
x
Reference in New Issue
Block a user