BrightContrast not working correctly with negative contrast
authorPhilipp Oeser <info@graphics-engineer.com>
Thu, 1 Aug 2019 16:17:56 +0000 (18:17 +0200)
committerPhilipp Oeser <info@graphics-engineer.com>
Fri, 2 Aug 2019 08:09:29 +0000 (10:09 +0200)
followup to rB8dd95abb2ff9 (which fixed this for the Compositor node),
turns out this was also wrong for the VSE modifier and in vertex color
operator.

- also adjust min/max for VSE modifier
- also guard against division by zero

Reviewers: brecht

Maniphest Tasks: T67808

Differential Revision: https://developer.blender.org/D5398

source/blender/blenkernel/intern/seqmodifier.c
source/blender/compositor/operations/COM_BrightnessOperation.cpp
source/blender/editors/sculpt_paint/paint_vertex_color_ops.c
source/blender/makesrna/intern/rna_sequencer.c

index cc44cd66f2328563bf7edb02ec507bcc349db50f..aceb8b7e4adb178a20ffa5b27c4cdda768b19507 100644 (file)
@@ -545,20 +545,20 @@ static void brightcontrast_apply_threaded(int width,
   float brightness = data->bright / 100.0f;
   float contrast = data->contrast;
   float delta = contrast / 200.0f;
-
-  a = 1.0f - delta * 2.0f;
   /*
    * The algorithm is by Werner D. Streidt
    * (http://visca.com/ffactory/archives/5-99/msg00021.html)
    * Extracted of OpenCV demhist.c
    */
   if (contrast > 0) {
-    a = 1.0f / a;
+    a = 1.0f - delta * 2.0f;
+    a = 1.0f / max_ff(a, FLT_EPSILON);
     b = a * (brightness - delta);
   }
   else {
     delta *= -1;
-    b = a * (brightness + delta);
+    a = max_ff(1.0f - delta * 2.0f, 0.0f);
+    b = a * brightness + delta;
   }
 
   for (y = 0; y < height; y++) {
index d0bab5aa4d983f6bea24eb8e55cc541add28bc70..b6c220298994fc2a44cb3aba1632b073d9a33c27 100644 (file)
@@ -62,12 +62,13 @@ void BrightnessOperation::executePixelSampled(float output[4],
    * Extracted of OpenCV demhist.c
    */
   if (contrast > 0) {
-    a = 1.0f / (1.0f - delta * 2.0f);
+    a = 1.0f - delta * 2.0f;
+    a = 1.0f / max_ff(a, FLT_EPSILON);
     b = a * (brightness - delta);
   }
   else {
     delta *= -1;
-    a = 1.0f - delta * 2.0f;
+    a = max_ff(1.0f - delta * 2.0f, 0.0f);
     b = a * brightness + delta;
   }
   if (this->m_use_premultiply) {
index fed477ace14afeaadc1df83762fc5c4c145143cc..9a6251e2f980ac28cc1b088ee236d1a46b19dcf5 100644 (file)
@@ -372,19 +372,20 @@ static int vertex_color_brightness_contrast_exec(bContext *C, wmOperator *op)
     float contrast = RNA_float_get(op->ptr, "contrast");
     brightness /= 100.0f;
     float delta = contrast / 200.0f;
-    gain = 1.0f - delta * 2.0f;
     /*
      * The algorithm is by Werner D. Streidt
      * (http://visca.com/ffactory/archives/5-99/msg00021.html)
      * Extracted of OpenCV demhist.c
      */
     if (contrast > 0) {
-      gain = 1.0f / ((gain != 0.0f) ? gain : FLT_EPSILON);
+      gain = 1.0f - delta * 2.0f;
+      gain = 1.0f / max_ff(gain, FLT_EPSILON);
       offset = gain * (brightness - delta);
     }
     else {
       delta *= -1;
-      offset = gain * (brightness + delta);
+      gain = max_ff(1.0f - delta * 2.0f, 0.0f);
+      offset = gain * brightness + delta;
     }
   }
 
index b54fdf5aadbc2dfbcf784135c0564168ed3e8b25..c1ef31a80cd9dd15bc7191f40eb7eec6ffa14e5e 100644 (file)
@@ -3066,7 +3066,7 @@ static void rna_def_brightcontrast_modifier(BlenderRNA *brna)
 
   prop = RNA_def_property(srna, "contrast", PROP_FLOAT, PROP_UNSIGNED);
   RNA_def_property_float_sdna(prop, NULL, "contrast");
-  RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
+  RNA_def_property_range(prop, -100.0f, 100.0f);
   RNA_def_property_ui_text(prop, "Contrast", "Adjust the difference in luminosity between pixels");
   RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_SequenceModifier_update");
 }