[gimp] app: in legacy layer modes, clamp after blending, not compositing



commit da8bcdcd5694259c60df570381d8424a6b08678f
Author: Ell <ell_se yahoo com>
Date:   Thu Jan 4 13:25:02 2018 -0500

    app: in legacy layer modes, clamp after blending, not compositing
    
    In legacy layer modes that may produce out-of-range output given
    in-range input, clamp the result after blending and before
    compositing, instead of after compositing, to avoid producing
    different results than 2.8 in certain cases.

 .../gimpoperationadditionlegacy.c                  |    2 +-
 .../layer-modes-legacy/gimpoperationdividelegacy.c |   12 +++---------
 .../layer-modes-legacy/gimpoperationdodgelegacy.c  |    4 +++-
 .../gimpoperationgrainextractlegacy.c              |    2 +-
 .../gimpoperationgrainmergelegacy.c                |    2 +-
 .../gimpoperationmultiplylegacy.c                  |    2 +-
 .../gimpoperationsubtractlegacy.c                  |    3 ++-
 7 files changed, 12 insertions(+), 15 deletions(-)
---
diff --git a/app/operations/layer-modes-legacy/gimpoperationadditionlegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationadditionlegacy.c
index d9792b7..a7c43d6 100644
--- a/app/operations/layer-modes-legacy/gimpoperationadditionlegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationadditionlegacy.c
@@ -97,9 +97,9 @@ gimp_operation_addition_legacy_process (GeglOperation       *op,
           for (b = RED; b < ALPHA; b++)
             {
               gfloat comp = in[b] + layer[b];
+              comp = CLAMP (comp, 0.0f, 1.0f);
 
               out[b] = comp * ratio + in[b] * (1.0f - ratio);
-              out[b] = CLAMP (out[b], 0.0f, 1.0f);
             }
         }
       else
diff --git a/app/operations/layer-modes-legacy/gimpoperationdividelegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationdividelegacy.c
index d4e9e00..33052d2 100644
--- a/app/operations/layer-modes-legacy/gimpoperationdividelegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationdividelegacy.c
@@ -23,6 +23,8 @@
 
 #include <gegl-plugin.h>
 
+#include "libgimpmath/gimpmath.h"
+
 #include "../operations-types.h"
 
 #include "gimpoperationdividelegacy.h"
@@ -96,17 +98,9 @@ gimp_operation_divide_legacy_process (GeglOperation       *op,
           for (b = RED; b < ALPHA; b++)
             {
               gfloat comp = in[b] / layer[b];
-
-              /* make infinities(or NaN) correspond to a high number,
-               * to get more predictable math, ideally higher than 5.0
-               * but it seems like some babl conversions might be
-               * acting up then
-               */
-              if (!(comp > -42949672.0f && comp < 5.0f))
-                comp = 1.0f;
+              comp = SAFE_CLAMP (comp, 0.0f, 1.0f);
 
               out[b] = comp * ratio + in[b] * (1.0f - ratio);
-              out[b] = CLAMP (out[b], 0.0f, 1.0f);
             }
         }
       else
diff --git a/app/operations/layer-modes-legacy/gimpoperationdodgelegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationdodgelegacy.c
index 98df1b7..55e531f 100644
--- a/app/operations/layer-modes-legacy/gimpoperationdodgelegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationdodgelegacy.c
@@ -23,6 +23,8 @@
 
 #include <gegl-plugin.h>
 
+#include "libgimpmath/gimpmath.h"
+
 #include "../operations-types.h"
 
 #include "gimpoperationdodgelegacy.h"
@@ -96,7 +98,7 @@ gimp_operation_dodge_legacy_process (GeglOperation       *op,
           for (b = RED; b < ALPHA; b++)
             {
               gfloat comp = in[b] / (1.0f - layer[b]);
-              comp = MIN (comp, 1.0f);
+              comp = SAFE_CLAMP (comp, 0.0f, 1.0f);
 
               out[b] = comp * ratio + in[b] * (1.0f - ratio);
             }
diff --git a/app/operations/layer-modes-legacy/gimpoperationgrainextractlegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationgrainextractlegacy.c
index 26b822e..42d232c 100644
--- a/app/operations/layer-modes-legacy/gimpoperationgrainextractlegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationgrainextractlegacy.c
@@ -96,9 +96,9 @@ gimp_operation_grain_extract_legacy_process (GeglOperation       *op,
           for (b = RED; b < ALPHA; b++)
             {
               gfloat comp = in[b] - layer[b] + 128.0f / 255.0f;
+              comp = CLAMP (comp, 0.0f, 1.0f);
 
               out[b] = comp * ratio + in[b] * (1.0f - ratio);
-              out[b] = CLAMP (out[b], 0.0f, 1.0f);
             }
         }
       else
diff --git a/app/operations/layer-modes-legacy/gimpoperationgrainmergelegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationgrainmergelegacy.c
index f16220f..a30ac88 100644
--- a/app/operations/layer-modes-legacy/gimpoperationgrainmergelegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationgrainmergelegacy.c
@@ -96,9 +96,9 @@ gimp_operation_grain_merge_legacy_process (GeglOperation       *op,
           for (b = RED; b < ALPHA; b++)
             {
               gfloat comp = in[b] + layer[b] - 128.0f / 255.0f;
+              comp = CLAMP (comp, 0.0f, 1.0f);
 
               out[b] = comp * ratio + in[b] * (1.0f - ratio);
-              out[b] = CLAMP (out[b], 0.0f, 1.0f);
             }
         }
       else
diff --git a/app/operations/layer-modes-legacy/gimpoperationmultiplylegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationmultiplylegacy.c
index 70d1d75..68a8a61 100644
--- a/app/operations/layer-modes-legacy/gimpoperationmultiplylegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationmultiplylegacy.c
@@ -96,8 +96,8 @@ gimp_operation_multiply_legacy_process (GeglOperation       *op,
           for (b = RED; b < ALPHA; b++)
             {
               gfloat comp = layer[b] * in[b];
+
               out[b] = comp * ratio + in[b] * (1.0f - ratio);
-              out[b] = CLAMP (out[b], 0.0f, 1.0f);
             }
         }
       else
diff --git a/app/operations/layer-modes-legacy/gimpoperationsubtractlegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationsubtractlegacy.c
index 09e6518..bc7bc92 100644
--- a/app/operations/layer-modes-legacy/gimpoperationsubtractlegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationsubtractlegacy.c
@@ -96,8 +96,9 @@ gimp_operation_subtract_legacy_process (GeglOperation       *op,
           for (b = RED; b < ALPHA; b++)
             {
               gfloat comp = in[b] - layer[b];
+              comp = CLAMP (comp, 0.0f, 1.0f);
+
               out[b] = comp * ratio + in[b] * (1.0f - ratio);
-              out[b] = CLAMP(out[b], 0.0f, 1.0f);
             }
         }
       else


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]