Skip to content

Commit b3a1576

Browse files
authored
Merge pull request #494 from treeform/dev
Use chroma's blends better.
2 parents 779b39a + de14eed commit b3a1576

1 file changed

Lines changed: 5 additions & 119 deletions

File tree

src/pixie/blends.nim

Lines changed: 5 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -38,25 +38,6 @@ proc alphaFix(backdrop, source, mixed: ColorRGBA): ColorRGBA =
3838
result.b = (b div a div 255).uint8
3939
result.a = a.uint8
4040

41-
proc alphaFix(backdrop, source, mixed: Color): Color =
42-
## After mixing an image, adjust its alpha value to be correct.
43-
result.a = (source.a + backdrop.a * (1.0 - source.a))
44-
if result.a == 0:
45-
return
46-
47-
let
48-
t0 = source.a * (1 - backdrop.a)
49-
t1 = source.a * backdrop.a
50-
t2 = (1 - source.a) * backdrop.a
51-
52-
result.r = t0 * source.r + t1 * mixed.r + t2 * backdrop.r
53-
result.g = t0 * source.g + t1 * mixed.g + t2 * backdrop.g
54-
result.b = t0 * source.b + t1 * mixed.b + t2 * backdrop.b
55-
56-
result.r /= result.a
57-
result.g /= result.a
58-
result.b /= result.a
59-
6041
proc blendAlpha*(backdrop, source: uint8): uint8 {.inline.} =
6142
## Blends alphas of backdrop, source.
6243
source + ((backdrop.uint32 * (255 - source)) div 255).uint8
@@ -76,65 +57,6 @@ proc hardLight(
7657
else:
7758
screen(backdropColor, sourceColor)
7859

79-
proc softLight(backdrop, source: float32): float32 {.inline.} =
80-
## Pegtop
81-
(1 - 2 * source) * backdrop ^ 2 + 2 * source * backdrop
82-
83-
proc `+`(c: Color, v: float32): Color {.inline.} =
84-
result.r = c.r + v
85-
result.g = c.g + v
86-
result.b = c.b + v
87-
result.a = c.a + v
88-
89-
proc `+`(v: float32, c: Color): Color {.inline.} =
90-
c + v
91-
92-
proc `*`(c: Color, v: float32): Color {.inline.} =
93-
result.r = c.r * v
94-
result.g = c.g * v
95-
result.b = c.b * v
96-
result.a = c.a * v
97-
98-
proc `/`(c: Color, v: float32): Color {.inline.} =
99-
result.r = c.r / v
100-
result.g = c.g / v
101-
result.b = c.b / v
102-
result.a = c.a / v
103-
104-
proc `-`(c: Color, v: float32): Color {.inline.} =
105-
result.r = c.r - v
106-
result.g = c.g - v
107-
result.b = c.b - v
108-
result.a = c.a - v
109-
110-
proc Lum(C: Color): float32 {.inline.} =
111-
0.3 * C.r + 0.59 * C.g + 0.11 * C.b
112-
113-
proc ClipColor(C: var Color) {.inline.} =
114-
let
115-
L = Lum(C)
116-
n = min([C.r, C.g, C.b])
117-
x = max([C.r, C.g, C.b])
118-
if n < 0:
119-
C = L + (((C - L) * L) / (L - n))
120-
if x > 1:
121-
C = L + (((C - L) * (1 - L)) / (x - L))
122-
123-
proc SetLum(C: Color, l: float32): Color {.inline.} =
124-
let d = l - Lum(C)
125-
result.r = C.r + d
126-
result.g = C.g + d
127-
result.b = C.b + d
128-
ClipColor(result)
129-
130-
proc Sat(C: Color): float32 {.inline.} =
131-
max([C.r, C.g, C.b]) - min([C.r, C.g, C.b])
132-
133-
proc SetSat(C: Color, s: float32): Color {.inline.} =
134-
let satC = Sat(C)
135-
if satC > 0:
136-
result = (C - min([C.r, C.g, C.b])) * s / satC
137-
13860
proc blendNormal*(backdrop, source: ColorRGBX): ColorRGBX {.inline.} =
13961
if backdrop.a == 0 or source.a == 255:
14062
return source
@@ -257,27 +179,7 @@ proc blendOverlay*(backdrop, source: ColorRGBX): ColorRGBX =
257179
result.a = blendAlpha(backdrop.a, source.a)
258180

259181
proc blendSoftLight*(backdrop, source: ColorRGBX): ColorRGBX =
260-
# proc softLight(backdrop, source: int32): uint8 {.inline.} =
261-
# ## Pegtop
262-
# (
263-
# ((255 - 2 * source) * backdrop ^ 2) div 255 ^ 2 +
264-
# (2 * source * backdrop) div 255
265-
# ).uint8
266-
267-
let
268-
backdrop = backdrop.rgba()
269-
source = source.rgba()
270-
271-
let
272-
b = backdrop.color
273-
s = source.color
274-
var blended: Color
275-
blended.r = softLight(b.r, s.r)
276-
blended.g = softLight(b.g, s.g)
277-
blended.b = softLight(b.b, s.b)
278-
blended = alphaFix(b, s, blended)
279-
280-
result = blended.rgbx()
182+
blendSoftLight(backdrop.color, source.color).rgbx
281183

282184
proc blendHardLight*(backdrop, source: ColorRGBX): ColorRGBX =
283185
result.r = hardLight(backdrop.r, backdrop.a, source.r, source.a)
@@ -311,32 +213,16 @@ proc blendExclusion*(backdrop, source: ColorRGBX): ColorRGBX =
311213
result.a = blendAlpha(backdrop.a, source.a)
312214

313215
proc blendColor*(backdrop, source: ColorRGBX): ColorRGBX =
314-
let
315-
backdrop = backdrop.rgba().color
316-
source = source.rgba().color
317-
blended = SetLum(source, Lum(backdrop))
318-
result = alphaFix(backdrop, source, blended).rgba.rgbx()
216+
blendColor(backdrop.color, source.color).rgbx
319217

320218
proc blendLuminosity*(backdrop, source: ColorRGBX): ColorRGBX =
321-
let
322-
backdrop = backdrop.rgba().color
323-
source = source.rgba().color
324-
blended = SetLum(backdrop, Lum(source))
325-
result = alphaFix(backdrop, source, blended).rgba.rgbx()
219+
blendLuminosity(backdrop.color, source.color).rgbx
326220

327221
proc blendHue*(backdrop, source: ColorRGBX): ColorRGBX =
328-
let
329-
backdrop = backdrop.rgba().color
330-
source = source.rgba().color
331-
blended = SetLum(SetSat(source, Sat(backdrop)), Lum(backdrop))
332-
result = alphaFix(backdrop, source, blended).rgba.rgbx()
222+
blendHue(backdrop.color, source.color).rgbx
333223

334224
proc blendSaturation*(backdrop, source: ColorRGBX): ColorRGBX =
335-
let
336-
backdrop = backdrop.rgba().color
337-
source = source.rgba().color
338-
blended = SetLum(SetSat(backdrop, Sat(source)), Lum(backdrop))
339-
result = alphaFix(backdrop, source, blended).rgba.rgbx()
225+
blendSaturation(backdrop.color, source.color).rgbx
340226

341227
proc blendMask*(backdrop, source: ColorRGBX): ColorRGBX {.inline.} =
342228
let k = source.a.uint32

0 commit comments

Comments
 (0)