aboutsummaryrefslogtreecommitdiff
path: root/Tests/ttLib/tables/otTables_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tests/ttLib/tables/otTables_test.py')
-rw-r--r--Tests/ttLib/tables/otTables_test.py254
1 files changed, 142 insertions, 112 deletions
diff --git a/Tests/ttLib/tables/otTables_test.py b/Tests/ttLib/tables/otTables_test.py
index 9202aa55..3f74b7a9 100644
--- a/Tests/ttLib/tables/otTables_test.py
+++ b/Tests/ttLib/tables/otTables_test.py
@@ -1,4 +1,4 @@
-from fontTools.misc.testTools import getXML, parseXML, FakeFont
+from fontTools.misc.testTools import getXML, parseXML, parseXmlInto, FakeFont
from fontTools.misc.textTools import deHexStr, hexStr
from fontTools.misc.xmlWriter import XMLWriter
from fontTools.ttLib.tables.otBase import OTTableReader, OTTableWriter
@@ -512,8 +512,11 @@ class InsertionMorphActionTest(unittest.TestCase):
for name, attrs, content in parseXML(self.MORPH_ACTION_XML):
a.fromXML(name, attrs, content, self.font)
writer = OTTableWriter()
- a.compile(writer, self.font,
- actionIndex={('B', 'C'): 9, ('B', 'A', 'D'): 7})
+ a.compile(
+ writer,
+ self.font,
+ actionIndex={('B', 'C'): 9, ('B', 'A', 'D'): 7},
+ )
self.assertEqual(hexStr(writer.getAllData()), "1234fc4300090007")
def testCompileActions_empty(self):
@@ -551,13 +554,11 @@ class SplitMultipleSubstTest:
from fontTools.ttLib.tables.otBase import OverflowErrorRecord
oldSubTable = buildMultipleSubstSubtable({'e': 1, 'a': 2, 'b': 3, 'c': 4, 'd': 5})
- oldSubTable.Format = 1
newSubTable = otTables.MultipleSubst()
ok = otTables.splitMultipleSubst(oldSubTable, newSubTable, OverflowErrorRecord((None, None, None, itemName, itemRecord)))
assert ok
- assert oldSubTable.Format == newSubTable.Format
return oldSubTable.mapping, newSubTable.mapping
def test_Coverage(self):
@@ -577,113 +578,142 @@ class SplitMultipleSubstTest:
def test_splitMarkBasePos():
- from fontTools.otlLib.builder import buildAnchor, buildMarkBasePosSubtable
-
- marks = {
- "acutecomb": (0, buildAnchor(0, 600)),
- "gravecomb": (0, buildAnchor(0, 590)),
- "cedillacomb": (1, buildAnchor(0, 0)),
- }
- bases = {
- "a": {
- 0: buildAnchor(350, 500),
- 1: None,
- },
- "c": {
- 0: buildAnchor(300, 700),
- 1: buildAnchor(300, 0),
- },
- }
- glyphOrder = ["a", "c", "acutecomb", "gravecomb", "cedillacomb"]
- glyphMap = {g: i for i, g in enumerate(glyphOrder)}
-
- oldSubTable = buildMarkBasePosSubtable(marks, bases, glyphMap)
- newSubTable = otTables.MarkBasePos()
-
- ok = otTables.splitMarkBasePos(oldSubTable, newSubTable, overflowRecord=None)
-
- assert ok
-
- assert getXML(oldSubTable.toXML) == [
- '<MarkBasePos Format="1">',
- ' <MarkCoverage>',
- ' <Glyph value="acutecomb"/>',
- ' <Glyph value="gravecomb"/>',
- ' </MarkCoverage>',
- ' <BaseCoverage>',
- ' <Glyph value="a"/>',
- ' <Glyph value="c"/>',
- ' </BaseCoverage>',
- ' <!-- ClassCount=1 -->',
- ' <MarkArray>',
- ' <!-- MarkCount=2 -->',
- ' <MarkRecord index="0">',
- ' <Class value="0"/>',
- ' <MarkAnchor Format="1">',
- ' <XCoordinate value="0"/>',
- ' <YCoordinate value="600"/>',
- ' </MarkAnchor>',
- ' </MarkRecord>',
- ' <MarkRecord index="1">',
- ' <Class value="0"/>',
- ' <MarkAnchor Format="1">',
- ' <XCoordinate value="0"/>',
- ' <YCoordinate value="590"/>',
- ' </MarkAnchor>',
- ' </MarkRecord>',
- ' </MarkArray>',
- ' <BaseArray>',
- ' <!-- BaseCount=2 -->',
- ' <BaseRecord index="0">',
- ' <BaseAnchor index="0" Format="1">',
- ' <XCoordinate value="350"/>',
- ' <YCoordinate value="500"/>',
- ' </BaseAnchor>',
- ' </BaseRecord>',
- ' <BaseRecord index="1">',
- ' <BaseAnchor index="0" Format="1">',
- ' <XCoordinate value="300"/>',
- ' <YCoordinate value="700"/>',
- ' </BaseAnchor>',
- ' </BaseRecord>',
- ' </BaseArray>',
- '</MarkBasePos>',
- ]
-
- assert getXML(newSubTable.toXML) == [
- '<MarkBasePos Format="1">',
- ' <MarkCoverage>',
- ' <Glyph value="cedillacomb"/>',
- ' </MarkCoverage>',
- ' <BaseCoverage>',
- ' <Glyph value="a"/>',
- ' <Glyph value="c"/>',
- ' </BaseCoverage>',
- ' <!-- ClassCount=1 -->',
- ' <MarkArray>',
- ' <!-- MarkCount=1 -->',
- ' <MarkRecord index="0">',
- ' <Class value="0"/>',
- ' <MarkAnchor Format="1">',
- ' <XCoordinate value="0"/>',
- ' <YCoordinate value="0"/>',
- ' </MarkAnchor>',
- ' </MarkRecord>',
- ' </MarkArray>',
- ' <BaseArray>',
- ' <!-- BaseCount=2 -->',
- ' <BaseRecord index="0">',
- ' <BaseAnchor index="0" empty="1"/>',
- ' </BaseRecord>',
- ' <BaseRecord index="1">',
- ' <BaseAnchor index="0" Format="1">',
- ' <XCoordinate value="300"/>',
- ' <YCoordinate value="0"/>',
- ' </BaseAnchor>',
- ' </BaseRecord>',
- ' </BaseArray>',
- '</MarkBasePos>',
- ]
+ from fontTools.otlLib.builder import buildAnchor, buildMarkBasePosSubtable
+
+ marks = {
+ "acutecomb": (0, buildAnchor(0, 600)),
+ "gravecomb": (0, buildAnchor(0, 590)),
+ "cedillacomb": (1, buildAnchor(0, 0)),
+ }
+ bases = {
+ "a": {
+ 0: buildAnchor(350, 500),
+ 1: None,
+ },
+ "c": {
+ 0: buildAnchor(300, 700),
+ 1: buildAnchor(300, 0),
+ },
+ }
+ glyphOrder = ["a", "c", "acutecomb", "gravecomb", "cedillacomb"]
+ glyphMap = {g: i for i, g in enumerate(glyphOrder)}
+
+ oldSubTable = buildMarkBasePosSubtable(marks, bases, glyphMap)
+ newSubTable = otTables.MarkBasePos()
+
+ ok = otTables.splitMarkBasePos(oldSubTable, newSubTable, overflowRecord=None)
+
+ assert ok
+
+ assert getXML(oldSubTable.toXML) == [
+ '<MarkBasePos Format="1">',
+ ' <MarkCoverage>',
+ ' <Glyph value="acutecomb"/>',
+ ' <Glyph value="gravecomb"/>',
+ ' </MarkCoverage>',
+ ' <BaseCoverage>',
+ ' <Glyph value="a"/>',
+ ' <Glyph value="c"/>',
+ ' </BaseCoverage>',
+ ' <!-- ClassCount=1 -->',
+ ' <MarkArray>',
+ ' <!-- MarkCount=2 -->',
+ ' <MarkRecord index="0">',
+ ' <Class value="0"/>',
+ ' <MarkAnchor Format="1">',
+ ' <XCoordinate value="0"/>',
+ ' <YCoordinate value="600"/>',
+ ' </MarkAnchor>',
+ ' </MarkRecord>',
+ ' <MarkRecord index="1">',
+ ' <Class value="0"/>',
+ ' <MarkAnchor Format="1">',
+ ' <XCoordinate value="0"/>',
+ ' <YCoordinate value="590"/>',
+ ' </MarkAnchor>',
+ ' </MarkRecord>',
+ ' </MarkArray>',
+ ' <BaseArray>',
+ ' <!-- BaseCount=2 -->',
+ ' <BaseRecord index="0">',
+ ' <BaseAnchor index="0" Format="1">',
+ ' <XCoordinate value="350"/>',
+ ' <YCoordinate value="500"/>',
+ ' </BaseAnchor>',
+ ' </BaseRecord>',
+ ' <BaseRecord index="1">',
+ ' <BaseAnchor index="0" Format="1">',
+ ' <XCoordinate value="300"/>',
+ ' <YCoordinate value="700"/>',
+ ' </BaseAnchor>',
+ ' </BaseRecord>',
+ ' </BaseArray>',
+ '</MarkBasePos>',
+ ]
+
+ assert getXML(newSubTable.toXML) == [
+ '<MarkBasePos Format="1">',
+ ' <MarkCoverage>',
+ ' <Glyph value="cedillacomb"/>',
+ ' </MarkCoverage>',
+ ' <BaseCoverage>',
+ ' <Glyph value="a"/>',
+ ' <Glyph value="c"/>',
+ ' </BaseCoverage>',
+ ' <!-- ClassCount=1 -->',
+ ' <MarkArray>',
+ ' <!-- MarkCount=1 -->',
+ ' <MarkRecord index="0">',
+ ' <Class value="0"/>',
+ ' <MarkAnchor Format="1">',
+ ' <XCoordinate value="0"/>',
+ ' <YCoordinate value="0"/>',
+ ' </MarkAnchor>',
+ ' </MarkRecord>',
+ ' </MarkArray>',
+ ' <BaseArray>',
+ ' <!-- BaseCount=2 -->',
+ ' <BaseRecord index="0">',
+ ' <BaseAnchor index="0" empty="1"/>',
+ ' </BaseRecord>',
+ ' <BaseRecord index="1">',
+ ' <BaseAnchor index="0" Format="1">',
+ ' <XCoordinate value="300"/>',
+ ' <YCoordinate value="0"/>',
+ ' </BaseAnchor>',
+ ' </BaseRecord>',
+ ' </BaseArray>',
+ '</MarkBasePos>',
+ ]
+
+
+class ColrV1Test(unittest.TestCase):
+ def setUp(self):
+ self.font = FakeFont(['.notdef', 'meh'])
+
+ def test_traverseEmptyPaintColrLayersNeedsNoLayerList(self):
+ colr = parseXmlInto(
+ self.font,
+ otTables.COLR(),
+ '''
+ <Version value="1"/>
+ <BaseGlyphList>
+ <BaseGlyphPaintRecord index="0">
+ <BaseGlyph value="meh"/>
+ <Paint Format="1"><!-- PaintColrLayers -->
+ <NumLayers value="0"/>
+ <FirstLayerIndex value="42"/>
+ </Paint>
+ </BaseGlyphPaintRecord>
+ </BaseGlyphList>
+ ''',
+ )
+ paint = colr.BaseGlyphList.BaseGlyphPaintRecord[0].Paint
+
+ # Just want to confirm we don't crash
+ visited = []
+ paint.traverse(colr, lambda p: visited.append(p))
+ assert len(visited) == 1
if __name__ == "__main__":