[gimp] libgimpcolor: optimize gimp_color_transform_process_buffer()



commit 4bad9b2144a2aab0e878a4f26076d34952875e8f
Author: Michael Natterer <mitch gimp org>
Date:   Sun May 29 20:24:37 2016 +0200

    libgimpcolor: optimize gimp_color_transform_process_buffer()
    
    for the case we're transforming the same buffer in place.

 libgimpcolor/gimpcolortransform.c |   71 ++++++++++++++++++++++++------------
 1 files changed, 47 insertions(+), 24 deletions(-)
---
diff --git a/libgimpcolor/gimpcolortransform.c b/libgimpcolor/gimpcolortransform.c
index 5407dca..b966dbc 100644
--- a/libgimpcolor/gimpcolortransform.c
+++ b/libgimpcolor/gimpcolortransform.c
@@ -353,7 +353,7 @@ gimp_color_transform_process_pixels (GimpColorTransform *transform,
  * @dest_format:
  * @dest_rect:
  *
- * This function transforms a contiguous line of pixels.
+ * This function transforms buffer into another buffer.
  *
  * Since: 2.10
  **/
@@ -366,7 +366,6 @@ gimp_color_transform_process_buffer (GimpColorTransform  *transform,
 {
   GimpColorTransformPrivate *priv;
   GeglBufferIterator        *iter;
-  const Babl                *fish = NULL;
   gint                       total_pixels;
   gint                       done_pixels = 0;
 
@@ -386,34 +385,58 @@ gimp_color_transform_process_buffer (GimpColorTransform  *transform,
                       gegl_buffer_get_height (src_buffer));
     }
 
-  if (babl_format_has_alpha (priv->dest_format))
-    fish = babl_fish (priv->src_format,
-                      priv->dest_format);
+  if (src_buffer != dest_buffer)
+    {
+      const Babl *fish = NULL;
+
+      if (babl_format_has_alpha (priv->dest_format))
+        fish = babl_fish (priv->src_format,
+                          priv->dest_format);
 
-  iter = gegl_buffer_iterator_new (src_buffer, src_rect, 0,
-                                   priv->src_format,
-                                   GEGL_ACCESS_READ,
-                                   GEGL_ABYSS_NONE);
+      iter = gegl_buffer_iterator_new (src_buffer, src_rect, 0,
+                                       priv->src_format,
+                                       GEGL_ACCESS_READ,
+                                       GEGL_ABYSS_NONE);
 
-  gegl_buffer_iterator_add (iter, dest_buffer, dest_rect, 0,
-                            priv->dest_format,
-                            GEGL_ACCESS_WRITE,
-                            GEGL_ABYSS_NONE);
+      gegl_buffer_iterator_add (iter, dest_buffer, dest_rect, 0,
+                                priv->dest_format,
+                                GEGL_ACCESS_WRITE,
+                                GEGL_ABYSS_NONE);
 
-  while (gegl_buffer_iterator_next (iter))
-    {
-      /* make sure the alpha channel is copied too, lcms doesn't copy it */
-      if (fish)
-        babl_process (fish, iter->data[0], iter->data[1], iter->length);
+      while (gegl_buffer_iterator_next (iter))
+        {
+          /* make sure the alpha channel is copied too, lcms doesn't copy it */
+          if (fish)
+            babl_process (fish, iter->data[0], iter->data[1], iter->length);
 
-      cmsDoTransform (priv->transform,
-                      iter->data[0], iter->data[1], iter->length);
+          cmsDoTransform (priv->transform,
+                          iter->data[0], iter->data[1], iter->length);
 
-      done_pixels += iter->roi[0].width * iter->roi[0].height;
+          done_pixels += iter->roi[0].width * iter->roi[0].height;
 
-      g_signal_emit (transform, gimp_color_transform_signals[PROGRESS], 0,
-                     (gdouble) done_pixels /
-                     (gdouble) total_pixels);
+          g_signal_emit (transform, gimp_color_transform_signals[PROGRESS], 0,
+                         (gdouble) done_pixels /
+                         (gdouble) total_pixels);
+        }
+    }
+  else
+    {
+      iter = gegl_buffer_iterator_new (src_buffer, src_rect, 0,
+                                       priv->src_format,
+                                       GEGL_ACCESS_READWRITE,
+                                       GEGL_ABYSS_NONE);
+
+      while (gegl_buffer_iterator_next (iter))
+        {
+          cmsDoTransform (priv->transform,
+                          iter->data[0], iter->data[0], iter->length);
+
+          done_pixels += iter->roi[0].width * iter->roi[0].height;
+
+          g_signal_emit (transform, gimp_color_transform_signals[PROGRESS], 0,
+                         (gdouble) done_pixels /
+                         (gdouble) total_pixels);
+        }
     }
 
   g_signal_emit (transform, gimp_color_transform_signals[PROGRESS], 0,


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