27 inline static const uchar range = 255;
28 inline static const float frange = 255.0f;
32 inline static const int bytes = 1;
33 inline static const float unit = 255.0f;
60 inline const static float range = 1.0f;
61 inline const static float frange = 1.0f;
65 inline const static float unit = 1.0f;
66 inline const static int bytes = 4;
111#define EPS_SATURATION 0.0005f
117template<
typename Color,
typename Traits>
118static Color
mix_blend(Color col_src, Color col_dst,
typename Traits::BlendType fac)
120 using Value =
typename Traits::ValueType;
121 using Blend =
typename Traits::BlendType;
123 Value *cp_src, *cp_dst, *cp_mix;
124 Color col_mix(0, 0, 0, 0);
131 if (fac >= Traits::range) {
135 mfac = Traits::range - fac;
142 Blend r1 = cp_src[0] * cp_src[0];
143 Blend g1 = cp_src[1] * cp_src[1];
144 Blend b1 = cp_src[2] * cp_src[2];
145 Blend a1 = cp_src[3] * cp_src[3];
147 Blend r2 = cp_dst[0] * cp_dst[0];
148 Blend g2 = cp_dst[1] * cp_dst[1];
149 Blend b2 = cp_dst[2] * cp_dst[2];
150 Blend a2 = cp_dst[3] * cp_dst[3];
152 cp_mix[0] = Traits::round(
sqrtf(Traits::divide_round((mfac * r1 + fac * r2), Traits::range)));
153 cp_mix[1] = Traits::round(
sqrtf(Traits::divide_round((mfac * g1 + fac * g2), Traits::range)));
154 cp_mix[2] = Traits::round(
sqrtf(Traits::divide_round((mfac * b1 + fac * b2), Traits::range)));
155 cp_mix[3] = Traits::round(
sqrtf(Traits::divide_round((mfac * a1 + fac * a2), Traits::range)));
156 return Color(col_mix[0], col_mix[1], col_mix[2], col_mix[3]);
161template<
typename Color,
typename Traits>
162static Color
mix_add(Color col_src, Color col_dst,
typename Traits::BlendType fac)
164 using Value =
typename Traits::ValueType;
165 using Blend =
typename Traits::BlendType;
167 Value *cp_src, *cp_dst, *cp_mix;
169 Color col_mix(0, 0, 0, 0);
175 cp_src = (Value *)&col_src.r;
176 cp_dst = (Value *)&col_dst.r;
177 cp_mix = (Value *)&col_mix.r;
179 temp = cp_src[0] + Traits::divide_round((fac * cp_dst[0]), Traits::range);
180 cp_mix[0] = (temp > Traits::cmpRange) ? Traits::range : temp;
181 temp = cp_src[1] + Traits::divide_round((fac * cp_dst[1]), Traits::range);
182 cp_mix[1] = (temp > Traits::cmpRange) ? Traits::range : temp;
183 temp = cp_src[2] + Traits::divide_round((fac * cp_dst[2]), Traits::range);
184 cp_mix[2] = (temp > Traits::cmpRange) ? Traits::range : temp;
185 temp = cp_src[3] + Traits::divide_round((fac * cp_dst[3]), Traits::range);
186 cp_mix[3] = (temp > Traits::cmpRange) ? Traits::range : temp;
191template<
typename Color,
typename Traits>
192static Color
mix_sub(Color col_src, Color col_dst,
typename Traits::BlendType fac)
194 using Value =
typename Traits::ValueType;
195 using Blend =
typename Traits::BlendType;
197 Value *cp_src, *cp_dst, *cp_mix;
199 Color col_mix(0, 0, 0, 0);
201 cp_src = (Value *)&col_src.r;
202 cp_dst = (Value *)&col_dst.r;
203 cp_mix = (Value *)&col_mix.r;
205 temp = cp_src[0] - Traits::divide_round((fac * cp_dst[0]), Traits::range);
206 cp_mix[0] = (temp < 0) ? 0 : temp;
207 temp = cp_src[1] - Traits::divide_round((fac * cp_dst[1]), Traits::range);
208 cp_mix[1] = (temp < 0) ? 0 : temp;
209 temp = cp_src[2] - Traits::divide_round((fac * cp_dst[2]), Traits::range);
210 cp_mix[2] = (temp < 0) ? 0 : temp;
211 temp = cp_src[3] - Traits::divide_round((fac * cp_dst[3]), Traits::range);
212 cp_mix[3] = (temp < 0) ? 0 : temp;
217template<
typename Color,
typename Traits>
218static Color
mix_mul(Color col_src, Color col_dst,
typename Traits::BlendType fac)
220 using Value =
typename Traits::ValueType;
221 using Blend =
typename Traits::BlendType;
223 Value *cp_src, *cp_dst, *cp_mix;
225 Color col_mix(0, 0, 0, 0);
231 mfac = Traits::range - fac;
233 cp_src = (Value *)&col_src;
234 cp_dst = (Value *)&col_dst;
235 cp_mix = (Value *)&col_mix;
238 cp_mix[0] = Traits::divide_round(mfac * cp_src[0] * Traits::range + fac * cp_dst[0] * cp_src[0],
239 Traits::range * Traits::range);
240 cp_mix[1] = Traits::divide_round(mfac * cp_src[1] * Traits::range + fac * cp_dst[1] * cp_src[1],
241 Traits::range * Traits::range);
242 cp_mix[2] = Traits::divide_round(mfac * cp_src[2] * Traits::range + fac * cp_dst[2] * cp_src[2],
243 Traits::range * Traits::range);
244 cp_mix[3] = Traits::divide_round(mfac * cp_src[3] * Traits::range + fac * cp_dst[3] * cp_src[3],
245 Traits::range * Traits::range);
250template<
typename Color,
typename Traits>
251static Color
mix_lighten(Color col_src, Color col_dst,
typename Traits::BlendType fac)
253 using Value =
typename Traits::ValueType;
254 using Blend =
typename Traits::BlendType;
256 Value *cp_src, *cp_dst, *cp_mix;
258 Color col_mix(0, 0, 0, 0);
263 if (fac >= Traits::range) {
267 mfac = Traits::range - fac;
269 cp_src = (Value *)&col_src;
270 cp_dst = (Value *)&col_dst;
271 cp_mix = (Value *)&col_mix;
279 cp_mix[0] = Traits::divide_round(mfac * cp_src[0] + fac * cp_dst[0], Traits::range);
280 cp_mix[1] = Traits::divide_round(mfac * cp_src[1] + fac * cp_dst[1], Traits::range);
281 cp_mix[2] = Traits::divide_round(mfac * cp_src[2] + fac * cp_dst[2], Traits::range);
282 cp_mix[3] = Traits::divide_round(mfac * cp_src[3] + fac * cp_dst[3], Traits::range);
287template<
typename Color,
typename Traits>
288static Color
mix_darken(Color col_src, Color col_dst,
typename Traits::BlendType fac)
290 using Value =
typename Traits::ValueType;
291 using Blend =
typename Traits::BlendType;
293 Value *cp_src, *cp_dst, *cp_mix;
295 Color col_mix(0, 0, 0, 0);
300 if (fac >= Traits::range) {
304 mfac = Traits::range - fac;
306 cp_src = (Value *)&col_src;
307 cp_dst = (Value *)&col_dst;
308 cp_mix = (Value *)&col_mix;
316 cp_mix[0] = Traits::divide_round((mfac * cp_src[0] + fac * cp_dst[0]), Traits::range);
317 cp_mix[1] = Traits::divide_round((mfac * cp_src[1] + fac * cp_dst[1]), Traits::range);
318 cp_mix[2] = Traits::divide_round((mfac * cp_src[2] + fac * cp_dst[2]), Traits::range);
319 cp_mix[3] = Traits::divide_round((mfac * cp_src[3] + fac * cp_dst[3]), Traits::range);
323template<
typename Color,
typename Traits>
324static Color
mix_colordodge(Color col_src, Color col_dst,
typename Traits::BlendType fac)
326 using Value =
typename Traits::ValueType;
327 using Blend =
typename Traits::BlendType;
329 Value *cp_src, *cp_dst, *cp_mix;
331 Color col_mix(0, 0, 0, 0);
337 mfac = Traits::range - fac;
339 cp_src = (Value *)&col_src;
340 cp_dst = (Value *)&col_dst;
341 cp_mix = (Value *)&col_mix;
343 Blend dodgefac = (
Blend)((
float)Traits::range * 0.885f);
345 temp = (cp_dst[0] == Traits::range) ?
347 Traits::min((cp_src[0] * dodgefac) / (Traits::range - cp_dst[0]), Traits::range);
348 cp_mix[0] = (mfac * cp_src[0] + temp * fac) / Traits::range;
349 temp = (cp_dst[1] == Traits::range) ?
351 Traits::min((cp_src[1] * dodgefac) / (Traits::range - cp_dst[1]), Traits::range);
352 cp_mix[1] = (mfac * cp_src[1] + temp * fac) / Traits::range;
353 temp = (cp_dst[2] == Traits::range) ?
355 Traits::min((cp_src[2] * dodgefac) / (Traits::range - cp_dst[2]), Traits::range);
356 cp_mix[2] = (mfac * cp_src[2] + temp * fac) / Traits::range;
357 temp = (cp_dst[3] == Traits::range) ?
359 Traits::min((cp_src[3] * dodgefac) / (Traits::range - cp_dst[3]), Traits::range);
360 cp_mix[3] = (mfac * cp_src[3] + temp * fac) / Traits::range;
364template<
typename Color,
typename Traits>
365static Color
mix_difference(Color col_src, Color col_dst,
typename Traits::BlendType fac)
367 using Value =
typename Traits::ValueType;
368 using Blend =
typename Traits::BlendType;
370 Value *cp_src, *cp_dst, *cp_mix;
372 Color col_mix(0, 0, 0, 0);
378 mfac = Traits::range - fac;
380 cp_src = (Value *)&col_src;
381 cp_dst = (Value *)&col_dst;
382 cp_mix = (Value *)&col_mix;
384 temp =
abs(cp_src[0] - cp_dst[0]);
385 cp_mix[0] = (mfac * cp_src[0] + temp * fac) / Traits::range;
386 temp =
abs(cp_src[1] - cp_dst[1]);
387 cp_mix[1] = (mfac * cp_src[1] + temp * fac) / Traits::range;
388 temp =
abs(cp_src[2] - cp_dst[2]);
389 cp_mix[2] = (mfac * cp_src[2] + temp * fac) / Traits::range;
390 temp =
abs(cp_src[3] - cp_dst[3]);
391 cp_mix[3] = (mfac * cp_src[3] + temp * fac) / Traits::range;
395template<
typename Color,
typename Traits>
396static Color
mix_screen(Color col_src, Color col_dst,
typename Traits::BlendType fac)
398 using Value =
typename Traits::ValueType;
399 using Blend =
typename Traits::BlendType;
401 Value *cp_src, *cp_dst, *cp_mix;
403 Color col_mix(0, 0, 0, 0);
409 mfac = Traits::range - fac;
411 cp_src = (Value *)&col_src;
412 cp_dst = (Value *)&col_dst;
413 cp_mix = (Value *)&col_mix;
415 temp = Traits::max(Traits::range - (((Traits::range - cp_src[0]) * (Traits::range - cp_dst[0])) /
418 cp_mix[0] = (mfac * cp_src[0] + temp * fac) / Traits::range;
419 temp = Traits::max(Traits::range - (((Traits::range - cp_src[1]) * (Traits::range - cp_dst[1])) /
422 cp_mix[1] = (mfac * cp_src[1] + temp * fac) / Traits::range;
423 temp = Traits::max(Traits::range - (((Traits::range - cp_src[2]) * (Traits::range - cp_dst[2])) /
426 cp_mix[2] = (mfac * cp_src[2] + temp * fac) / Traits::range;
427 temp = Traits::max(Traits::range - (((Traits::range - cp_src[3]) * (Traits::range - cp_dst[3])) /
430 cp_mix[3] = (mfac * cp_src[3] + temp * fac) / Traits::range;
434template<
typename Color,
typename Traits>
435static Color
mix_hardlight(Color col_src, Color col_dst,
typename Traits::BlendType fac)
437 using Value =
typename Traits::ValueType;
438 using Blend =
typename Traits::BlendType;
440 Value *cp_src, *cp_dst, *cp_mix;
442 Color col_mix(0, 0, 0, 0);
448 mfac = Traits::range - fac;
450 cp_src = (Value *)&col_src;
451 cp_dst = (Value *)&col_dst;
452 cp_mix = (Value *)&col_mix;
456 for (i = 0; i < 4; i++) {
457 if (cp_dst[i] > (Traits::range / 2)) {
458 temp = Traits::range - ((Traits::range - 2 * (cp_dst[i] - (Traits::range / 2))) *
459 (Traits::range - cp_src[i]) / Traits::range);
462 temp = (2 * cp_dst[i] * cp_src[i]) / Traits::expandedRange;
464 cp_mix[i] = Traits::min((mfac * cp_src[i] + temp * fac) / Traits::range, Traits::range);
469template<
typename Color,
typename Traits>
470static Color
mix_overlay(Color col_src, Color col_dst,
typename Traits::BlendType fac)
472 using Value =
typename Traits::ValueType;
473 using Blend =
typename Traits::BlendType;
475 Value *cp_src, *cp_dst, *cp_mix;
477 Color col_mix(0, 0, 0, 0);
483 mfac = Traits::range - fac;
485 cp_src = (Value *)&col_src;
486 cp_dst = (Value *)&col_dst;
487 cp_mix = (Value *)&col_mix;
491 for (i = 0; i < 4; i++) {
492 if (cp_src[i] > (Traits::range / 2)) {
493 temp = Traits::range - ((Traits::range - 2 * (cp_src[i] - (Traits::range / 2))) *
494 (Traits::range - cp_dst[i]) / Traits::range);
497 temp = (2 * cp_dst[i] * cp_src[i]) / Traits::expandedRange;
499 cp_mix[i] = Traits::min((mfac * cp_src[i] + temp * fac) / Traits::range, Traits::range);
504template<
typename Color,
typename Traits>
505static Color
mix_softlight(Color col_src, Color col_dst,
typename Traits::BlendType fac)
507 using Value =
typename Traits::ValueType;
508 using Blend =
typename Traits::BlendType;
510 Value *cp_src, *cp_dst, *cp_mix;
512 Color col_mix(0, 0, 0, 0);
518 mfac = Traits::range - fac;
520 cp_src = (Value *)&col_src;
521 cp_dst = (Value *)&col_dst;
522 cp_mix = (Value *)&col_mix;
525 const int add = Traits::divide_round(Traits::range, 4);
527 for (
int i = 0; i < 4; i++) {
528 if (cp_src[i] < (Traits::range / 2)) {
529 temp = ((2 * ((cp_dst[i] / 2) + add)) * cp_src[i]) / Traits::range;
532 temp = Traits::range - (2 * (Traits::range - ((cp_dst[i] / 2) + add)) *
533 (Traits::range - cp_src[i]) / Traits::range);
535 cp_mix[i] = (temp * fac + cp_src[i] * mfac) / Traits::range;
540template<
typename Color,
typename Traits>
541static Color
mix_exclusion(Color col_src, Color col_dst,
typename Traits::BlendType fac)
543 using Value =
typename Traits::ValueType;
544 using Blend =
typename Traits::BlendType;
546 Value *cp_src, *cp_dst, *cp_mix;
548 Color col_mix(0, 0, 0, 0);
554 mfac = Traits::range - fac;
556 cp_src = (Value *)&col_src;
557 cp_dst = (Value *)&col_dst;
558 cp_mix = (Value *)&col_mix;
562 for (i = 0; i < 4; i++) {
563 temp = (Traits::range / 2) -
564 ((2 * (cp_src[i] - (Traits::range / 2)) * (cp_dst[i] - (Traits::range / 2))) /
566 cp_mix[i] = (temp * fac + cp_src[i] * mfac) / Traits::range;
571template<
typename Color,
typename Traits>
572static Color
mix_luminosity(Color col_src, Color col_dst,
typename Traits::BlendType fac)
574 using Value =
typename Traits::ValueType;
575 using Blend =
typename Traits::BlendType;
577 Value *cp_src, *cp_dst, *cp_mix;
579 Color col_mix(0, 0, 0, 0);
585 mfac = Traits::range - fac;
587 cp_src = (Value *)&col_src;
588 cp_dst = (Value *)&col_dst;
589 cp_mix = (Value *)&col_mix;
595 cp_src[1] / Traits::frange,
596 cp_src[2] / Traits::frange,
601 cp_dst[1] / Traits::frange,
602 cp_dst[2] / Traits::frange,
611 cp_mix[0] = ((
Blend)(r * Traits::frange) * fac + mfac * cp_src[0]) / Traits::range;
612 cp_mix[1] = ((
Blend)(g * Traits::frange) * fac + mfac * cp_src[1]) / Traits::range;
613 cp_mix[2] = ((
Blend)(
b * Traits::frange) * fac + mfac * cp_src[2]) / Traits::range;
614 cp_mix[3] = ((
Blend)(cp_dst[3]) * fac + mfac * cp_src[3]) / Traits::range;
618template<
typename Color,
typename Traits>
619static Color
mix_saturation(Color col_src, Color col_dst,
typename Traits::BlendType fac)
621 using Value =
typename Traits::ValueType;
622 using Blend =
typename Traits::BlendType;
624 Value *cp_src, *cp_dst, *cp_mix;
626 Color col_mix(0, 0, 0, 0);
632 mfac = Traits::range - fac;
634 cp_src = (Value *)&col_src;
635 cp_dst = (Value *)&col_dst;
636 cp_mix = (Value *)&col_mix;
642 cp_src[1] / Traits::frange,
643 cp_src[2] / Traits::frange,
648 cp_dst[1] / Traits::frange,
649 cp_dst[2] / Traits::frange,
660 cp_mix[0] = ((
Blend)(r * Traits::frange) * fac + mfac * cp_src[0]) / Traits::range;
661 cp_mix[1] = ((
Blend)(g * Traits::frange) * fac + mfac * cp_src[1]) / Traits::range;
662 cp_mix[2] = ((
Blend)(
b * Traits::frange) * fac + mfac * cp_src[2]) / Traits::range;
666template<
typename Color,
typename Traits>
667static Color
mix_hue(Color col_src, Color col_dst,
typename Traits::BlendType fac)
669 using Value =
typename Traits::ValueType;
670 using Blend =
typename Traits::BlendType;
672 Value *cp_src, *cp_dst, *cp_mix;
674 Color col_mix(0, 0, 0, 0);
680 mfac = Traits::range - fac;
682 cp_src = (Value *)&col_src;
683 cp_dst = (Value *)&col_dst;
684 cp_mix = (Value *)&col_mix;
690 cp_src[1] / Traits::frange,
691 cp_src[2] / Traits::frange,
696 cp_dst[1] / Traits::frange,
697 cp_dst[2] / Traits::frange,
706 cp_mix[0] = ((
Blend)(r * Traits::frange) * fac + mfac * cp_src[0]) / Traits::range;
707 cp_mix[1] = ((
Blend)(g * Traits::frange) * fac + mfac * cp_src[1]) / Traits::range;
708 cp_mix[2] = ((
Blend)(
b * Traits::frange) * fac + mfac * cp_src[2]) / Traits::range;
709 cp_mix[3] = ((
Blend)(cp_dst[3]) * fac + mfac * cp_src[3]) / Traits::range;
713template<
typename Color,
typename Traits>
716 using Value =
typename Traits::ValueType;
717 using Blend =
typename Traits::BlendType;
719 Value *cp_src, *cp_mix;
721 Color col_mix = col_src;
727 cp_src = (Value *)&col_src;
728 cp_mix = (Value *)&col_mix;
730 temp = cp_src[3] + fac;
731 cp_mix[3] = (temp > Traits::cmpRange) ? Traits::range : temp;
736template<
typename Color,
typename Traits>
739 using Value =
typename Traits::ValueType;
740 using Blend =
typename Traits::BlendType;
742 Value *cp_src, *cp_mix;
744 Color col_mix = col_src;
750 cp_src = (Value *)&col_src;
751 cp_mix = (Value *)&col_mix;
753 temp = cp_src[3] - fac;
754 cp_mix[3] = temp < 0 ? 0 : temp;
759template<
typename Color,
typename Traits>
760static Color
mix_pinlight(Color col_src, Color col_dst,
typename Traits::BlendType fac)
762 using Value =
typename Traits::ValueType;
763 using Blend =
typename Traits::BlendType;
765 Value *cp_src, *cp_dst, *cp_mix;
767 Color col_mix(0, 0, 0, 0);
773 mfac = Traits::range - fac;
775 cp_src = (Value *)&col_src;
776 cp_dst = (Value *)&col_dst;
777 cp_mix = (Value *)&col_mix;
779 const Blend cmp = Traits::range / 2;
785 if (cp_dst[i] > cmp) {
786 temp = Traits::max(2 * (cp_dst[i] - cmp), cp_src[i]);
789 temp = Traits::min(2 * cp_dst[i], cp_src[i]);
791 cp_mix[i] = (
Value)((Traits::min(temp, Traits::range) * fac + cp_src[i] * mfac) /
795 col_mix.a = col_src.a;
799template<
typename Color,
typename Traits>
800static Color
mix_linearlight(Color col_src, Color col_dst,
typename Traits::BlendType fac)
802 using Value =
typename Traits::ValueType;
803 using Blend =
typename Traits::BlendType;
805 Value *cp_src, *cp_dst, *cp_mix;
807 Color col_mix(0, 0, 0, 0);
813 mfac = Traits::range - fac;
815 cp_src = (Value *)&col_src;
816 cp_dst = (Value *)&col_dst;
817 cp_mix = (Value *)&col_mix;
819 const Blend cmp = Traits::range / 2;
825 if (cp_dst[i] > cmp) {
826 temp = Traits::min(cp_src[i] + 2 * (cp_dst[i] - cmp), Traits::range);
829 temp = Traits::max(cp_src[i] + 2 * cp_dst[i] - Traits::range, 0);
832 cp_mix[i] = (
Value)((temp * fac + cp_src[i] * mfac) / Traits::range);
835 col_mix.a = col_src.a;
839template<
typename Color,
typename Traits>
840static Color
mix_vividlight(Color col_src, Color col_dst,
typename Traits::BlendType fac)
842 using Value =
typename Traits::ValueType;
843 using Blend =
typename Traits::BlendType;
845 Value *cp_src, *cp_dst;
847 Color col_mix(0, 0, 0, 0);
853 mfac = Traits::range - fac;
855 cp_src = (Value *)&col_src;
856 cp_dst = (Value *)&col_dst;
858 const Blend cmp = Traits::range / 2;
865 if (cp_dst[i] == Traits::range) {
866 temp = (cp_src[i] == 0) ? cmp : Traits::range;
868 else if (cp_dst[i] == 0) {
869 temp = (cp_src[i] == Traits::range) ? cmp : 0;
871 else if (cp_dst[i] > cmp) {
872 temp = Traits::min(((cp_src[i]) * Traits::range) / (2 * (Traits::range - cp_dst[i])),
877 Traits::range - ((Traits::range - cp_src[i]) * Traits::range / (2 * cp_dst[i])), 0);
879 col_mix[i] = (
Value)((temp * fac + cp_src[i] * mfac) / Traits::range);
882 col_mix.a = col_src.a;
886template<
typename Color,
typename Traits>
887static Color
mix_color(Color col_src, Color col_dst,
typename Traits::BlendType fac)
889 using Value =
typename Traits::ValueType;
890 using Blend =
typename Traits::BlendType;
892 Value *cp_src, *cp_dst, *cp_mix;
894 Color col_mix(0, 0, 0, 0);
900 mfac = Traits::range - fac;
902 cp_src = (Value *)&col_src;
903 cp_dst = (Value *)&col_dst;
904 cp_mix = (Value *)&col_mix;
911 cp_src[1] / Traits::frange,
912 cp_src[2] / Traits::frange,
917 cp_dst[1] / Traits::frange,
918 cp_dst[2] / Traits::frange,
928 cp_mix[0] = (
Value)(((Blend)(r * Traits::frange) * fac + cp_src[0] * mfac) / Traits::range);
929 cp_mix[1] = (
Value)(((Blend)(g * Traits::frange) * fac + cp_src[1] * mfac) / Traits::range);
930 cp_mix[2] = (
Value)(((Blend)(
b * Traits::frange) * fac + cp_src[2] * mfac) / Traits::range);
932 col_mix.a = col_src.a;
936template<
typename Color,
typename Traits>
937static Color
mix_colorburn(Color col_src, Color col_dst,
typename Traits::BlendType fac)
939 using Value =
typename Traits::ValueType;
940 using Blend =
typename Traits::BlendType;
942 Value *cp_src, *cp_dst, *cp_mix;
944 Color col_mix(0, 0, 0, 0);
950 mfac = Traits::range - fac;
952 cp_src = (Value *)&col_src;
953 cp_dst = (Value *)&col_dst;
954 cp_mix = (Value *)&col_mix;
962 Traits::max(Traits::range - ((Traits::range - cp_src[i]) * Traits::range) / cp_dst[i],
964 cp_mix[i] = (
Value)((temp * fac + cp_src[i] * mfac) / Traits::range);
967 col_mix.a = col_src.a;
971template<
typename Color,
typename Traits>
972static Color
mix_linearburn(Color col_src, Color col_dst,
typename Traits::BlendType fac)
974 using Value =
typename Traits::ValueType;
975 using Blend =
typename Traits::BlendType;
977 Value *cp_src, *cp_dst, *cp_mix;
979 Color col_mix(0, 0, 0, 0);
985 mfac = Traits::range - fac;
987 cp_src = (Value *)&col_src;
988 cp_dst = (Value *)&col_dst;
989 cp_mix = (Value *)&col_mix;
994 const Blend temp = Traits::max(cp_src[i] + cp_dst[i] - Traits::range, 0);
995 cp_mix[i] = (
Value)((temp * fac + cp_src[i] * mfac) / Traits::range);
998 col_mix.a = col_src.a;
1002template<
typename Color,
typename Traits>
1006 const typename Traits::BlendType alpha)
1058 return Color(0, 0, 0, 0);
#define BLI_assert_unreachable()
MINLINE unsigned char round_fl_to_uchar(float a)
MINLINE float max_ff(float a, float b)
MINLINE int min_ii(int a, int b)
MINLINE float min_ff(float a, float b)
MINLINE int max_ii(int a, int b)
MINLINE int divide_round_i(int a, int b)
void rgb_to_hsv(float r, float g, float b, float *r_h, float *r_s, float *r_v)
void hsv_to_rgb(float h, float s, float v, float *r_r, float *r_g, float *r_b)
BLI_INLINE unsigned char IMB_colormanagement_get_luminance_byte(const unsigned char[3])
BLI_INLINE float IMB_colormanagement_get_luminance(const float rgb[3])
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert Color
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert Invert a producing a negative Combine Generate a color from its and blue Hue Saturation Value
ATTR_WARN_UNUSED_RESULT const BMVert * v2
local_group_size(16, 16) .push_constant(Type b
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
static Color mix_pinlight(Color col_src, Color col_dst, typename Traits::BlendType fac)
static Color mix_difference(Color col_src, Color col_dst, typename Traits::BlendType fac)
static Color mix_alpha_sub(Color col_src, typename Traits::BlendType fac)
static float get_luminance(ColorPaint4f c)
static Color mix_screen(Color col_src, Color col_dst, typename Traits::BlendType fac)
static Color mix_alpha_add(Color col_src, typename Traits::BlendType fac)
static Color mix_colorburn(Color col_src, Color col_dst, typename Traits::BlendType fac)
static Color mix_colordodge(Color col_src, Color col_dst, typename Traits::BlendType fac)
static Color mix_hardlight(Color col_src, Color col_dst, typename Traits::BlendType fac)
static Color mix_vividlight(Color col_src, Color col_dst, typename Traits::BlendType fac)
static Color mix_linearburn(Color col_src, Color col_dst, typename Traits::BlendType fac)
static Color mix_sub(Color col_src, Color col_dst, typename Traits::BlendType fac)
static Color mix_luminosity(Color col_src, Color col_dst, typename Traits::BlendType fac)
BLI_INLINE Color BLI_mix_colors(const IMB_BlendMode tool, const Color a, const Color b, const typename Traits::BlendType alpha)
static Color mix_softlight(Color col_src, Color col_dst, typename Traits::BlendType fac)
static Color mix_color(Color col_src, Color col_dst, typename Traits::BlendType fac)
static Color mix_overlay(Color col_src, Color col_dst, typename Traits::BlendType fac)
static Color mix_mul(Color col_src, Color col_dst, typename Traits::BlendType fac)
static Color mix_add(Color col_src, Color col_dst, typename Traits::BlendType fac)
static Color mix_lighten(Color col_src, Color col_dst, typename Traits::BlendType fac)
static Color mix_darken(Color col_src, Color col_dst, typename Traits::BlendType fac)
static Color mix_linearlight(Color col_src, Color col_dst, typename Traits::BlendType fac)
static Color mix_hue(Color col_src, Color col_dst, typename Traits::BlendType fac)
static Color mix_blend(Color col_src, Color col_dst, typename Traits::BlendType fac)
static Color mix_saturation(Color col_src, Color col_dst, typename Traits::BlendType fac)
static Color mix_exclusion(Color col_src, Color col_dst, typename Traits::BlendType fac)
Traits are traits classes to determine the type of a derivative of another type.
static const float frange
static BlendType max(BlendType a, BlendType b)
static const int expandedRange
static BlendType min(BlendType a, BlendType b)
static ValueType round(float f)
static BlendType divide_round(BlendType a, BlendType b)
static const int cmpRange
static const float frange
static ValueType round(float f)
static const float cmpRange
static BlendType min(BlendType a, BlendType b)
static const int expandedRange
static BlendType max(BlendType a, BlendType b)
static BlendType divide_round(BlendType a, BlendType b)
ccl_device_inline int abs(int x)