[gegl] process: propagate level argument further



commit aa92eab41f367a1aca761a2a6a52608220fdd6ac
Author: Øyvind Kolås <pippin gimp org>
Date:   Tue Jul 1 09:55:57 2014 +0200

    process: propagate level argument further
    
    Adding a GEGL_MIPMAP_RENDERING environment variable, which when set causes
    gegl_node_blit to pass this level, rather than 0 to the eval_manager for
    rendering. The level argument is now propagated all the way down to the
    operations process() vfuncs.

 gegl/gegl-types-internal.h          |   24 +++++++++++++++++++
 gegl/graph/gegl-node.c              |   44 +++++++++++++++++++++++++---------
 gegl/process/gegl-eval-manager.c    |    5 ++-
 gegl/process/gegl-eval-manager.h    |    3 +-
 gegl/process/gegl-graph-traversal.c |    4 ++-
 gegl/process/gegl-graph-traversal.h |    3 +-
 6 files changed, 66 insertions(+), 17 deletions(-)
---
diff --git a/gegl/gegl-types-internal.h b/gegl/gegl-types-internal.h
index 7888f02..69a96f7 100644
--- a/gegl/gegl-types-internal.h
+++ b/gegl/gegl-types-internal.h
@@ -46,6 +46,30 @@ struct _GeglDimension
 };
 
 
+static inline int gegl_level_from_scale (gfloat scale)
+{
+  gint level = 0;
+  //gint factor = 1;
+
+  while (scale <= 0.500001)
+  {
+    scale *= 2;
+   // factor *= 2;
+    level++;
+#if 0
+    if (rect)
+    {
+      rect->x = 0 < rect->x ? rect->x/2 : (rect->x - 1) / 2;
+      rect->y = 0 < rect->y ? rect->y/2 : (rect->y - 1) / 2;
+      rect->width = 0 < rect->width ? rect->width/2 : (rect->width  - 1) / 2;
+      rect->height = 0 < rect->height ? rect->height/2 : (rect->height  - 1) / 2;
+    }
+#endif
+  }
+
+  return level;
+}
+
 G_END_DECLS
 
 #endif /* __GEGL_TYPES_INTERNAL_H__ */
diff --git a/gegl/graph/gegl-node.c b/gegl/graph/gegl-node.c
index 40916f6..51e030d 100644
--- a/gegl/graph/gegl-node.c
+++ b/gegl/graph/gegl-node.c
@@ -930,25 +930,27 @@ gegl_node_get_eval_manager (GeglNode *self)
 
 static GeglBuffer *
 gegl_node_apply_roi (GeglNode            *self,
-                     const GeglRectangle *roi)
+                     const GeglRectangle *roi,
+                     gint                 level)
 {
   GeglEvalManager *eval_manager = gegl_node_get_eval_manager (self);
 
   if (roi)
     {
-      return gegl_eval_manager_apply (eval_manager, roi);
+      return gegl_eval_manager_apply (eval_manager, roi, level);
     }
   else
     {
       GeglRectangle node_bbox = gegl_node_get_bounding_box (self);
-      return gegl_eval_manager_apply (eval_manager, &node_bbox);
+      return gegl_eval_manager_apply (eval_manager, &node_bbox, level);
     }
 }
 
-void
-gegl_node_blit_buffer (GeglNode            *self,
-                       GeglBuffer          *buffer,
-                       const GeglRectangle *roi)
+static void
+gegl_node_blit_buffer2 (GeglNode            *self,
+                        GeglBuffer          *buffer,
+                        const GeglRectangle *roi,
+                        gint                 level)
 {
   GeglEvalManager *eval_manager;
   GeglBuffer      *result;
@@ -963,7 +965,7 @@ gegl_node_blit_buffer (GeglNode            *self,
   else
     request = gegl_node_get_bounding_box (self);
 
-  result = gegl_eval_manager_apply (eval_manager, &request);
+  result = gegl_eval_manager_apply (eval_manager, &request, level);
 
   if (result)
     {
@@ -974,6 +976,22 @@ gegl_node_blit_buffer (GeglNode            *self,
 }
 
 void
+gegl_node_blit_buffer (GeglNode            *self,
+                       GeglBuffer          *buffer,
+                       const GeglRectangle *roi)
+{
+  gegl_node_blit_buffer2 (self, buffer, roi, 0);
+}
+
+static inline gboolean gegl_mipmap_rendering_enabled (void)
+{
+  static int enabled = -1;
+  if (enabled == -1)
+    enabled = g_getenv("GEGL_MIPMAP_RENDERING")!=NULL;
+  return enabled;
+}
+
+void
 gegl_node_blit (GeglNode            *self,
                 gdouble              scale,
                 const GeglRectangle *roi,
@@ -993,11 +1011,12 @@ gegl_node_blit (GeglNode            *self,
         {
           const GeglRectangle unscaled_roi = _gegl_get_required_for_scale (format, roi, scale);
 
-          buffer = gegl_node_apply_roi (self, &unscaled_roi);
+          buffer = gegl_node_apply_roi (self, &unscaled_roi,
+              gegl_mipmap_rendering_enabled()?gegl_level_from_scale (scale):0);
         }
       else
         {
-          buffer = gegl_node_apply_roi (self, roi);
+          buffer = gegl_node_apply_roi (self, roi, 0);
         }
 
       if (buffer && destination_buf)
@@ -1017,7 +1036,8 @@ gegl_node_blit (GeglNode            *self,
             {
               const GeglRectangle unscaled_roi = _gegl_get_required_for_scale (format, roi, scale);
 
-              gegl_node_blit_buffer (self, buffer, &unscaled_roi);
+              gegl_node_blit_buffer2 (self, buffer, &unscaled_roi,
+                gegl_mipmap_rendering_enabled()?gegl_level_from_scale (scale):0);
               gegl_cache_computed (cache, &unscaled_roi);
             }
           else
@@ -1165,7 +1185,7 @@ gegl_node_property_changed (GObject    *gobject,
              or perhaps a bug lurks here?
            */
           GeglRectangle dirty_rect;
-/*          GeglRectangle new_have_rect;*/
+/*        GeglRectangle new_have_rect;*/
 
           dirty_rect = self->have_rect;
           /*new_have_rect = gegl_node_get_bounding_box (self);
diff --git a/gegl/process/gegl-eval-manager.c b/gegl/process/gegl-eval-manager.c
index 67ab41c..48ceaf0 100644
--- a/gegl/process/gegl-eval-manager.c
+++ b/gegl/process/gegl-eval-manager.c
@@ -114,7 +114,8 @@ gegl_eval_manager_get_bounding_box (GeglEvalManager     *self)
 
 GeglBuffer *
 gegl_eval_manager_apply (GeglEvalManager     *self,
-                         const GeglRectangle *roi)
+                         const GeglRectangle *roi,
+                         gint                 level)
 {
   GeglBuffer  *object;
 
@@ -130,7 +131,7 @@ gegl_eval_manager_apply (GeglEvalManager     *self,
   GEGL_INSTRUMENT_END ("gegl", "prepare-request");
 
   GEGL_INSTRUMENT_START();
-  object = gegl_graph_process (self->traversal);
+  object = gegl_graph_process (self->traversal, level);
   GEGL_INSTRUMENT_END ("gegl", "process");
 
   return object;
diff --git a/gegl/process/gegl-eval-manager.h b/gegl/process/gegl-eval-manager.h
index 41a2585..2206662 100644
--- a/gegl/process/gegl-eval-manager.h
+++ b/gegl/process/gegl-eval-manager.h
@@ -67,7 +67,8 @@ void              gegl_eval_manager_prepare  (GeglEvalManager     *self);
 GeglRectangle     gegl_eval_manager_get_bounding_box (GeglEvalManager     *self);
 
 GeglBuffer *      gegl_eval_manager_apply    (GeglEvalManager     *self,
-                                              const GeglRectangle *roi);
+                                              const GeglRectangle *roi,
+                                              gint                 level);
 GeglEvalManager * gegl_eval_manager_new      (GeglNode        *node,
                                               const gchar     *pad_name);
 
diff --git a/gegl/process/gegl-graph-traversal.c b/gegl/process/gegl-graph-traversal.c
index 99f231c..abe5bf7 100644
--- a/gegl/process/gegl-graph-traversal.c
+++ b/gegl/process/gegl-graph-traversal.c
@@ -368,7 +368,8 @@ gegl_graph_get_shared_empty (GeglGraphTraversal *path)
  * there is no output pad.
  */
 GeglBuffer *
-gegl_graph_process (GeglGraphTraversal *path)
+gegl_graph_process (GeglGraphTraversal *path,
+                    gint                level)
 {
   GList *list_iter = NULL;
   GeglBuffer *result = NULL;
@@ -416,6 +417,7 @@ gegl_graph_process (GeglGraphTraversal *path)
                   gegl_operation_context_set_object (context, "input", G_OBJECT 
(gegl_graph_get_shared_empty(path)));
                 }
 
+              context->level = level; // XXX: get rid of context->level member?
               gegl_operation_process (operation, context, "output", &context->need_rect, context->level);
               operation_result = GEGL_BUFFER (gegl_operation_context_get_object (context, "output"));
 
diff --git a/gegl/process/gegl-graph-traversal.h b/gegl/process/gegl-graph-traversal.h
index cff1223..413b2a0 100644
--- a/gegl/process/gegl-graph-traversal.h
+++ b/gegl/process/gegl-graph-traversal.h
@@ -28,7 +28,8 @@ void                gegl_graph_free             (GeglGraphTraversal  *path);
 void                gegl_graph_prepare          (GeglGraphTraversal  *path);
 void                gegl_graph_prepare_request  (GeglGraphTraversal  *path,
                                                  const GeglRectangle *roi);
-GeglBuffer         *gegl_graph_process          (GeglGraphTraversal  *path);
+GeglBuffer         *gegl_graph_process          (GeglGraphTraversal  *path,
+                                                 gint                 level);
 
 GeglRectangle       gegl_graph_get_bounding_box (GeglGraphTraversal  *path);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]