@@ -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-
6041proc 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-
13860proc 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
259181proc 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
282184proc 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
313215proc 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
320218proc 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
327221proc 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
334224proc 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
341227proc blendMask * (backdrop, source: ColorRGBX ): ColorRGBX {.inline .} =
342228 let k = source.a.uint32
0 commit comments