[gegl] processor: make using non-zero levels for processing work



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]