Color fonts (COLR / CPAL)

COLR/CPAL color-glyph fonts render their visible artwork as native PDF vector content. An embedded subset supplies invisible selectable/searchable text, while per-glyph /ActualText preserves exact emoji sequences when copied. The row below is the real COLR v1 build of Noto Color Emoji (gradients, transforms, compositing all handled).

πŸ˜€ ❀ πŸ‘ πŸš€ 🌈 ⭐ πŸ”₯ πŸ™‚

COLR paint features

The same pipeline, broken down by paint type (hand-authored COLR v1 fixture):

A
Layered solids
PaintColrLayers β†’ red box under a green triangle
B
Single solid
PaintGlyph β†’ PaintSolid (blue)
G
Linear gradient
PaintLinearGradient (red β†’ blue)
T
Transform
PaintTranslate over a yellow triangle
M
Blend compositing
PaintComposite MULTIPLY (blue Γ— yellow β†’ black)
F
Reflect gradient
PaintLinearGradient, EXTEND_REFLECT

CFF outlines, Porter-Duff compositing and gradient geometry

A COLR v1 font over CFF (OpenType) outlines paints like one over TrueType outlines. Composite modes (a blue triangle source over a yellow box backdrop) and radial/linear gradient geometry:

3
SRC_IN
the triangle, only where the box is
5
SRC_ATOP
box, with the triangle inside it
6
DEST_OVER
triangle beneath the box
0
Radial inner radius
r0 = 150: flat color inside it
1
Radial repeat
EXTEND_REPEAT, concentric
2
Linear p2 rotation
color lines parallel to p0β†’p2
A
SRC_OUT
the triangle outside the box: nothing
B
DEST_OUT
the box outside the triangle
E
Two-circle radial
different centers, r0 = 100

Drawn through the raster backend

A PDF has no additive blend and a PDF shading can only pad, so a glyph with a PLUS composite, or a repeating/reflecting radial gradient between circles with different centers, is painted once on a pixel canvas and embedded as a picture. Every other glyph stays vector.

D
PLUS
yellow + blue adds to white where they overlap
N
Cone repeat
EXTEND_REPEAT, different centers
O
Cone reflect
EXTEND_REFLECT, different centers

Emoji sequences

A multi-codepoint emoji sequence composes into the single glyph the font defines for it, via the font's ccmp feature β€” which is where Noto Color Emoji keeps every one of these (it declares no liga/rlig at all). A U+FE0F variation selector inside a sequence draws nothing of its own and does not stop the ligature forming.

πŸ³οΈβ€πŸŒˆ
ZWJ + VS16
U+1F3F3 U+FE0F U+200D U+1F308
πŸ‘©β€πŸ’»
ZWJ sequence
U+1F469 U+200D U+1F4BB
πŸ‡ΊπŸ‡Έ
Regional indicators
U+1F1FA U+1F1F8
πŸ‡―πŸ‡΅
Regional indicators
U+1F1EF U+1F1F5
🏴󠁧󠁒󠁳󠁣󠁴󠁿
Tag sequence
U+1F3F4 + 5 TAG letters + U+E007F
❀️
Lone VS16
U+2764 U+FE0F β€” selector draws nothing

Skin tone modifiers (U+1F3FB–U+1F3FF) compose the same way. Unlike a variation selector these are not default-ignorable β€” each has a real swatch glyph β€” so a font whose ccmp never ran renders the base emoji followed by a bare coloured square rather than the modified emoji.

πŸ‘ πŸ‘πŸ» πŸ‘πŸΌ πŸ‘πŸ½ πŸ‘πŸΎ πŸ‘πŸΏ