_f_v_a_r: use floatToFixedToStr and strToFixedToFloat in Axis and NamedInstance

This commit is contained in:
Cosimo Lupo 2019-10-07 15:19:24 +01:00
parent b50c10af7a
commit d66c92fbe0
No known key found for this signature in database
GPG Key ID: 20D4A261E4A0E642
2 changed files with 29 additions and 14 deletions

View File

@ -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

View File

@ -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__":