add test for parsing and compiling DeviceTable's DeltaValue

This commit is contained in:
Cosimo Lupo 2025-02-04 10:20:41 +00:00
parent 24eb3f7197
commit 5b3176f4fd
2 changed files with 91 additions and 0 deletions

View File

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

View File

@ -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(
"""\
<Version value="0x00010000"/>
<ScriptList>
<!-- ScriptCount=1 -->
<ScriptRecord index="0">
<ScriptTag value="DFLT"/>
<Script>
<DefaultLangSys>
<ReqFeatureIndex value="65535"/>
<!-- FeatureCount=1 -->
<FeatureIndex index="0" value="0"/>
</DefaultLangSys>
<!-- LangSysCount=0 -->
</Script>
</ScriptRecord>
</ScriptList>
<FeatureList>
<!-- FeatureCount=1 -->
<FeatureRecord index="0">
<FeatureTag value="curs"/>
<Feature>
<!-- LookupCount=1 -->
<LookupListIndex index="0" value="0"/>
</Feature>
</FeatureRecord>
</FeatureList>
<LookupList>
<!-- LookupCount=1 -->
<Lookup index="0">
<LookupType value="3"/>
<LookupFlag value="0"/>
<!-- SubTableCount=1 -->
<CursivePos index="0" Format="1">
<Coverage>
<Glyph value="five"/>
</Coverage>
<!-- EntryExitCount=1 -->
<EntryExitRecord index="0">
<EntryAnchor Format="3">
<XCoordinate value="124"/>
<YCoordinate value="-4"/>
<XDeviceTable>
<StartSize value="8"/>
<EndSize value="9"/>
<DeltaFormat value="2"/>
<DeltaValue value="[1, 2]"/>
</XDeviceTable>
<YDeviceTable>
<StartSize value="7"/>
<EndSize value="7"/>
<DeltaFormat value="2"/>
<DeltaValue value="[3]"/>
</YDeviceTable>
</EntryAnchor>
<ExitAnchor Format="2">
<XCoordinate value="3"/>
<YCoordinate value="4"/>
<AnchorPoint value="2"/>
</ExitAnchor>
</EntryExitRecord>
</CursivePos>
</Lookup>
</LookupList>"""
)
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