aboutsummaryrefslogtreecommitdiff
path: root/Tests/ttLib/tables/S_V_G__test.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tests/ttLib/tables/S_V_G__test.py')
-rw-r--r--Tests/ttLib/tables/S_V_G__test.py131
1 files changed, 131 insertions, 0 deletions
diff --git a/Tests/ttLib/tables/S_V_G__test.py b/Tests/ttLib/tables/S_V_G__test.py
new file mode 100644
index 00000000..91b0f23a
--- /dev/null
+++ b/Tests/ttLib/tables/S_V_G__test.py
@@ -0,0 +1,131 @@
+import struct
+
+from fontTools.misc import etree
+from fontTools.misc.testTools import getXML, parseXML
+from fontTools.ttLib import TTFont
+from fontTools.ttLib.tables.S_V_G_ import table_S_V_G_
+
+import pytest
+
+
+def dump(table, ttFont=None):
+ print("\n".join(getXML(table.toXML, ttFont)))
+
+
+def strip_xml_whitespace(xml_string):
+ def strip_or_none(text):
+ text = text.strip() if text else None
+ return text if text else None
+
+ tree = etree.fromstring(xml_string)
+ for e in tree.iter("*"):
+ e.text = strip_or_none(e.text)
+ e.tail = strip_or_none(e.tail)
+ return etree.tostring(tree, encoding="utf-8")
+
+
+SVG_DOCS = [
+ strip_xml_whitespace(svg)
+ for svg in (
+ b"""\
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
+ <defs>
+ <rect x="100" y="-200" width="300" height="400" id="p1"/>
+ </defs>
+ <g id="glyph1">
+ <use xlink:href="#p1" fill="#red"/>
+ </g>
+ <g id="glyph2">
+ <use xlink:href="#p1" fill="#blue"/>
+ </g>
+ <g id="glyph4">
+ <use xlink:href="#p1" fill="#green"/>
+ </g>
+ </svg>""",
+ b"""\
+ <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <g id="glyph3">
+ <path d="M0,0 L100,0 L50,100 Z"/>
+ </g>
+ </svg>""",
+ )
+]
+
+
+OTSVG_DATA = b"".join(
+ [
+ # SVG table header
+ b"\x00\x00" # version (0)
+ b"\x00\x00\x00\x0a" # offset to SVGDocumentList (10)
+ b"\x00\x00\x00\x00" # reserved (0)
+ # SVGDocumentList
+ b"\x00\x03" # number of SVGDocumentRecords (3)
+ # SVGDocumentRecord[0]
+ b"\x00\x01" # startGlyphID (1)
+ b"\x00\x02" # endGlyphID (2)
+ b"\x00\x00\x00\x26" # svgDocOffset (2 + 12*3 == 38 == 0x26)
+ + struct.pack(">L", len(SVG_DOCS[0])) # svgDocLength
+ # SVGDocumentRecord[1]
+ + b"\x00\x03" # startGlyphID (3)
+ b"\x00\x03" # endGlyphID (3)
+ + struct.pack(">L", 0x26 + len(SVG_DOCS[0])) # svgDocOffset
+ + struct.pack(">L", len(SVG_DOCS[1])) # svgDocLength
+ # SVGDocumentRecord[2]
+ + b"\x00\x04" # startGlyphID (4)
+ b"\x00\x04" # endGlyphID (4)
+ b"\x00\x00\x00\x26" # svgDocOffset (38); records 0 and 2 point to same SVG doc
+ + struct.pack(">L", len(SVG_DOCS[0])) # svgDocLength
+ ]
+ + SVG_DOCS
+)
+
+OTSVG_TTX = [
+ '<svgDoc endGlyphID="2" startGlyphID="1">',
+ f" <![CDATA[{SVG_DOCS[0].decode()}]]>",
+ "</svgDoc>",
+ '<svgDoc endGlyphID="3" startGlyphID="3">',
+ f" <![CDATA[{SVG_DOCS[1].decode()}]]>",
+ "</svgDoc>",
+ '<svgDoc endGlyphID="4" startGlyphID="4">',
+ f" <![CDATA[{SVG_DOCS[0].decode()}]]>",
+ "</svgDoc>",
+]
+
+
+@pytest.fixture
+def font():
+ font = TTFont()
+ font.setGlyphOrder([".notdef"] + ["glyph%05d" % i for i in range(1, 30)])
+ return font
+
+
+def test_decompile_and_compile(font):
+ table = table_S_V_G_()
+ table.decompile(OTSVG_DATA, font)
+ assert table.compile(font) == OTSVG_DATA
+
+
+def test_decompile_and_dump_ttx(font):
+ table = table_S_V_G_()
+ table.decompile(OTSVG_DATA, font)
+
+ dump(table, font)
+ assert getXML(table.toXML, font) == OTSVG_TTX
+
+
+def test_load_from_ttx_and_compile(font):
+ table = table_S_V_G_()
+ for name, attrs, content in parseXML(OTSVG_TTX):
+ table.fromXML(name, attrs, content, font)
+ assert table.compile(font) == OTSVG_DATA
+
+
+def test_round_trip_ttx(font):
+ table = table_S_V_G_()
+ for name, attrs, content in parseXML(OTSVG_TTX):
+ table.fromXML(name, attrs, content, font)
+ compiled = table.compile(font)
+
+ table = table_S_V_G_()
+ table.decompile(compiled, font)
+ assert getXML(table.toXML, font) == OTSVG_TTX