unbuilder.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. from fontTools.ttLib.tables import otTables as ot
  2. from .table_builder import TableUnbuilder
  3. def unbuildColrV1(layerList, baseGlyphList):
  4. layers = []
  5. if layerList:
  6. layers = layerList.Paint
  7. unbuilder = LayerListUnbuilder(layers)
  8. return {
  9. rec.BaseGlyph: unbuilder.unbuildPaint(rec.Paint)
  10. for rec in baseGlyphList.BaseGlyphPaintRecord
  11. }
  12. def _flatten_layers(lst):
  13. for paint in lst:
  14. if paint["Format"] == ot.PaintFormat.PaintColrLayers:
  15. yield from _flatten_layers(paint["Layers"])
  16. else:
  17. yield paint
  18. class LayerListUnbuilder:
  19. def __init__(self, layers):
  20. self.layers = layers
  21. callbacks = {
  22. (
  23. ot.Paint,
  24. ot.PaintFormat.PaintColrLayers,
  25. ): self._unbuildPaintColrLayers,
  26. }
  27. self.tableUnbuilder = TableUnbuilder(callbacks)
  28. def unbuildPaint(self, paint):
  29. assert isinstance(paint, ot.Paint)
  30. return self.tableUnbuilder.unbuild(paint)
  31. def _unbuildPaintColrLayers(self, source):
  32. assert source["Format"] == ot.PaintFormat.PaintColrLayers
  33. layers = list(
  34. _flatten_layers(
  35. [
  36. self.unbuildPaint(childPaint)
  37. for childPaint in self.layers[
  38. source["FirstLayerIndex"] : source["FirstLayerIndex"]
  39. + source["NumLayers"]
  40. ]
  41. ]
  42. )
  43. )
  44. if len(layers) == 1:
  45. return layers[0]
  46. return {"Format": source["Format"], "Layers": layers}
  47. if __name__ == "__main__":
  48. from pprint import pprint
  49. import sys
  50. from fontTools.ttLib import TTFont
  51. try:
  52. fontfile = sys.argv[1]
  53. except IndexError:
  54. sys.exit("usage: fonttools colorLib.unbuilder FONTFILE")
  55. font = TTFont(fontfile)
  56. colr = font["COLR"]
  57. if colr.version < 1:
  58. sys.exit(f"error: No COLR table version=1 found in {fontfile}")
  59. colorGlyphs = unbuildColrV1(
  60. colr.table.LayerList,
  61. colr.table.BaseGlyphList,
  62. )
  63. pprint(colorGlyphs)