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), [ '', '', '', ' ', ' ', "", '', ' ', ' ', "", ], ) 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), [ '', '', '', " ", ' ', ' ', ' ', "", '', " ", ' ', ' ', ' ', "", "", ' ", ], ) def test_fromXML_v0(self): cpal = newTable("CPAL") for name, attrs, content in parseXML( '' '' '' ' ' ' ' "" ): 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( '' '' '' ' ' ' ' ' ' "" "" ' " ): 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())