[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29989] trunk/blender/source/blender: Color Balance Node

Campbell Barton ideasman42 at gmail.com
Mon Jul 5 16:29:16 CEST 2010


Revision: 29989
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29989
Author:   campbellbarton
Date:     2010-07-05 16:29:16 +0200 (Mon, 05 Jul 2010)

Log Message:
-----------
Color Balance Node
changes from sequencer applied to compositor mostly noticable is how the lift works.

Before & After,
http://www.graphicall.org/ftp/ideasman42/color_balance_before_after.png

even with lower values these kinds of errors can be seen.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/sequencer.c
    trunk/blender/source/blender/makesdna/DNA_node_types.h
    trunk/blender/source/blender/makesdna/DNA_sequence_types.h
    trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c

Modified: trunk/blender/source/blender/blenkernel/intern/sequencer.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/sequencer.c	2010-07-05 13:14:14 UTC (rev 29988)
+++ trunk/blender/source/blender/blenkernel/intern/sequencer.c	2010-07-05 14:29:16 UTC (rev 29989)
@@ -1525,13 +1525,12 @@
 	return cb;
 }
 
-/* compiler should inline */
-MINLINE float color_balance_fl(float v, float lift, float gain, float gamma, float mul)
+/* pow(p[c] * cb.gain[c] + cb.lift[c], cb.gamma[c]) * mul;*/
+MINLINE float color_balance_fl(const float v, const float lift, const float gain, const float gamma, const float mul)
 {
-	return pow(pow(v * gain, lift), gamma) * mul;
+	return powf(powf(v * gain, lift), gamma) * mul;
 }
 
-
 static void make_cb_table_byte(float lift, float gain, float gamma,
 				   unsigned char * table, float mul)
 {

Modified: trunk/blender/source/blender/makesdna/DNA_node_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_node_types.h	2010-07-05 13:14:14 UTC (rev 29988)
+++ trunk/blender/source/blender/makesdna/DNA_node_types.h	2010-07-05 14:29:16 UTC (rev 29989)
@@ -311,6 +311,9 @@
 	float lift[3];
 	float gamma[3];
 	float gain[3];
+
+	/* temp storage for inverted lift */
+	float lift_lgg[3];
 } NodeColorBalance;
 
 typedef struct NodeColorspill {

Modified: trunk/blender/source/blender/makesdna/DNA_sequence_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_sequence_types.h	2010-07-05 13:14:14 UTC (rev 29988)
+++ trunk/blender/source/blender/makesdna/DNA_sequence_types.h	2010-07-05 14:29:16 UTC (rev 29989)
@@ -72,8 +72,8 @@
 	float gain[3];
 	int flag;
 	int pad;
-	float exposure;
-	float saturation;
+	// float exposure;
+	// float saturation;
 } StripColorBalance;
 
 typedef struct StripProxy {

Modified: trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c
===================================================================
--- trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c	2010-07-05 13:14:14 UTC (rev 29988)
+++ trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c	2010-07-05 14:29:16 UTC (rev 29989)
@@ -56,8 +56,8 @@
 
 DO_INLINE float colorbalance_lgg(float in, float lift, float gamma, float gain)
 {
-	float x = gain*(in+(lift-1)*(1-in));
-	
+	float x= powf(in * gain, lift);
+
 	/* prevent NaN */
 	if (x < 0.f) x = 0.f;
 	
@@ -88,10 +88,10 @@
 static void do_colorbalance_lgg(bNode *node, float* out, float *in)
 {
 	NodeColorBalance *n= (NodeColorBalance *)node->storage;
-	
-	out[0] = colorbalance_lgg(in[0], n->lift[0], n->gamma[0], n->gain[0]);
-	out[1] = colorbalance_lgg(in[1], n->lift[1], n->gamma[1], n->gain[1]);
-	out[2] = colorbalance_lgg(in[2], n->lift[2], n->gamma[2], n->gain[2]);
+
+	out[0] = colorbalance_lgg(in[0], n->lift_lgg[0], n->gamma[0], n->gain[0]);
+	out[1] = colorbalance_lgg(in[1], n->lift_lgg[1], n->gamma[1], n->gain[1]);
+	out[2] = colorbalance_lgg(in[2], n->lift_lgg[2], n->gamma[2], n->gain[2]);
 	out[3] = in[3];
 }
 
@@ -99,10 +99,10 @@
 {
 	NodeColorBalance *n= (NodeColorBalance *)node->storage;
 	const float mfac= 1.0f - *fac;
-	
-	out[0] = mfac*in[0] + *fac * colorbalance_lgg(in[0], n->lift[0], n->gamma[0], n->gain[0]);
-	out[1] = mfac*in[1] + *fac * colorbalance_lgg(in[1], n->lift[1], n->gamma[1], n->gain[1]);
-	out[2] = mfac*in[2] + *fac * colorbalance_lgg(in[2], n->lift[2], n->gamma[2], n->gain[2]);
+
+	out[0] = mfac*in[0] + *fac * colorbalance_lgg(in[0], n->lift_lgg[0], n->gamma[0], n->gain[0]);
+	out[1] = mfac*in[1] + *fac * colorbalance_lgg(in[1], n->lift_lgg[1], n->gamma[1], n->gain[1]);
+	out[2] = mfac*in[2] + *fac * colorbalance_lgg(in[2], n->lift_lgg[2], n->gamma[2], n->gain[2]);
 	out[3] = in[3];
 }
 
@@ -119,7 +119,15 @@
 		out[0]->data = pass_on_compbuf(cbuf);
 		return;
 	}
-	
+
+	{
+		NodeColorBalance *n= (NodeColorBalance *)node->storage;
+		int c;
+		for (c = 0; c < 3; c++) {
+			n->lift_lgg[c] = 2.0f - pow(n->lift[c], 2);
+		}
+	}
+
 	if (cbuf) {
 		stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* create output based on image input */
 			





More information about the Bf-blender-cvs mailing list