libgimpcolor: optimize gimp_color_transform_process_buffer()

for the case we're transforming the same buffer in place.
This commit is contained in:
Michael Natterer 2016-05-29 20:24:37 +02:00
parent 8379f7e31d
commit 4bad9b2144
1 changed files with 49 additions and 26 deletions

View File

@ -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,6 +385,10 @@ gimp_color_transform_process_buffer (GimpColorTransform *transform,
gegl_buffer_get_height (src_buffer));
}
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);
@ -415,6 +418,26 @@ gimp_color_transform_process_buffer (GimpColorTransform *transform,
(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,
1.0);