Coverage for /usr/lib/python3/dist-packages/fontTools/colorLib/unbuilder.py: 22%
41 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-14 15:55 +0200
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-14 15:55 +0200
1from fontTools.ttLib.tables import otTables as ot
2from .table_builder import TableUnbuilder
5def unbuildColrV1(layerList, baseGlyphList):
6 layers = []
7 if layerList:
8 layers = layerList.Paint
9 unbuilder = LayerListUnbuilder(layers)
10 return {
11 rec.BaseGlyph: unbuilder.unbuildPaint(rec.Paint)
12 for rec in baseGlyphList.BaseGlyphPaintRecord
13 }
16def _flatten_layers(lst):
17 for paint in lst:
18 if paint["Format"] == ot.PaintFormat.PaintColrLayers:
19 yield from _flatten_layers(paint["Layers"])
20 else:
21 yield paint
24class LayerListUnbuilder:
25 def __init__(self, layers):
26 self.layers = layers
28 callbacks = {
29 (
30 ot.Paint,
31 ot.PaintFormat.PaintColrLayers,
32 ): self._unbuildPaintColrLayers,
33 }
34 self.tableUnbuilder = TableUnbuilder(callbacks)
36 def unbuildPaint(self, paint):
37 assert isinstance(paint, ot.Paint)
38 return self.tableUnbuilder.unbuild(paint)
40 def _unbuildPaintColrLayers(self, source):
41 assert source["Format"] == ot.PaintFormat.PaintColrLayers
43 layers = list(
44 _flatten_layers(
45 [
46 self.unbuildPaint(childPaint)
47 for childPaint in self.layers[
48 source["FirstLayerIndex"] : source["FirstLayerIndex"]
49 + source["NumLayers"]
50 ]
51 ]
52 )
53 )
55 if len(layers) == 1:
56 return layers[0]
58 return {"Format": source["Format"], "Layers": layers}
61if __name__ == "__main__":
62 from pprint import pprint
63 import sys
64 from fontTools.ttLib import TTFont
66 try:
67 fontfile = sys.argv[1]
68 except IndexError:
69 sys.exit("usage: fonttools colorLib.unbuilder FONTFILE")
71 font = TTFont(fontfile)
72 colr = font["COLR"]
73 if colr.version < 1:
74 sys.exit(f"error: No COLR table version=1 found in {fontfile}")
76 colorGlyphs = unbuildColrV1(
77 colr.table.LayerList,
78 colr.table.BaseGlyphList,
79 )
81 pprint(colorGlyphs)