_a_v_a_r: use floatToFixedToStr and strToFixedToFloat in toXML/fromXML methods
This commit is contained in:
parent
d66c92fbe0
commit
8791caf3b8
@ -1,7 +1,12 @@
|
|||||||
from fontTools.misc.py23 import *
|
from fontTools.misc.py23 import *
|
||||||
from fontTools import ttLib
|
from fontTools import ttLib
|
||||||
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
|
from fontTools.misc.textTools import safeEval
|
||||||
from fontTools.ttLib import TTLibError
|
from fontTools.ttLib import TTLibError
|
||||||
from . import DefaultTable
|
from . import DefaultTable
|
||||||
@ -46,8 +51,8 @@ class table__a_v_a_r(DefaultTable.DefaultTable):
|
|||||||
mappings = sorted(self.segments[axis].items())
|
mappings = sorted(self.segments[axis].items())
|
||||||
result.append(struct.pack(">H", len(mappings)))
|
result.append(struct.pack(">H", len(mappings)))
|
||||||
for key, value in mappings:
|
for key, value in mappings:
|
||||||
fixedKey = floatToFixed(key, 14)
|
fixedKey = fl2fi(key, 14)
|
||||||
fixedValue = floatToFixed(value, 14)
|
fixedValue = fl2fi(value, 14)
|
||||||
result.append(struct.pack(">hh", fixedKey, fixedValue))
|
result.append(struct.pack(">hh", fixedKey, fixedValue))
|
||||||
return bytesjoin(result)
|
return bytesjoin(result)
|
||||||
|
|
||||||
@ -66,7 +71,7 @@ class table__a_v_a_r(DefaultTable.DefaultTable):
|
|||||||
pos = pos + 2
|
pos = pos + 2
|
||||||
for _ in range(numPairs):
|
for _ in range(numPairs):
|
||||||
fromValue, toValue = struct.unpack(">hh", data[pos:pos+4])
|
fromValue, toValue = struct.unpack(">hh", data[pos:pos+4])
|
||||||
segments[fixedToFloat(fromValue, 14)] = fixedToFloat(toValue, 14)
|
segments[fi2fl(fromValue, 14)] = fi2fl(toValue, 14)
|
||||||
pos = pos + 4
|
pos = pos + 4
|
||||||
|
|
||||||
def toXML(self, writer, ttFont):
|
def toXML(self, writer, ttFont):
|
||||||
@ -75,10 +80,8 @@ class table__a_v_a_r(DefaultTable.DefaultTable):
|
|||||||
writer.begintag("segment", axis=axis)
|
writer.begintag("segment", axis=axis)
|
||||||
writer.newline()
|
writer.newline()
|
||||||
for key, value in sorted(self.segments[axis].items()):
|
for key, value in sorted(self.segments[axis].items()):
|
||||||
# roundtrip float -> fixed -> float to normalize TTX output
|
key = fl2str(key, 14)
|
||||||
# as dumped after decompiling or straight from varLib
|
value = fl2str(value, 14)
|
||||||
key = fixedToFloat(floatToFixed(key, 14), 14)
|
|
||||||
value = fixedToFloat(floatToFixed(value, 14), 14)
|
|
||||||
writer.simpletag("mapping", **{"from": key, "to": value})
|
writer.simpletag("mapping", **{"from": key, "to": value})
|
||||||
writer.newline()
|
writer.newline()
|
||||||
writer.endtag("segment")
|
writer.endtag("segment")
|
||||||
@ -92,8 +95,8 @@ class table__a_v_a_r(DefaultTable.DefaultTable):
|
|||||||
if isinstance(element, tuple):
|
if isinstance(element, tuple):
|
||||||
elementName, elementAttrs, _ = element
|
elementName, elementAttrs, _ = element
|
||||||
if elementName == "mapping":
|
if elementName == "mapping":
|
||||||
fromValue = safeEval(elementAttrs["from"])
|
fromValue = str2fl(elementAttrs["from"], 14)
|
||||||
toValue = safeEval(elementAttrs["to"])
|
toValue = str2fl(elementAttrs["to"], 14)
|
||||||
if fromValue in segment:
|
if fromValue in segment:
|
||||||
log.warning("duplicate entry for %s in axis '%s'",
|
log.warning("duplicate entry for %s in axis '%s'",
|
||||||
fromValue, axis)
|
fromValue, axis)
|
||||||
|
@ -17,6 +17,17 @@ TEST_DATA = deHexStr(
|
|||||||
|
|
||||||
|
|
||||||
class AxisVariationTableTest(unittest.TestCase):
|
class AxisVariationTableTest(unittest.TestCase):
|
||||||
|
def assertAvarAlmostEqual(self, segments1, segments2):
|
||||||
|
self.assertSetEqual(set(segments1.keys()), set(segments2.keys()))
|
||||||
|
for axisTag, mapping1 in segments1.items():
|
||||||
|
mapping2 = segments2[axisTag]
|
||||||
|
self.assertEqual(len(mapping1), len(mapping2))
|
||||||
|
for (k1, v1), (k2, v2) in zip(
|
||||||
|
sorted(mapping1.items()), sorted(mapping2.items())
|
||||||
|
):
|
||||||
|
self.assertAlmostEqual(k1, k2)
|
||||||
|
self.assertAlmostEqual(v1, v2)
|
||||||
|
|
||||||
def test_compile(self):
|
def test_compile(self):
|
||||||
avar = table__a_v_a_r()
|
avar = table__a_v_a_r()
|
||||||
avar.segments["wdth"] = {-1.0: -1.0, 0.0: 0.0, 0.3: 0.8, 1.0: 1.0}
|
avar.segments["wdth"] = {-1.0: -1.0, 0.0: 0.0, 0.3: 0.8, 1.0: 1.0}
|
||||||
@ -26,8 +37,8 @@ class AxisVariationTableTest(unittest.TestCase):
|
|||||||
def test_decompile(self):
|
def test_decompile(self):
|
||||||
avar = table__a_v_a_r()
|
avar = table__a_v_a_r()
|
||||||
avar.decompile(TEST_DATA, self.makeFont(["wdth", "wght"]))
|
avar.decompile(TEST_DATA, self.makeFont(["wdth", "wght"]))
|
||||||
self.assertEqual({
|
self.assertAvarAlmostEqual({
|
||||||
"wdth": {-1.0: -1.0, 0.0: 0.0, 0.3: 0.8, 1.0: 1.0},
|
"wdth": {-1.0: -1.0, 0.0: 0.0, 0.2999878: 0.7999878, 1.0: 1.0},
|
||||||
"wght": {-1.0: -1.0, 0.0: 0.0, 1.0: 1.0}
|
"wght": {-1.0: -1.0, 0.0: 0.0, 1.0: 1.0}
|
||||||
}, avar.segments)
|
}, avar.segments)
|
||||||
|
|
||||||
@ -38,7 +49,7 @@ class AxisVariationTableTest(unittest.TestCase):
|
|||||||
|
|
||||||
def test_toXML(self):
|
def test_toXML(self):
|
||||||
avar = table__a_v_a_r()
|
avar = table__a_v_a_r()
|
||||||
avar.segments["opsz"] = {-1.0: -1.0, 0.0: 0.0, 0.3: 0.8, 1.0: 1.0}
|
avar.segments["opsz"] = {-1.0: -1.0, 0.0: 0.0, 0.2999878: 0.7999878, 1.0: 1.0}
|
||||||
writer = XMLWriter(BytesIO())
|
writer = XMLWriter(BytesIO())
|
||||||
avar.toXML(writer, self.makeFont(["opsz"]))
|
avar.toXML(writer, self.makeFont(["opsz"]))
|
||||||
self.assertEqual([
|
self.assertEqual([
|
||||||
@ -60,8 +71,10 @@ class AxisVariationTableTest(unittest.TestCase):
|
|||||||
' <mapping from="1.0" to="1.0"/>'
|
' <mapping from="1.0" to="1.0"/>'
|
||||||
'</segment>'):
|
'</segment>'):
|
||||||
avar.fromXML(name, attrs, content, ttFont=None)
|
avar.fromXML(name, attrs, content, ttFont=None)
|
||||||
self.assertEqual({"wdth": {-1: -1, 0: 0, 0.7: 0.2, 1.0: 1.0}},
|
self.assertAvarAlmostEqual(
|
||||||
avar.segments)
|
{"wdth": {-1: -1, 0: 0, 0.7000122: 0.2000122, 1.0: 1.0}},
|
||||||
|
avar.segments
|
||||||
|
)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def makeFont(axisTags):
|
def makeFont(axisTags):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user