[gegl] process: propagate level argument further
- From: Øyvind Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] process: propagate level argument further
- Date: Fri, 4 Jul 2014 21:44:00 +0000 (UTC)
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]