Blender  V2.93
math_color_blend_inline.c
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  *
19  * The Original Code is: some of this file.
20  */
21 
26 #include "BLI_math_base.h"
27 #include "BLI_math_color.h"
28 #include "BLI_math_color_blend.h"
29 #include "BLI_math_vector.h"
30 #include "BLI_utildefines.h"
31 
32 #ifndef __MATH_COLOR_BLEND_INLINE_C__
33 # define __MATH_COLOR_BLEND_INLINE_C__
34 
35 /* don't add any saturation to a completely black and white image */
36 # define EPS_SATURATION 0.0005f
37 # define EPS_ALPHA 0.0005f
38 
39 /***************************** Color Blending ********************************
40  *
41  * - byte colors are assumed to be straight alpha
42  * - byte colors uses to do >>8 (same as /256) but actually should do /255,
43  * otherwise get quick darkening due to rounding
44  * - divide_round_i is also used to avoid darkening due to integers always
45  * rounding down
46  * - float colors are assumed to be premultiplied alpha
47  */
48 
49 /* straight alpha byte blending modes */
50 
51 MINLINE void blend_color_mix_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
52 {
53  if (src2[3] != 0) {
54  /* straight over operation */
55  const int t = src2[3];
56  const int mt = 255 - t;
57  int tmp[4];
58 
59  tmp[0] = (mt * src1[3] * src1[0]) + (t * 255 * src2[0]);
60  tmp[1] = (mt * src1[3] * src1[1]) + (t * 255 * src2[1]);
61  tmp[2] = (mt * src1[3] * src1[2]) + (t * 255 * src2[2]);
62  tmp[3] = (mt * src1[3]) + (t * 255);
63 
64  dst[0] = (uchar)divide_round_i(tmp[0], tmp[3]);
65  dst[1] = (uchar)divide_round_i(tmp[1], tmp[3]);
66  dst[2] = (uchar)divide_round_i(tmp[2], tmp[3]);
67  dst[3] = (uchar)divide_round_i(tmp[3], 255);
68  }
69  else {
70  /* no op */
71  copy_v4_v4_uchar(dst, src1);
72  }
73 }
74 
75 MINLINE void blend_color_add_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
76 {
77  if (src2[3] != 0) {
78  /* straight add operation */
79  const int t = src2[3];
80  int tmp[3];
81 
82  tmp[0] = (src1[0] * 255) + (src2[0] * t);
83  tmp[1] = (src1[1] * 255) + (src2[1] * t);
84  tmp[2] = (src1[2] * 255) + (src2[2] * t);
85 
86  dst[0] = (uchar)min_ii(divide_round_i(tmp[0], 255), 255);
87  dst[1] = (uchar)min_ii(divide_round_i(tmp[1], 255), 255);
88  dst[2] = (uchar)min_ii(divide_round_i(tmp[2], 255), 255);
89  dst[3] = src1[3];
90  }
91  else {
92  /* no op */
93  copy_v4_v4_uchar(dst, src1);
94  }
95 }
96 
97 MINLINE void blend_color_sub_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
98 {
99  if (src2[3] != 0) {
100  /* straight sub operation */
101  const int t = src2[3];
102  int tmp[3];
103 
104  tmp[0] = (src1[0] * 255) - (src2[0] * t);
105  tmp[1] = (src1[1] * 255) - (src2[1] * t);
106  tmp[2] = (src1[2] * 255) - (src2[2] * t);
107 
108  dst[0] = (uchar)max_ii(divide_round_i(tmp[0], 255), 0);
109  dst[1] = (uchar)max_ii(divide_round_i(tmp[1], 255), 0);
110  dst[2] = (uchar)max_ii(divide_round_i(tmp[2], 255), 0);
111  dst[3] = src1[3];
112  }
113  else {
114  /* no op */
115  copy_v4_v4_uchar(dst, src1);
116  }
117 }
118 
119 MINLINE void blend_color_mul_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
120 {
121  if (src2[3] != 0) {
122  /* straight multiply operation */
123  const int t = src2[3];
124  const int mt = 255 - t;
125  int tmp[3];
126 
127  tmp[0] = (mt * src1[0] * 255) + (t * src1[0] * src2[0]);
128  tmp[1] = (mt * src1[1] * 255) + (t * src1[1] * src2[1]);
129  tmp[2] = (mt * src1[2] * 255) + (t * src1[2] * src2[2]);
130 
131  dst[0] = (uchar)divide_round_i(tmp[0], 255 * 255);
132  dst[1] = (uchar)divide_round_i(tmp[1], 255 * 255);
133  dst[2] = (uchar)divide_round_i(tmp[2], 255 * 255);
134  dst[3] = src1[3];
135  }
136  else {
137  /* no op */
138  copy_v4_v4_uchar(dst, src1);
139  }
140 }
141 
142 MINLINE void blend_color_lighten_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
143 {
144  if (src2[3] != 0) {
145  /* straight lighten operation */
146  const int t = src2[3];
147  const int mt = 255 - t;
148  int tmp[3];
149 
150  tmp[0] = (mt * src1[0]) + (t * max_ii(src1[0], src2[0]));
151  tmp[1] = (mt * src1[1]) + (t * max_ii(src1[1], src2[1]));
152  tmp[2] = (mt * src1[2]) + (t * max_ii(src1[2], src2[2]));
153 
154  dst[0] = (uchar)divide_round_i(tmp[0], 255);
155  dst[1] = (uchar)divide_round_i(tmp[1], 255);
156  dst[2] = (uchar)divide_round_i(tmp[2], 255);
157  dst[3] = src1[3];
158  }
159  else {
160  /* no op */
161  copy_v4_v4_uchar(dst, src1);
162  }
163 }
164 
165 MINLINE void blend_color_darken_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
166 {
167  if (src2[3] != 0) {
168  /* straight darken operation */
169  const int t = src2[3];
170  const int mt = 255 - t;
171  int tmp[3];
172 
173  tmp[0] = (mt * src1[0]) + (t * min_ii(src1[0], src2[0]));
174  tmp[1] = (mt * src1[1]) + (t * min_ii(src1[1], src2[1]));
175  tmp[2] = (mt * src1[2]) + (t * min_ii(src1[2], src2[2]));
176 
177  dst[0] = (uchar)divide_round_i(tmp[0], 255);
178  dst[1] = (uchar)divide_round_i(tmp[1], 255);
179  dst[2] = (uchar)divide_round_i(tmp[2], 255);
180  dst[3] = src1[3];
181  }
182  else {
183  /* no op */
184  copy_v4_v4_uchar(dst, src1);
185  }
186 }
187 
188 MINLINE void blend_color_erase_alpha_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
189 {
190  if (src2[3] != 0) {
191  /* straight so just modify alpha channel */
192  const int t = src2[3];
193 
194  dst[0] = src1[0];
195  dst[1] = src1[1];
196  dst[2] = src1[2];
197  dst[3] = (uchar)max_ii(src1[3] - divide_round_i(t * src2[3], 255), 0);
198  }
199  else {
200  /* no op */
201  copy_v4_v4_uchar(dst, src1);
202  }
203 }
204 
205 MINLINE void blend_color_add_alpha_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
206 {
207  if (src2[3] != 0) {
208  /* straight so just modify alpha channel */
209  const int t = src2[3];
210 
211  dst[0] = src1[0];
212  dst[1] = src1[1];
213  dst[2] = src1[2];
214  dst[3] = (uchar)min_ii(src1[3] + divide_round_i(t * src2[3], 255), 255);
215  }
216  else {
217  /* no op */
218  copy_v4_v4_uchar(dst, src1);
219  }
220 }
221 
222 MINLINE void blend_color_overlay_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
223 {
224  const int fac = (int)src2[3];
225  if (fac != 0) {
226  const int mfac = 255 - fac;
227  int i = 3;
228 
229  while (i--) {
230  int temp;
231 
232  if (src1[i] > 127) {
233  temp = 255 - ((255 - 2 * (src1[i] - 127)) * (255 - src2[i]) / 255);
234  }
235  else {
236  temp = (2 * src1[i] * src2[i]) >> 8;
237  }
238  dst[i] = (uchar)min_ii((temp * fac + src1[i] * mfac) / 255, 255);
239  }
240  }
241  else {
242  /* no op */
243  copy_v4_v4_uchar(dst, src1);
244  }
245 }
246 
247 MINLINE void blend_color_hardlight_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
248 {
249  const int fac = (int)src2[3];
250  if (fac != 0) {
251  const int mfac = 255 - fac;
252  int i = 3;
253 
254  while (i--) {
255  int temp;
256 
257  if (src2[i] > 127) {
258  temp = 255 - ((255 - 2 * (src2[i] - 127)) * (255 - src1[i]) / 255);
259  }
260  else {
261  temp = (2 * src2[i] * src1[i]) >> 8;
262  }
263  dst[i] = (uchar)min_ii((temp * fac + src1[i] * mfac) / 255, 255);
264  }
265  }
266  else {
267  /* no op */
268  copy_v4_v4_uchar(dst, src1);
269  }
270 }
271 
272 MINLINE void blend_color_burn_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
273 {
274  const int fac = src2[3];
275  if (fac != 0) {
276  const int mfac = 255 - fac;
277  int i = 3;
278 
279  while (i--) {
280  const int temp = (src2[i] == 0) ? 0 : max_ii(255 - ((255 - src1[i]) * 255) / src2[i], 0);
281  dst[i] = (uchar)((temp * fac + src1[i] * mfac) / 255);
282  }
283  }
284  else {
285  /* no op */
286  copy_v4_v4_uchar(dst, src1);
287  }
288 }
289 
290 MINLINE void blend_color_linearburn_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
291 {
292  const int fac = src2[3];
293  if (fac != 0) {
294  const int mfac = 255 - fac;
295  int i = 3;
296 
297  while (i--) {
298  const int temp = max_ii(src1[i] + src2[i] - 255, 0);
299  dst[i] = (uchar)((temp * fac + src1[i] * mfac) / 255);
300  }
301  }
302  else {
303  /* no op */
304  copy_v4_v4_uchar(dst, src1);
305  }
306 }
307 
308 MINLINE void blend_color_dodge_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
309 {
310  const int fac = src2[3];
311  if (fac != 0) {
312  const int mfac = 255 - fac;
313  int i = 3;
314 
315  while (i--) {
316  const int temp = (src2[i] == 255) ? 255 : min_ii((src1[i] * 255) / (255 - src2[i]), 255);
317  dst[i] = (uchar)((temp * fac + src1[i] * mfac) / 255);
318  }
319  }
320  else {
321  /* no op */
322  copy_v4_v4_uchar(dst, src1);
323  }
324 }
325 
326 MINLINE void blend_color_screen_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
327 {
328  const int fac = src2[3];
329  if (fac != 0) {
330  const int mfac = 255 - fac;
331  int i = 3;
332 
333  while (i--) {
334  const int temp = max_ii(255 - (((255 - src1[i]) * (255 - src2[i])) / 255), 0);
335  dst[i] = (uchar)((temp * fac + src1[i] * mfac) / 255);
336  }
337  }
338  else {
339  /* no op */
340  copy_v4_v4_uchar(dst, src1);
341  }
342 }
343 
344 MINLINE void blend_color_softlight_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
345 {
346  const int fac = src2[3];
347  if (fac != 0) {
348  const int mfac = 255 - fac;
349  int i = 3;
350 
351  while (i--) {
352  int temp;
353 
354  if (src1[i] < 127) {
355  temp = ((2 * ((src2[i] / 2) + 64)) * src1[i]) / 255;
356  }
357  else {
358  temp = 255 - (2 * (255 - ((src2[i] / 2) + 64)) * (255 - src1[i]) / 255);
359  }
360  dst[i] = (uchar)((temp * fac + src1[i] * mfac) / 255);
361  }
362  }
363  else {
364  /* no op */
365  copy_v4_v4_uchar(dst, src1);
366  }
367 }
368 
369 MINLINE void blend_color_pinlight_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
370 {
371  const int fac = src2[3];
372  if (fac != 0) {
373  const int mfac = 255 - fac;
374  int i = 3;
375 
376  while (i--) {
377  int temp;
378 
379  if (src2[i] > 127) {
380  temp = max_ii(2 * (src2[i] - 127), src1[i]);
381  }
382  else {
383  temp = min_ii(2 * src2[i], src1[i]);
384  }
385  dst[i] = (uchar)((temp * fac + src1[i] * mfac) / 255);
386  }
387  }
388  else {
389  /* no op */
390  copy_v4_v4_uchar(dst, src1);
391  }
392 }
393 
394 MINLINE void blend_color_linearlight_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
395 {
396  const int fac = src2[3];
397  if (fac != 0) {
398  const int mfac = 255 - fac;
399  int i = 3;
400 
401  while (i--) {
402  int temp;
403 
404  if (src2[i] > 127) {
405  temp = min_ii(src1[i] + 2 * (src2[i] - 127), 255);
406  }
407  else {
408  temp = max_ii(src1[i] + 2 * src2[i] - 255, 0);
409  }
410  dst[i] = (uchar)((temp * fac + src1[i] * mfac) / 255);
411  }
412  }
413  else {
414  /* no op */
415  copy_v4_v4_uchar(dst, src1);
416  }
417 }
418 
419 MINLINE void blend_color_vividlight_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
420 {
421  const int fac = src2[3];
422  if (fac != 0) {
423  const int mfac = 255 - fac;
424  int i = 3;
425 
426  while (i--) {
427  int temp;
428 
429  if (src2[i] == 255) {
430  temp = (src1[i] == 0) ? 127 : 255;
431  }
432  else if (src2[i] == 0) {
433  temp = (src1[i] == 255) ? 127 : 0;
434  }
435  else if (src2[i] > 127) {
436  temp = min_ii(((src1[i]) * 255) / (2 * (255 - src2[i])), 255);
437  }
438  else {
439  temp = max_ii(255 - ((255 - src1[i]) * 255 / (2 * src2[i])), 0);
440  }
441  dst[i] = (uchar)((temp * fac + src1[i] * mfac) / 255);
442  }
443  }
444  else {
445  /* no op */
446  copy_v4_v4_uchar(dst, src1);
447  }
448 }
449 
450 MINLINE void blend_color_difference_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
451 {
452  const int fac = src2[3];
453  if (fac != 0) {
454  const int mfac = 255 - fac;
455  int i = 3;
456 
457  while (i--) {
458  const int temp = abs(src1[i] - src2[i]);
459  dst[i] = (uchar)((temp * fac + src1[i] * mfac) / 255);
460  }
461  }
462  else {
463  /* no op */
464  copy_v4_v4_uchar(dst, src1);
465  }
466 }
467 
468 MINLINE void blend_color_exclusion_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
469 {
470  const int fac = src2[3];
471  if (fac != 0) {
472  const int mfac = 255 - fac;
473  int i = 3;
474 
475  while (i--) {
476  const int temp = 127 - ((2 * (src1[i] - 127) * (src2[i] - 127)) / 255);
477  dst[i] = (uchar)((temp * fac + src1[i] * mfac) / 255);
478  }
479  }
480  else {
481  /* no op */
482  copy_v4_v4_uchar(dst, src1);
483  }
484 }
485 
486 MINLINE void blend_color_color_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
487 {
488  const int fac = src2[3];
489  if (fac != 0) {
490  const int mfac = 255 - fac;
491  float h1, s1, v1;
492  float h2, s2, v2;
493  float r, g, b;
494  rgb_to_hsv(src1[0] / 255.0f, src1[1] / 255.0f, src1[2] / 255.0f, &h1, &s1, &v1);
495  rgb_to_hsv(src2[0] / 255.0f, src2[1] / 255.0f, src2[2] / 255.0f, &h2, &s2, &v2);
496 
497  h1 = h2;
498  s1 = s2;
499 
500  hsv_to_rgb(h1, s1, v1, &r, &g, &b);
501 
502  dst[0] = (uchar)(((int)(r * 255.0f) * fac + src1[0] * mfac) / 255);
503  dst[1] = (uchar)(((int)(g * 255.0f) * fac + src1[1] * mfac) / 255);
504  dst[2] = (uchar)(((int)(b * 255.0f) * fac + src1[2] * mfac) / 255);
505  }
506  else {
507  /* no op */
508  copy_v4_v4_uchar(dst, src1);
509  }
510 }
511 
512 MINLINE void blend_color_hue_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
513 {
514  const int fac = src2[3];
515  if (fac != 0) {
516  const int mfac = 255 - fac;
517  float h1, s1, v1;
518  float h2, s2, v2;
519  float r, g, b;
520  rgb_to_hsv(src1[0] / 255.0f, src1[1] / 255.0f, src1[2] / 255.0f, &h1, &s1, &v1);
521  rgb_to_hsv(src2[0] / 255.0f, src2[1] / 255.0f, src2[2] / 255.0f, &h2, &s2, &v2);
522 
523  h1 = h2;
524 
525  hsv_to_rgb(h1, s1, v1, &r, &g, &b);
526 
527  dst[0] = (uchar)(((int)(r * 255.0f) * fac + src1[0] * mfac) / 255);
528  dst[1] = (uchar)(((int)(g * 255.0f) * fac + src1[1] * mfac) / 255);
529  dst[2] = (uchar)(((int)(b * 255.0f) * fac + src1[2] * mfac) / 255);
530  }
531  else {
532  /* no op */
533  copy_v4_v4_uchar(dst, src1);
534  }
535 }
536 
537 MINLINE void blend_color_saturation_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
538 {
539  const int fac = src2[3];
540  if (fac != 0) {
541  const int mfac = 255 - fac;
542  float h1, s1, v1;
543  float h2, s2, v2;
544  float r, g, b;
545  rgb_to_hsv(src1[0] / 255.0f, src1[1] / 255.0f, src1[2] / 255.0f, &h1, &s1, &v1);
546  rgb_to_hsv(src2[0] / 255.0f, src2[1] / 255.0f, src2[2] / 255.0f, &h2, &s2, &v2);
547 
548  if (s1 > EPS_SATURATION) {
549  s1 = s2;
550  }
551 
552  hsv_to_rgb(h1, s1, v1, &r, &g, &b);
553 
554  dst[0] = (uchar)(((int)(r * 255.0f) * fac + src1[0] * mfac) / 255);
555  dst[1] = (uchar)(((int)(g * 255.0f) * fac + src1[1] * mfac) / 255);
556  dst[2] = (uchar)(((int)(b * 255.0f) * fac + src1[2] * mfac) / 255);
557  }
558  else {
559  /* no op */
560  copy_v4_v4_uchar(dst, src1);
561  }
562 }
563 
564 MINLINE void blend_color_luminosity_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
565 {
566  const int fac = src2[3];
567  if (fac != 0) {
568  const int mfac = 255 - fac;
569  float h1, s1, v1;
570  float h2, s2, v2;
571  float r, g, b;
572  rgb_to_hsv(src1[0] / 255.0f, src1[1] / 255.0f, src1[2] / 255.0f, &h1, &s1, &v1);
573  rgb_to_hsv(src2[0] / 255.0f, src2[1] / 255.0f, src2[2] / 255.0f, &h2, &s2, &v2);
574 
575  v1 = v2;
576 
577  hsv_to_rgb(h1, s1, v1, &r, &g, &b);
578 
579  dst[0] = (uchar)(((int)(r * 255.0f) * fac + src1[0] * mfac) / 255);
580  dst[1] = (uchar)(((int)(g * 255.0f) * fac + src1[1] * mfac) / 255);
581  dst[2] = (uchar)(((int)(b * 255.0f) * fac + src1[2] * mfac) / 255);
582  }
583  else {
584  /* no op */
585  copy_v4_v4_uchar(dst, src1);
586  }
587 }
588 
590  const uchar src1[4],
591  const uchar src2[4],
592  float ft)
593 {
594  /* do color interpolation, but in premultiplied space so that RGB colors
595  * from zero alpha regions have no influence */
596  const int t = (int)(255 * ft);
597  const int mt = 255 - t;
598  int tmp = (mt * src1[3] + t * src2[3]);
599 
600  if (tmp > 0) {
601  dst[0] = (uchar)divide_round_i(mt * src1[0] * src1[3] + t * src2[0] * src2[3], tmp);
602  dst[1] = (uchar)divide_round_i(mt * src1[1] * src1[3] + t * src2[1] * src2[3], tmp);
603  dst[2] = (uchar)divide_round_i(mt * src1[2] * src1[3] + t * src2[2] * src2[3], tmp);
604  dst[3] = (uchar)divide_round_i(tmp, 255);
605  }
606  else {
607  copy_v4_v4_uchar(dst, src1);
608  dst[3] = 0;
609  }
610 }
611 
612 /* premultiplied alpha float blending modes */
613 
614 MINLINE void blend_color_mix_float(float dst[4], const float src1[4], const float src2[4])
615 {
616  if (src2[3] != 0.0f) {
617  /* premul over operation */
618  const float t = src2[3];
619  const float mt = 1.0f - t;
620 
621  dst[0] = mt * src1[0] + src2[0];
622  dst[1] = mt * src1[1] + src2[1];
623  dst[2] = mt * src1[2] + src2[2];
624  dst[3] = mt * src1[3] + t;
625  }
626  else {
627  /* no op */
628  copy_v4_v4(dst, src1);
629  }
630 }
631 
632 MINLINE void blend_color_add_float(float dst[4], const float src1[4], const float src2[4])
633 {
634  if (src2[3] != 0.0f) {
635  /* unpremul > add > premul, simplified */
636  dst[0] = src1[0] + src2[0] * src1[3];
637  dst[1] = src1[1] + src2[1] * src1[3];
638  dst[2] = src1[2] + src2[2] * src1[3];
639  dst[3] = src1[3];
640  }
641  else {
642  /* no op */
643  copy_v4_v4(dst, src1);
644  }
645 }
646 
647 MINLINE void blend_color_sub_float(float dst[4], const float src1[4], const float src2[4])
648 {
649  if (src2[3] != 0.0f) {
650  /* unpremul > subtract > premul, simplified */
651  dst[0] = max_ff(src1[0] - src2[0] * src1[3], 0.0f);
652  dst[1] = max_ff(src1[1] - src2[1] * src1[3], 0.0f);
653  dst[2] = max_ff(src1[2] - src2[2] * src1[3], 0.0f);
654  dst[3] = src1[3];
655  }
656  else {
657  /* no op */
658  copy_v4_v4(dst, src1);
659  }
660 }
661 
662 MINLINE void blend_color_mul_float(float dst[4], const float src1[4], const float src2[4])
663 {
664  if (src2[3] != 0.0f) {
665  /* unpremul > multiply > premul, simplified */
666  const float t = src2[3];
667  const float mt = 1.0f - t;
668 
669  dst[0] = mt * src1[0] + src1[0] * src2[0] * src1[3];
670  dst[1] = mt * src1[1] + src1[1] * src2[1] * src1[3];
671  dst[2] = mt * src1[2] + src1[2] * src2[2] * src1[3];
672  dst[3] = src1[3];
673  }
674  else {
675  /* no op */
676  copy_v4_v4(dst, src1);
677  }
678 }
679 
680 MINLINE void blend_color_lighten_float(float dst[4], const float src1[4], const float src2[4])
681 {
682  if (src2[3] != 0.0f) {
683  /* remap src2 to have same alpha as src1 premultiplied, take maximum of
684  * src1 and src2, then blend it with src1 */
685  const float t = src2[3];
686  const float mt = 1.0f - t;
687  const float map_alpha = src1[3] / src2[3];
688 
689  dst[0] = mt * src1[0] + t * max_ff(src1[0], src2[0] * map_alpha);
690  dst[1] = mt * src1[1] + t * max_ff(src1[1], src2[1] * map_alpha);
691  dst[2] = mt * src1[2] + t * max_ff(src1[2], src2[2] * map_alpha);
692  dst[3] = src1[3];
693  }
694  else {
695  /* no op */
696  copy_v4_v4(dst, src1);
697  }
698 }
699 
700 MINLINE void blend_color_darken_float(float dst[4], const float src1[4], const float src2[4])
701 {
702  if (src2[3] != 0.0f) {
703  /* remap src2 to have same alpha as src1 premultiplied, take minimum of
704  * src1 and src2, then blend it with src1 */
705  const float t = src2[3];
706  const float mt = 1.0f - t;
707  const float map_alpha = src1[3] / src2[3];
708 
709  dst[0] = mt * src1[0] + t * min_ff(src1[0], src2[0] * map_alpha);
710  dst[1] = mt * src1[1] + t * min_ff(src1[1], src2[1] * map_alpha);
711  dst[2] = mt * src1[2] + t * min_ff(src1[2], src2[2] * map_alpha);
712  dst[3] = src1[3];
713  }
714  else {
715  /* no op */
716  copy_v4_v4(dst, src1);
717  }
718 }
719 
720 MINLINE void blend_color_erase_alpha_float(float dst[4], const float src1[4], const float src2[4])
721 {
722  if (src2[3] != 0.0f && src1[3] > 0.0f) {
723  /* subtract alpha and remap RGB channels to match */
724  float alpha = max_ff(src1[3] - src2[3], 0.0f);
725  float map_alpha;
726 
727  if (alpha <= EPS_ALPHA) {
728  alpha = 0.0f;
729  }
730 
731  map_alpha = alpha / src1[3];
732 
733  dst[0] = src1[0] * map_alpha;
734  dst[1] = src1[1] * map_alpha;
735  dst[2] = src1[2] * map_alpha;
736  dst[3] = alpha;
737  }
738  else {
739  /* no op */
740  copy_v4_v4(dst, src1);
741  }
742 }
743 
744 MINLINE void blend_color_add_alpha_float(float dst[4], const float src1[4], const float src2[4])
745 {
746  if (src2[3] != 0.0f && src1[3] < 1.0f) {
747  /* add alpha and remap RGB channels to match */
748  float alpha = min_ff(src1[3] + src2[3], 1.0f);
749  float map_alpha;
750 
751  if (alpha >= 1.0f - EPS_ALPHA) {
752  alpha = 1.0f;
753  }
754 
755  map_alpha = (src1[3] > 0.0f) ? alpha / src1[3] : 1.0f;
756 
757  dst[0] = src1[0] * map_alpha;
758  dst[1] = src1[1] * map_alpha;
759  dst[2] = src1[2] * map_alpha;
760  dst[3] = alpha;
761  }
762  else {
763  /* no op */
764  copy_v4_v4(dst, src1);
765  }
766 }
767 
768 MINLINE void blend_color_overlay_float(float dst[4], const float src1[4], const float src2[4])
769 {
770  const float fac = src2[3];
771  if (fac != 0.0f) {
772  const float mfac = 1.0f - fac;
773  int i = 3;
774 
775  while (i--) {
776  float temp;
777 
778  if (src1[i] > 0.5f) {
779  temp = 1.0f - (1.0f - 2.0f * (src1[i] - 0.5f)) * (1.0f - src2[i]);
780  }
781  else {
782  temp = 2.0f * src1[i] * src2[i];
783  }
784  dst[i] = min_ff(temp * fac + src1[i] * mfac, 1.0f);
785  }
786  }
787  else {
788  /* no op */
789  copy_v4_v4(dst, src1);
790  }
791 }
792 
793 MINLINE void blend_color_hardlight_float(float dst[4], const float src1[4], const float src2[4])
794 {
795  const float fac = src2[3];
796  if (fac != 0.0f) {
797  const float mfac = 1.0f - fac;
798  int i = 3;
799 
800  while (i--) {
801  float temp;
802 
803  if (src2[i] > 0.5f) {
804  temp = 1.0f - ((1.0f - 2.0f * (src2[i] - 0.5f)) * (1.0f - src1[i]));
805  }
806  else {
807  temp = 2.0f * src2[i] * src1[i];
808  }
809  dst[i] = min_ff((temp * fac + src1[i] * mfac) / 1.0f, 1.0f);
810  }
811  }
812  else {
813  /* no op */
814  copy_v4_v4(dst, src1);
815  }
816 }
817 
818 MINLINE void blend_color_burn_float(float dst[4], const float src1[4], const float src2[4])
819 {
820  const float fac = src2[3];
821  if (fac != 0.0f) {
822  const float mfac = 1.0f - fac;
823  int i = 3;
824 
825  while (i--) {
826  const float temp = (src2[i] == 0.0f) ? 0.0f :
827  max_ff(1.0f - ((1.0f - src1[i]) / src2[i]), 0.0f);
828  dst[i] = (temp * fac + src1[i] * mfac);
829  }
830  }
831  else {
832  /* no op */
833  copy_v4_v4(dst, src1);
834  }
835 }
836 
837 MINLINE void blend_color_linearburn_float(float dst[4], const float src1[4], const float src2[4])
838 {
839  const float fac = src2[3];
840  if (fac != 0.0f) {
841  const float mfac = 1.0f - fac;
842  int i = 3;
843 
844  while (i--) {
845  const float temp = max_ff(src1[i] + src2[i] - 1.0f, 0.0f);
846  dst[i] = (temp * fac + src1[i] * mfac);
847  }
848  }
849  else {
850  /* no op */
851  copy_v4_v4(dst, src1);
852  }
853 }
854 
855 MINLINE void blend_color_dodge_float(float dst[4], const float src1[4], const float src2[4])
856 {
857  const float fac = src2[3];
858  if (fac != 0.0f) {
859  const float mfac = 1.0f - fac;
860  int i = 3;
861 
862  while (i--) {
863  const float temp = (src2[i] >= 1.0f) ? 1.0f : min_ff(src1[i] / (1.0f - src2[i]), 1.0f);
864  dst[i] = (temp * fac + src1[i] * mfac);
865  }
866  }
867  else {
868  /* no op */
869  copy_v4_v4(dst, src1);
870  }
871 }
872 
873 MINLINE void blend_color_screen_float(float dst[4], const float src1[4], const float src2[4])
874 {
875  const float fac = src2[3];
876  if (fac != 0.0f) {
877  const float mfac = 1.0f - fac;
878  int i = 3;
879 
880  while (i--) {
881  const float temp = max_ff(1.0f - ((1.0f - src1[i]) * (1.0f - src2[i])), 0.0f);
882  dst[i] = (temp * fac + src1[i] * mfac);
883  }
884  }
885  else {
886  /* no op */
887  copy_v4_v4(dst, src1);
888  }
889 }
890 
891 MINLINE void blend_color_softlight_float(float dst[4], const float src1[4], const float src2[4])
892 {
893  const float fac = src2[3];
894  if (fac != 0.0f) {
895  const float mfac = 1.0f - fac;
896  int i = 3;
897 
898  while (i--) {
899  float temp;
900 
901  if (src1[i] < 0.5f) {
902  temp = (src2[i] + 0.5f) * src1[i];
903  }
904  else {
905  temp = 1.0f - ((1.0f - (src2[i] + 0.5f)) * (1.0f - src1[i]));
906  }
907  dst[i] = (temp * fac + src1[i] * mfac);
908  }
909  }
910  else {
911  /* no op */
912  copy_v4_v4(dst, src1);
913  }
914 }
915 
916 MINLINE void blend_color_pinlight_float(float dst[4], const float src1[4], const float src2[4])
917 {
918  const float fac = src2[3];
919  if (fac != 0.0f) {
920  const float mfac = 1.0f - fac;
921  int i = 3;
922 
923  while (i--) {
924  float temp;
925 
926  if (src2[i] > 0.5f) {
927  temp = max_ff(2.0f * (src2[i] - 0.5f), src1[i]);
928  }
929  else {
930  temp = min_ff(2.0f * src2[i], src1[i]);
931  }
932  dst[i] = (temp * fac + src1[i] * mfac);
933  }
934  }
935  else {
936  /* no op */
937  copy_v4_v4(dst, src1);
938  }
939 }
940 
941 MINLINE void blend_color_linearlight_float(float dst[4], const float src1[4], const float src2[4])
942 {
943  const float fac = src2[3];
944  if (fac != 0.0f) {
945  const float mfac = 1.0f - fac;
946  int i = 3;
947 
948  while (i--) {
949  float temp;
950 
951  if (src2[i] > 0.5f) {
952  temp = min_ff(src1[i] + 2.0f * (src2[i] - 0.5f), 1.0f);
953  }
954  else {
955  temp = max_ff(src1[i] + 2.0f * src2[i] - 1.0f, 0.0f);
956  }
957  dst[i] = (temp * fac + src1[i] * mfac);
958  }
959  }
960  else {
961  /* no op */
962  copy_v4_v4(dst, src1);
963  }
964 }
965 
966 MINLINE void blend_color_vividlight_float(float dst[4], const float src1[4], const float src2[4])
967 {
968  const float fac = src2[3];
969  if (fac != 0.0f) {
970  const float mfac = 1.0f - fac;
971  int i = 3;
972 
973  while (i--) {
974  float temp;
975 
976  if (src2[i] == 1.0f) {
977  temp = (src1[i] == 0.0f) ? 0.5f : 1.0f;
978  }
979  else if (src2[i] == 0.0f) {
980  temp = (src1[i] == 1.0f) ? 0.5f : 0.0f;
981  }
982  else if (src2[i] > 0.5f) {
983  temp = min_ff(((src1[i]) * 1.0f) / (2.0f * (1.0f - src2[i])), 1.0f);
984  }
985  else {
986  temp = max_ff(1.0f - ((1.0f - src1[i]) * 1.0f / (2.0f * src2[i])), 0.0f);
987  }
988  dst[i] = (temp * fac + src1[i] * mfac);
989  }
990  }
991  else {
992  /* no op */
993  copy_v4_v4(dst, src1);
994  }
995 }
996 
997 MINLINE void blend_color_difference_float(float dst[4], const float src1[4], const float src2[4])
998 {
999  const float fac = src2[3];
1000  if (fac != 0.0f) {
1001  const float mfac = 1.0f - fac;
1002  int i = 3;
1003 
1004  while (i--) {
1005  dst[i] = (fabsf(src1[i] - src2[i]) * fac + src1[i] * mfac);
1006  }
1007  }
1008  else {
1009  /* no op */
1010  copy_v4_v4(dst, src1);
1011  }
1012 }
1013 
1014 MINLINE void blend_color_exclusion_float(float dst[4], const float src1[4], const float src2[4])
1015 {
1016  const float fac = src2[3];
1017  if (fac != 0.0f) {
1018  const float mfac = 1.0f - fac;
1019  int i = 3;
1020 
1021  while (i--) {
1022  const float temp = 0.5f - ((2 * (src1[i] - 0.5f) * (src2[i] - 0.5f)));
1023  dst[i] = (temp * fac + src1[i] * mfac);
1024  }
1025  }
1026  else {
1027  /* no op */
1028  copy_v4_v4(dst, src1);
1029  }
1030 }
1031 
1032 MINLINE void blend_color_color_float(float dst[4], const float src1[4], const float src2[4])
1033 {
1034  const float fac = src2[3];
1035  if (fac != 0.0f) {
1036  const float mfac = 1.0f - fac;
1037  float h1, s1, v1;
1038  float h2, s2, v2;
1039  float r, g, b;
1040 
1041  rgb_to_hsv(src1[0], src1[1], src1[2], &h1, &s1, &v1);
1042  rgb_to_hsv(src2[0], src2[1], src2[2], &h2, &s2, &v2);
1043 
1044  h1 = h2;
1045  s1 = s2;
1046 
1047  hsv_to_rgb(h1, s1, v1, &r, &g, &b);
1048 
1049  dst[0] = (r * fac + src1[0] * mfac);
1050  dst[1] = (g * fac + src1[1] * mfac);
1051  dst[2] = (b * fac + src1[2] * mfac);
1052  }
1053  else {
1054  /* no op */
1055  copy_v4_v4(dst, src1);
1056  }
1057 }
1058 
1059 MINLINE void blend_color_hue_float(float dst[4], const float src1[4], const float src2[4])
1060 {
1061  const float fac = src2[3];
1062  if (fac != 0.0f) {
1063  const float mfac = 1.0f - fac;
1064  float h1, s1, v1;
1065  float h2, s2, v2;
1066  float r, g, b;
1067 
1068  rgb_to_hsv(src1[0], src1[1], src1[2], &h1, &s1, &v1);
1069  rgb_to_hsv(src2[0], src2[1], src2[2], &h2, &s2, &v2);
1070 
1071  h1 = h2;
1072 
1073  hsv_to_rgb(h1, s1, v1, &r, &g, &b);
1074 
1075  dst[0] = (r * fac + src1[0] * mfac);
1076  dst[1] = (g * fac + src1[1] * mfac);
1077  dst[2] = (b * fac + src1[2] * mfac);
1078  }
1079  else {
1080  /* no op */
1081  copy_v4_v4(dst, src1);
1082  }
1083 }
1084 
1085 MINLINE void blend_color_saturation_float(float dst[4], const float src1[4], const float src2[4])
1086 {
1087  const float fac = src2[3];
1088  if (fac != 0.0f) {
1089  const float mfac = 1.0f - fac;
1090  float h1, s1, v1;
1091  float h2, s2, v2;
1092  float r, g, b;
1093 
1094  rgb_to_hsv(src1[0], src1[1], src1[2], &h1, &s1, &v1);
1095  rgb_to_hsv(src2[0], src2[1], src2[2], &h2, &s2, &v2);
1096 
1097  if (s1 > EPS_SATURATION) {
1098  s1 = s2;
1099  }
1100  hsv_to_rgb(h1, s1, v1, &r, &g, &b);
1101 
1102  dst[0] = (r * fac + src1[0] * mfac);
1103  dst[1] = (g * fac + src1[1] * mfac);
1104  dst[2] = (b * fac + src1[2] * mfac);
1105  }
1106  else {
1107  /* no op */
1108  copy_v4_v4(dst, src1);
1109  }
1110 }
1111 
1112 MINLINE void blend_color_luminosity_float(float dst[4], const float src1[4], const float src2[4])
1113 {
1114  const float fac = src2[3];
1115  if (fac != 0.0f) {
1116  const float mfac = 1.0f - fac;
1117  float h1, s1, v1;
1118  float h2, s2, v2;
1119  float r, g, b;
1120 
1121  rgb_to_hsv(src1[0], src1[1], src1[2], &h1, &s1, &v1);
1122  rgb_to_hsv(src2[0], src2[1], src2[2], &h2, &s2, &v2);
1123 
1124  v1 = v2;
1125  hsv_to_rgb(h1, s1, v1, &r, &g, &b);
1126 
1127  dst[0] = (r * fac + src1[0] * mfac);
1128  dst[1] = (g * fac + src1[1] * mfac);
1129  dst[2] = (b * fac + src1[2] * mfac);
1130  }
1131  else {
1132  /* no op */
1133  copy_v4_v4(dst, src1);
1134  }
1135 }
1136 
1138  const float src1[4],
1139  const float src2[4],
1140  float t)
1141 {
1142  /* interpolation, colors are premultiplied so it goes fine */
1143  const float mt = 1.0f - t;
1144 
1145  dst[0] = mt * src1[0] + t * src2[0];
1146  dst[1] = mt * src1[1] + t * src2[1];
1147  dst[2] = mt * src1[2] + t * src2[2];
1148  dst[3] = mt * src1[3] + t * src2[3];
1149 }
1150 
1151 # undef EPS_SATURATION
1152 # undef EPS_ALPHA
1153 
1154 #endif /* __MATH_COLOR_BLEND_INLINE_C__ */
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)
Definition: math_color.c:229
void hsv_to_rgb(float h, float s, float v, float *r_r, float *r_g, float *r_b)
Definition: math_color.c:31
#define MINLINE
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE void copy_v4_v4_uchar(unsigned char r[4], const unsigned char a[4])
unsigned char uchar
Definition: BLI_sys_types.h:86
_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 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 t
_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
ATTR_WARN_UNUSED_RESULT const BMVert * v2
static CCL_NAMESPACE_BEGIN const double alpha
#define fabsf(x)
MINLINE void blend_color_add_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_mul_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_exclusion_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_overlay_float(float dst[4], const float src1[4], const float src2[4])
#define EPS_SATURATION
MINLINE void blend_color_burn_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_sub_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_color_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_linearlight_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_saturation_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_darken_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_hue_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_dodge_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_difference_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_dodge_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_pinlight_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_pinlight_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_mul_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_overlay_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_erase_alpha_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_screen_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_add_alpha_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_exclusion_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_hardlight_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_color_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_hue_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_erase_alpha_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_saturation_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_linearburn_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_vividlight_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_mix_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_mix_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_luminosity_float(float dst[4], const float src1[4], const float src2[4])
#define EPS_ALPHA
MINLINE void blend_color_sub_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_burn_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_darken_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_interpolate_byte(uchar dst[4], const uchar src1[4], const uchar src2[4], float ft)
MINLINE void blend_color_vividlight_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_add_alpha_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_add_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_hardlight_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_lighten_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_linearburn_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_softlight_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_luminosity_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_difference_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_linearlight_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_lighten_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_screen_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_softlight_byte(uchar dst[4], const uchar src1[4], const uchar src2[4])
MINLINE void blend_color_interpolate_float(float dst[4], const float src1[4], const float src2[4], float t)
__forceinline const avxi abs(const avxi &a)
Definition: util_avxi.h:186