[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