small optimization by Tobias Lenz.

2005-10-04  Sven Neumann  <sven@gimp.org>

	* app/base/siox.c: small optimization by Tobias Lenz.
This commit is contained in:
Sven Neumann 2005-10-04 11:08:28 +00:00 committed by Sven Neumann
parent 73d324225c
commit ebe1c9f0f3
2 changed files with 25 additions and 40 deletions

View File

@ -1,3 +1,7 @@
2005-10-04 Sven Neumann <sven@gimp.org>
* app/base/siox.c: small optimization by Tobias Lenz.
2005-10-03 Michael Natterer <mitch@gimp.org> 2005-10-03 Michael Natterer <mitch@gimp.org>
* app/tools/gimppainttool.c (gimp_paint_tool_color_picked): * app/tools/gimppainttool.c (gimp_paint_tool_color_picked):

View File

@ -143,7 +143,7 @@ stageone (lab *points,
gint left, gint left,
gint right, gint right,
gint depth, gint depth,
GSList **clusters, gint *clusters,
const gfloat *limits) const gfloat *limits)
{ {
gint curdim = depth % SIOX_DIMS; gint curdim = depth % SIOX_DIMS;
@ -197,9 +197,23 @@ stageone (lab *points,
else else
{ {
/* create leave */ /* create leave */
*clusters = gfloat l = 0;
g_slist_prepend (g_slist_prepend (*clusters, GINT_TO_POINTER (right)), gfloat a = 0;
GINT_TO_POINTER (left)); gfloat b = 0;
points[*clusters].cardinality = right - left;
for (; left < right; ++left)
{
l += points[left].l;
a += points[left].a;
b += points[left].b;
}
points[*clusters].l = l / points[*clusters].cardinality;
points[*clusters].a = a / points[*clusters].cardinality;
points[*clusters].b = b / points[*clusters].cardinality;
++(*clusters);
} }
} }
@ -323,9 +337,8 @@ create_signature (lab *input,
const gfloat *limits) const gfloat *limits)
{ {
GSList *clusters = NULL; GSList *clusters = NULL;
lab *centroids;
lab *rval; lab *rval;
gint size; gint size = 0;
gint i; gint i;
if (length < 1) if (length < 1)
@ -334,39 +347,7 @@ create_signature (lab *input,
return NULL; return NULL;
} }
stageone (input, 0, length, 0, &clusters, limits); stageone (input, 0, length, 0, &size, limits);
size = g_slist_length(clusters) / 2;
centroids = g_new (lab, size);
i = 0;
while (clusters != NULL)
{
gfloat l = 0;
gfloat a = 0;
gfloat b = 0;
gint k;
gint left, right;
left = GPOINTER_TO_INT (clusters->data);
clusters = g_slist_delete_link (clusters, clusters);
right = GPOINTER_TO_INT (clusters->data);
clusters = g_slist_delete_link (clusters, clusters);
for (k = left; k < right; k++)
{
l += input[k].l;
a += input[k].a;
b += input[k].b;
}
centroids[i].l = l / (right - left);
centroids[i].a = a / (right - left);
centroids[i].b = b / (right - left);
centroids[i].cardinality = right - left;
i++;
}
#ifdef SIOX_DEBUG #ifdef SIOX_DEBUG
g_printerr ("siox.c: step #1 -> %d clusters\n", size); g_printerr ("siox.c: step #1 -> %d clusters\n", size);
@ -374,7 +355,7 @@ create_signature (lab *input,
clusters = NULL; clusters = NULL;
stagetwo (centroids, 0, size, 0, &clusters, limits, length * 0.001f); stagetwo (input, 0, size, 0, &clusters, limits, length * 0.001f);
size = g_slist_length(clusters); size = g_slist_length(clusters);
rval = g_new (lab, size); rval = g_new (lab, size);