251 lines
9.3 KiB
Python
251 lines
9.3 KiB
Python
from fontTools.misc.testTools import getXML, parseXML
|
|
from fontTools.misc.textTools import deHexStr
|
|
from fontTools.ttLib import getTableModule, newTable
|
|
import unittest
|
|
|
|
|
|
CPAL_DATA_V0 = deHexStr(
|
|
"0000 0002 " # version=0, numPaletteEntries=2
|
|
"0002 0004 " # numPalettes=2, numColorRecords=4
|
|
"00000010 " # offsetToFirstColorRecord=16
|
|
"0000 0002 " # colorRecordIndex=[0, 2]
|
|
"000000FF FFCC66FF " # colorRecord #0, #1 (blue/green/red/alpha)
|
|
"000000FF 000080FF"
|
|
) # colorRecord #2, #3
|
|
|
|
|
|
CPAL_DATA_V0_SHARING_COLORS = deHexStr(
|
|
"0000 0003 " # version=0, numPaletteEntries=3
|
|
"0004 0006 " # numPalettes=4, numColorRecords=6
|
|
"00000014 " # offsetToFirstColorRecord=20
|
|
"0000 0000 0003 0000 " # colorRecordIndex=[0, 0, 3, 0]
|
|
"443322FF 77889911 55555555 " # colorRecord #0, #1, #2 (BGRA)
|
|
"443322FF 77889911 FFFFFFFF"
|
|
) # colorRecord #3, #4, #5
|
|
|
|
|
|
CPAL_DATA_V1_NOLABELS_NOTYPES = deHexStr(
|
|
"0001 0003 " # version=1, numPaletteEntries=3
|
|
"0002 0006 " # numPalettes=2, numColorRecords=6
|
|
"0000001C " # offsetToFirstColorRecord=28
|
|
"0000 0003 " # colorRecordIndex=[0, 3]
|
|
"00000000 " # offsetToPaletteTypeArray=0
|
|
"00000000 " # offsetToPaletteLabelArray=0
|
|
"00000000 " # offsetToPaletteEntryLabelArray=0
|
|
"CAFECAFE 00112233 44556677 " # colorRecord #0, #1, #2 (BGRA)
|
|
"31415927 42424242 00331337"
|
|
) # colorRecord #3, #4, #5
|
|
|
|
|
|
CPAL_DATA_V1 = deHexStr(
|
|
"0001 0003 " # version=1, numPaletteEntries=3
|
|
"0002 0006 " # numPalettes=2, numColorRecords=6
|
|
"0000001C " # offsetToFirstColorRecord=28
|
|
"0000 0003 " # colorRecordIndex=[0, 3]
|
|
"00000034 " # offsetToPaletteTypeArray=52
|
|
"0000003C " # offsetToPaletteLabelArray=60
|
|
"00000040 " # offsetToPaletteEntryLabelArray=64
|
|
"CAFECAFE 00112233 44556677 " # colorRecord #0, #1, #2 (BGRA)
|
|
"31415927 42424242 00331337 " # colorRecord #3, #4, #5
|
|
"00000001 00000002 " # paletteType=[1, 2]
|
|
"0102 0103 " # paletteLabel=[258, 259]
|
|
"0201 0202 0203"
|
|
) # paletteEntryLabel=[513, 514, 515]
|
|
|
|
|
|
class FakeNameTable(object):
|
|
def __init__(self, names):
|
|
self.names = names
|
|
|
|
def getDebugName(self, nameID):
|
|
return self.names.get(nameID)
|
|
|
|
|
|
class CPALTest(unittest.TestCase):
|
|
def test_decompile_v0(self):
|
|
cpal = newTable("CPAL")
|
|
cpal.decompile(CPAL_DATA_V0, ttFont=None)
|
|
self.assertEqual(cpal.version, 0)
|
|
self.assertEqual(cpal.numPaletteEntries, 2)
|
|
self.assertEqual(
|
|
repr(cpal.palettes), "[[#000000FF, #66CCFFFF], [#000000FF, #800000FF]]"
|
|
)
|
|
|
|
def test_decompile_v0_sharingColors(self):
|
|
cpal = newTable("CPAL")
|
|
cpal.decompile(CPAL_DATA_V0_SHARING_COLORS, ttFont=None)
|
|
self.assertEqual(cpal.version, 0)
|
|
self.assertEqual(cpal.numPaletteEntries, 3)
|
|
self.assertEqual(
|
|
[repr(p) for p in cpal.palettes],
|
|
[
|
|
"[#223344FF, #99887711, #55555555]",
|
|
"[#223344FF, #99887711, #55555555]",
|
|
"[#223344FF, #99887711, #FFFFFFFF]",
|
|
"[#223344FF, #99887711, #55555555]",
|
|
],
|
|
)
|
|
|
|
def test_decompile_v1_noLabelsNoTypes(self):
|
|
cpal = newTable("CPAL")
|
|
cpal.decompile(CPAL_DATA_V1_NOLABELS_NOTYPES, ttFont=None)
|
|
self.assertEqual(cpal.version, 1)
|
|
self.assertEqual(cpal.numPaletteEntries, 3)
|
|
self.assertEqual(
|
|
[repr(p) for p in cpal.palettes],
|
|
[
|
|
"[#CAFECAFE, #22110033, #66554477]", # RGBA
|
|
"[#59413127, #42424242, #13330037]",
|
|
],
|
|
)
|
|
self.assertEqual(cpal.paletteLabels, [cpal.NO_NAME_ID] * len(cpal.palettes))
|
|
self.assertEqual(cpal.paletteTypes, [0, 0])
|
|
self.assertEqual(
|
|
cpal.paletteEntryLabels, [cpal.NO_NAME_ID] * cpal.numPaletteEntries
|
|
)
|
|
|
|
def test_decompile_v1(self):
|
|
cpal = newTable("CPAL")
|
|
cpal.decompile(CPAL_DATA_V1, ttFont=None)
|
|
self.assertEqual(cpal.version, 1)
|
|
self.assertEqual(cpal.numPaletteEntries, 3)
|
|
self.assertEqual(
|
|
[repr(p) for p in cpal.palettes],
|
|
[
|
|
"[#CAFECAFE, #22110033, #66554477]", # RGBA
|
|
"[#59413127, #42424242, #13330037]",
|
|
],
|
|
)
|
|
self.assertEqual(cpal.paletteTypes, [1, 2])
|
|
self.assertEqual(cpal.paletteLabels, [258, 259])
|
|
self.assertEqual(cpal.paletteEntryLabels, [513, 514, 515])
|
|
|
|
def test_compile_v0(self):
|
|
cpal = newTable("CPAL")
|
|
cpal.decompile(CPAL_DATA_V0, ttFont=None)
|
|
self.assertEqual(cpal.compile(ttFont=None), CPAL_DATA_V0)
|
|
|
|
def test_compile_v0_sharingColors(self):
|
|
cpal = newTable("CPAL")
|
|
cpal.version = 0
|
|
Color = getTableModule("CPAL").Color
|
|
palette1 = [
|
|
Color(red=0x22, green=0x33, blue=0x44, alpha=0xFF),
|
|
Color(red=0x99, green=0x88, blue=0x77, alpha=0x11),
|
|
Color(red=0x55, green=0x55, blue=0x55, alpha=0x55),
|
|
]
|
|
palette2 = [
|
|
Color(red=0x22, green=0x33, blue=0x44, alpha=0xFF),
|
|
Color(red=0x99, green=0x88, blue=0x77, alpha=0x11),
|
|
Color(red=0xFF, green=0xFF, blue=0xFF, alpha=0xFF),
|
|
]
|
|
cpal.numPaletteEntries = len(palette1)
|
|
cpal.palettes = [palette1, palette1, palette2, palette1]
|
|
self.assertEqual(cpal.compile(ttFont=None), CPAL_DATA_V0_SHARING_COLORS)
|
|
|
|
def test_compile_v1(self):
|
|
cpal = newTable("CPAL")
|
|
cpal.decompile(CPAL_DATA_V1, ttFont=None)
|
|
self.assertEqual(cpal.compile(ttFont=None), CPAL_DATA_V1)
|
|
|
|
def test_compile_v1_noLabelsNoTypes(self):
|
|
cpal = newTable("CPAL")
|
|
cpal.decompile(CPAL_DATA_V1_NOLABELS_NOTYPES, ttFont=None)
|
|
self.assertEqual(cpal.compile(ttFont=None), CPAL_DATA_V1_NOLABELS_NOTYPES)
|
|
|
|
def test_toXML_v0(self):
|
|
cpal = newTable("CPAL")
|
|
cpal.decompile(CPAL_DATA_V0, ttFont=None)
|
|
self.assertEqual(
|
|
getXML(cpal.toXML),
|
|
[
|
|
'<version value="0"/>',
|
|
'<numPaletteEntries value="2"/>',
|
|
'<palette index="0">',
|
|
' <color index="0" value="#000000FF"/>',
|
|
' <color index="1" value="#66CCFFFF"/>',
|
|
"</palette>",
|
|
'<palette index="1">',
|
|
' <color index="0" value="#000000FF"/>',
|
|
' <color index="1" value="#800000FF"/>',
|
|
"</palette>",
|
|
],
|
|
)
|
|
|
|
def test_toXML_v1(self):
|
|
name = FakeNameTable(
|
|
{258: "Spring theme", 259: "Winter theme", 513: "darks", 515: "lights"}
|
|
)
|
|
cpal = newTable("CPAL")
|
|
ttFont = {"name": name, "CPAL": cpal}
|
|
cpal.decompile(CPAL_DATA_V1, ttFont)
|
|
self.assertEqual(
|
|
getXML(cpal.toXML, ttFont),
|
|
[
|
|
'<version value="1"/>',
|
|
'<numPaletteEntries value="3"/>',
|
|
'<palette index="0" label="258" type="1">',
|
|
" <!-- Spring theme -->",
|
|
' <color index="0" value="#CAFECAFE"/>',
|
|
' <color index="1" value="#22110033"/>',
|
|
' <color index="2" value="#66554477"/>',
|
|
"</palette>",
|
|
'<palette index="1" label="259" type="2">',
|
|
" <!-- Winter theme -->",
|
|
' <color index="0" value="#59413127"/>',
|
|
' <color index="1" value="#42424242"/>',
|
|
' <color index="2" value="#13330037"/>',
|
|
"</palette>",
|
|
"<paletteEntryLabels>",
|
|
' <label index="0" value="513"/><!-- darks -->',
|
|
' <label index="1" value="514"/>',
|
|
' <label index="2" value="515"/><!-- lights -->',
|
|
"</paletteEntryLabels>",
|
|
],
|
|
)
|
|
|
|
def test_fromXML_v0(self):
|
|
cpal = newTable("CPAL")
|
|
for name, attrs, content in parseXML(
|
|
'<version value="0"/>'
|
|
'<numPaletteEntries value="2"/>'
|
|
'<palette index="0">'
|
|
' <color index="0" value="#12345678"/>'
|
|
' <color index="1" value="#FEDCBA98"/>'
|
|
"</palette>"
|
|
):
|
|
cpal.fromXML(name, attrs, content, ttFont=None)
|
|
self.assertEqual(cpal.version, 0)
|
|
self.assertEqual(cpal.numPaletteEntries, 2)
|
|
self.assertEqual(repr(cpal.palettes), "[[#12345678, #FEDCBA98]]")
|
|
|
|
def test_fromXML_v1(self):
|
|
cpal = newTable("CPAL")
|
|
for name, attrs, content in parseXML(
|
|
'<version value="1"/>'
|
|
'<numPaletteEntries value="3"/>'
|
|
'<palette index="0" label="259" type="2">'
|
|
' <color index="0" value="#12345678"/>'
|
|
' <color index="1" value="#FEDCBA98"/>'
|
|
' <color index="2" value="#CAFECAFE"/>'
|
|
"</palette>"
|
|
"<paletteEntryLabels>"
|
|
' <label index="1" value="262"/>'
|
|
"</paletteEntryLabels>"
|
|
):
|
|
cpal.fromXML(name, attrs, content, ttFont=None)
|
|
self.assertEqual(cpal.version, 1)
|
|
self.assertEqual(cpal.numPaletteEntries, 3)
|
|
self.assertEqual(repr(cpal.palettes), "[[#12345678, #FEDCBA98, #CAFECAFE]]")
|
|
self.assertEqual(cpal.paletteLabels, [259])
|
|
self.assertEqual(cpal.paletteTypes, [2])
|
|
self.assertEqual(
|
|
cpal.paletteEntryLabels, [cpal.NO_NAME_ID, 262, cpal.NO_NAME_ID]
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import sys
|
|
|
|
sys.exit(unittest.main())
|