C_O_L_R_test: add tests for COLRv1 decompile/compile/fromXML/toXML
This commit is contained in:
parent
49d504d970
commit
d9144d4dfc
@ -5,31 +5,31 @@ from fontTools.ttLib.tables.C_O_L_R_ import table_C_O_L_R_
|
||||
import pytest
|
||||
|
||||
|
||||
COLR_DATA = (
|
||||
b"\x00\x00" # Version
|
||||
b"\x00\x01" # BaseGlyphRecordCount
|
||||
COLR_V0_DATA = (
|
||||
b"\x00\x00" # Version (0)
|
||||
b"\x00\x01" # BaseGlyphRecordCount (1)
|
||||
b"\x00\x00\x00\x0e" # Offset to BaseGlyphRecordArray
|
||||
b"\x00\x00\x00\x14" # Offset to LayerRecordArray
|
||||
b"\x00\x03" # LayerRecordCount
|
||||
b"\x00\x06" # BaseGlyphRecord[0].BaseGlyph
|
||||
b"\x00\x00" # BaseGlyphRecord[0].FirstLayerIndex
|
||||
b"\x00\x03" # BaseGlyphRecord[0].NumLayers
|
||||
b"\x00\x07" # LayerRecord[0].LayerGlyph
|
||||
b"\x00\x00" # LayerRecord[0].PaletteIndex
|
||||
b"\x00\x08" # LayerRecord[1].LayerGlyph
|
||||
b"\x00\x01" # LayerRecord[1].PaletteIndex
|
||||
b"\x00\t" # LayerRecord[2].LayerGlyph
|
||||
b"\x00\x02" # LayerRecord[3].PaletteIndex
|
||||
b"\x00\x03" # LayerRecordCount (3)
|
||||
b"\x00\x06" # BaseGlyphRecord[0].BaseGlyph (6)
|
||||
b"\x00\x00" # BaseGlyphRecord[0].FirstLayerIndex (0)
|
||||
b"\x00\x03" # BaseGlyphRecord[0].NumLayers (3)
|
||||
b"\x00\x07" # LayerRecord[0].LayerGlyph (7)
|
||||
b"\x00\x00" # LayerRecord[0].PaletteIndex (0)
|
||||
b"\x00\x08" # LayerRecord[1].LayerGlyph (8)
|
||||
b"\x00\x01" # LayerRecord[1].PaletteIndex (1)
|
||||
b"\x00\t" # LayerRecord[2].LayerGlyph (9)
|
||||
b"\x00\x02" # LayerRecord[3].PaletteIndex (2)
|
||||
)
|
||||
|
||||
|
||||
COLR_XML = [
|
||||
COLR_V0_XML = [
|
||||
'<version value="0"/>',
|
||||
'<ColorGlyph name="glyph00006">',
|
||||
' <layer colorID="0" name="glyph00007"/>',
|
||||
' <layer colorID="1" name="glyph00008"/>',
|
||||
' <layer colorID="2" name="glyph00009"/>',
|
||||
'</ColorGlyph>',
|
||||
"</ColorGlyph>",
|
||||
]
|
||||
|
||||
|
||||
@ -40,19 +40,274 @@ def dump(table, ttFont=None):
|
||||
@pytest.fixture
|
||||
def font():
|
||||
font = ttLib.TTFont()
|
||||
font.setGlyphOrder(["glyph%05d" % i for i in range(10)])
|
||||
font.setGlyphOrder(["glyph%05d" % i for i in range(30)])
|
||||
return font
|
||||
|
||||
|
||||
def test_decompile_and_compile(font):
|
||||
colr = table_C_O_L_R_()
|
||||
colr.decompile(COLR_DATA, font)
|
||||
assert colr.compile(font) == COLR_DATA
|
||||
class COLR_V0_Test(object):
|
||||
def test_decompile_and_compile(self, font):
|
||||
colr = table_C_O_L_R_()
|
||||
colr.decompile(COLR_V0_DATA, font)
|
||||
assert colr.compile(font) == COLR_V0_DATA
|
||||
|
||||
def test_decompile_and_dump_xml(self, font):
|
||||
colr = table_C_O_L_R_()
|
||||
colr.decompile(COLR_V0_DATA, font)
|
||||
|
||||
dump(colr, font)
|
||||
assert getXML(colr.toXML, font) == COLR_V0_XML
|
||||
|
||||
def test_load_from_xml_and_compile(self, font):
|
||||
colr = table_C_O_L_R_()
|
||||
for name, attrs, content in parseXML(COLR_V0_XML):
|
||||
colr.fromXML(name, attrs, content, font)
|
||||
|
||||
assert colr.compile(font) == COLR_V0_DATA
|
||||
|
||||
|
||||
def test_decompile_and_dump_xml(font):
|
||||
colr = table_C_O_L_R_()
|
||||
colr.decompile(COLR_DATA, font)
|
||||
COLR_V1_DATA = (
|
||||
b"\x00\x01" # Version (1)
|
||||
b"\x00\x01" # BaseGlyphRecordCount (1)
|
||||
b"\x00\x00\x00\x16" # Offset to BaseGlyphRecordArray
|
||||
b"\x00\x00\x00\x1c" # Offset to LayerRecordArray
|
||||
b"\x00\x03" # LayerRecordCount (3)
|
||||
b"\x00\x00\x00(" # Offset to BaseGlyphV1Array
|
||||
b"\x00\x00\x00\x00" # Offset to VarStore (NULL)
|
||||
b"\x00\x06" # BaseGlyphRecord[0].BaseGlyph (6)
|
||||
b"\x00\x00" # BaseGlyphRecord[0].FirstLayerIndex (0)
|
||||
b"\x00\x03" # BaseGlyphRecord[0].NumLayers (3)
|
||||
b"\x00\x07" # LayerRecord[0].LayerGlyph (7)
|
||||
b"\x00\x00" # LayerRecord[0].PaletteIndex (0)
|
||||
b"\x00\x08" # LayerRecord[1].LayerGlyph (8)
|
||||
b"\x00\x01" # LayerRecord[1].PaletteIndex (1)
|
||||
b"\x00\t" # LayerRecord[2].LayerGlyph (9)
|
||||
b"\x00\x02" # LayerRecord[3].PaletteIndex (2)
|
||||
b"\x00\x00\x00\x01" # BaseGlyphV1Array.BaseGlyphCount (1)
|
||||
b"\x00\n" # BaseGlyphV1Array.BaseGlyphV1Record[0].BaseGlyph (10)
|
||||
b"\x00\x00\x00\n" # Offset to LayerV1Array
|
||||
b"\x00\x00\x00\x03" # LayerV1Array.LayerCount (3)
|
||||
b"\x00\x0b" # LayerV1Array.LayerV1Record[0].LayerGlyph (11)
|
||||
b"\x00\x00\x00\x16" # Offset to Paint
|
||||
b"\x00\x0c" # LayerV1Array.LayerV1Record[1].LayerGlyph (12)
|
||||
b"\x00\x00\x00 " # Offset to Paint
|
||||
b"\x00\r" # LayerV1Array.LayerV1Record[2].LayerGlyph (13)
|
||||
b"\x00\x00\x00x" # Offset to Paint
|
||||
b"\x00\x01" # Paint.Format (1)
|
||||
b"\x00\x02" # Paint.Color.PaletteIndex (2)
|
||||
b" \x00" # Paint.Color.Transparency.value (0.5)
|
||||
b"\x00\x00\x00\x00" # Paint.Color.Transparency.varIdx (0)
|
||||
b"\x00\x02" # Paint.Format (2)
|
||||
b"\x00\x00\x00*" # Offset to ColorLine
|
||||
b"\x00\x01" # Paint.p0.x.value (1)
|
||||
b"\x00\x00\x00\x00" # Paint.p0.x.varIdx (0)
|
||||
b"\x00\x02" # Paint.p0.y.value (2)
|
||||
b"\x00\x00\x00\x00" # Paint.p0.y.varIdx (0)
|
||||
b"\xff\xfd" # Paint.p1.x.value (-3)
|
||||
b"\x00\x00\x00\x00" # Paint.p1.x.varIdx (0)
|
||||
b"\xff\xfc" # Paint.p1.y.value (-4)
|
||||
b"\x00\x00\x00\x00" # Paint.p1.y.varIdx (0)
|
||||
b"\x00\x05" # Paint.p2.x.value (5)
|
||||
b"\x00\x00\x00\x00" # Paint.p2.y.varIdx (0)
|
||||
b"\x00\x06" # Paint.p2.y.value (5)
|
||||
b"\x00\x00\x00\x00" # Paint.p2.y.varIdx (0)
|
||||
b"\x00\x01" # ColorLine.Extend (1 or "repeat")
|
||||
b"\x00\x03" # ColorLine.StopCount (3)
|
||||
b"\x00\x00" # ColorLine.ColorStop[0].StopOffset.value (0.0)
|
||||
b"\x00\x00\x00\x00" # ColorLine.ColorStop[0].StopOffset.varIdx (0)
|
||||
b"\x00\x03" # ColorLine.ColorStop[0].Color.PaletteIndex (3)
|
||||
b"\x00\x00" # ColorLine.ColorStop[0].Color.Transparency.value (0.0)
|
||||
b"\x00\x00\x00\x00" # ColorLine.ColorStop[0].Color.Transparency.varIdx (0)
|
||||
b" \x00" # ColorLine.ColorStop[1].StopOffset.value (0.5)
|
||||
b"\x00\x00\x00\x00" # ColorLine.ColorStop[1].StopOffset.varIdx (0)
|
||||
b"\x00\x04" # ColorLine.ColorStop[1].Color.PaletteIndex (4)
|
||||
b"\x00\x00" # ColorLine.ColorStop[1].Color.Transparency.value (0.0)
|
||||
b"\x00\x00\x00\x00" # ColorLine.ColorStop[1].Color.Transparency.varIdx (0)
|
||||
b"@\x00" # ColorLine.ColorStop[2].StopOffset.value (1.0)
|
||||
b"\x00\x00\x00\x00" # ColorLine.ColorStop[2].StopOffset.varIdx (0)
|
||||
b"\x00\x05" # ColorLine.ColorStop[2].Color.PaletteIndex (5)
|
||||
b"\x00\x00" # ColorLine.ColorStop[2].Color.Transparency.value (0.0)
|
||||
b"\x00\x00\x00\x00" # ColorLine.ColorStop[2].Color.Transparency.varIdx (0)
|
||||
b"\x00\x03" # Paint.Format (3)
|
||||
b"\x00\x00\x00." # Offset to ColorLine
|
||||
b"\x00\x07" # Paint.c0.x.value (7)
|
||||
b"\x00\x00\x00\x00"
|
||||
b"\x00\x08" # Paint.c0.y.value (8)
|
||||
b"\x00\x00\x00\x00"
|
||||
b"\x00\t" # Paint.c1.x.value (9)
|
||||
b"\x00\x00\x00\x00"
|
||||
b"\x00\n" # Paint.c1.y.value (10)
|
||||
b"\x00\x00\x00\x00"
|
||||
b"\x00\x0b" # Paint.r0.value (11)
|
||||
b"\x00\x00\x00\x00"
|
||||
b"\x00\x0c" # Paint.r1.value (12)
|
||||
b"\x00\x00\x00\x00"
|
||||
b"\x00\x00\x00N" # Offset to Affine2x2
|
||||
b"\x00\x00" # ColorLine.Extend (0 or "pad")
|
||||
b"\x00\x02" # ColorLine.StopCount (2)
|
||||
b"\x00\x00" # ColorLine.ColorStop[0].StopOffset.value (0.0)
|
||||
b"\x00\x00\x00\x00"
|
||||
b"\x00\x06" # ColorLine.ColorStop[0].Color.PaletteIndex (6)
|
||||
b"\x00\x00"
|
||||
b"\x00\x00\x00\x00"
|
||||
b"@\x00" # ColorLine.ColorStop[1].StopOffset.value (1.0)
|
||||
b"\x00\x00\x00\x00"
|
||||
b"\x00\x07" # ColorLine.ColorStop[1].Color.PaletteIndex (7)
|
||||
b"\x19\x9a" # ColorLine.ColorStop[1].Color.Transparency.value (0.4)
|
||||
b"\x00\x00\x00\x00"
|
||||
b"\xff\xf3\x00\x00" # Affine2x2.xx.value (-13)
|
||||
b"\x00\x00\x00\x00"
|
||||
b"\x00\x0e\x00\x00" # Affine2x2.xy.value (14)
|
||||
b"\x00\x00\x00\x00"
|
||||
b"\x00\x0f\x00\x00" # Affine2x2.yx.value (15)
|
||||
b"\x00\x00\x00\x00"
|
||||
b"\xff\xef\x00\x00" # Affine2x2.yy.value (-17)
|
||||
b"\x00\x00\x00\x00"
|
||||
)
|
||||
|
||||
dump(colr, font)
|
||||
assert getXML(colr.toXML, font) == COLR_XML
|
||||
|
||||
COLR_V1_XML = [
|
||||
'<Version value="1"/>',
|
||||
"<!-- BaseGlyphRecordCount=1 -->",
|
||||
"<BaseGlyphRecordArray>",
|
||||
' <BaseGlyphRecord index="0">',
|
||||
' <BaseGlyph value="glyph00006"/>',
|
||||
' <FirstLayerIndex value="0"/>',
|
||||
' <NumLayers value="3"/>',
|
||||
" </BaseGlyphRecord>",
|
||||
"</BaseGlyphRecordArray>",
|
||||
"<LayerRecordArray>",
|
||||
' <LayerRecord index="0">',
|
||||
' <LayerGlyph value="glyph00007"/>',
|
||||
' <PaletteIndex value="0"/>',
|
||||
" </LayerRecord>",
|
||||
' <LayerRecord index="1">',
|
||||
' <LayerGlyph value="glyph00008"/>',
|
||||
' <PaletteIndex value="1"/>',
|
||||
" </LayerRecord>",
|
||||
' <LayerRecord index="2">',
|
||||
' <LayerGlyph value="glyph00009"/>',
|
||||
' <PaletteIndex value="2"/>',
|
||||
" </LayerRecord>",
|
||||
"</LayerRecordArray>",
|
||||
"<!-- LayerRecordCount=3 -->",
|
||||
"<BaseGlyphV1Array>",
|
||||
" <!-- BaseGlyphCount=1 -->",
|
||||
' <BaseGlyphV1Record index="0">',
|
||||
' <BaseGlyph value="glyph00010"/>',
|
||||
" <LayerV1Array>",
|
||||
" <!-- LayerCount=3 -->",
|
||||
' <LayerV1Record index="0">',
|
||||
' <LayerGlyph value="glyph00011"/>',
|
||||
' <Paint Format="1">',
|
||||
" <Color>",
|
||||
' <PaletteIndex value="2"/>',
|
||||
' <Transparency value="0.5"/>',
|
||||
" </Color>",
|
||||
" </Paint>",
|
||||
" </LayerV1Record>",
|
||||
' <LayerV1Record index="1">',
|
||||
' <LayerGlyph value="glyph00012"/>',
|
||||
' <Paint Format="2">',
|
||||
" <ColorLine>",
|
||||
' <Extend value="repeat"/>',
|
||||
" <!-- StopCount=3 -->",
|
||||
' <ColorStop index="0">',
|
||||
' <StopOffset value="0.0"/>',
|
||||
" <Color>",
|
||||
' <PaletteIndex value="3"/>',
|
||||
' <Transparency value="0.0"/>',
|
||||
" </Color>",
|
||||
" </ColorStop>",
|
||||
' <ColorStop index="1">',
|
||||
' <StopOffset value="0.5"/>',
|
||||
" <Color>",
|
||||
' <PaletteIndex value="4"/>',
|
||||
' <Transparency value="0.0"/>',
|
||||
" </Color>",
|
||||
" </ColorStop>",
|
||||
' <ColorStop index="2">',
|
||||
' <StopOffset value="1.0"/>',
|
||||
" <Color>",
|
||||
' <PaletteIndex value="5"/>',
|
||||
' <Transparency value="0.0"/>',
|
||||
" </Color>",
|
||||
" </ColorStop>",
|
||||
" </ColorLine>",
|
||||
" <p0>",
|
||||
' <x value="1"/>',
|
||||
' <y value="2"/>',
|
||||
" </p0>",
|
||||
" <p1>",
|
||||
' <x value="-3"/>',
|
||||
' <y value="-4"/>',
|
||||
" </p1>",
|
||||
" <p2>",
|
||||
' <x value="5"/>',
|
||||
' <y value="6"/>',
|
||||
" </p2>",
|
||||
" </Paint>",
|
||||
" </LayerV1Record>",
|
||||
' <LayerV1Record index="2">',
|
||||
' <LayerGlyph value="glyph00013"/>',
|
||||
' <Paint Format="3">',
|
||||
" <ColorLine>",
|
||||
' <Extend value="pad"/>',
|
||||
" <!-- StopCount=2 -->",
|
||||
' <ColorStop index="0">',
|
||||
' <StopOffset value="0.0"/>',
|
||||
" <Color>",
|
||||
' <PaletteIndex value="6"/>',
|
||||
' <Transparency value="0.0"/>',
|
||||
" </Color>",
|
||||
" </ColorStop>",
|
||||
' <ColorStop index="1">',
|
||||
' <StopOffset value="1.0"/>',
|
||||
" <Color>",
|
||||
' <PaletteIndex value="7"/>',
|
||||
' <Transparency value="0.4"/>',
|
||||
" </Color>",
|
||||
" </ColorStop>",
|
||||
" </ColorLine>",
|
||||
" <c0>",
|
||||
' <x value="7"/>',
|
||||
' <y value="8"/>',
|
||||
" </c0>",
|
||||
" <c1>",
|
||||
' <x value="9"/>',
|
||||
' <y value="10"/>',
|
||||
" </c1>",
|
||||
' <r0 value="11"/>',
|
||||
' <r1 value="12"/>',
|
||||
" <Affine>",
|
||||
' <xx value="-13.0"/>',
|
||||
' <xy value="14.0"/>',
|
||||
' <yx value="15.0"/>',
|
||||
' <yy value="-17.0"/>',
|
||||
" </Affine>",
|
||||
" </Paint>",
|
||||
" </LayerV1Record>",
|
||||
" </LayerV1Array>",
|
||||
" </BaseGlyphV1Record>",
|
||||
"</BaseGlyphV1Array>",
|
||||
]
|
||||
|
||||
|
||||
class COLR_V1_Test(object):
|
||||
def test_decompile_and_compile(self, font):
|
||||
colr = table_C_O_L_R_()
|
||||
colr.decompile(COLR_V1_DATA, font)
|
||||
assert colr.compile(font) == COLR_V1_DATA
|
||||
|
||||
def test_decompile_and_dump_xml(self, font):
|
||||
colr = table_C_O_L_R_()
|
||||
colr.decompile(COLR_V1_DATA, font)
|
||||
|
||||
dump(colr, font)
|
||||
assert getXML(colr.toXML, font) == COLR_V1_XML
|
||||
|
||||
def test_load_from_xml_and_compile(self, font):
|
||||
colr = table_C_O_L_R_()
|
||||
for name, attrs, content in parseXML(COLR_V1_XML):
|
||||
colr.fromXML(name, attrs, content, font)
|
||||
|
||||
assert colr.compile(font) == COLR_V1_DATA
|
||||
|
Loading…
x
Reference in New Issue
Block a user