[gimp] app: in gimp_blend_composite(), fix dst_atop and avoid some conversions



commit 7df1bb4c0e68eeb090ac3511e381e63de0da0a62
Author: Ell <ell_se yahoo com>
Date:   Thu Jan 19 11:47:43 2017 -0500

    app: in gimp_blend_composite(), fix dst_atop and avoid some conversions
    
    Also s/comp_alpha/layer_alpha/ for consistency.

 app/operations/layer-modes/gimpblendcomposite.h |   85 ++++++++++++++++++----
 1 files changed, 69 insertions(+), 16 deletions(-)
---
diff --git a/app/operations/layer-modes/gimpblendcomposite.h b/app/operations/layer-modes/gimpblendcomposite.h
index 9df6cd1..7042d62 100644
--- a/app/operations/layer-modes/gimpblendcomposite.h
+++ b/app/operations/layer-modes/gimpblendcomposite.h
@@ -45,12 +45,12 @@ compfun_src_atop (gfloat *in,
 {
   while (samples--)
     {
-      gfloat comp_alpha = layer[ALPHA] * opacity;
+      gfloat layer_alpha = layer[ALPHA] * opacity;
 
       if (mask)
-        comp_alpha *= *mask;
+        layer_alpha *= *mask;
 
-      if (comp_alpha == 0.0f)
+      if (layer_alpha == 0.0f)
         {
           out[RED]   = in[RED];
           out[GREEN] = in[GREEN];
@@ -61,7 +61,7 @@ compfun_src_atop (gfloat *in,
           gint b;
 
           for (b = RED; b < ALPHA; b++)
-            out[b] = layer[b] * comp_alpha + in[b] * (1.0f - comp_alpha);
+            out[b] = layer[b] * layer_alpha + in[b] * (1.0f - layer_alpha);
         }
 
       out[ALPHA] = in[ALPHA];
@@ -87,14 +87,14 @@ compfun_src_over (gfloat *in,
   while (samples--)
     {
       gfloat new_alpha;
-      gfloat comp_alpha = layer[ALPHA] * opacity;
+      gfloat layer_alpha = layer[ALPHA] * opacity;
 
       if (mask)
-        comp_alpha *= *mask;
+        layer_alpha *= *mask;
 
-      new_alpha = comp_alpha + (1.0f - comp_alpha) * in[ALPHA];
+      new_alpha = layer_alpha + (1.0f - layer_alpha) * in[ALPHA];
 
-      if (comp_alpha == 0.0f || new_alpha == 0.0f)
+      if (layer_alpha == 0.0f || new_alpha == 0.0f)
         {
           out[RED]   = in[RED];
           out[GREEN] = in[GREEN];
@@ -102,7 +102,7 @@ compfun_src_over (gfloat *in,
         }
       else
         {
-          gfloat ratio = comp_alpha / new_alpha;
+          gfloat ratio = layer_alpha / new_alpha;
           gint   b;
 
           for (b = RED; b < ALPHA; b++)
@@ -121,6 +121,45 @@ compfun_src_over (gfloat *in,
     }
 }
 
+static inline void
+compfun_dst_atop (gfloat *in,
+                  gfloat *layer,
+                  gfloat *comp,
+                  gfloat *mask,
+                  gfloat  opacity,
+                  gfloat *out,
+                  gint    samples)
+{
+  while (samples--)
+    {
+      gfloat layer_alpha = layer[ALPHA] * opacity;
+
+      if (mask)
+        layer_alpha *= *mask;
+
+      if (layer_alpha == 0.0f)
+        {
+          out[RED]   = in[RED];
+          out[GREEN] = in[GREEN];
+          out[BLUE]  = in[BLUE];
+        }
+      else
+        {
+          for (b = RED; b < ALPHA; b++)
+            out[b] = comp[b] * in[ALPHA] + layer[b] * (1.0f - in[ALPHA]);
+        }
+
+      out[ALPHA] = layer_alpha;
+
+      in    += 4;
+      layer += 4;
+      comp  += 4;
+      out   += 4;
+
+      if (mask)
+        mask++;
+    }
+}
 
 static inline void
 compfun_src_in (gfloat *in,
@@ -261,7 +300,26 @@ gimp_composite_blend (gfloat                 *in,
 
   if (fish_to_composite)
     {
-      babl_process (fish_to_composite, blend_in, blend_in,   samples);
+      if (composite_trc == GIMP_LAYER_BLEND_RGB_LINEAR)
+        {
+          blend_in    = in;
+          blend_layer = layer;
+        }
+      else
+        {
+          if (composite_mode == GIMP_LAYER_COMPOSITE_SRC_OVER ||
+              composite_mode == GIMP_LAYER_COMPOSITE_SRC_ATOP)
+            {
+              babl_process (fish_to_composite, blend_in, blend_in, samples);
+            }
+
+          if (composite_mode == GIMP_LAYER_COMPOSITE_SRC_OVER ||
+              composite_mode == GIMP_LAYER_COMPOSITE_DST_ATOP)
+            {
+              babl_process (fish_to_composite, blend_layer, blend_layer, samples);
+            }
+        }
+
       babl_process (fish_to_composite, blend_out, blend_out, samples);
     }
 
@@ -273,16 +331,11 @@ gimp_composite_blend (gfloat                 *in,
       break;
 
     case GIMP_LAYER_COMPOSITE_SRC_OVER:
-      if (fish_to_composite)
-        babl_process (fish_to_composite, blend_layer, blend_layer,  samples);
       compfun_src_over (blend_in, blend_layer, blend_out, mask, opacity, out, samples);
       break;
 
     case GIMP_LAYER_COMPOSITE_DST_ATOP:
-      if (fish_to_composite)
-        babl_process (fish_to_composite, blend_layer, blend_layer,  samples);
-
-      compfun_src_atop (blend_out, blend_in, mask, opacity, out, samples); /* swapped arguments */
+      compfun_dst_atop (blend_in, blend_layer, blend_out, mask, opacity, out, samples);
       break;
 
     case GIMP_LAYER_COMPOSITE_SRC_IN:


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