2
* Copyright 2011, Blender Foundation.
4
* This program is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU General Public License
6
* as published by the Free Software Foundation; either version 2
7
* of the License, or (at your option) any later version.
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software Foundation,
16
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23
#include "COM_MixOperation.h"
29
/* ******** Mix Base Operation ******** */
31
MixBaseOperation::MixBaseOperation() : NodeOperation()
33
this->addInputSocket(COM_DT_VALUE);
34
this->addInputSocket(COM_DT_COLOR);
35
this->addInputSocket(COM_DT_COLOR);
36
this->addOutputSocket(COM_DT_COLOR);
37
this->m_inputValueOperation = NULL;
38
this->m_inputColor1Operation = NULL;
39
this->m_inputColor2Operation = NULL;
40
this->setUseValueAlphaMultiply(false);
41
this->setUseClamp(false);
44
void MixBaseOperation::initExecution()
46
this->m_inputValueOperation = this->getInputSocketReader(0);
47
this->m_inputColor1Operation = this->getInputSocketReader(1);
48
this->m_inputColor2Operation = this->getInputSocketReader(2);
51
void MixBaseOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)
57
this->m_inputValueOperation->read(inputValue, x, y, sampler);
58
this->m_inputColor1Operation->read(inputColor1, x, y, sampler);
59
this->m_inputColor2Operation->read(inputColor2, x, y, sampler);
61
float value = inputValue[0];
62
if (this->useValueAlphaMultiply()) {
63
value *= inputColor2[3];
65
float valuem = 1.0f - value;
66
output[0] = valuem * (inputColor1[0]) + value * (inputColor2[0]);
67
output[1] = valuem * (inputColor1[1]) + value * (inputColor2[1]);
68
output[2] = valuem * (inputColor1[2]) + value * (inputColor2[2]);
69
output[3] = inputColor1[3];
72
void MixBaseOperation::determineResolution(unsigned int resolution[2], unsigned int preferredResolution[2])
75
unsigned int tempPreferredResolution[2] = {0, 0};
76
unsigned int tempResolution[2];
78
socket = this->getInputSocket(1);
79
socket->determineResolution(tempResolution, tempPreferredResolution);
80
if ((tempResolution[0] != 0) && (tempResolution[1] != 0)) {
81
this->setResolutionInputSocketIndex(1);
84
socket = this->getInputSocket(2);
85
socket->determineResolution(tempResolution, tempPreferredResolution);
86
if ((tempResolution[0] != 0) && (tempResolution[1] != 0)) {
87
this->setResolutionInputSocketIndex(2);
90
this->setResolutionInputSocketIndex(0);
93
NodeOperation::determineResolution(resolution, preferredResolution);
96
void MixBaseOperation::deinitExecution()
98
this->m_inputValueOperation = NULL;
99
this->m_inputColor1Operation = NULL;
100
this->m_inputColor2Operation = NULL;
103
/* ******** Mix Add Operation ******** */
105
MixAddOperation::MixAddOperation() : MixBaseOperation()
110
void MixAddOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)
112
float inputColor1[4];
113
float inputColor2[4];
116
this->m_inputValueOperation->read(inputValue, x, y, sampler);
117
this->m_inputColor1Operation->read(inputColor1, x, y, sampler);
118
this->m_inputColor2Operation->read(inputColor2, x, y, sampler);
120
float value = inputValue[0];
121
if (this->useValueAlphaMultiply()) {
122
value *= inputColor2[3];
124
output[0] = inputColor1[0] + value * inputColor2[0];
125
output[1] = inputColor1[1] + value * inputColor2[1];
126
output[2] = inputColor1[2] + value * inputColor2[2];
127
output[3] = inputColor1[3];
129
clampIfNeeded(output);
132
/* ******** Mix Blend Operation ******** */
134
MixBlendOperation::MixBlendOperation() : MixBaseOperation()
139
void MixBlendOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)
141
float inputColor1[4];
142
float inputColor2[4];
146
this->m_inputValueOperation->read(inputValue, x, y, sampler);
147
this->m_inputColor1Operation->read(inputColor1, x, y, sampler);
148
this->m_inputColor2Operation->read(inputColor2, x, y, sampler);
149
value = inputValue[0];
151
if (this->useValueAlphaMultiply()) {
152
value *= inputColor2[3];
154
float valuem = 1.0f - value;
155
output[0] = valuem * (inputColor1[0]) + value * (inputColor2[0]);
156
output[1] = valuem * (inputColor1[1]) + value * (inputColor2[1]);
157
output[2] = valuem * (inputColor1[2]) + value * (inputColor2[2]);
158
output[3] = inputColor1[3];
160
clampIfNeeded(output);
163
/* ******** Mix Burn Operation ******** */
165
MixBurnOperation::MixBurnOperation() : MixBaseOperation()
170
void MixBurnOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)
172
float inputColor1[4];
173
float inputColor2[4];
177
this->m_inputValueOperation->read(inputValue, x, y, sampler);
178
this->m_inputColor1Operation->read(inputColor1, x, y, sampler);
179
this->m_inputColor2Operation->read(inputColor2, x, y, sampler);
181
float value = inputValue[0];
182
if (this->useValueAlphaMultiply()) {
183
value *= inputColor2[3];
185
float valuem = 1.0f - value;
187
tmp = valuem + value * inputColor2[0];
191
tmp = 1.0f - (1.0f - inputColor1[0]) / tmp;
200
tmp = valuem + value * inputColor2[1];
204
tmp = 1.0f - (1.0f - inputColor1[1]) / tmp;
213
tmp = valuem + value * inputColor2[2];
217
tmp = 1.0f - (1.0f - inputColor1[2]) / tmp;
226
output[3] = inputColor1[3];
228
clampIfNeeded(output);
231
/* ******** Mix Color Operation ******** */
233
MixColorOperation::MixColorOperation() : MixBaseOperation()
238
void MixColorOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)
240
float inputColor1[4];
241
float inputColor2[4];
244
this->m_inputValueOperation->read(inputValue, x, y, sampler);
245
this->m_inputColor1Operation->read(inputColor1, x, y, sampler);
246
this->m_inputColor2Operation->read(inputColor2, x, y, sampler);
248
float value = inputValue[0];
249
if (this->useValueAlphaMultiply()) {
250
value *= inputColor2[3];
252
float valuem = 1.0f - value;
254
float colH, colS, colV;
255
rgb_to_hsv(inputColor2[0], inputColor2[1], inputColor2[2], &colH, &colS, &colV);
258
float tmpr, tmpg, tmpb;
259
rgb_to_hsv(inputColor1[0], inputColor1[1], inputColor1[2], &rH, &rS, &rV);
260
hsv_to_rgb(colH, colS, rV, &tmpr, &tmpg, &tmpb);
261
output[0] = (valuem * inputColor1[0]) + (value * tmpr);
262
output[1] = (valuem * inputColor1[1]) + (value * tmpg);
263
output[2] = (valuem * inputColor1[2]) + (value * tmpb);
266
copy_v3_v3(output, inputColor1);
268
output[3] = inputColor1[3];
270
clampIfNeeded(output);
273
/* ******** Mix Darken Operation ******** */
275
MixDarkenOperation::MixDarkenOperation() : MixBaseOperation()
280
void MixDarkenOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)
282
float inputColor1[4];
283
float inputColor2[4];
286
this->m_inputValueOperation->read(inputValue, x, y, sampler);
287
this->m_inputColor1Operation->read(inputColor1, x, y, sampler);
288
this->m_inputColor2Operation->read(inputColor2, x, y, sampler);
290
float value = inputValue[0];
291
if (this->useValueAlphaMultiply()) {
292
value *= inputColor2[3];
294
float valuem = 1.0f - value;
296
tmp = inputColor2[0] + ((1.0f - inputColor2[0]) * valuem);
297
if (tmp < inputColor1[0]) output[0] = tmp;
298
else output[0] = inputColor1[0];
299
tmp = inputColor2[1] + ((1.0f - inputColor2[1]) * valuem);
300
if (tmp < inputColor1[1]) output[1] = tmp;
301
else output[1] = inputColor1[1];
302
tmp = inputColor2[2] + ((1.0f - inputColor2[2]) * valuem);
303
if (tmp < inputColor1[2]) output[2] = tmp;
304
else output[2] = inputColor1[2];
306
output[3] = inputColor1[3];
308
clampIfNeeded(output);
311
/* ******** Mix Difference Operation ******** */
313
MixDifferenceOperation::MixDifferenceOperation() : MixBaseOperation()
318
void MixDifferenceOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)
320
float inputColor1[4];
321
float inputColor2[4];
324
this->m_inputValueOperation->read(inputValue, x, y, sampler);
325
this->m_inputColor1Operation->read(inputColor1, x, y, sampler);
326
this->m_inputColor2Operation->read(inputColor2, x, y, sampler);
328
float value = inputValue[0];
329
if (this->useValueAlphaMultiply()) {
330
value *= inputColor2[3];
332
float valuem = 1.0f - value;
333
output[0] = valuem * inputColor1[0] + value *fabsf(inputColor1[0] - inputColor2[0]);
334
output[1] = valuem * inputColor1[1] + value *fabsf(inputColor1[1] - inputColor2[1]);
335
output[2] = valuem * inputColor1[2] + value *fabsf(inputColor1[2] - inputColor2[2]);
336
output[3] = inputColor1[3];
338
clampIfNeeded(output);
341
/* ******** Mix Difference Operation ******** */
343
MixDivideOperation::MixDivideOperation() : MixBaseOperation()
348
void MixDivideOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)
350
float inputColor1[4];
351
float inputColor2[4];
354
this->m_inputValueOperation->read(inputValue, x, y, sampler);
355
this->m_inputColor1Operation->read(inputColor1, x, y, sampler);
356
this->m_inputColor2Operation->read(inputColor2, x, y, sampler);
358
float value = inputValue[0];
359
if (this->useValueAlphaMultiply()) {
360
value *= inputColor2[3];
362
float valuem = 1.0f - value;
364
if (inputColor2[0] != 0.0f)
365
output[0] = valuem * (inputColor1[0]) + value * (inputColor1[0]) / inputColor2[0];
368
if (inputColor2[1] != 0.0f)
369
output[1] = valuem * (inputColor1[1]) + value * (inputColor1[1]) / inputColor2[1];
372
if (inputColor2[2] != 0.0f)
373
output[2] = valuem * (inputColor1[2]) + value * (inputColor1[2]) / inputColor2[2];
377
output[3] = inputColor1[3];
379
clampIfNeeded(output);
382
/* ******** Mix Dodge Operation ******** */
384
MixDodgeOperation::MixDodgeOperation() : MixBaseOperation()
389
void MixDodgeOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)
391
float inputColor1[4];
392
float inputColor2[4];
396
this->m_inputValueOperation->read(inputValue, x, y, sampler);
397
this->m_inputColor1Operation->read(inputColor1, x, y, sampler);
398
this->m_inputColor2Operation->read(inputColor2, x, y, sampler);
400
float value = inputValue[0];
401
if (this->useValueAlphaMultiply()) {
402
value *= inputColor2[3];
405
if (inputColor1[0] != 0.0f) {
406
tmp = 1.0f - value * inputColor2[0];
410
tmp = inputColor1[0] / tmp;
420
if (inputColor1[1] != 0.0f) {
421
tmp = 1.0f - value * inputColor2[1];
425
tmp = inputColor1[1] / tmp;
435
if (inputColor1[2] != 0.0f) {
436
tmp = 1.0f - value * inputColor2[2];
440
tmp = inputColor1[2] / tmp;
450
output[3] = inputColor1[3];
452
clampIfNeeded(output);
455
/* ******** Mix Glare Operation ******** */
457
MixGlareOperation::MixGlareOperation() : MixBaseOperation()
462
void MixGlareOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)
464
float inputColor1[4];
465
float inputColor2[4];
469
this->m_inputValueOperation->read(inputValue, x, y, sampler);
470
this->m_inputColor1Operation->read(inputColor1, x, y, sampler);
471
this->m_inputColor2Operation->read(inputColor2, x, y, sampler);
472
value = inputValue[0];
473
float mf = 2.f - 2.f * fabsf(value - 0.5f);
475
if (inputColor1[0] < 0.0f) inputColor1[0] = 0.0f;
476
if (inputColor1[1] < 0.0f) inputColor1[1] = 0.0f;
477
if (inputColor1[2] < 0.0f) inputColor1[2] = 0.0f;
479
output[0] = mf * max(inputColor1[0] + value * (inputColor2[0] - inputColor1[0]), 0.0f);
480
output[1] = mf * max(inputColor1[1] + value * (inputColor2[1] - inputColor1[1]), 0.0f);
481
output[2] = mf * max(inputColor1[2] + value * (inputColor2[2] - inputColor1[2]), 0.0f);
482
output[3] = inputColor1[3];
484
clampIfNeeded(output);
487
/* ******** Mix Hue Operation ******** */
489
MixHueOperation::MixHueOperation() : MixBaseOperation()
494
void MixHueOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)
496
float inputColor1[4];
497
float inputColor2[4];
500
this->m_inputValueOperation->read(inputValue, x, y, sampler);
501
this->m_inputColor1Operation->read(inputColor1, x, y, sampler);
502
this->m_inputColor2Operation->read(inputColor2, x, y, sampler);
504
float value = inputValue[0];
505
if (this->useValueAlphaMultiply()) {
506
value *= inputColor2[3];
508
float valuem = 1.0f - value;
510
float colH, colS, colV;
511
rgb_to_hsv(inputColor2[0], inputColor2[1], inputColor2[2], &colH, &colS, &colV);
514
float tmpr, tmpg, tmpb;
515
rgb_to_hsv(inputColor1[0], inputColor1[1], inputColor1[2], &rH, &rS, &rV);
516
hsv_to_rgb(colH, rS, rV, &tmpr, &tmpg, &tmpb);
517
output[0] = valuem * (inputColor1[0]) + value * tmpr;
518
output[1] = valuem * (inputColor1[1]) + value * tmpg;
519
output[2] = valuem * (inputColor1[2]) + value * tmpb;
522
copy_v3_v3(output, inputColor1);
524
output[3] = inputColor1[3];
526
clampIfNeeded(output);
529
/* ******** Mix Lighten Operation ******** */
531
MixLightenOperation::MixLightenOperation() : MixBaseOperation()
536
void MixLightenOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)
538
float inputColor1[4];
539
float inputColor2[4];
542
this->m_inputValueOperation->read(inputValue, x, y, sampler);
543
this->m_inputColor1Operation->read(inputColor1, x, y, sampler);
544
this->m_inputColor2Operation->read(inputColor2, x, y, sampler);
546
float value = inputValue[0];
547
if (this->useValueAlphaMultiply()) {
548
value *= inputColor2[3];
551
tmp = value * inputColor2[0];
552
if (tmp > inputColor1[0]) output[0] = tmp;
553
else output[0] = inputColor1[0];
554
tmp = value * inputColor2[1];
555
if (tmp > inputColor1[1]) output[1] = tmp;
556
else output[1] = inputColor1[1];
557
tmp = value * inputColor2[2];
558
if (tmp > inputColor1[2]) output[2] = tmp;
559
else output[2] = inputColor1[2];
560
output[3] = inputColor1[3];
562
clampIfNeeded(output);
565
/* ******** Mix Linear Light Operation ******** */
567
MixLinearLightOperation::MixLinearLightOperation() : MixBaseOperation()
572
void MixLinearLightOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)
574
float inputColor1[4];
575
float inputColor2[4];
578
this->m_inputValueOperation->read(inputValue, x, y, sampler);
579
this->m_inputColor1Operation->read(inputColor1, x, y, sampler);
580
this->m_inputColor2Operation->read(inputColor2, x, y, sampler);
582
float value = inputValue[0];
583
if (this->useValueAlphaMultiply()) {
584
value *= inputColor2[3];
586
if (inputColor2[0] > 0.5f)
587
output[0] = inputColor1[0] + value * (2.0f * (inputColor2[0] - 0.5f));
589
output[0] = inputColor1[0] + value * (2.0f * (inputColor2[0]) - 1.0f);
590
if (inputColor2[1] > 0.5f)
591
output[1] = inputColor1[1] + value * (2.0f * (inputColor2[1] - 0.5f));
593
output[1] = inputColor1[1] + value * (2.0f * (inputColor2[1]) - 1.0f);
594
if (inputColor2[2] > 0.5f)
595
output[2] = inputColor1[2] + value * (2.0f * (inputColor2[2] - 0.5f));
597
output[2] = inputColor1[2] + value * (2.0f * (inputColor2[2]) - 1.0f);
599
output[3] = inputColor1[3];
601
clampIfNeeded(output);
604
/* ******** Mix Multiply Operation ******** */
606
MixMultiplyOperation::MixMultiplyOperation() : MixBaseOperation()
611
void MixMultiplyOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)
613
float inputColor1[4];
614
float inputColor2[4];
617
this->m_inputValueOperation->read(inputValue, x, y, sampler);
618
this->m_inputColor1Operation->read(inputColor1, x, y, sampler);
619
this->m_inputColor2Operation->read(inputColor2, x, y, sampler);
621
float value = inputValue[0];
622
if (this->useValueAlphaMultiply()) {
623
value *= inputColor2[3];
625
float valuem = 1.0f - value;
626
output[0] = inputColor1[0] * (valuem + value * inputColor2[0]);
627
output[1] = inputColor1[1] * (valuem + value * inputColor2[1]);
628
output[2] = inputColor1[2] * (valuem + value * inputColor2[2]);
629
output[3] = inputColor1[3];
631
clampIfNeeded(output);
634
/* ******** Mix Ovelray Operation ******** */
636
MixOverlayOperation::MixOverlayOperation() : MixBaseOperation()
641
void MixOverlayOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)
643
float inputColor1[4];
644
float inputColor2[4];
647
this->m_inputValueOperation->read(inputValue, x, y, sampler);
648
this->m_inputColor1Operation->read(inputColor1, x, y, sampler);
649
this->m_inputColor2Operation->read(inputColor2, x, y, sampler);
651
float value = inputValue[0];
652
if (this->useValueAlphaMultiply()) {
653
value *= inputColor2[3];
656
float valuem = 1.0f - value;
658
if (inputColor1[0] < 0.5f) {
659
output[0] = inputColor1[0] * (valuem + 2.0f * value * inputColor2[0]);
662
output[0] = 1.0f - (valuem + 2.0f * value * (1.0f - inputColor2[0])) * (1.0f - inputColor1[0]);
664
if (inputColor1[1] < 0.5f) {
665
output[1] = inputColor1[1] * (valuem + 2.0f * value * inputColor2[1]);
668
output[1] = 1.0f - (valuem + 2.0f * value * (1.0f - inputColor2[1])) * (1.0f - inputColor1[1]);
670
if (inputColor1[2] < 0.5f) {
671
output[2] = inputColor1[2] * (valuem + 2.0f * value * inputColor2[2]);
674
output[2] = 1.0f - (valuem + 2.0f * value * (1.0f - inputColor2[2])) * (1.0f - inputColor1[2]);
676
output[3] = inputColor1[3];
678
clampIfNeeded(output);
681
/* ******** Mix Saturation Operation ******** */
683
MixSaturationOperation::MixSaturationOperation() : MixBaseOperation()
688
void MixSaturationOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)
690
float inputColor1[4];
691
float inputColor2[4];
694
this->m_inputValueOperation->read(inputValue, x, y, sampler);
695
this->m_inputColor1Operation->read(inputColor1, x, y, sampler);
696
this->m_inputColor2Operation->read(inputColor2, x, y, sampler);
698
float value = inputValue[0];
699
if (this->useValueAlphaMultiply()) {
700
value *= inputColor2[3];
702
float valuem = 1.0f - value;
705
rgb_to_hsv(inputColor1[0], inputColor1[1], inputColor1[2], &rH, &rS, &rV);
707
float colH, colS, colV;
708
rgb_to_hsv(inputColor2[0], inputColor2[1], inputColor2[2], &colH, &colS, &colV);
709
hsv_to_rgb(rH, (valuem * rS + value * colS), rV, &output[0], &output[1], &output[2]);
712
copy_v3_v3(output, inputColor1);
715
output[3] = inputColor1[3];
717
clampIfNeeded(output);
720
/* ******** Mix Screen Operation ******** */
722
MixScreenOperation::MixScreenOperation() : MixBaseOperation()
727
void MixScreenOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)
729
float inputColor1[4];
730
float inputColor2[4];
733
this->m_inputValueOperation->read(inputValue, x, y, sampler);
734
this->m_inputColor1Operation->read(inputColor1, x, y, sampler);
735
this->m_inputColor2Operation->read(inputColor2, x, y, sampler);
737
float value = inputValue[0];
738
if (this->useValueAlphaMultiply()) {
739
value *= inputColor2[3];
741
float valuem = 1.0f - value;
743
output[0] = 1.0f - (valuem + value * (1.0f - inputColor2[0])) * (1.0f - inputColor1[0]);
744
output[1] = 1.0f - (valuem + value * (1.0f - inputColor2[1])) * (1.0f - inputColor1[1]);
745
output[2] = 1.0f - (valuem + value * (1.0f - inputColor2[2])) * (1.0f - inputColor1[2]);
746
output[3] = inputColor1[3];
748
clampIfNeeded(output);
751
/* ******** Mix Soft Light Operation ******** */
753
MixSoftLightOperation::MixSoftLightOperation() : MixBaseOperation()
758
void MixSoftLightOperation::executePixel(float output[4], float x, float y, PixelSampler sampler) \
760
float inputColor1[4];
761
float inputColor2[4];
764
this->m_inputValueOperation->read(inputValue, x, y, sampler);
765
this->m_inputColor1Operation->read(inputColor1, x, y, sampler);
766
this->m_inputColor2Operation->read(inputColor2, x, y, sampler);
768
float value = inputValue[0];
769
if (this->useValueAlphaMultiply()) {
770
value *= inputColor2[3];
772
float valuem = 1.0f - value;
775
/* first calculate non-fac based Screen mix */
776
scr = 1.0f - (1.0f - inputColor2[0]) * (1.0f - inputColor1[0]);
777
scg = 1.0f - (1.0f - inputColor2[1]) * (1.0f - inputColor1[1]);
778
scb = 1.0f - (1.0f - inputColor2[2]) * (1.0f - inputColor1[2]);
780
output[0] = valuem * (inputColor1[0]) + value * (((1.0f - inputColor1[0]) * inputColor2[0] * (inputColor1[0])) + (inputColor1[0] * scr));
781
output[1] = valuem * (inputColor1[1]) + value * (((1.0f - inputColor1[1]) * inputColor2[1] * (inputColor1[1])) + (inputColor1[1] * scg));
782
output[2] = valuem * (inputColor1[2]) + value * (((1.0f - inputColor1[2]) * inputColor2[2] * (inputColor1[2])) + (inputColor1[2] * scb));
783
output[3] = inputColor1[3];
785
clampIfNeeded(output);
788
/* ******** Mix Subtract Operation ******** */
790
MixSubtractOperation::MixSubtractOperation() : MixBaseOperation()
795
void MixSubtractOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)
797
float inputColor1[4];
798
float inputColor2[4];
801
this->m_inputValueOperation->read(inputValue, x, y, sampler);
802
this->m_inputColor1Operation->read(inputColor1, x, y, sampler);
803
this->m_inputColor2Operation->read(inputColor2, x, y, sampler);
805
float value = inputValue[0];
806
if (this->useValueAlphaMultiply()) {
807
value *= inputColor2[3];
809
output[0] = inputColor1[0] - value * (inputColor2[0]);
810
output[1] = inputColor1[1] - value * (inputColor2[1]);
811
output[2] = inputColor1[2] - value * (inputColor2[2]);
812
output[3] = inputColor1[3];
814
clampIfNeeded(output);
817
/* ******** Mix Value Operation ******** */
819
MixValueOperation::MixValueOperation() : MixBaseOperation()
824
void MixValueOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)
826
float inputColor1[4];
827
float inputColor2[4];
830
this->m_inputValueOperation->read(inputValue, x, y, sampler);
831
this->m_inputColor1Operation->read(inputColor1, x, y, sampler);
832
this->m_inputColor2Operation->read(inputColor2, x, y, sampler);
834
float value = inputValue[0];
835
if (this->useValueAlphaMultiply()) {
836
value *= inputColor2[3];
838
float valuem = 1.0f - value;
841
float colH, colS, colV;
842
rgb_to_hsv(inputColor1[0], inputColor1[1], inputColor1[2], &rH, &rS, &rV);
843
rgb_to_hsv(inputColor2[0], inputColor2[1], inputColor2[2], &colH, &colS, &colV);
844
hsv_to_rgb(rH, rS, (valuem * rV + value * colV), &output[0], &output[1], &output[2]);
845
output[3] = inputColor1[3];
847
clampIfNeeded(output);