colorLib: add buildCOLR and buildCPAL

This commit is contained in:
Cosimo Lupo 2020-02-10 17:31:14 +00:00
parent 3826fc7d60
commit 191a036f26
No known key found for this signature in database
GPG Key ID: 20D4A261E4A0E642
3 changed files with 57 additions and 0 deletions

View File

View File

@ -0,0 +1,54 @@
from fontTools.ttLib import newTable
from .errors import ColorLibError
def buildCOLR(colorLayers):
"""Build COLR table from color layers mapping.
Args:
colorLayers: Dict[str, List[Tuple[str, int]]]: map of base glyph names (str)
to lists of layer glyph names (str) and palette indices (int) tuples.
Return:
A new COLRv0 table.
"""
from fontTools.ttLib.tables.C_O_L_R_ import LayerRecord
colorLayerLists = {}
for baseGlyphName, layers in colorLayers.items():
colorLayerLists[baseGlyphName] = [
LayerRecord(layerGlyphName, colorID) for layerGlyphName, colorID in layers
]
colr = newTable("COLR")
colr.version = 0
colr.ColorLayers = colorLayerLists
return colr
def buildCPAL(palettes):
"""Build CPAL table from list of color palettes.
Args:
palettes: List[List[Tuple[float, float, float, float]]]: list of lists
colors encoded as tuples of (R, G, B, A) floats.
Return:
A new CPALv0 table.
"""
from fontTools.ttLib.tables.C_P_A_L_ import Color
if len({len(p) for p in palettes}) != 1:
raise ColorLibError("color palettes have different lengths")
cpal = newTable("CPAL")
# TODO(anthotype): Support version 1 with palette types, labels and entry labels.
cpal.version = 0
cpal.numPaletteEntries = len(palettes[0])
cpal.palettes = [
[
Color(*(round(v * 255) for v in (blue, green, red, alpha)))
for red, green, blue, alpha in palette
]
for palette in palettes
]
return cpal

View File

@ -0,0 +1,3 @@
class ColorLibError(Exception):
pass