[gegl] processor: make using non-zero levels for processing work
- From: Øyvind Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] processor: make using non-zero levels for processing work
- Date: Mon, 27 Feb 2017 22:27:55 +0000 (UTC)
commit 339d07c75a134cb7772959d2d541acfe229f5cac
Author: Øyvind Kolås <pippin gimp org>
Date: Mon Feb 27 23:25:13 2017 +0100
processor: make using non-zero levels for processing work
gegl_node_blit expects to be passed a scaled ROI, GeglProcessor didn't use to
scale its rectangle according to the level before blitting. Based on an
initial patch by Debarshi Ray
gegl/process/gegl-processor.c | 24 ++++++++++++++++++------
1 files changed, 18 insertions(+), 6 deletions(-)
---
diff --git a/gegl/process/gegl-processor.c b/gegl/process/gegl-processor.c
index ffe7788..2d82223 100644
--- a/gegl/process/gegl-processor.c
+++ b/gegl/process/gegl-processor.c
@@ -14,6 +14,7 @@
* License along with GEGL; if not, see <http://www.gnu.org/licenses/>.
*
* Copyright 2007-2012,2014,2015,2017 Øyvind Kolås
+ * 2015 Debarshi Ray
*/
#include "config.h"
@@ -74,6 +75,7 @@ struct _GeglProcessor
GeglNode *node;
GeglNode *real_node;
GeglRectangle rectangle;
+ GeglRectangle rectangle_unscaled;
GeglNode *input;
gint level;
GeglOperationContext *context;
@@ -316,7 +318,14 @@ gegl_processor_set_node (GeglProcessor *processor,
g_object_notify (G_OBJECT (processor), "node");
}
-
+static void
+set_scaled_rectangle (GeglProcessor *processor)
+{
+ processor->rectangle.x = processor->rectangle_unscaled.x >> processor->level;
+ processor->rectangle.y = processor->rectangle_unscaled.y >> processor->level;
+ processor->rectangle.width = processor->rectangle_unscaled.width >> processor->level;
+ processor->rectangle.height = processor->rectangle_unscaled.height >> processor->level;
+}
/* Sets the processor->rectangle to the given rectangle (or the node
@@ -345,7 +354,7 @@ gegl_processor_set_rectangle (GeglProcessor *processor,
/* if the processor's rectangle isn't already set to the node's bounding box,
* then set it and remove processor->dirty_rectangles (set to NULL) */
- if (! gegl_rectangle_equal (&processor->rectangle, rectangle))
+ if (! gegl_rectangle_equal (&processor->rectangle_unscaled, rectangle))
{
#if 0
/* XXX: this is a large penalty hit, so we assume the rectangle
@@ -353,9 +362,10 @@ gegl_processor_set_rectangle (GeglProcessor *processor,
GeglRectangle bounds;
bounds = processor->bounds;/*gegl_node_get_bounding_box (processor->input);*/
#endif
- processor->rectangle = *rectangle;
+ processor->rectangle_unscaled = *rectangle;
+ set_scaled_rectangle (processor);
#if 0
- gegl_rectangle_intersect (&processor->rectangle, &processor->rectangle, &bounds);
+ gegl_rectangle_intersect (&processor->rectangle_unscaled, &processor->rectangle_unscaled, &bounds);
#endif
}
{
@@ -388,9 +398,9 @@ gegl_processor_set_rectangle (GeglProcessor *processor,
gegl_operation_context_set_object (processor->context, "input", G_OBJECT (cache));
gegl_operation_context_set_result_rect (processor->context,
- &processor->rectangle);
+ &processor->rectangle_unscaled);
gegl_operation_context_set_need_rect (processor->context,
- &processor->rectangle);
+ &processor->rectangle_unscaled);
}
if (processor->valid_region)
@@ -852,9 +862,11 @@ void gegl_processor_set_level (GeglProcessor *processor,
gint level)
{
processor->level = level;
+ set_scaled_rectangle (processor);
}
void gegl_processor_set_scale (GeglProcessor *processor,
gdouble scale)
{
processor->level = gegl_level_from_scale (scale);
+ set_scaled_rectangle (processor);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]