diff --git a/Lib/fontTools/misc/testTools.py b/Lib/fontTools/misc/testTools.py
index 7d7872148..f4127fe61 100644
--- a/Lib/fontTools/misc/testTools.py
+++ b/Lib/fontTools/misc/testTools.py
@@ -58,6 +58,9 @@ class FakeFont:
self.tables = {}
self.cfg = Config()
+ def __contains__(self, tag):
+ return tag in self.tables
+
def __getitem__(self, tag):
return self.tables[tag]
diff --git a/Lib/fontTools/ttLib/tables/otData.py b/Lib/fontTools/ttLib/tables/otData.py
index 3a01f5934..f538aeb48 100644
--- a/Lib/fontTools/ttLib/tables/otData.py
+++ b/Lib/fontTools/ttLib/tables/otData.py
@@ -385,7 +385,7 @@ otData = [
(
"DeltaValue",
"DeltaValue",
- "",
+ None,
"DeltaFormat in (1,2,3)",
"Array of compressed data",
),
diff --git a/Tests/ttLib/tables/otTables_test.py b/Tests/ttLib/tables/otTables_test.py
index db33e4c65..01bc97db8 100644
--- a/Tests/ttLib/tables/otTables_test.py
+++ b/Tests/ttLib/tables/otTables_test.py
@@ -4,6 +4,7 @@ from fontTools.misc.xmlWriter import XMLWriter
from fontTools.ttLib.tables.otBase import OTTableReader, OTTableWriter
import fontTools.ttLib.tables.otTables as otTables
from io import StringIO
+from textwrap import dedent
import unittest
@@ -735,6 +736,93 @@ class ColrV1Test(unittest.TestCase):
assert len(visited) == 1
+def test_parse_Device_DeltaValue_from_XML_and_compile():
+ # https://github.com/fonttools/fonttools/pull/3757
+ font = FakeFont([".notdef", "five"])
+
+ gpos_xml = dedent(
+ """\
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ """
+ )
+
+ gpos = parseXmlInto(font, otTables.GPOS(), gpos_xml)
+
+ anchor = gpos.LookupList.Lookup[0].SubTable[0].EntryExitRecord[0].EntryAnchor
+ assert anchor.XDeviceTable.DeltaValue == [1, 2]
+ assert anchor.YDeviceTable.DeltaValue == [3]
+
+ writer = OTTableWriter()
+ gpos.compile(writer, font)
+ data = writer.getAllData()
+
+ reader = OTTableReader(data, tableTag="GPOS")
+ gpos2 = otTables.GPOS()
+ gpos2.decompile(reader, font)
+
+ assert dedent("\n".join(getXML(gpos2.toXML, font)[1:-1])) == gpos_xml
+
+
if __name__ == "__main__":
import sys