mirror of
https://github.com/storytold/deckcraft.git
synced 2026-10-26 11:36:58 -06:00
* Emoji: colour glyphs, and emoji take the colour emoji font Emoji were drawn as black outlines from a symbol font, with ZWJ sequences (families, flags) falling apart into their parts. Now: - an emoji cluster (emoji presentation, U+FE0F, ZWJ between pictographs, skin tones, regional indicators, keycaps) takes an installed colour font (COLR, CBDT, sbix or SVG tables) before the document's fonts, so its sequences ligate as in PowerPoint; U+FE0E keeps a plain face; - COLR v0 and v1 glyphs are painted in their CPAL colours (solid fills, linear, radial and sweep gradients, transforms, composite modes), with palette index 0xFFFF in the text colour. A tiny COLRv0 test font (two squares, CC0, regenerated by make_colr_font.py) backs the render test. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * Render: lock skrifa for colour glyphs Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
52 lines
1.8 KiB
Python
52 lines
1.8 KiB
Python
"""Build the COLR test font: DeckCraft Colr Squares (contributor-original, CC0-1.0).
|
|
|
|
Usage: python make_colr_font.py colr-squares.ttf (needs fontTools)
|
|
|
|
U+E000: a 1000x1000 red square (palette 0) with a 400x400 blue square (palette 1) in its middle.
|
|
U+E001: a 1000x1000 square in the text colour (palette index 0xFFFF).
|
|
Plain outlines of the base glyphs are a single square, as colour fonts carry for renderers
|
|
without colour support.
|
|
"""
|
|
import sys
|
|
|
|
from fontTools.fontBuilder import FontBuilder
|
|
from fontTools.pens.ttGlyphPen import TTGlyphPen
|
|
from fontTools.colorLib.builder import buildCOLR, buildCPAL
|
|
|
|
|
|
def square(x0, y0, x1, y1):
|
|
pen = TTGlyphPen(None)
|
|
pen.moveTo((x0, y0))
|
|
pen.lineTo((x0, y1))
|
|
pen.lineTo((x1, y1))
|
|
pen.lineTo((x1, y0))
|
|
pen.closePath()
|
|
return pen.glyph()
|
|
|
|
|
|
def empty():
|
|
return TTGlyphPen(None).glyph()
|
|
|
|
|
|
order = [".notdef", "space", "redblue", "ink", "big", "small"]
|
|
fb = FontBuilder(1000, isTTF=True)
|
|
fb.setupGlyphOrder(order)
|
|
fb.setupCharacterMap({0x20: "space", 0xE000: "redblue", 0xE001: "ink"})
|
|
fb.setupGlyf({
|
|
".notdef": empty(),
|
|
"space": empty(),
|
|
"redblue": square(0, 0, 1000, 1000),
|
|
"ink": square(0, 0, 1000, 1000),
|
|
"big": square(0, 0, 1000, 1000),
|
|
"small": square(300, 300, 700, 700),
|
|
})
|
|
fb.setupHorizontalMetrics({g: (1000, 0) for g in order})
|
|
fb.setupHorizontalHeader(ascent=1000, descent=0)
|
|
fb.setupNameTable({"familyName": "DeckCraft Colr Squares", "styleName": "Regular"})
|
|
fb.setupOS2(sTypoAscender=1000, sTypoDescender=0, usWinAscent=1000, usWinDescent=0)
|
|
fb.setupPost()
|
|
fb.font["COLR"] = buildCOLR({"redblue": [("big", 0), ("small", 1)], "ink": [("big", 0xFFFF)]}, version=0)
|
|
fb.font["CPAL"] = buildCPAL([[(1.0, 0.0, 0.0, 1.0), (0.0, 0.0, 1.0, 1.0)]])
|
|
fb.save(sys.argv[1])
|
|
print("saved", sys.argv[1])
|