allocate temporary histogram slots on demand and provide an array with

2005-02-14  Sven Neumann  <sven@gimp.org>

	* app/base/gimphistogram.[ch]: allocate temporary histogram slots
	on demand and provide an array with enough slots for the maximum
	number of threads. gimp_histogram_new() doesn't need a
	GimpBaseConfig parameter any longer.

	* app/core/gimpdrawable-equalize.c
	* app/core/gimpdrawable-levels.c
	* app/tools/gimpcurvestool.c
	* app/tools/gimplevelstool.c
	* app/tools/gimpthresholdtool.c
	* app/widgets/gimphistogrameditor.c
	* tools/pdbgen/pdb/color.pdb: changed accordingly.

	* app/pdb/color_cmds.c: regenerated.
This commit is contained in:
Sven Neumann 2005-02-14 01:05:34 +00:00 committed by Sven Neumann
parent 9e6fd61f59
commit 1cb9714f02
11 changed files with 65 additions and 99 deletions

View File

@ -1,3 +1,20 @@
2005-02-14 Sven Neumann <sven@gimp.org>
* app/base/gimphistogram.[ch]: allocate temporary histogram slots
on demand and provide an array with enough slots for the maximum
number of threads. gimp_histogram_new() doesn't need a
GimpBaseConfig parameter any longer.
* app/core/gimpdrawable-equalize.c
* app/core/gimpdrawable-levels.c
* app/tools/gimpcurvestool.c
* app/tools/gimplevelstool.c
* app/tools/gimpthresholdtool.c
* app/widgets/gimphistogrameditor.c
* tools/pdbgen/pdb/color.pdb: changed accordingly.
* app/pdb/color_cmds.c: regenerated.
2005-02-14 Sven Neumann <sven@gimp.org> 2005-02-14 Sven Neumann <sven@gimp.org>
* app/base/pixel-processor.[ch]: define the maximum number of * app/base/pixel-processor.[ch]: define the maximum number of

View File

@ -26,8 +26,6 @@
#include "base-types.h" #include "base-types.h"
#include "config/gimpbaseconfig.h"
#include "gimphistogram.h" #include "gimphistogram.h"
#include "pixel-processor.h" #include "pixel-processor.h"
#include "pixel-region.h" #include "pixel-region.h"
@ -35,50 +33,39 @@
struct _GimpHistogram struct _GimpHistogram
{ {
gint bins; gint bins;
gdouble **values; gdouble **values;
gint n_channels; gint n_channels;
#ifdef ENABLE_MP #ifdef ENABLE_MP
GStaticMutex mutex; GStaticMutex mutex;
gint num_slots; gdouble **tmp_values[GIMP_MAX_NUM_THREADS];
gdouble ***tmp_values; gchar tmp_slots[GIMP_MAX_NUM_THREADS];
gchar *tmp_slots;
#endif #endif
}; };
/* local function prototypes */ /* local function prototypes */
static void gimp_histogram_alloc_values (GimpHistogram *histogram, static void gimp_histogram_alloc_values (GimpHistogram *histogram,
gint bytes); gint bytes);
static void gimp_histogram_free_values (GimpHistogram *histogram); static void gimp_histogram_free_values (GimpHistogram *histogram);
static void gimp_histogram_calculate_sub_region (GimpHistogram *histogram, static void gimp_histogram_calculate_sub_region (GimpHistogram *histogram,
PixelRegion *region, PixelRegion *region,
PixelRegion *mask); PixelRegion *mask);
/* public functions */ /* public functions */
GimpHistogram * GimpHistogram *
gimp_histogram_new (GimpBaseConfig *config) gimp_histogram_new (void)
{ {
GimpHistogram *histogram; GimpHistogram *histogram = g_new0 (GimpHistogram, 1);
g_return_val_if_fail (GIMP_IS_BASE_CONFIG (config), NULL);
histogram = g_new0 (GimpHistogram, 1);
histogram->bins = 0; histogram->bins = 0;
histogram->values = NULL; histogram->values = NULL;
histogram->n_channels = 0; histogram->n_channels = 0;
#ifdef ENABLE_MP
histogram->num_slots = config->num_processors;
histogram->tmp_slots = g_new0 (gchar, histogram->num_slots);
histogram->tmp_values = g_new0 (gdouble **, histogram->num_slots);
#endif /* ENABLE_MP */
return histogram; return histogram;
} }
@ -87,11 +74,6 @@ gimp_histogram_free (GimpHistogram *histogram)
{ {
g_return_if_fail (histogram != NULL); g_return_if_fail (histogram != NULL);
#ifdef ENABLE_MP
g_free (histogram->tmp_values);
g_free (histogram->tmp_slots);
#endif
gimp_histogram_free_values (histogram); gimp_histogram_free_values (histogram);
g_free (histogram); g_free (histogram);
} }
@ -113,24 +95,6 @@ gimp_histogram_calculate (GimpHistogram *histogram,
gimp_histogram_alloc_values (histogram, region->bytes); gimp_histogram_alloc_values (histogram, region->bytes);
#ifdef ENABLE_MP
for (i = 0; i < histogram->num_slots; i++)
{
histogram->tmp_values[i] = g_new0 (gdouble *, histogram->n_channels);
histogram->tmp_slots[i] = 0;
for (j = 0; j < histogram->n_channels; j++)
{
gint k;
histogram->tmp_values[i][j] = g_new0 (gdouble, 256);
for (k = 0; k < 256; k++)
histogram->tmp_values[i][j][k] = 0.0;
}
}
#endif
for (i = 0; i < histogram->n_channels; i++) for (i = 0; i < histogram->n_channels; i++)
for (j = 0; j < 256; j++) for (j = 0; j < 256; j++)
histogram->values[i][j] = 0.0; histogram->values[i][j] = 0.0;
@ -141,19 +105,23 @@ gimp_histogram_calculate (GimpHistogram *histogram,
#ifdef ENABLE_MP #ifdef ENABLE_MP
/* add up all the tmp buffers and free their memmory */ /* add up all the tmp buffers and free their memmory */
for (i = 0; i < histogram->num_slots; i++) for (i = 0; i < GIMP_MAX_NUM_THREADS; i++)
{ {
for (j = 0; j < histogram->n_channels; j++) if (histogram->tmp_values[i])
{ {
gint k; for (j = 0; j < histogram->n_channels; j++)
{
gint k;
for (k = 0; k < 256; k++) for (k = 0; k < 256; k++)
histogram->values[j][k] += histogram->tmp_values[i][j][k]; histogram->values[j][k] += histogram->tmp_values[i][j][k];
g_free (histogram->tmp_values[i][j]); g_free (histogram->tmp_values[i][j]);
}
g_free (histogram->tmp_values[i]);
histogram->tmp_values[i] = NULL;
} }
g_free (histogram->tmp_values[i]);
} }
#endif #endif
} }
@ -470,6 +438,18 @@ gimp_histogram_calculate_sub_region (GimpHistogram *histogram,
g_static_mutex_unlock (&histogram->mutex); g_static_mutex_unlock (&histogram->mutex);
if (! values)
{
gint j;
histogram->tmp_values[slot] = g_new0 (gdouble *, histogram->n_channels);
for (j = 0; j < histogram->n_channels; j++)
histogram->tmp_values[slot][j] = g_new0 (gdouble, 256);
values = histogram->tmp_values[slot];
}
#else #else
values = histogram->values; values = histogram->values;
#endif #endif
@ -627,7 +607,6 @@ gimp_histogram_calculate_sub_region (GimpHistogram *histogram,
#ifdef ENABLE_MP #ifdef ENABLE_MP
/* unlock this slot */ /* unlock this slot */
/* we shouldn't have to use mutex locks here */
g_static_mutex_lock (&histogram->mutex); g_static_mutex_lock (&histogram->mutex);
histogram->tmp_slots[slot] = 0; histogram->tmp_slots[slot] = 0;

View File

@ -22,7 +22,7 @@
#define __GIMP_HISTOGRAM_H__ #define __GIMP_HISTOGRAM_H__
GimpHistogram * gimp_histogram_new (GimpBaseConfig *config); GimpHistogram * gimp_histogram_new (void);
void gimp_histogram_free (GimpHistogram *histogram); void gimp_histogram_free (GimpHistogram *histogram);
void gimp_histogram_calculate (GimpHistogram *histogram, void gimp_histogram_calculate (GimpHistogram *histogram,

View File

@ -28,8 +28,6 @@
#include "base/pixel-processor.h" #include "base/pixel-processor.h"
#include "base/pixel-region.h" #include "base/pixel-region.h"
#include "config/gimpbaseconfig.h"
#include "gimp.h" #include "gimp.h"
#include "gimpdrawable.h" #include "gimpdrawable.h"
#include "gimpdrawable-equalize.h" #include "gimpdrawable-equalize.h"
@ -59,7 +57,7 @@ gimp_drawable_equalize (GimpDrawable *drawable,
if (! gimp_drawable_mask_intersect (drawable, &x, &y, &width, &height)) if (! gimp_drawable_mask_intersect (drawable, &x, &y, &width, &height))
return; return;
hist = gimp_histogram_new (GIMP_BASE_CONFIG (gimage->gimp->config)); hist = gimp_histogram_new ();
gimp_drawable_calculate_histogram (drawable, hist); gimp_drawable_calculate_histogram (drawable, hist);
/* Build equalization LUT */ /* Build equalization LUT */

View File

@ -31,8 +31,6 @@
#include "base/pixel-processor.h" #include "base/pixel-processor.h"
#include "base/pixel-region.h" #include "base/pixel-region.h"
#include "config/gimpbaseconfig.h"
#include "gimp.h" #include "gimp.h"
#include "gimpcontext.h" #include "gimpcontext.h"
#include "gimpdrawable.h" #include "gimpdrawable.h"
@ -133,7 +131,7 @@ gimp_drawable_levels_stretch (GimpDrawable *drawable,
return; return;
/* Build the histogram */ /* Build the histogram */
hist = gimp_histogram_new (GIMP_BASE_CONFIG (context->gimp->config)); hist = gimp_histogram_new ();
gimp_drawable_calculate_histogram (drawable, hist); gimp_drawable_calculate_histogram (drawable, hist);

View File

@ -37,7 +37,6 @@
#include "base/pixel-processor.h" #include "base/pixel-processor.h"
#include "base/pixel-region.h" #include "base/pixel-region.h"
#include "base/threshold.h" #include "base/threshold.h"
#include "config/gimpbaseconfig.h"
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpdrawable-desaturate.h" #include "core/gimpdrawable-desaturate.h"
#include "core/gimpdrawable-equalize.h" #include "core/gimpdrawable-equalize.h"
@ -1214,9 +1213,7 @@ histogram_invoker (Gimp *gimp,
if (success) if (success)
{ {
GimpHistogram *histogram; GimpHistogram *histogram = gimp_histogram_new ();
histogram = gimp_histogram_new (GIMP_BASE_CONFIG (gimp->config));
gimp_drawable_calculate_histogram (drawable, histogram); gimp_drawable_calculate_histogram (drawable, histogram);

View File

@ -29,7 +29,6 @@
#include "tools-types.h" #include "tools-types.h"
#include "config/gimpbaseconfig.h"
#include "config/gimpguiconfig.h" #include "config/gimpguiconfig.h"
#include "base/curves.h" #include "base/curves.h"
@ -281,11 +280,7 @@ gimp_curves_tool_initialize (GimpTool *tool,
} }
if (! c_tool->hist) if (! c_tool->hist)
{ c_tool->hist = gimp_histogram_new ();
Gimp *gimp = GIMP_TOOL (c_tool)->tool_info->gimp;
c_tool->hist = gimp_histogram_new (GIMP_BASE_CONFIG (gimp->config));
}
curves_init (c_tool->curves); curves_init (c_tool->curves);

View File

@ -34,8 +34,6 @@
#include "base/gimplut.h" #include "base/gimplut.h"
#include "base/levels.h" #include "base/levels.h"
#include "config/gimpbaseconfig.h"
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpdrawable.h" #include "core/gimpdrawable.h"
#include "core/gimpdrawable-histogram.h" #include "core/gimpdrawable-histogram.h"
@ -283,11 +281,7 @@ gimp_levels_tool_initialize (GimpTool *tool,
} }
if (! l_tool->hist) if (! l_tool->hist)
{ l_tool->hist = gimp_histogram_new ();
Gimp *gimp = tool->tool_info->gimp;
l_tool->hist = gimp_histogram_new (GIMP_BASE_CONFIG (gimp->config));
}
levels_init (l_tool->levels); levels_init (l_tool->levels);

View File

@ -27,8 +27,6 @@
#include "base/gimphistogram.h" #include "base/gimphistogram.h"
#include "base/threshold.h" #include "base/threshold.h"
#include "config/gimpbaseconfig.h"
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpdrawable.h" #include "core/gimpdrawable.h"
#include "core/gimpdrawable-histogram.h" #include "core/gimpdrawable-histogram.h"
@ -200,11 +198,7 @@ gimp_threshold_tool_initialize (GimpTool *tool,
} }
if (!t_tool->hist) if (!t_tool->hist)
{ t_tool->hist = gimp_histogram_new ();
Gimp *gimp = GIMP_TOOL (t_tool)->tool_info->gimp;
t_tool->hist = gimp_histogram_new (GIMP_BASE_CONFIG (gimp->config));
}
t_tool->threshold->color = gimp_drawable_is_rgb (drawable); t_tool->threshold->color = gimp_drawable_is_rgb (drawable);
t_tool->threshold->low_threshold = 127; t_tool->threshold->low_threshold = 127;

View File

@ -27,8 +27,6 @@
#include "base/gimphistogram.h" #include "base/gimphistogram.h"
#include "base/pixel-region.h" #include "base/pixel-region.h"
#include "config/gimpbaseconfig.h"
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpdrawable.h" #include "core/gimpdrawable.h"
#include "core/gimpdrawable-histogram.h" #include "core/gimpdrawable-histogram.h"
@ -291,8 +289,7 @@ gimp_histogram_editor_set_image (GimpImageEditor *image_editor,
if (gimage) if (gimage)
{ {
editor->histogram = editor->histogram = gimp_histogram_new ();
gimp_histogram_new (GIMP_BASE_CONFIG (gimage->gimp->config));
gimp_histogram_view_set_histogram (view, editor->histogram); gimp_histogram_view_set_histogram (view, editor->histogram);

View File

@ -733,8 +733,7 @@ HELP
} }
%invoke = ( %invoke = (
headers => [ qw("config/gimpbaseconfig.h" "core/gimp.h" headers => [ qw("core/gimp.h" "core/gimpdrawable-histogram.h") ],
"core/gimpdrawable-histogram.h") ],
code => <<'CODE' code => <<'CODE'
{ {
if (! gimp_item_is_attached (GIMP_ITEM (drawable)) || if (! gimp_item_is_attached (GIMP_ITEM (drawable)) ||
@ -747,9 +746,7 @@ HELP
if (success) if (success)
{ {
GimpHistogram *histogram; GimpHistogram *histogram = gimp_histogram_new ();
histogram = gimp_histogram_new (GIMP_BASE_CONFIG (gimp->config));
gimp_drawable_calculate_histogram (drawable, histogram); gimp_drawable_calculate_histogram (drawable, histogram);