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).
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 |
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 |
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 |
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.