recent commit to make color balance work like the sequencer, I forgot that the gamma...
authorCampbell Barton <ideasman42@gmail.com>
Sat, 31 Jul 2010 10:03:08 +0000 (10:03 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Sat, 31 Jul 2010 10:03:08 +0000 (10:03 +0000)
source/blender/makesdna/DNA_node_types.h
source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c

index 872d69f31488af2e1b3122ebb8917c4cab215de6..e3ac90bf88133d911c80dfbf6dc6d9bd0784eb84 100644 (file)
@@ -314,6 +314,7 @@ typedef struct NodeColorBalance {
 
        /* temp storage for inverted lift */
        float lift_lgg[3];
+       float gamma_inv[3];
 } NodeColorBalance;
 
 typedef struct NodeColorspill {
index 843daa49a5bf9f4d038e129b6b2a9615f9bb665c..43c6c6d791ea6c475d85f86a8d7efd769ea17db0 100644 (file)
@@ -54,8 +54,8 @@ DO_INLINE float colorbalance_cdl(float in, float offset, float power, float slop
        return powf(x, 1.f/power);
 }
 
-/* note: lift_lgg is just 2-lift */
-DO_INLINE float colorbalance_lgg(float in, float lift_lgg, float gamma, float gain)
+/* note: lift_lgg is just 2-lift, gamma_inv is 1.0/gamma */
+DO_INLINE float colorbalance_lgg(float in, float lift_lgg, float gamma_inv, float gain)
 {
        /* 1:1 match with the sequencer with linear/srgb conversions, the conversion isnt pretty
         * but best keep it this way, sice testing for durian shows a similar calculation
@@ -66,7 +66,7 @@ DO_INLINE float colorbalance_lgg(float in, float lift_lgg, float gamma, float ga
        /* prevent NaN */
        if (x < 0.f) x = 0.f;
 
-       return powf(srgb_to_linearrgb(x), gamma);
+       return powf(srgb_to_linearrgb(x), gamma_inv);
 }
 
 static void do_colorbalance_cdl(bNode *node, float* out, float *in)
@@ -94,9 +94,9 @@ static void do_colorbalance_lgg(bNode *node, float* out, float *in)
 {
        NodeColorBalance *n= (NodeColorBalance *)node->storage;
 
-       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[0] = colorbalance_lgg(in[0], n->lift_lgg[0], n->gamma_inv[0], n->gain[0]);
+       out[1] = colorbalance_lgg(in[1], n->lift_lgg[1], n->gamma_inv[1], n->gain[1]);
+       out[2] = colorbalance_lgg(in[2], n->lift_lgg[2], n->gamma_inv[2], n->gain[2]);
        out[3] = in[3];
 }
 
@@ -105,9 +105,9 @@ static void do_colorbalance_lgg_fac(bNode *node, float* out, float *in, float *f
        NodeColorBalance *n= (NodeColorBalance *)node->storage;
        const float mfac= 1.0f - *fac;
 
-       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[0] = mfac*in[0] + *fac * colorbalance_lgg(in[0], n->lift_lgg[0], n->gamma_inv[0], n->gain[0]);
+       out[1] = mfac*in[1] + *fac * colorbalance_lgg(in[1], n->lift_lgg[1], n->gamma_inv[1], n->gain[1]);
+       out[2] = mfac*in[2] + *fac * colorbalance_lgg(in[2], n->lift_lgg[2], n->gamma_inv[2], n->gain[2]);
        out[3] = in[3];
 }
 
@@ -131,6 +131,7 @@ static void node_composit_exec_colorbalance(void *data, bNode *node, bNodeStack
 
                for (c = 0; c < 3; c++) {
                        n->lift_lgg[c] = 2.0f - n->lift[c];
+                       n->gamma_inv[c] = (n->gamma[c] != 0.0f) ? 1.0f/n->gamma[c] : 1000000.0f;
                }
        }