[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42535] branches/tile/source/blender/ compositor/operations: Finished all blend modes for the color mix node.
Lukas Toenne
lukas.toenne at googlemail.com
Fri Dec 9 12:38:18 CET 2011
Revision: 42535
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42535
Author: lukastoenne
Date: 2011-12-09 11:38:10 +0000 (Fri, 09 Dec 2011)
Log Message:
-----------
Finished all blend modes for the color mix node.
In detail:
* Added missing implementations for Dodge, Burn, Hue, Saturation, Value and Color blend modes.
* Reviewed all other blend modes for correctness.
* Base Operation: Leave alpha unchanged (all color mix ops do so); use the alpha multiply value like all others (just for clarity, base op is not really used)
* Difference: Use fabsf instead of fabs, the latter works on doubles instead floats.
* Divide: return 0 if divisor is 0.
Modified Paths:
--------------
branches/tile/source/blender/compositor/operations/COM_MixBaseOperation.cpp
branches/tile/source/blender/compositor/operations/COM_MixBurnOperation.cpp
branches/tile/source/blender/compositor/operations/COM_MixColorOperation.cpp
branches/tile/source/blender/compositor/operations/COM_MixDarkenOperation.cpp
branches/tile/source/blender/compositor/operations/COM_MixDifferenceOperation.cpp
branches/tile/source/blender/compositor/operations/COM_MixDivideOperation.cpp
branches/tile/source/blender/compositor/operations/COM_MixDodgeOperation.cpp
branches/tile/source/blender/compositor/operations/COM_MixHueOperation.cpp
branches/tile/source/blender/compositor/operations/COM_MixLinearLightOperation.cpp
branches/tile/source/blender/compositor/operations/COM_MixSaturationOperation.cpp
branches/tile/source/blender/compositor/operations/COM_MixValueOperation.cpp
Modified: branches/tile/source/blender/compositor/operations/COM_MixBaseOperation.cpp
===================================================================
--- branches/tile/source/blender/compositor/operations/COM_MixBaseOperation.cpp 2011-12-09 10:19:11 UTC (rev 42534)
+++ branches/tile/source/blender/compositor/operations/COM_MixBaseOperation.cpp 2011-12-09 11:38:10 UTC (rev 42535)
@@ -50,11 +50,14 @@
inputColor1Operation->read(&inputColor1[0], x, y, inputBuffers);
inputColor2Operation->read(&inputColor2[0], x, y, inputBuffers);
+ if (this->useValueAlphaMultiply()) {
+ value *= inputColor2[3];
+ }
float valuem= 1.0f-value;
outputColor[0] = valuem*(inputColor1[0])+value*(inputColor2[0]);
outputColor[1] = valuem*(inputColor1[1])+value*(inputColor2[1]);
outputColor[2] = valuem*(inputColor1[2])+value*(inputColor2[2]);
- outputColor[3] = valuem*(inputColor1[3])+value*(inputColor2[0]);
+ outputColor[3] = inputColor1[3];
}
void MixBaseOperation::deinitExecution() {
Modified: branches/tile/source/blender/compositor/operations/COM_MixBurnOperation.cpp
===================================================================
--- branches/tile/source/blender/compositor/operations/COM_MixBurnOperation.cpp 2011-12-09 10:19:11 UTC (rev 42534)
+++ branches/tile/source/blender/compositor/operations/COM_MixBurnOperation.cpp 2011-12-09 11:38:10 UTC (rev 42535)
@@ -28,20 +28,59 @@
}
void MixBurnOperation::executePixel(float* outputValue, float x, float y, MemoryBuffer *inputBuffers[]) {
- float inputColor1[4];
- float inputColor2[4];
- float value;
-
+ float inputColor1[4];
+ float inputColor2[4];
+ float value;
+ float tmp;
+
inputValueOperation->read(&value, x, y, inputBuffers);
inputColor1Operation->read(&inputColor1[0], x, y, inputBuffers);
inputColor2Operation->read(&inputColor2[0], x, y, inputBuffers);
-
- if (this->useValueAlphaMultiply()) {
- value *= inputColor2[3];
- }
- outputValue[0] = inputColor1[0]+value*(inputColor2[0]);
- outputValue[1] = inputColor1[1]+value*(inputColor2[1]);
- outputValue[2] = inputColor1[2]+value*(inputColor2[2]);
- outputValue[3] = inputColor1[3];
+
+ if (this->useValueAlphaMultiply()) {
+ value *= inputColor2[3];
+ }
+ float valuem= 1.0f-value;
+
+ tmp = valuem + value*inputColor2[0];
+ if (tmp <= 0.0f)
+ outputValue[0] = 0.0f;
+ else {
+ tmp = 1.0f - (1.0f - inputColor1[0]) / tmp;
+ if (tmp < 0.0f)
+ outputValue[0] = 0.0f;
+ else if (tmp > 1.0f)
+ outputValue[0] = 1.0f;
+ else
+ outputValue[0] = tmp;
+ }
+
+ tmp = valuem + value*inputColor2[1];
+ if (tmp <= 0.0f)
+ outputValue[1] = 0.0f;
+ else {
+ tmp = 1.0f - (1.0f - inputColor1[1]) / tmp;
+ if (tmp < 0.0f)
+ outputValue[1] = 0.0f;
+ else if (tmp > 1.0f)
+ outputValue[1] = 1.0f;
+ else
+ outputValue[1] = tmp;
+ }
+
+ tmp = valuem + value*inputColor2[2];
+ if (tmp <= 0.0f)
+ outputValue[2] = 0.0f;
+ else {
+ tmp = 1.0f - (1.0f - inputColor1[2]) / tmp;
+ if (tmp < 0.0f)
+ outputValue[2] = 0.0f;
+ else if (tmp > 1.0f)
+ outputValue[2] = 1.0f;
+ else
+ outputValue[2] = tmp;
+ }
+
+ outputValue[3] = inputColor1[3];
}
Modified: branches/tile/source/blender/compositor/operations/COM_MixColorOperation.cpp
===================================================================
--- branches/tile/source/blender/compositor/operations/COM_MixColorOperation.cpp 2011-12-09 10:19:11 UTC (rev 42534)
+++ branches/tile/source/blender/compositor/operations/COM_MixColorOperation.cpp 2011-12-09 11:38:10 UTC (rev 42535)
@@ -24,24 +24,38 @@
#include "COM_InputSocket.h"
#include "COM_OutputSocket.h"
+extern "C" {
+ #include "BLI_math.h"
+}
+
MixColorOperation::MixColorOperation(): MixBaseOperation() {
}
void MixColorOperation::executePixel(float* outputValue, float x, float y, MemoryBuffer *inputBuffers[]) {
- float inputColor1[4];
- float inputColor2[4];
- float value;
+ float inputColor1[4];
+ float inputColor2[4];
+ float value;
inputValueOperation->read(&value, x, y, inputBuffers);
inputColor1Operation->read(&inputColor1[0], x, y, inputBuffers);
inputColor2Operation->read(&inputColor2[0], x, y, inputBuffers);
- if (this->useValueAlphaMultiply()) {
- value *= inputColor2[3];
- }
- outputValue[0] = inputColor1[0]+value*(inputColor2[0]);
- outputValue[1] = inputColor1[1]+value*(inputColor2[1]);
- outputValue[2] = inputColor1[2]+value*(inputColor2[2]);
- outputValue[3] = inputColor1[3];
+ if (this->useValueAlphaMultiply()) {
+ value *= inputColor2[3];
+ }
+ float valuem= 1.0f-value;
+
+ float colH,colS,colV;
+ rgb_to_hsv(inputColor2[0], inputColor2[1], inputColor2[2], &colH, &colS, &colV);
+ if(colS!=0.0f){
+ float rH,rS,rV;
+ float tmpr,tmpg,tmpb;
+ rgb_to_hsv(inputColor1[0], inputColor1[1], inputColor1[2], &rH, &rS, &rV);
+ hsv_to_rgb(colH , colS, rV, &tmpr, &tmpg, &tmpb);
+ outputValue[0] = valuem*(inputColor1[0]) + value*tmpr;
+ outputValue[1] = valuem*(inputColor1[1]) + value*tmpg;
+ outputValue[2] = valuem*(inputColor1[2]) + value*tmpb;
+ }
+ outputValue[3] = inputColor1[3];
}
Modified: branches/tile/source/blender/compositor/operations/COM_MixDarkenOperation.cpp
===================================================================
--- branches/tile/source/blender/compositor/operations/COM_MixDarkenOperation.cpp 2011-12-09 10:19:11 UTC (rev 42534)
+++ branches/tile/source/blender/compositor/operations/COM_MixDarkenOperation.cpp 2011-12-09 11:38:10 UTC (rev 42535)
@@ -39,15 +39,15 @@
if (this->useValueAlphaMultiply()) {
value *= inputColor2[3];
}
- float valuem = 1.0-value;
+ float valuem = 1.0f-value;
float tmp;
- tmp=inputColor2[0]+((1-inputColor2[0])*valuem);
+ tmp=inputColor2[0]+((1.0f-inputColor2[0])*valuem);
if(tmp < inputColor1[0]) outputValue[0]= tmp;
else outputValue[0] = inputColor1[0];
- tmp=inputColor2[1]+((1-inputColor2[1])*valuem);
+ tmp=inputColor2[1]+((1.0f-inputColor2[1])*valuem);
if(tmp < inputColor1[1]) outputValue[1]= tmp;
else outputValue[1] = inputColor1[1];
- tmp=inputColor2[2]+((1-inputColor2[2])*valuem);
+ tmp=inputColor2[2]+((1.0f-inputColor2[2])*valuem);
if(tmp < inputColor1[2]) outputValue[2]= tmp;
else outputValue[2] = inputColor1[2];
Modified: branches/tile/source/blender/compositor/operations/COM_MixDifferenceOperation.cpp
===================================================================
--- branches/tile/source/blender/compositor/operations/COM_MixDifferenceOperation.cpp 2011-12-09 10:19:11 UTC (rev 42534)
+++ branches/tile/source/blender/compositor/operations/COM_MixDifferenceOperation.cpp 2011-12-09 11:38:10 UTC (rev 42535)
@@ -41,9 +41,9 @@
value *= inputColor2[3];
}
float valuem= 1.0f-value;
- outputValue[0] = valuem*inputColor1[0] + value*fabs(inputColor1[0]-inputColor2[0]);
- outputValue[1] = valuem*inputColor1[1] + value*fabs(inputColor1[1]-inputColor2[1]);
- outputValue[2] = valuem*inputColor1[2] + value*fabs(inputColor1[2]-inputColor2[2]);
+ outputValue[0] = valuem*inputColor1[0] + value*fabsf(inputColor1[0]-inputColor2[0]);
+ outputValue[1] = valuem*inputColor1[1] + value*fabsf(inputColor1[1]-inputColor2[1]);
+ outputValue[2] = valuem*inputColor1[2] + value*fabsf(inputColor1[2]-inputColor2[2]);
outputValue[3] = inputColor1[3];
}
Modified: branches/tile/source/blender/compositor/operations/COM_MixDivideOperation.cpp
===================================================================
--- branches/tile/source/blender/compositor/operations/COM_MixDivideOperation.cpp 2011-12-09 10:19:11 UTC (rev 42534)
+++ branches/tile/source/blender/compositor/operations/COM_MixDivideOperation.cpp 2011-12-09 11:38:10 UTC (rev 42535)
@@ -41,13 +41,19 @@
}
float valuem= 1.0f-value;
- if(inputColor2[0]!=0.0f)
- outputValue[0] = valuem*(inputColor1[0]) + value*(inputColor1[0])/inputColor2[0];
- if(inputColor2[1]!=0.0f)
- outputValue[1] = valuem*(inputColor1[1]) + value*(inputColor1[1])/inputColor2[1];
- if(inputColor2[2]!=0.0f)
- outputValue[2] = valuem*(inputColor1[2]) + value*(inputColor1[2])/inputColor2[2];
-
- outputValue[3] = inputColor1[3];
+ if(inputColor2[0]!=0.0f)
+ outputValue[0] = valuem*(inputColor1[0]) + value*(inputColor1[0])/inputColor2[0];
+ else
+ outputValue[0] = 0.0f;
+ if(inputColor2[1]!=0.0f)
+ outputValue[1] = valuem*(inputColor1[1]) + value*(inputColor1[1])/inputColor2[1];
+ else
+ outputValue[1] = 0.0f;
+ if(inputColor2[2]!=0.0f)
+ outputValue[2] = valuem*(inputColor1[2]) + value*(inputColor1[2])/inputColor2[2];
+ else
+ outputValue[2] = 0.0f;
+
+ outputValue[3] = inputColor1[3];
}
Modified: branches/tile/source/blender/compositor/operations/COM_MixDodgeOperation.cpp
===================================================================
--- branches/tile/source/blender/compositor/operations/COM_MixDodgeOperation.cpp 2011-12-09 10:19:11 UTC (rev 42534)
+++ branches/tile/source/blender/compositor/operations/COM_MixDodgeOperation.cpp 2011-12-09 11:38:10 UTC (rev 42535)
@@ -28,20 +28,64 @@
}
void MixDodgeOperation::executePixel(float* outputValue, float x, float y, MemoryBuffer *inputBuffers[]) {
- float inputColor1[4];
- float inputColor2[4];
- float value;
+ float inputColor1[4];
+ float inputColor2[4];
+ float value;
+ float tmp;
inputValueOperation->read(&value, x, y, inputBuffers);
inputColor1Operation->read(&inputColor1[0], x, y, inputBuffers);
inputColor2Operation->read(&inputColor2[0], x, y, inputBuffers);
- if (this->useValueAlphaMultiply()) {
- value *= inputColor2[3];
- }
- outputValue[0] = inputColor1[0]+value*(inputColor2[0]);
- outputValue[1] = inputColor1[1]+value*(inputColor2[1]);
- outputValue[2] = inputColor1[2]+value*(inputColor2[2]);
- outputValue[3] = inputColor1[3];
+ if (this->useValueAlphaMultiply()) {
+ value *= inputColor2[3];
+ }
+
+ if (inputColor1[0] != 0.0f) {
+ tmp = 1.0f - value*inputColor2[0];
+ if (tmp <= 0.0f)
+ outputValue[0] = 1.0f;
+ else {
+ tmp = inputColor1[0] / tmp;
+ if (tmp > 1.0f)
+ outputValue[0] = 1.0f;
+ else
+ outputValue[0] = tmp;
+ }
+ }
+ else
+ outputValue[0] = 0.0f;
+
+ if (inputColor1[1] != 0.0f) {
+ tmp = 1.0f - value*inputColor2[1];
+ if (tmp <= 0.0f)
+ outputValue[1] = 1.0f;
+ else {
+ tmp = inputColor1[1] / tmp;
+ if (tmp > 1.0f)
+ outputValue[1] = 1.0f;
+ else
+ outputValue[1] = tmp;
+ }
+ }
+ else
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list