svn merge ^/trunk/blender -r50080:50089
[blender.git] / source / blender / blenkernel / intern / colortools.c
index 0df27532af2b7860a2b44404dcff2c4d9c052cc4..2a045d8b54f4abc7337161119c56d73dc2878f64 100644 (file)
@@ -151,13 +151,8 @@ void curvemapping_set_black_white_ex(const float black[3], const float white[3],
        int a;
 
        for (a = 0; a < 3; a++) {
-               const float delta = white[a] - black[a];
-               if (delta != 0.0f) {
-                       r_bwmul[a] = 1.0f / delta;
-               }
-               else {
-                       r_bwmul[a] = 0.0f;
-               }
+               const float delta = maxf(white[a] - black[a], 1e-5f);
+               r_bwmul[a] = 1.0f / delta;
        }
 }
 
@@ -446,7 +441,7 @@ static void calchandle_curvemap(BezTriple *bezt, BezTriple *prev, BezTriple *nex
 
 /* in X, out Y. 
  * X is presumed to be outside first or last */
-static float curvemap_calc_extend(CurveMap *cuma, float x, const float first[2], const float last[2])
+static float curvemap_calc_extend(const CurveMap *cuma, float x, const float first[2], const float last[2])
 {
        if (x <= first[0]) {
                if ((cuma->flag & CUMA_EXTEND_EXTRAPOLATE) == 0) {
@@ -745,7 +740,7 @@ void curvemapping_changed_all(CurveMapping *cumap)
 }
 
 /* table should be verified */
-float curvemap_evaluateF(CurveMap *cuma, float value)
+float curvemap_evaluateF(const CurveMap *cuma, float value)
 {
        float fi;
        int i;
@@ -767,33 +762,26 @@ float curvemap_evaluateF(CurveMap *cuma, float value)
 }
 
 /* works with curve 'cur' */
-float curvemapping_evaluateF(CurveMapping *cumap, int cur, float value)
+float curvemapping_evaluateF(const CurveMapping *cumap, int cur, float value)
 {
-       CurveMap *cuma = cumap->cm + cur;
-       
-       /* allocate or bail out */
-       if (cuma->table == NULL) {
-               curvemap_make_table(cuma, &cumap->clipr);
-               if (cuma->table == NULL)
-                       return 1.0f - value;
-       }
+       const CurveMap *cuma = cumap->cm + cur;
        return curvemap_evaluateF(cuma, value);
 }
 
 /* vector case */
-void curvemapping_evaluate3F(CurveMapping *cumap, float vecout[3], const float vecin[3])
+void curvemapping_evaluate3F(const CurveMapping *cumap, float vecout[3], const float vecin[3])
 {
-       vecout[0] = curvemapping_evaluateF(cumap, 0, vecin[0]);
-       vecout[1] = curvemapping_evaluateF(cumap, 1, vecin[1]);
-       vecout[2] = curvemapping_evaluateF(cumap, 2, vecin[2]);
+       vecout[0] = curvemap_evaluateF(&cumap->cm[0], vecin[0]);
+       vecout[1] = curvemap_evaluateF(&cumap->cm[1], vecin[1]);
+       vecout[2] = curvemap_evaluateF(&cumap->cm[2], vecin[2]);
 }
 
 /* RGB case, no black/white points, no premult */
-void curvemapping_evaluateRGBF(CurveMapping *cumap, float vecout[3], const float vecin[3])
+void curvemapping_evaluateRGBF(const CurveMapping *cumap, float vecout[3], const float vecin[3])
 {
-       vecout[0] = curvemapping_evaluateF(cumap, 0, curvemapping_evaluateF(cumap, 3, vecin[0]));
-       vecout[1] = curvemapping_evaluateF(cumap, 1, curvemapping_evaluateF(cumap, 3, vecin[1]));
-       vecout[2] = curvemapping_evaluateF(cumap, 2, curvemapping_evaluateF(cumap, 3, vecin[2]));
+       vecout[0] = curvemap_evaluateF(&cumap->cm[0], curvemap_evaluateF(&cumap->cm[3], vecin[0]));
+       vecout[1] = curvemap_evaluateF(&cumap->cm[1], curvemap_evaluateF(&cumap->cm[3], vecin[1]));
+       vecout[2] = curvemap_evaluateF(&cumap->cm[2], curvemap_evaluateF(&cumap->cm[3], vecin[2]));
 }
 
 /** same as #curvemapping_evaluate_premulRGBF
@@ -805,7 +793,7 @@ void curvemapping_evaluateRGBF(CurveMapping *cumap, float vecout[3], const float
  * \param black Use instead of cumap->black
  * \param bwmul Use instead of cumap->bwmul
  */
-void curvemapping_evaluate_premulRGBF_ex(CurveMapping *cumap, float vecout[3], const float vecin[3],
+void curvemapping_evaluate_premulRGBF_ex(const CurveMapping *cumap, float vecout[3], const float vecin[3],
                                          const float black[3], const float bwmul[3])
 {
        vecout[0] = curvemap_evaluateF(&cumap->cm[0], (vecin[0] - black[0]) * bwmul[0]);
@@ -814,7 +802,7 @@ void curvemapping_evaluate_premulRGBF_ex(CurveMapping *cumap, float vecout[3], c
 }
 
 /* RGB with black/white points and premult. tables are checked */
-void curvemapping_evaluate_premulRGBF(CurveMapping *cumap, float vecout[3], const float vecin[3])
+void curvemapping_evaluate_premulRGBF(const CurveMapping *cumap, float vecout[3], const float vecin[3])
 {
        vecout[0] = curvemap_evaluateF(&cumap->cm[0], (vecin[0] - cumap->black[0]) * cumap->bwmul[0]);
        vecout[1] = curvemap_evaluateF(&cumap->cm[1], (vecin[1] - cumap->black[1]) * cumap->bwmul[1]);
@@ -822,7 +810,7 @@ void curvemapping_evaluate_premulRGBF(CurveMapping *cumap, float vecout[3], cons
 }
 
 /* same as above, byte version */
-void curvemapping_evaluate_premulRGB(CurveMapping *cumap, unsigned char vecout_byte[3], const unsigned char vecin_byte[3])
+void curvemapping_evaluate_premulRGB(const CurveMapping *cumap, unsigned char vecout_byte[3], const unsigned char vecin_byte[3])
 {
        float vecin[3], vecout[3];
 
@@ -895,7 +883,7 @@ void curvemapping_do_ibuf(CurveMapping *cumap, ImBuf *ibuf)
        curvemapping_premultiply(cumap, 1);
 }
 
-int curvemapping_RGBA_does_something(CurveMapping *cumap)
+int curvemapping_RGBA_does_something(const CurveMapping *cumap)
 {
        int a;
        
@@ -931,13 +919,12 @@ void curvemapping_initialize(CurveMapping *cumap)
        }
 }
 
-void curvemapping_table_RGBA(CurveMapping *cumap, float **array, int *size)
+void curvemapping_table_RGBA(const CurveMapping *cumap, float **array, int *size)
 {
        int a;
        
        *size = CM_TABLE + 1;
        *array = MEM_callocN(sizeof(float) * (*size) * 4, "CurveMapping");
-       curvemapping_initialize(cumap);
 
        for (a = 0; a < *size; a++) {
                if (cumap->cm[0].table)