from fontTools.ttLib.tables import otTables as ot
from .table_builder import TableUnbuilder


def unbuildColrV1(layerList, baseGlyphList):
    layers = []
    if layerList:
        layers = layerList.Paint
    unbuilder = LayerListUnbuilder(layers)
    return {
        rec.BaseGlyph: unbuilder.unbuildPaint(rec.Paint)
        for rec in baseGlyphList.BaseGlyphPaintRecord
    }


def _flatten_layers(lst):
    for paint in lst:
        if paint["Format"] == ot.PaintFormat.PaintColrLayers:
            yield from _flatten_layers(paint["Layers"])
        else:
            yield paint


class LayerListUnbuilder:
    def __init__(self, layers):
        self.layers = layers

        callbacks = {
            (
                ot.Paint,
                ot.PaintFormat.PaintColrLayers,
            ): self._unbuildPaintColrLayers,
        }
        self.tableUnbuilder = TableUnbuilder(callbacks)

    def unbuildPaint(self, paint):
        assert isinstance(paint, ot.Paint)
        return self.tableUnbuilder.unbuild(paint)

    def _unbuildPaintColrLayers(self, source):
        assert source["Format"] == ot.PaintFormat.PaintColrLayers

        layers = list(
            _flatten_layers(
                [
                    self.unbuildPaint(childPaint)
                    for childPaint in self.layers[
                        source["FirstLayerIndex"] : source["FirstLayerIndex"]
                        + source["NumLayers"]
                    ]
                ]
            )
        )

        if len(layers) == 1:
            return layers[0]

        return {"Format": source["Format"], "Layers": layers}


if __name__ == "__main__":
    from pprint import pprint
    import sys
    from fontTools.ttLib import TTFont

    try:
        fontfile = sys.argv[1]
    except IndexError:
        sys.exit("usage: fonttools colorLib.unbuilder FONTFILE")

    font = TTFont(fontfile)
    colr = font["COLR"]
    if colr.version < 1:
        sys.exit(f"error: No COLR table version=1 found in {fontfile}")

    colorGlyphs = unbuildColrV1(
        colr.table.LayerList,
        colr.table.BaseGlyphList,
    )

    pprint(colorGlyphs)

bb9b5218c0910f5839dd0af99f6603eb80fa4ee6
<mask token>


class LayerListUnbuilder:

    def __init__(self, layers):
        self.layers = layers
        callbacks = {(ot.Paint, ot.PaintFormat.PaintColrLayers): self.
            _unbuildPaintColrLayers}
        self.tableUnbuilder = TableUnbuilder(callbacks)
    <mask token>

    def _unbuildPaintColrLayers(self, source):
        assert source['Format'] == ot.PaintFormat.PaintColrLayers
        layers = list(_flatten_layers([self.unbuildPaint(childPaint) for
            childPaint in self.layers[source['FirstLayerIndex']:source[
            'FirstLayerIndex'] + source['NumLayers']]]))
        if len(layers) == 1:
            return layers[0]
        return {'Format': source['Format'], 'Layers': layers}


<mask token>

<mask token>


def unbuildColrV1(layerList, baseGlyphList):
    layers = []
    if layerList:
        layers = layerList.Paint
    unbuilder = LayerListUnbuilder(layers)
    return {rec.BaseGlyph: unbuilder.unbuildPaint(rec.Paint) for rec in
        baseGlyphList.BaseGlyphPaintRecord}


def _flatten_layers(lst):
    for paint in lst:
        if paint['Format'] == ot.PaintFormat.PaintColrLayers:
            yield from _flatten_layers(paint['Layers'])
        else:
            yield paint


class LayerListUnbuilder:

    def __init__(self, layers):
        self.layers = layers
        callbacks = {(ot.Paint, ot.PaintFormat.PaintColrLayers): self.
            _unbuildPaintColrLayers}
        self.tableUnbuilder = TableUnbuilder(callbacks)

    def unbuildPaint(self, paint):
        assert isinstance(paint, ot.Paint)
        return self.tableUnbuilder.unbuild(paint)

    def _unbuildPaintColrLayers(self, source):
        assert source['Format'] == ot.PaintFormat.PaintColrLayers
        layers = list(_flatten_layers([self.unbuildPaint(childPaint) for
            childPaint in self.layers[source['FirstLayerIndex']:source[
            'FirstLayerIndex'] + source['NumLayers']]]))
        if len(layers) == 1:
            return layers[0]
        return {'Format': source['Format'], 'Layers': layers}


<mask token>

<mask token>


def unbuildColrV1(layerList, baseGlyphList):
    layers = []
    if layerList:
        layers = layerList.Paint
    unbuilder = LayerListUnbuilder(layers)
    return {rec.BaseGlyph: unbuilder.unbuildPaint(rec.Paint) for rec in
        baseGlyphList.BaseGlyphPaintRecord}


def _flatten_layers(lst):
    for paint in lst:
        if paint['Format'] == ot.PaintFormat.PaintColrLayers:
            yield from _flatten_layers(paint['Layers'])
        else:
            yield paint


class LayerListUnbuilder:

    def __init__(self, layers):
        self.layers = layers
        callbacks = {(ot.Paint, ot.PaintFormat.PaintColrLayers): self.
            _unbuildPaintColrLayers}
        self.tableUnbuilder = TableUnbuilder(callbacks)

    def unbuildPaint(self, paint):
        assert isinstance(paint, ot.Paint)
        return self.tableUnbuilder.unbuild(paint)

    def _unbuildPaintColrLayers(self, source):
        assert source['Format'] == ot.PaintFormat.PaintColrLayers
        layers = list(_flatten_layers([self.unbuildPaint(childPaint) for
            childPaint in self.layers[source['FirstLayerIndex']:source[
            'FirstLayerIndex'] + source['NumLayers']]]))
        if len(layers) == 1:
            return layers[0]
        return {'Format': source['Format'], 'Layers': layers}


if __name__ == '__main__':
    from pprint import pprint
    import sys
    from fontTools.ttLib import TTFont
    try:
        fontfile = sys.argv[1]
    except IndexError:
        sys.exit('usage: fonttools colorLib.unbuilder FONTFILE')
    font = TTFont(fontfile)
    colr = font['COLR']
    if colr.version < 1:
        sys.exit(f'error: No COLR table version=1 found in {fontfile}')
    colorGlyphs = unbuildColrV1(colr.table.LayerList, colr.table.BaseGlyphList)
    pprint(colorGlyphs)

from fontTools.ttLib.tables import otTables as ot
from .table_builder import TableUnbuilder


def unbuildColrV1(layerList, baseGlyphList):
    layers = []
    if layerList:
        layers = layerList.Paint
    unbuilder = LayerListUnbuilder(layers)
    return {rec.BaseGlyph: unbuilder.unbuildPaint(rec.Paint) for rec in
        baseGlyphList.BaseGlyphPaintRecord}


def _flatten_layers(lst):
    for paint in lst:
        if paint['Format'] == ot.PaintFormat.PaintColrLayers:
            yield from _flatten_layers(paint['Layers'])
        else:
            yield paint


class LayerListUnbuilder:

    def __init__(self, layers):
        self.layers = layers
        callbacks = {(ot.Paint, ot.PaintFormat.PaintColrLayers): self.
            _unbuildPaintColrLayers}
        self.tableUnbuilder = TableUnbuilder(callbacks)

    def unbuildPaint(self, paint):
        assert isinstance(paint, ot.Paint)
        return self.tableUnbuilder.unbuild(paint)

    def _unbuildPaintColrLayers(self, source):
        assert source['Format'] == ot.PaintFormat.PaintColrLayers
        layers = list(_flatten_layers([self.unbuildPaint(childPaint) for
            childPaint in self.layers[source['FirstLayerIndex']:source[
            'FirstLayerIndex'] + source['NumLayers']]]))
        if len(layers) == 1:
            return layers[0]
        return {'Format': source['Format'], 'Layers': layers}


if __name__ == '__main__':
    from pprint import pprint
    import sys
    from fontTools.ttLib import TTFont
    try:
        fontfile = sys.argv[1]
    except IndexError:
        sys.exit('usage: fonttools colorLib.unbuilder FONTFILE')
    font = TTFont(fontfile)
    colr = font['COLR']
    if colr.version < 1:
        sys.exit(f'error: No COLR table version=1 found in {fontfile}')
    colorGlyphs = unbuildColrV1(colr.table.LayerList, colr.table.BaseGlyphList)
    pprint(colorGlyphs)

from fontTools.ttLib.tables import otTables as ot
from .table_builder import TableUnbuilder


def unbuildColrV1(layerList, baseGlyphList):
    layers = []
    if layerList:
        layers = layerList.Paint
    unbuilder = LayerListUnbuilder(layers)
    return {
        rec.BaseGlyph: unbuilder.unbuildPaint(rec.Paint)
        for rec in baseGlyphList.BaseGlyphPaintRecord
    }


def _flatten_layers(lst):
    for paint in lst:
        if paint["Format"] == ot.PaintFormat.PaintColrLayers:
            yield from _flatten_layers(paint["Layers"])
        else:
            yield paint


class LayerListUnbuilder:
    def __init__(self, layers):
        self.layers = layers

        callbacks = {
            (
                ot.Paint,
                ot.PaintFormat.PaintColrLayers,
            ): self._unbuildPaintColrLayers,
        }
        self.tableUnbuilder = TableUnbuilder(callbacks)

    def unbuildPaint(self, paint):
        assert isinstance(paint, ot.Paint)
        return self.tableUnbuilder.unbuild(paint)

    def _unbuildPaintColrLayers(self, source):
        assert source["Format"] == ot.PaintFormat.PaintColrLayers

        layers = list(
            _flatten_layers(
                [
                    self.unbuildPaint(childPaint)
                    for childPaint in self.layers[
                        source["FirstLayerIndex"] : source["FirstLayerIndex"]
                        + source["NumLayers"]
                    ]
                ]
            )
        )

        if len(layers) == 1:
            return layers[0]

        return {"Format": source["Format"], "Layers": layers}


if __name__ == "__main__":
    from pprint import pprint
    import sys
    from fontTools.ttLib import TTFont

    try:
        fontfile = sys.argv[1]
    except IndexError:
        sys.exit("usage: fonttools colorLib.unbuilder FONTFILE")

    font = TTFont(fontfile)
    colr = font["COLR"]
    if colr.version < 1:
        sys.exit(f"error: No COLR table version=1 found in {fontfile}")

    colorGlyphs = unbuildColrV1(
        colr.table.LayerList,
        colr.table.BaseGlyphList,
    )

    pprint(colorGlyphs)
