18 #include <type_traits>
27 inline static const float frange = 255.0f;
31 inline static const int bytes = 1;
32 inline static const float unit = 255.0f;
59 inline const static float range = 1.0f;
60 inline const static float frange = 1.0f;
64 inline const static float unit = 1.0f;
65 inline const static int bytes = 4;
99 #define EPS_SATURATION 0.0005f
105 template<
typename Color,
typename Traits>
106 static Color mix_blend(Color col_src, Color col_dst,
typename Traits::BlendType fac)
108 using Value =
typename Traits::ValueType;
109 using Blend =
typename Traits::BlendType;
111 Value *cp_src, *cp_dst, *cp_mix;
112 Color col_mix(0, 0, 0, 0);
119 if (fac >= Traits::range) {
123 mfac = Traits::range - fac;
130 Blend r1 = cp_src[0] * cp_src[0];
131 Blend g1 = cp_src[1] * cp_src[1];
132 Blend b1 = cp_src[2] * cp_src[2];
133 Blend a1 = cp_src[3] * cp_src[3];
135 Blend r2 = cp_dst[0] * cp_dst[0];
136 Blend g2 = cp_dst[1] * cp_dst[1];
137 Blend b2 = cp_dst[2] * cp_dst[2];
138 Blend a2 = cp_dst[3] * cp_dst[3];
140 cp_mix[0] = Traits::round(
sqrtf(Traits::divide_round((mfac * r1 + fac * r2), Traits::range)));
141 cp_mix[1] = Traits::round(
sqrtf(Traits::divide_round((mfac * g1 + fac * g2), Traits::range)));
142 cp_mix[2] = Traits::round(
sqrtf(Traits::divide_round((mfac * b1 + fac * b2), Traits::range)));
143 cp_mix[3] = Traits::round(
sqrtf(Traits::divide_round((mfac * a1 + fac * a2), Traits::range)));
144 return Color(col_mix[0], col_mix[1], col_mix[2], col_mix[3]);
149 template<
typename Color,
typename Traits>
150 static Color mix_add(Color col_src, Color col_dst,
typename Traits::BlendType fac)
152 using Value =
typename Traits::ValueType;
153 using Blend =
typename Traits::BlendType;
155 Value *cp_src, *cp_dst, *cp_mix;
157 Color col_mix(0, 0, 0, 0);
163 cp_src = (
Value *)&col_src.r;
164 cp_dst = (
Value *)&col_dst.r;
165 cp_mix = (
Value *)&col_mix.r;
167 temp = cp_src[0] + Traits::divide_round((fac * cp_dst[0]), Traits::range);
168 cp_mix[0] = (temp > Traits::cmpRange) ? Traits::range : temp;
169 temp = cp_src[1] + Traits::divide_round((fac * cp_dst[1]), Traits::range);
170 cp_mix[1] = (temp > Traits::cmpRange) ? Traits::range : temp;
171 temp = cp_src[2] + Traits::divide_round((fac * cp_dst[2]), Traits::range);
172 cp_mix[2] = (temp > Traits::cmpRange) ? Traits::range : temp;
173 temp = cp_src[3] + Traits::divide_round((fac * cp_dst[3]), Traits::range);
174 cp_mix[3] = (temp > Traits::cmpRange) ? Traits::range : temp;
179 template<
typename Color,
typename Traits>
180 static Color mix_sub(Color col_src, Color col_dst,
typename Traits::BlendType fac)
182 using Value =
typename Traits::ValueType;
183 using Blend =
typename Traits::BlendType;
185 Value *cp_src, *cp_dst, *cp_mix;
187 Color col_mix(0, 0, 0, 0);
189 cp_src = (
Value *)&col_src.r;
190 cp_dst = (
Value *)&col_dst.r;
191 cp_mix = (
Value *)&col_mix.r;
193 temp = cp_src[0] - Traits::divide_round((fac * cp_dst[0]), Traits::range);
194 cp_mix[0] = (temp < 0) ? 0 : temp;
195 temp = cp_src[1] - Traits::divide_round((fac * cp_dst[1]), Traits::range);
196 cp_mix[1] = (temp < 0) ? 0 : temp;
197 temp = cp_src[2] - Traits::divide_round((fac * cp_dst[2]), Traits::range);
198 cp_mix[2] = (temp < 0) ? 0 : temp;
199 temp = cp_src[3] - Traits::divide_round((fac * cp_dst[3]), Traits::range);
200 cp_mix[3] = (temp < 0) ? 0 : temp;
205 template<
typename Color,
typename Traits>
206 static Color mix_mul(Color col_src, Color col_dst,
typename Traits::BlendType fac)
208 using Value =
typename Traits::ValueType;
209 using Blend =
typename Traits::BlendType;
211 Value *cp_src, *cp_dst, *cp_mix;
213 Color col_mix(0, 0, 0, 0);
219 mfac = Traits::range - fac;
221 cp_src = (
Value *)&col_src;
222 cp_dst = (
Value *)&col_dst;
223 cp_mix = (
Value *)&col_mix;
226 cp_mix[0] = Traits::divide_round(mfac * cp_src[0] * Traits::range + fac * cp_dst[0] * cp_src[0],
227 Traits::range * Traits::range);
228 cp_mix[1] = Traits::divide_round(mfac * cp_src[1] * Traits::range + fac * cp_dst[1] * cp_src[1],
229 Traits::range * Traits::range);
230 cp_mix[2] = Traits::divide_round(mfac * cp_src[2] * Traits::range + fac * cp_dst[2] * cp_src[2],
231 Traits::range * Traits::range);
232 cp_mix[3] = Traits::divide_round(mfac * cp_src[3] * Traits::range + fac * cp_dst[3] * cp_src[3],
233 Traits::range * Traits::range);
238 template<
typename Color,
typename Traits>
241 using Value =
typename Traits::ValueType;
242 using Blend =
typename Traits::BlendType;
244 Value *cp_src, *cp_dst, *cp_mix;
246 Color col_mix(0, 0, 0, 0);
251 if (fac >= Traits::range) {
255 mfac = Traits::range - fac;
257 cp_src = (
Value *)&col_src;
258 cp_dst = (
Value *)&col_dst;
259 cp_mix = (
Value *)&col_mix;
267 cp_mix[0] = Traits::divide_round(mfac * cp_src[0] + fac * cp_dst[0], Traits::range);
268 cp_mix[1] = Traits::divide_round(mfac * cp_src[1] + fac * cp_dst[1], Traits::range);
269 cp_mix[2] = Traits::divide_round(mfac * cp_src[2] + fac * cp_dst[2], Traits::range);
270 cp_mix[3] = Traits::divide_round(mfac * cp_src[3] + fac * cp_dst[3], Traits::range);
275 template<
typename Color,
typename Traits>
278 using Value =
typename Traits::ValueType;
279 using Blend =
typename Traits::BlendType;
281 Value *cp_src, *cp_dst, *cp_mix;
283 Color col_mix(0, 0, 0, 0);
288 if (fac >= Traits::range) {
292 mfac = Traits::range - fac;
294 cp_src = (
Value *)&col_src;
295 cp_dst = (
Value *)&col_dst;
296 cp_mix = (
Value *)&col_mix;
304 cp_mix[0] = Traits::divide_round((mfac * cp_src[0] + fac * cp_dst[0]), Traits::range);
305 cp_mix[1] = Traits::divide_round((mfac * cp_src[1] + fac * cp_dst[1]), Traits::range);
306 cp_mix[2] = Traits::divide_round((mfac * cp_src[2] + fac * cp_dst[2]), Traits::range);
307 cp_mix[3] = Traits::divide_round((mfac * cp_src[3] + fac * cp_dst[3]), Traits::range);
311 template<
typename Color,
typename Traits>
314 using Value =
typename Traits::ValueType;
315 using Blend =
typename Traits::BlendType;
317 Value *cp_src, *cp_dst, *cp_mix;
319 Color col_mix(0, 0, 0, 0);
325 mfac = Traits::range - fac;
327 cp_src = (
Value *)&col_src;
328 cp_dst = (
Value *)&col_dst;
329 cp_mix = (
Value *)&col_mix;
331 Blend dodgefac = (Blend)((
float)Traits::range * 0.885f);
333 temp = (cp_dst[0] == Traits::range) ?
335 Traits::min((cp_src[0] * dodgefac) / (Traits::range - cp_dst[0]), Traits::range);
336 cp_mix[0] = (mfac * cp_src[0] + temp * fac) / Traits::range;
337 temp = (cp_dst[1] == Traits::range) ?
339 Traits::min((cp_src[1] * dodgefac) / (Traits::range - cp_dst[1]), Traits::range);
340 cp_mix[1] = (mfac * cp_src[1] + temp * fac) / Traits::range;
341 temp = (cp_dst[2] == Traits::range) ?
343 Traits::min((cp_src[2] * dodgefac) / (Traits::range - cp_dst[2]), Traits::range);
344 cp_mix[2] = (mfac * cp_src[2] + temp * fac) / Traits::range;
345 temp = (cp_dst[3] == Traits::range) ?
347 Traits::min((cp_src[3] * dodgefac) / (Traits::range - cp_dst[3]), Traits::range);
348 cp_mix[3] = (mfac * cp_src[3] + temp * fac) / Traits::range;
352 template<
typename Color,
typename Traits>
355 using Value =
typename Traits::ValueType;
356 using Blend =
typename Traits::BlendType;
358 Value *cp_src, *cp_dst, *cp_mix;
360 Color col_mix(0, 0, 0, 0);
366 mfac = Traits::range - fac;
368 cp_src = (
Value *)&col_src;
369 cp_dst = (
Value *)&col_dst;
370 cp_mix = (
Value *)&col_mix;
372 temp =
abs(cp_src[0] - cp_dst[0]);
373 cp_mix[0] = (mfac * cp_src[0] + temp * fac) / Traits::range;
374 temp =
abs(cp_src[1] - cp_dst[1]);
375 cp_mix[1] = (mfac * cp_src[1] + temp * fac) / Traits::range;
376 temp =
abs(cp_src[2] - cp_dst[2]);
377 cp_mix[2] = (mfac * cp_src[2] + temp * fac) / Traits::range;
378 temp =
abs(cp_src[3] - cp_dst[3]);
379 cp_mix[3] = (mfac * cp_src[3] + temp * fac) / Traits::range;
383 template<
typename Color,
typename Traits>
386 using Value =
typename Traits::ValueType;
387 using Blend =
typename Traits::BlendType;
389 Value *cp_src, *cp_dst, *cp_mix;
391 Color col_mix(0, 0, 0, 0);
397 mfac = Traits::range - fac;
399 cp_src = (
Value *)&col_src;
400 cp_dst = (
Value *)&col_dst;
401 cp_mix = (
Value *)&col_mix;
403 temp =
Traits::max(Traits::range - (((Traits::range - cp_src[0]) * (Traits::range - cp_dst[0])) /
406 cp_mix[0] = (mfac * cp_src[0] + temp * fac) / Traits::range;
407 temp =
Traits::max(Traits::range - (((Traits::range - cp_src[1]) * (Traits::range - cp_dst[1])) /
410 cp_mix[1] = (mfac * cp_src[1] + temp * fac) / Traits::range;
411 temp =
Traits::max(Traits::range - (((Traits::range - cp_src[2]) * (Traits::range - cp_dst[2])) /
414 cp_mix[2] = (mfac * cp_src[2] + temp * fac) / Traits::range;
415 temp =
Traits::max(Traits::range - (((Traits::range - cp_src[3]) * (Traits::range - cp_dst[3])) /
418 cp_mix[3] = (mfac * cp_src[3] + temp * fac) / Traits::range;
422 template<
typename Color,
typename Traits>
425 using Value =
typename Traits::ValueType;
426 using Blend =
typename Traits::BlendType;
428 Value *cp_src, *cp_dst, *cp_mix;
430 Color col_mix(0, 0, 0, 0);
436 mfac = Traits::range - fac;
438 cp_src = (
Value *)&col_src;
439 cp_dst = (
Value *)&col_dst;
440 cp_mix = (
Value *)&col_mix;
444 for (i = 0; i < 4; i++) {
445 if (cp_dst[i] > (Traits::range / 2)) {
446 temp = Traits::range - ((Traits::range - 2 * (cp_dst[i] - (Traits::range / 2))) *
447 (Traits::range - cp_src[i]) / Traits::range);
450 temp = (2 * cp_dst[i] * cp_src[i]) / Traits::expandedRange;
452 cp_mix[i] =
Traits::min((mfac * cp_src[i] + temp * fac) / Traits::range, Traits::range);
457 template<
typename Color,
typename Traits>
460 using Value =
typename Traits::ValueType;
461 using Blend =
typename Traits::BlendType;
463 Value *cp_src, *cp_dst, *cp_mix;
465 Color col_mix(0, 0, 0, 0);
471 mfac = Traits::range - fac;
473 cp_src = (
Value *)&col_src;
474 cp_dst = (
Value *)&col_dst;
475 cp_mix = (
Value *)&col_mix;
479 for (i = 0; i < 4; i++) {
480 if (cp_src[i] > (Traits::range / 2)) {
481 temp = Traits::range - ((Traits::range - 2 * (cp_src[i] - (Traits::range / 2))) *
482 (Traits::range - cp_dst[i]) / Traits::range);
485 temp = (2 * cp_dst[i] * cp_src[i]) / Traits::expandedRange;
487 cp_mix[i] =
Traits::min((mfac * cp_src[i] + temp * fac) / Traits::range, Traits::range);
492 template<
typename Color,
typename Traits>
495 using Value =
typename Traits::ValueType;
496 using Blend =
typename Traits::BlendType;
498 Value *cp_src, *cp_dst, *cp_mix;
500 Color col_mix(0, 0, 0, 0);
506 mfac = Traits::range - fac;
508 cp_src = (
Value *)&col_src;
509 cp_dst = (
Value *)&col_dst;
510 cp_mix = (
Value *)&col_mix;
513 const int add = Traits::divide_round(Traits::range, 4);
515 for (
int i = 0; i < 4; i++) {
516 if (cp_src[i] < (Traits::range / 2)) {
517 temp = ((2 * ((cp_dst[i] / 2) +
add)) * cp_src[i]) / Traits::range;
520 temp = Traits::range - (2 * (Traits::range - ((cp_dst[i] / 2) +
add)) *
521 (Traits::range - cp_src[i]) / Traits::range);
523 cp_mix[i] = (temp * fac + cp_src[i] * mfac) / Traits::range;
528 template<
typename Color,
typename Traits>
531 using Value =
typename Traits::ValueType;
532 using Blend =
typename Traits::BlendType;
534 Value *cp_src, *cp_dst, *cp_mix;
536 Color col_mix(0, 0, 0, 0);
542 mfac = Traits::range - fac;
544 cp_src = (
Value *)&col_src;
545 cp_dst = (
Value *)&col_dst;
546 cp_mix = (
Value *)&col_mix;
550 for (i = 0; i < 4; i++) {
551 temp = (Traits::range / 2) -
552 ((2 * (cp_src[i] - (Traits::range / 2)) * (cp_dst[i] - (Traits::range / 2))) /
554 cp_mix[i] = (temp * fac + cp_src[i] * mfac) / Traits::range;
559 template<
typename Color,
typename Traits>
562 using Value =
typename Traits::ValueType;
563 using Blend =
typename Traits::BlendType;
565 Value *cp_src, *cp_dst, *cp_mix;
567 Color col_mix(0, 0, 0, 0);
573 mfac = Traits::range - fac;
575 cp_src = (
Value *)&col_src;
576 cp_dst = (
Value *)&col_dst;
577 cp_mix = (
Value *)&col_mix;
583 cp_src[1] / Traits::frange,
584 cp_src[2] / Traits::frange,
589 cp_dst[1] / Traits::frange,
590 cp_dst[2] / Traits::frange,
599 cp_mix[0] = ((Blend)(
r * Traits::frange) * fac + mfac * cp_src[0]) / Traits::range;
600 cp_mix[1] = ((Blend)(
g * Traits::frange) * fac + mfac * cp_src[1]) / Traits::range;
601 cp_mix[2] = ((Blend)(
b * Traits::frange) * fac + mfac * cp_src[2]) / Traits::range;
602 cp_mix[3] = ((Blend)(cp_dst[3]) * fac + mfac * cp_src[3]) / Traits::range;
606 template<
typename Color,
typename Traits>
609 using Value =
typename Traits::ValueType;
610 using Blend =
typename Traits::BlendType;
612 Value *cp_src, *cp_dst, *cp_mix;
614 Color col_mix(0, 0, 0, 0);
620 mfac = Traits::range - fac;
622 cp_src = (
Value *)&col_src;
623 cp_dst = (
Value *)&col_dst;
624 cp_mix = (
Value *)&col_mix;
630 cp_src[1] / Traits::frange,
631 cp_src[2] / Traits::frange,
636 cp_dst[1] / Traits::frange,
637 cp_dst[2] / Traits::frange,
648 cp_mix[0] = ((Blend)(
r * Traits::frange) * fac + mfac * cp_src[0]) / Traits::range;
649 cp_mix[1] = ((Blend)(
g * Traits::frange) * fac + mfac * cp_src[1]) / Traits::range;
650 cp_mix[2] = ((Blend)(
b * Traits::frange) * fac + mfac * cp_src[2]) / Traits::range;
654 template<
typename Color,
typename Traits>
655 static Color mix_hue(Color col_src, Color col_dst,
typename Traits::BlendType fac)
657 using Value =
typename Traits::ValueType;
658 using Blend =
typename Traits::BlendType;
660 Value *cp_src, *cp_dst, *cp_mix;
662 Color col_mix(0, 0, 0, 0);
668 mfac = Traits::range - fac;
670 cp_src = (
Value *)&col_src;
671 cp_dst = (
Value *)&col_dst;
672 cp_mix = (
Value *)&col_mix;
678 cp_src[1] / Traits::frange,
679 cp_src[2] / Traits::frange,
684 cp_dst[1] / Traits::frange,
685 cp_dst[2] / Traits::frange,
694 cp_mix[0] = ((Blend)(
r * Traits::frange) * fac + mfac * cp_src[0]) / Traits::range;
695 cp_mix[1] = ((Blend)(
g * Traits::frange) * fac + mfac * cp_src[1]) / Traits::range;
696 cp_mix[2] = ((Blend)(
b * Traits::frange) * fac + mfac * cp_src[2]) / Traits::range;
697 cp_mix[3] = ((Blend)(cp_dst[3]) * fac + mfac * cp_src[3]) / Traits::range;
701 template<
typename Color,
typename Traits>
704 using Value =
typename Traits::ValueType;
705 using Blend =
typename Traits::BlendType;
707 Value *cp_src, *cp_mix;
709 Color col_mix = col_src;
715 cp_src = (
Value *)&col_src;
716 cp_mix = (
Value *)&col_mix;
718 temp = cp_src[3] + fac;
719 cp_mix[3] = (temp > Traits::cmpRange) ? Traits::range : temp;
724 template<
typename Color,
typename Traits>
727 using Value =
typename Traits::ValueType;
728 using Blend =
typename Traits::BlendType;
730 Value *cp_src, *cp_mix;
732 Color col_mix = col_src;
738 cp_src = (
Value *)&col_src;
739 cp_mix = (
Value *)&col_mix;
741 temp = cp_src[3] - fac;
742 cp_mix[3] = temp < 0 ? 0 : temp;
747 template<
typename Color,
typename Traits>
750 using Value =
typename Traits::ValueType;
751 using Blend =
typename Traits::BlendType;
753 Value *cp_src, *cp_dst, *cp_mix;
755 Color col_mix(0, 0, 0, 0);
761 mfac = Traits::range - fac;
763 cp_src = (
Value *)&col_src;
764 cp_dst = (
Value *)&col_dst;
765 cp_mix = (
Value *)&col_mix;
767 const Blend cmp = Traits::range / 2;
773 if (cp_dst[i] > cmp) {
774 temp =
Traits::max(2 * (cp_dst[i] - cmp), cp_src[i]);
779 cp_mix[i] = (
Value)((
Traits::min(temp, Traits::range) * fac + cp_src[i] * mfac) /
783 col_mix.a = col_src.a;
787 template<
typename Color,
typename Traits>
790 using Value =
typename Traits::ValueType;
791 using Blend =
typename Traits::BlendType;
793 Value *cp_src, *cp_dst, *cp_mix;
795 Color col_mix(0, 0, 0, 0);
801 mfac = Traits::range - fac;
803 cp_src = (
Value *)&col_src;
804 cp_dst = (
Value *)&col_dst;
805 cp_mix = (
Value *)&col_mix;
807 const Blend cmp = Traits::range / 2;
813 if (cp_dst[i] > cmp) {
814 temp =
Traits::min(cp_src[i] + 2 * (cp_dst[i] - cmp), Traits::range);
817 temp =
Traits::max(cp_src[i] + 2 * cp_dst[i] - Traits::range, 0);
820 cp_mix[i] = (
Value)((temp * fac + cp_src[i] * mfac) / Traits::range);
823 col_mix.a = col_src.a;
827 template<
typename Color,
typename Traits>
830 using Value =
typename Traits::ValueType;
831 using Blend =
typename Traits::BlendType;
833 Value *cp_src, *cp_dst;
835 Color col_mix(0, 0, 0, 0);
841 mfac = Traits::range - fac;
843 cp_src = (
Value *)&col_src;
844 cp_dst = (
Value *)&col_dst;
846 const Blend cmp = Traits::range / 2;
853 if (cp_dst[i] == Traits::range) {
854 temp = (cp_src[i] == 0) ? cmp : Traits::range;
856 else if (cp_dst[i] == 0) {
857 temp = (cp_src[i] == Traits::range) ? cmp : 0;
859 else if (cp_dst[i] > cmp) {
860 temp =
Traits::min(((cp_src[i]) * Traits::range) / (2 * (Traits::range - cp_dst[i])),
865 Traits::range - ((Traits::range - cp_src[i]) * Traits::range / (2 * cp_dst[i])), 0);
867 col_mix[i] = (
Value)((temp * fac + cp_src[i] * mfac) / Traits::range);
870 col_mix.a = col_src.a;
874 template<
typename Color,
typename Traits>
875 static Color mix_color(Color col_src, Color col_dst,
typename Traits::BlendType fac)
877 using Value =
typename Traits::ValueType;
878 using Blend =
typename Traits::BlendType;
880 Value *cp_src, *cp_dst, *cp_mix;
882 Color col_mix(0, 0, 0, 0);
888 mfac = Traits::range - fac;
890 cp_src = (
Value *)&col_src;
891 cp_dst = (
Value *)&col_dst;
892 cp_mix = (
Value *)&col_mix;
899 cp_src[1] / Traits::frange,
900 cp_src[2] / Traits::frange,
905 cp_dst[1] / Traits::frange,
906 cp_dst[2] / Traits::frange,
916 cp_mix[0] = (
Value)(((Blend)(
r * Traits::frange) * fac + cp_src[0] * mfac) / Traits::range);
917 cp_mix[1] = (
Value)(((Blend)(
g * Traits::frange) * fac + cp_src[1] * mfac) / Traits::range);
918 cp_mix[2] = (
Value)(((Blend)(
b * Traits::frange) * fac + cp_src[2] * mfac) / Traits::range);
920 col_mix.a = col_src.a;
924 template<
typename Color,
typename Traits>
927 using Value =
typename Traits::ValueType;
928 using Blend =
typename Traits::BlendType;
930 Value *cp_src, *cp_dst, *cp_mix;
932 Color col_mix(0, 0, 0, 0);
938 mfac = Traits::range - fac;
940 cp_src = (
Value *)&col_src;
941 cp_dst = (
Value *)&col_dst;
942 cp_mix = (
Value *)&col_mix;
950 Traits::max(Traits::range - ((Traits::range - cp_src[i]) * Traits::range) / cp_dst[i],
952 cp_mix[i] = (
Value)((temp * fac + cp_src[i] * mfac) / Traits::range);
955 col_mix.a = col_src.a;
959 template<
typename Color,
typename Traits>
962 using Value =
typename Traits::ValueType;
963 using Blend =
typename Traits::BlendType;
965 Value *cp_src, *cp_dst, *cp_mix;
967 Color col_mix(0, 0, 0, 0);
973 mfac = Traits::range - fac;
975 cp_src = (
Value *)&col_src;
976 cp_dst = (
Value *)&col_dst;
977 cp_mix = (
Value *)&col_mix;
982 const Blend temp =
Traits::max(cp_src[i] + cp_dst[i] - Traits::range, 0);
983 cp_mix[i] = (
Value)((temp * fac + cp_src[i] * mfac) / Traits::range);
986 col_mix.a = col_src.a;
990 template<
typename Color,
typename Traits>
994 const typename Traits::BlendType alpha)
998 return mix_blend<Color, Traits>(
a,
b, alpha);
1000 return mix_add<Color, Traits>(
a,
b, alpha);
1002 return mix_sub<Color, Traits>(
a,
b, alpha);
1004 return mix_mul<Color, Traits>(
a,
b, alpha);
1006 return mix_lighten<Color, Traits>(
a,
b, alpha);
1008 return mix_darken<Color, Traits>(
a,
b, alpha);
1010 return mix_colordodge<Color, Traits>(
a,
b, alpha);
1012 return mix_colorburn<Color, Traits>(
a,
b, alpha);
1014 return mix_difference<Color, Traits>(
a,
b, alpha);
1016 return mix_screen<Color, Traits>(
a,
b, alpha);
1018 return mix_hardlight<Color, Traits>(
a,
b, alpha);
1020 return mix_overlay<Color, Traits>(
a,
b, alpha);
1022 return mix_softlight<Color, Traits>(
a,
b, alpha);
1024 return mix_exclusion<Color, Traits>(
a,
b, alpha);
1026 return mix_luminosity<Color, Traits>(
a,
b, alpha);
1028 return mix_saturation<Color, Traits>(
a,
b, alpha);
1030 return mix_hue<Color, Traits>(
a,
b, alpha);
1033 return mix_alpha_sub<Color, Traits>(
a, alpha);
1035 return mix_alpha_add<Color, Traits>(
a, alpha);
1037 return mix_pinlight<Color, Traits>(
a,
b, alpha);
1039 return mix_linearlight<Color, Traits>(
a,
b, alpha);
1041 return mix_vividlight<Color, Traits>(
a,
b, alpha);
1043 return mix_color<Color, Traits>(
a,
b, alpha);
1046 return Color(0, 0, 0, 0);
typedef float(TangentPoint)[2]
#define BLI_assert_unreachable()
MINLINE unsigned char round_fl_to_uchar(float a)
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)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble GLdouble r _GL_VOID_RET _GL_VOID GLfloat GLfloat r _GL_VOID_RET _GL_VOID GLint GLint r _GL_VOID_RET _GL_VOID GLshort GLshort r _GL_VOID_RET _GL_VOID GLdouble GLdouble r
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
BLI_INLINE unsigned char IMB_colormanagement_get_luminance_byte(const unsigned char[3])
BLI_INLINE float IMB_colormanagement_get_luminance(const float rgb[3])
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Sky Generate a procedural sky texture Noise Generate fractal Perlin noise Wave Generate procedural bands or rings with noise Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a or normal between and object coordinate space Combine Create a color from its and value channels Color Retrieve a color or the default fallback if none is specified Separate Split a vector into its and Z components Generates normals with round corners and may slow down renders Vector Displace the surface along an arbitrary direction White Return a random value or color based on an input seed Float Map an input float to a curve and outputs a float value Separate 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 Bright Control the brightness and contrast of the input color Vector Map an input vectors to used to fine tune the interpolation of the input 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 a producing a negative Combine Generate a color from its and blue Hue Saturation Value
ATTR_WARN_UNUSED_RESULT const BMVert * v2
bool add(void *owner, const AttributeIDRef &attribute_id, eAttrDomain domain, eCustomDataType data_type, const AttributeInit &initializer)
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)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
static const pxr::TfToken g("g", pxr::TfToken::Immortal)
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)