reset

fire

For outlines, drawings

Texturing

Core Graphics, WPF

Jeff Amelang

MyFill : Texture ⇒ TransformPoints((1,0,0,1,-120,-120)) → Gradient( RadialGradientShape((0,0), 50), GradientExtendReflect, GradientColorSpan((0.7,0,1,0), (0,0,-1,1), 1)) MyComp : Compositor ⇒ CompositeDstOut Main (bg: Texture, write: Texture) : Bezier >> Color ⇒ TransformBeziers((1,0,0,1,120,120)) → Rasterize → ApplyTexture(CompositeTextures(MyFill, bg, MyComp)) → write

Gradients, bitmaps, extend modes

fire

reset

Rasterization

reset

fire

(a : Color) ⊕ (b : Color) : Color a × (1 - b.a) + b × (1 - a.a) CompositeClear : Compositor ∀ (a, b) >> 0 CompositeSrc : Compositor ∀ (a, b) >> a CompositeDst : Compositor ∀ (a, b) >> b CompositeOver : Compositor ∀ (a, b) >> a + b × (1 - a.a) CompositeDstOver : Compositor ∀ (a, b) >> b + a × (1 - b.a) CompositeSrcIn : Compositor ∀ (a, b) >> a × b.a CompositeDstIn : Compositor ∀ (a, b) >> b × a.a CompositeSrcOut : Compositor ∀ (a, b) >> a × (1 - b.a) CompositeDstOut : Compositor ∀ (a, b) >> b × (1 - a.a) CompositeSrcAtop : Compositor ∀ (a, b) >> a × b.a + b × (1 - a.a) CompositeDstAtop : Compositor ∀ (a, b) >> b × a.a + a × (1 - b.a) CompositeXor : Compositor ∀ (a, b) >> a ⊕ b CompositePlus : Compositor ∀ (a, b) >> (a + b) ◁ 1 CompositeMultiply : Compositor ∀ (a, b) >> a × b + (a ⊕ b) CompositeScreen : Compositor ∀ (a, b) >> a + b - a × b

Bitmap filters

129 LOC

MyFill : Texture ⇒ TransformPoints((1,0,0,1,-120,-120)) → Gradient( RadialGradientShape((0,0), 50), GradientExtendReflect, GradientColorSpan((0.7,0,1,0), (0,0,-1,1), 1))

close

fire

reset

MyComp : Compositor ∀ (a, b) >> a + b × (1 - a.a)

71 LOC

3 kinds of caps and joins

Main (bg: Texture, write: Texture) : Bezier >> Color ⇒ TransformBeziers((1,0,0,1,120,120)) → Rasterize → ApplyTexture(CompositeTextures(MyFill, bg, MyComp)) → write

Main (bg: Texture, write: Texture) : Bezier >> Color ⇒ TransformBeziers((1,0,0,1,120,120)) → Rasterize → ApplyTexture(CompositeTextures(MyFill, bg, MyComp)) → write

Bilinear, bicubic, gaussian filters.

CompositeOverlay : Compositor ∀ (a, b) c = 2 × a × b + (a ⊕ b) d = a.a × b.a - 2 × (b.a - b) × (a.a - a) + (a ⊕ b) >> {c if 2 × b < b.a, d} CompositeDarken : Compositor ∀ (a, b) >> (a × b.a) ◁ (b × a.a) + (a ⊕ b) CompositeLighten : Compositor ∀ (a, b) >> (a × b.a) ▷ (b × a.a) + (a ⊕ b) CompositeColorDodge : Compositor ∀ (a, b) c = a.a × b.a + (a ⊕ b) d = (b × a.a / (1 - a / a.a) + (a ⊕ b)) ◁ 1 >> {c if a × b.a + b × a.a ≥ a.a × b.a, d} CompositeColorBurn : Compositor ∀ (a, b) c = a.a × (a × b.a + b × a.a - a.a × b.a) / a + (a ⊕ b) >> {a ⊕ b if a × b.a + b × a.a ≤ a.a × b.a, c} CompositeHardLight : Compositor ∀ (a, b) c = 2 × a × b + (a ⊕ b) d = a.a × b.a - 2 × (b.a - b) × (a.a - a) + (a ⊕ b) >> {c if 2 × a < a.a, d} CompositeSoftLight : Compositor ∀ (a, b) c = (1 - b / b.a) × (2 × a - a.a) d = b × (a.a - c) + (a ⊕ b) e = b × (a.a - c × (3 - 8 × b / b.a)) + (a ⊕ b) f = b × a.a + (√(b / b.a) × b.a - b) × (2 × a - a.a) + (a ⊕ b) >> {d if 2 × a < a.a, e if b × 8 ≤ b.a, f} CompositeDifference : Compositor ∀ (a, b) c = a + b - 2 × ((a × b.a) ◁ (b × a.a)) >> (c.a + a.a × b.a, c.r, c.g, c.b) CompositeExclusion : Compositor ∀ (a, b) c = a × b.a + b × a.a - 2 × a × b + (a ⊕ b) >> (c.a + a.a × b.a, c.r, c.g, c.b) CompositeSubtract : Compositor ∀ (a, b) >> (a + b - 1) ▷ 0 CompositeInvert : Compositor ∀ (a, b) >> (b.a, 1 - b.r, 1 - b.g, 1 - b.b)

Pen Stroking

95 LOC

used by Flash/SVG,

execute

MyFill : Texture ⇒ TransformPoints((1,0,0,1,-120,-120)) → Gradient( RadialGradientShape((0,0), 50), GradientExtendReflect, GradientColorSpan((0.7,0,1,0), (0,0,-1,1), 1)) MyComp : Compositor ⇒ CompositeInvert Main (bg: Texture, write: Texture) : Bezier >> Color ⇒ TransformBeziers((1,0,0,1,120,120)) → Rasterize → ApplyTexture(CompositeTextures(MyFill, bg, MyComp)) → write

Compositing

Nile Total 457 LOC

The 26 compositing ops

reset

execute

MyFill : Texture ⇒ TransformPoints((1,0,0,1,-120,-120)) → Gradient( RadialGradientShape((0,0), 50), GradientExtendReflect, GradientColorSpan((0.7,0,1,0), (0,0,-1,1), 1)) MyComp : Compositor ⇒ CompositeSubtract Main (bg: Texture, write: Texture) : Bezier >> Color ⇒ TransformBeziers((1,0,0,1,120,120)) → Rasterize → ApplyTexture(CompositeTextures(MyFill, bg, MyComp)) → write

~ incl. Clipping and Transformation

45 LOC

reset

reset

fire

execute

95 LOC

reset