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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to