[gimp/goat-invasion: 502/608] app: remove the legacy histogram calculation code



commit 42623563a0e8722afa852ea8d66d955947109c6e
Author: Michael Natterer <mitch gimp org>
Date:   Mon Apr 16 22:36:28 2012 +0200

    app: remove the legacy histogram calculation code

 app/core/gimpdrawable-histogram.c |   39 +----
 app/core/gimphistogram.c          |  382 +++----------------------------------
 app/core/gimphistogram.h          |    6 +-
 3 files changed, 29 insertions(+), 398 deletions(-)
---
diff --git a/app/core/gimpdrawable-histogram.c b/app/core/gimpdrawable-histogram.c
index d5efdd8..6ad2bd5 100644
--- a/app/core/gimpdrawable-histogram.c
+++ b/app/core/gimpdrawable-histogram.c
@@ -23,12 +23,8 @@
 
 #include "core-types.h"
 
-#include "base/pixel-region.h"
-
 #include "gegl/gimp-gegl-nodes.h"
 
-#include "gimp.h" /* gimp_use_gegl */
-#include "gimp-utils.h"
 #include "gimpchannel.h"
 #include "gimpdrawable-histogram.h"
 #include "gimphistogram.h"
@@ -53,9 +49,7 @@ gimp_drawable_calculate_histogram (GimpDrawable  *drawable,
   image = gimp_item_get_image (GIMP_ITEM (drawable));
   mask  = gimp_image_get_mask (image);
 
-  GIMP_TIMER_START();
-
-  if (FALSE) // gimp_use_gegl (image->gimp))
+  if (FALSE)
     {
       GeglNode      *node = gegl_node_new ();
       GeglNode      *buffer_source;
@@ -102,7 +96,7 @@ gimp_drawable_calculate_histogram (GimpDrawable  *drawable,
       g_object_unref (processor);
       g_object_unref (node);
     }
-  else if (gimp_use_gegl (image->gimp))
+  else
     {
       if (! gimp_channel_is_empty (mask))
         {
@@ -110,7 +104,7 @@ gimp_drawable_calculate_histogram (GimpDrawable  *drawable,
 
           gimp_item_get_offset (GIMP_ITEM (drawable), &off_x, &off_y);
 
-          gimp_histogram_calc_gegl (histogram,
+          gimp_histogram_calculate (histogram,
                                     gimp_drawable_get_buffer (drawable),
                                     GEGL_RECTANGLE (x, y, width, height),
                                     gimp_drawable_get_buffer (GIMP_DRAWABLE (mask)),
@@ -119,35 +113,10 @@ gimp_drawable_calculate_histogram (GimpDrawable  *drawable,
         }
       else
         {
-          gimp_histogram_calc_gegl (histogram,
+          gimp_histogram_calculate (histogram,
                                     gimp_drawable_get_buffer (drawable),
                                     GEGL_RECTANGLE (x, y, width, height),
                                     NULL, NULL);
         }
     }
-  else
-    {
-      PixelRegion  region;
-      PixelRegion  mask_region;
-
-      pixel_region_init (&region, gimp_drawable_get_tiles (drawable),
-                         x, y, width, height, FALSE);
-
-      if (! gimp_channel_is_empty (mask))
-        {
-          gint off_x, off_y;
-
-          gimp_item_get_offset (GIMP_ITEM (drawable), &off_x, &off_y);
-          pixel_region_init (&mask_region,
-                             gimp_drawable_get_tiles (GIMP_DRAWABLE (mask)),
-                             x + off_x, y + off_y, width, height, FALSE);
-          gimp_histogram_calculate (histogram, &region, &mask_region);
-        }
-      else
-        {
-          gimp_histogram_calculate (histogram, &region, NULL);
-        }
-    }
-
-  GIMP_TIMER_END("histogram");
 }
diff --git a/app/core/gimphistogram.c b/app/core/gimphistogram.c
index 4a3b5c6..33bcacb 100644
--- a/app/core/gimphistogram.c
+++ b/app/core/gimphistogram.c
@@ -21,44 +21,27 @@
 
 #include <string.h>
 
-#undef G_DISABLE_DEPRECATED /* GStaticMutex */
 #include <gegl.h>
 
 #include "libgimpmath/gimpmath.h"
 
 #include "core-types.h"
 
-#include "base/pixel-processor.h"
-#include "base/pixel-region.h"
-
 #include "gimphistogram.h"
 
-#ifdef ENABLE_MP
-#define NUM_SLOTS  GIMP_MAX_NUM_THREADS
-#else
-#define NUM_SLOTS  1
-#endif
-
 
 struct _GimpHistogram
 {
-  gint           ref_count;
-  gint           n_channels;
-#ifdef ENABLE_MP
-  GStaticMutex   mutex;
-  gchar          slots[NUM_SLOTS];
-#endif
-  gdouble       *values[NUM_SLOTS];
+  gint     ref_count;
+  gint     n_channels;
+  gdouble *values;
 };
 
 
 /*  local function prototypes  */
 
-static void  gimp_histogram_alloc_values         (GimpHistogram *histogram,
-                                                  gint           bytes);
-static void  gimp_histogram_calculate_sub_region (GimpHistogram *histogram,
-                                                  PixelRegion   *region,
-                                                  PixelRegion   *mask);
+static void   gimp_histogram_alloc_values (GimpHistogram *histogram,
+                                           gint           bytes);
 
 
 /*  public functions  */
@@ -70,10 +53,6 @@ gimp_histogram_new (void)
 
   histogram->ref_count = 1;
 
-#ifdef ENABLE_MP
-  g_static_mutex_init (&histogram->mutex);
-#endif
-
   return histogram;
 }
 
@@ -119,23 +98,15 @@ gimp_histogram_duplicate (GimpHistogram *histogram)
 
   dup = gimp_histogram_new ();
 
-#ifdef ENABLE_MP
-  g_static_mutex_lock (&histogram->mutex);
-#endif
-
   dup->n_channels = histogram->n_channels;
-  dup->values[0]  = g_memdup (histogram->values[0],
+  dup->values     = g_memdup (histogram->values,
                               sizeof (gdouble) * dup->n_channels * 256);
 
-#ifdef ENABLE_MP
-  g_static_mutex_unlock (&histogram->mutex);
-#endif
-
   return dup;
 }
 
 void
-gimp_histogram_calc_gegl (GimpHistogram       *histogram,
+gimp_histogram_calculate (GimpHistogram       *histogram,
                           GeglBuffer          *buffer,
                           const GeglRectangle *buffer_rect,
                           GeglBuffer          *mask,
@@ -144,7 +115,6 @@ gimp_histogram_calc_gegl (GimpHistogram       *histogram,
   GeglBufferIterator *iter;
   const Babl         *format;
   gint                bpp;
-  gdouble            *values;
 
   g_return_if_fail (histogram != NULL);
   g_return_if_fail (GEGL_IS_BUFFER (buffer));
@@ -163,9 +133,7 @@ gimp_histogram_calc_gegl (GimpHistogram       *histogram,
                               babl_format ("Y float"),
                               GEGL_BUFFER_READ, GEGL_ABYSS_NONE);
 
-  values = histogram->values[0];
-
-#define VALUE(c,i) (values[(c) * 256 + (i)])
+#define VALUE(c,i) (histogram->values[(c) * 256 + (i)])
 
   while (gegl_buffer_iterator_next (iter))
     {
@@ -312,53 +280,21 @@ gimp_histogram_calc_gegl (GimpHistogram       *histogram,
 }
 
 void
-gimp_histogram_calculate (GimpHistogram *histogram,
-                          PixelRegion   *region,
-                          PixelRegion   *mask)
-{
-  gint i;
-
-  g_return_if_fail (histogram != NULL);
-  g_return_if_fail (region != NULL);
-
-  gimp_histogram_alloc_values (histogram, region->bytes);
-
-  pixel_regions_process_parallel ((PixelProcessorFunc)
-                                  gimp_histogram_calculate_sub_region,
-                                  histogram, 2, region, mask);
-
-#ifdef ENABLE_MP
-  /* add up all slots */
-  for (i = 1; i < NUM_SLOTS; i++)
-    if (histogram->values[i])
-      {
-        gint j;
-
-        for (j = 0; j < histogram->n_channels * 256; j++)
-          histogram->values[0][j] += histogram->values[i][j];
-      }
-#endif
-}
-
-void
 gimp_histogram_clear_values (GimpHistogram *histogram)
 {
-  gint i;
-
   g_return_if_fail (histogram != NULL);
 
-  for (i = 0; i < NUM_SLOTS; i++)
-    if (histogram->values[i])
-      {
-        g_free (histogram->values[i]);
-        histogram->values[i] = NULL;
-      }
+  if (histogram->values)
+    {
+      g_free (histogram->values);
+      histogram->values = NULL;
+    }
 
   histogram->n_channels = 0;
 }
 
 
-#define HISTOGRAM_VALUE(c,i) (histogram->values[0][(c) * 256 + (i)])
+#define HISTOGRAM_VALUE(c,i) (histogram->values[(c) * 256 + (i)])
 
 
 gdouble
@@ -374,7 +310,7 @@ gimp_histogram_get_maximum (GimpHistogram        *histogram,
   if (histogram->n_channels == 3 && channel == GIMP_HISTOGRAM_ALPHA)
     channel = 1;
 
-  if (! histogram->values[0] ||
+  if (! histogram->values ||
       (channel != GIMP_HISTOGRAM_RGB && channel >= histogram->n_channels))
     return 0.0;
 
@@ -405,7 +341,7 @@ gimp_histogram_get_value (GimpHistogram        *histogram,
   if (histogram->n_channels == 3 && channel == GIMP_HISTOGRAM_ALPHA)
     channel = 1;
 
-  if (! histogram->values[0] ||
+  if (! histogram->values ||
       bin < 0 || bin >= 256 ||
       (channel == GIMP_HISTOGRAM_RGB && histogram->n_channels < 4) ||
       (channel != GIMP_HISTOGRAM_RGB && channel >= histogram->n_channels))
@@ -469,7 +405,7 @@ gimp_histogram_get_count (GimpHistogram        *histogram,
             gimp_histogram_get_count (histogram,
                                       GIMP_HISTOGRAM_BLUE, start, end));
 
-  if (! histogram->values[0] ||
+  if (! histogram->values ||
       start > end ||
       channel >= histogram->n_channels)
     return 0.0;
@@ -499,7 +435,7 @@ gimp_histogram_get_mean (GimpHistogram        *histogram,
   if (histogram->n_channels == 3 && channel == GIMP_HISTOGRAM_ALPHA)
     channel = 1;
 
-  if (! histogram->values[0] ||
+  if (! histogram->values ||
       start > end ||
       (channel == GIMP_HISTOGRAM_RGB && histogram->n_channels < 4) ||
       (channel != GIMP_HISTOGRAM_RGB && channel >= histogram->n_channels))
@@ -545,7 +481,7 @@ gimp_histogram_get_median (GimpHistogram         *histogram,
   if (histogram->n_channels == 3 && channel == GIMP_HISTOGRAM_ALPHA)
     channel = 1;
 
-  if (! histogram->values[0] ||
+  if (! histogram->values ||
       start > end ||
       (channel == GIMP_HISTOGRAM_RGB && histogram->n_channels < 4) ||
       (channel != GIMP_HISTOGRAM_RGB && channel >= histogram->n_channels))
@@ -607,7 +543,7 @@ gimp_histogram_get_threshold (GimpHistogram        *histogram,
   if (histogram->n_channels == 3 && channel == GIMP_HISTOGRAM_ALPHA)
     channel = 1;
 
-  if (! histogram->values[0] ||
+  if (! histogram->values ||
       start > end ||
       (channel == GIMP_HISTOGRAM_RGB && histogram->n_channels < 4) ||
       (channel != GIMP_HISTOGRAM_RGB && channel >= histogram->n_channels))
@@ -690,7 +626,7 @@ gimp_histogram_get_std_dev (GimpHistogram        *histogram,
   if (histogram->n_channels == 3 && channel == GIMP_HISTOGRAM_ALPHA)
     channel = 1;
 
-  if (! histogram->values[0] ||
+  if (! histogram->values ||
       start > end ||
       (channel == GIMP_HISTOGRAM_RGB && histogram->n_channels < 4) ||
       (channel != GIMP_HISTOGRAM_RGB && channel >= histogram->n_channels))
@@ -736,281 +672,11 @@ gimp_histogram_alloc_values (GimpHistogram *histogram,
 
       histogram->n_channels = bytes + 1;
 
-      histogram->values[0] = g_new0 (gdouble, histogram->n_channels * 256);
+      histogram->values = g_new0 (gdouble, histogram->n_channels * 256);
     }
   else
     {
-      gint i;
-
-      for (i = 0; i < NUM_SLOTS; i++)
-        if (histogram->values[i])
-          memset (histogram->values[i],
-                  0, histogram->n_channels * 256 * sizeof (gdouble));
-    }
-}
-
-static void
-gimp_histogram_calculate_sub_region (GimpHistogram *histogram,
-                                     PixelRegion   *region,
-                                     PixelRegion   *mask)
-{
-  const guchar *src, *msrc;
-  const guchar *m, *s;
-  gdouble      *values;
-  gint          h, w, max;
-
-#ifdef ENABLE_MP
-  gint slot = 0;
-
-  /* find an unused temporary slot to put our results in and lock it */
-  g_static_mutex_lock (&histogram->mutex);
-
-  while (histogram->slots[slot])
-    slot++;
-
-  values = histogram->values[slot];
-  histogram->slots[slot] = 1;
-
-  g_static_mutex_unlock (&histogram->mutex);
-
-  if (! values)
-    {
-      histogram->values[slot] = g_new0 (gdouble, histogram->n_channels * 256);
-      values = histogram->values[slot];
-    }
-
-#else
-  values = histogram->values[0];
-#endif
-
-#define VALUE(c,i) (values[(c) * 256 + (i)])
-
-  h = region->h;
-
-  if (mask)
-    {
-      src  = region->data;
-      msrc = mask->data;
-
-      switch (region->bytes)
-        {
-        case 1:
-          while (h--)
-            {
-              s = src;
-              m = msrc;
-              w = region->w;
-
-              while (w--)
-                {
-                  const gdouble masked = m[0] / 255.0;
-
-                  VALUE (0, s[0]) += masked;
-
-                  s += 1;
-                  m += 1;
-                }
-
-              src  += region->rowstride;
-              msrc += mask->rowstride;
-            }
-          break;
-
-        case 2:
-          while (h--)
-            {
-              s = src;
-              m = msrc;
-              w = region->w;
-
-              while (w--)
-                {
-                  const gdouble masked = m[0] / 255.0;
-                  const gdouble weight = s[1] / 255.0;
-
-                  VALUE (0, s[0]) += weight * masked;
-                  VALUE (1, s[1]) += masked;
-
-                  s += 2;
-                  m += 1;
-                }
-
-              src  += region->rowstride;
-              msrc += mask->rowstride;
-            }
-          break;
-
-        case 3: /* calculate separate value values */
-          while (h--)
-            {
-              s = src;
-              m = msrc;
-              w = region->w;
-
-              while (w--)
-                {
-                  const gdouble masked = m[0] / 255.0;
-
-                  VALUE (1, s[0]) += masked;
-                  VALUE (2, s[1]) += masked;
-                  VALUE (3, s[2]) += masked;
-
-                  max = (s[0] > s[1]) ? s[0] : s[1];
-
-                  if (s[2] > max)
-                    VALUE (0, s[2]) += masked;
-                  else
-                    VALUE (0, max) += masked;
-
-                  s += 3;
-                  m += 1;
-                }
-
-              src  += region->rowstride;
-              msrc += mask->rowstride;
-            }
-          break;
-
-        case 4: /* calculate separate value values */
-          while (h--)
-            {
-              s = src;
-              m = msrc;
-              w = region->w;
-
-              while (w--)
-                {
-                  const gdouble masked = m[0] / 255.0;
-                  const gdouble weight = s[3] / 255.0;
-
-                  VALUE (1, s[0]) += weight * masked;
-                  VALUE (2, s[1]) += weight * masked;
-                  VALUE (3, s[2]) += weight * masked;
-                  VALUE (4, s[3]) += masked;
-
-                  max = (s[0] > s[1]) ? s[0] : s[1];
-
-                  if (s[2] > max)
-                   VALUE (0, s[2]) += weight * masked;
-                  else
-                    VALUE (0, max) += weight * masked;
-
-                  s += 4;
-                  m += 1;
-                }
-
-              src  += region->rowstride;
-              msrc += mask->rowstride;
-            }
-          break;
-        }
-    }
-  else /* no mask */
-    {
-      src = region->data;
-
-      switch (region->bytes)
-        {
-        case 1:
-          while (h--)
-            {
-              s = src;
-              w = region->w;
-
-              while (w--)
-                {
-                  VALUE (0, s[0]) += 1.0;
-
-                  s += 1;
-                }
-
-              src += region->rowstride;
-            }
-          break;
-
-        case 2:
-          while (h--)
-            {
-              s = src;
-              w = region->w;
-
-              while (w--)
-                {
-                  const gdouble weight = s[1] / 255;
-
-                  VALUE (0, s[0]) += weight;
-                  VALUE (1, s[1]) += 1.0;
-
-                  s += 2;
-                }
-
-              src += region->rowstride;
-            }
-          break;
-
-        case 3: /* calculate separate value values */
-          while (h--)
-            {
-              s = src;
-              w = region->w;
-
-              while (w--)
-                {
-                  VALUE (1, s[0]) += 1.0;
-                  VALUE (2, s[1]) += 1.0;
-                  VALUE (3, s[2]) += 1.0;
-
-                  max = (s[0] > s[1]) ? s[0] : s[1];
-
-                  if (s[2] > max)
-                    VALUE (0, s[2]) += 1.0;
-                  else
-                    VALUE (0, max) += 1.0;
-
-                  s += 3;
-                }
-
-              src += region->rowstride;
-            }
-          break;
-
-        case 4: /* calculate separate value values */
-          while (h--)
-            {
-              s = src;
-              w = region->w;
-
-              while (w--)
-                {
-                  const gdouble weight = s[3] / 255;
-
-                  VALUE (1, s[0]) += weight;
-                  VALUE (2, s[1]) += weight;
-                  VALUE (3, s[2]) += weight;
-                  VALUE (4, s[3]) += 1.0;
-
-                  max = (s[0] > s[1]) ? s[0] : s[1];
-
-                  if (s[2] > max)
-                    VALUE (0, s[2]) += weight;
-                  else
-                    VALUE (0, max) += weight;
-
-                  s += 4;
-                }
-
-              src += region->rowstride;
-            }
-          break;
-        }
+      memset (histogram->values,
+              0, histogram->n_channels * 256 * sizeof (gdouble));
     }
-
-#ifdef ENABLE_MP
-  /* unlock this slot */
-  g_static_mutex_lock (&histogram->mutex);
-
-  histogram->slots[slot] = 0;
-
-  g_static_mutex_unlock (&histogram->mutex);
-#endif
 }
diff --git a/app/core/gimphistogram.h b/app/core/gimphistogram.h
index 76294fe..4e89d8f 100644
--- a/app/core/gimphistogram.h
+++ b/app/core/gimphistogram.h
@@ -28,16 +28,12 @@ void            gimp_histogram_unref         (GimpHistogram        *histogram);
 
 GimpHistogram * gimp_histogram_duplicate     (GimpHistogram        *histogram);
 
-void            gimp_histogram_calc_gegl     (GimpHistogram        *histogram,
+void            gimp_histogram_calculate     (GimpHistogram        *histogram,
                                               GeglBuffer           *buffer,
                                               const GeglRectangle  *buffer_rect,
                                               GeglBuffer           *mask,
                                               const GeglRectangle  *mask_rect);
 
-void            gimp_histogram_calculate     (GimpHistogram        *histogram,
-                                              PixelRegion          *region,
-                                              PixelRegion          *mask);
-
 void            gimp_histogram_clear_values  (GimpHistogram        *histogram);
 
 gdouble         gimp_histogram_get_maximum   (GimpHistogram        *histogram,



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