[gegl] transform: pass roi to inner working functions
- From: Øyvind Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] transform: pass roi to inner working functions
- Date: Sun, 19 Feb 2017 17:51:37 +0000 (UTC)
commit b1c7d38a9eef151cc50cf50ba75241561b3f86f8
Author: Øyvind Kolås <pippin gimp org>
Date: Sun Feb 19 18:10:11 2017 +0100
transform: pass roi to inner working functions
The previous code relied on doing work on the bounding box of the output
buffer, which meant that at least for threaded processing, the same work was
being done in all threads - with caching, there might also have been other
repeated re-work.
operations/transform/transform-core.c | 61 +++++++++++++++++---------------
1 files changed, 32 insertions(+), 29 deletions(-)
---
diff --git a/operations/transform/transform-core.c b/operations/transform/transform-core.c
index 8f0ef9d..2c8f6e4 100644
--- a/operations/transform/transform-core.c
+++ b/operations/transform/transform-core.c
@@ -726,11 +726,12 @@ gegl_transform_get_invalidated_by_change (GeglOperation *op,
typedef struct ThreadData
{
- void (*func) (GeglOperation *operation,
- GeglBuffer *dest,
- GeglBuffer *src,
- GeglMatrix3 *matrix,
- gint level);
+ void (*func) (GeglOperation *operation,
+ GeglBuffer *dest,
+ GeglBuffer *src,
+ GeglMatrix3 *matrix,
+ const GeglRectangle *roi,
+ gint level);
GeglOperation *operation;
@@ -747,7 +748,11 @@ static void thread_process (gpointer thread_data, gpointer unused)
{
ThreadData *data = thread_data;
data->func (data->operation,
- data->output, data->input, data->matrix, data->level);
+ data->output,
+ data->input,
+ data->matrix,
+ &data->roi,
+ data->level);
data->success = FALSE;
g_atomic_int_add (data->pending, -1);
}
@@ -765,18 +770,18 @@ static GThreadPool *thread_pool (void)
static void
-transform_affine (GeglOperation *operation,
- GeglBuffer *dest,
- GeglBuffer *src,
- GeglMatrix3 *matrix,
- gint level)
+transform_affine (GeglOperation *operation,
+ GeglBuffer *dest,
+ GeglBuffer *src,
+ GeglMatrix3 *matrix,
+ const GeglRectangle *roi,
+ gint level)
{
gint factor = 1 << level;
OpTransform *transform = (OpTransform *) operation;
const Babl *format = babl_format ("RaGaBaA float");
GeglMatrix3 inverse;
GeglMatrix2 inverse_jacobian;
- gint dest_pixels;
GeglSampler *sampler = gegl_buffer_sampler_new_at_level (src,
babl_format("RaGaBaA float"),
level?GEGL_SAMPLER_NEAREST:transform->sampler,
@@ -811,10 +816,8 @@ transform_affine (GeglOperation *operation,
gegl_matrix3_invert (&inverse);
- g_object_get (dest, "pixels", &dest_pixels, NULL);
-
{
- const GeglRectangle *dest_extent = gegl_buffer_get_extent (dest);
+ const GeglRectangle *dest_extent = roi;
GeglBufferIterator *i = gegl_buffer_iterator_new (dest,
dest_extent,
level,
@@ -988,11 +991,12 @@ transform_affine (GeglOperation *operation,
}
static void
-transform_generic (GeglOperation *operation,
- GeglBuffer *dest,
- GeglBuffer *src,
- GeglMatrix3 *matrix,
- gint level)
+transform_generic (GeglOperation *operation,
+ GeglBuffer *dest,
+ GeglBuffer *src,
+ GeglMatrix3 *matrix,
+ const GeglRectangle *roi,
+ gint level)
{
OpTransform *transform = (OpTransform *) operation;
const Babl *format = babl_format ("RaGaBaA float");
@@ -1000,7 +1004,6 @@ transform_generic (GeglOperation *operation,
GeglBufferIterator *i;
const GeglRectangle *dest_extent;
GeglMatrix3 inverse;
- gint dest_pixels;
GeglSampler *sampler = gegl_buffer_sampler_new_at_level (src,
babl_format("RaGaBaA float"),
level?GEGL_SAMPLER_NEAREST:
@@ -1008,8 +1011,7 @@ transform_generic (GeglOperation *operation,
level);
GeglSamplerGetFun sampler_get_fun = gegl_sampler_get_fun (sampler);
- g_object_get (dest, "pixels", &dest_pixels, NULL);
- dest_extent = gegl_buffer_get_extent (dest);
+ dest_extent = roi;
/*
* Construct an output tile iterator.
@@ -1277,11 +1279,12 @@ gegl_transform_process (GeglOperation *operation,
}
else
{
- void (*func) (GeglOperation *operation,
- GeglBuffer *dest,
- GeglBuffer *src,
- GeglMatrix3 *matrix,
- gint level) = transform_generic;
+ void (*func) (GeglOperation *operation,
+ GeglBuffer *dest,
+ GeglBuffer *src,
+ GeglMatrix3 *matrix,
+ const GeglRectangle *roi,
+ gint level) = transform_generic;
if (gegl_matrix3_is_affine (&matrix))
func = transform_affine;
@@ -1344,7 +1347,7 @@ gegl_transform_process (GeglOperation *operation,
}
else
{
- func (operation, output, input, &matrix, level);
+ func (operation, output, input, &matrix, result, level);
}
if (input != NULL)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]