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