[gegl] GeglNode: added passthrough property
- From: Øyvind Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] GeglNode: added passthrough property
- Date: Wed, 26 Nov 2014 23:16:18 +0000 (UTC)
commit 9c30bb4213d89413a65d11fc4ab39266e911da6a
Author: Øyvind Kolås <pippin gimp org>
Date: Mon Jul 14 00:17:17 2014 +0200
GeglNode: added passthrough property
This boolean, which lives on the node; not the operation makes the contained
op act like gegl:nop.
gegl/gegl-xml.c | 8 ++++++++
gegl/graph/gegl-node-private.h | 2 ++
gegl/graph/gegl-node.c | 37 ++++++++++++++++++++++++++++++++++++-
gegl/graph/gegl-node.h | 6 ++++++
gegl/operation/gegl-operation.c | 35 +++++++++++++++++++++++++++++++++--
5 files changed, 85 insertions(+), 3 deletions(-)
---
diff --git a/gegl/gegl-xml.c b/gegl/gegl-xml.c
index 41ca7e4..96815cd 100644
--- a/gegl/gegl-xml.c
+++ b/gegl/gegl-xml.c
@@ -1073,6 +1073,10 @@ add_stack (SerializeState *ss,
xml_attr (ss->buf, "operation", class);
if (id != NULL)
xml_attr (ss->buf, "id", id);
+
+ if (gegl_node_get_passthrough (iter) == TRUE)
+ xml_attr (ss->buf, "passthrough", "true");
+
g_free (name);
g_free (class);
}
@@ -1103,6 +1107,10 @@ add_stack (SerializeState *ss,
xml_attr (ss->buf, "operation", class);
if (id != NULL)
xml_attr (ss->buf, "id", id);
+
+ if (gegl_node_get_passthrough (iter) == TRUE)
+ xml_attr (ss->buf, "passthrough", "true");
+
g_free (name);
g_free (class);
}
diff --git a/gegl/graph/gegl-node-private.h b/gegl/graph/gegl-node-private.h
index 222d141..f458176 100644
--- a/gegl/graph/gegl-node-private.h
+++ b/gegl/graph/gegl-node-private.h
@@ -79,6 +79,8 @@ struct _GeglNode
GMutex mutex;
+ gint passthrough;
+
/*< private >*/
GeglNodePrivate *priv;
};
diff --git a/gegl/graph/gegl-node.c b/gegl/graph/gegl-node.c
index 8fc8edc..4ab2103 100644
--- a/gegl/graph/gegl-node.c
+++ b/gegl/graph/gegl-node.c
@@ -50,7 +50,8 @@ enum
PROP_OPERATION,
PROP_NAME,
PROP_DONT_CACHE,
- PROP_USE_OPENCL
+ PROP_USE_OPENCL,
+ PROP_PASSTHROUGH
};
enum
@@ -172,6 +173,14 @@ gegl_node_class_init (GeglNodeClass *klass)
G_PARAM_CONSTRUCT |
G_PARAM_READWRITE));
+ g_object_class_install_property (gobject_class, PROP_PASSTHROUGH,
+ g_param_spec_boolean ("passthrough",
+ "Passthrough",
+ "Act as a nop, passing input unmodifed through to
ouput.",
+ FALSE,
+ G_PARAM_CONSTRUCT |
+ G_PARAM_READWRITE));
+
gegl_node_signals[INVALIDATED] =
g_signal_new ("invalidated",
G_TYPE_FROM_CLASS (klass),
@@ -305,6 +314,10 @@ gegl_node_local_set_property (GObject *gobject,
node->dont_cache = g_value_get_boolean (value);
break;
+ case PROP_PASSTHROUGH:
+ node->passthrough = g_value_get_boolean (value);
+ break;
+
case PROP_USE_OPENCL:
node->use_opencl = g_value_get_boolean (value);
break;
@@ -351,6 +364,10 @@ gegl_node_local_get_property (GObject *gobject,
g_value_set_boolean (value, node->dont_cache);
break;
+ case PROP_PASSTHROUGH:
+ g_value_set_boolean (value, node->passthrough);
+ break;
+
case PROP_USE_OPENCL:
g_value_set_boolean (value, node->use_opencl);
break;
@@ -2128,3 +2145,21 @@ gegl_node_new (void)
{
return g_object_new (GEGL_TYPE_NODE, NULL);
}
+
+gboolean
+gegl_node_get_passthrough (GeglNode *node)
+{
+ g_return_val_if_fail (GEGL_IS_NODE (node), FALSE);
+
+ return node->passthrough;
+}
+
+void
+gegl_node_set_passthrough (GeglNode *node,
+ gboolean passthrough)
+{
+ g_return_if_fail (GEGL_IS_NODE (node));
+
+ gegl_node_invalidated (node, NULL, TRUE);
+ node->passthrough = passthrough;
+}
diff --git a/gegl/graph/gegl-node.h b/gegl/graph/gegl-node.h
index 5af5afe..df76656 100644
--- a/gegl/graph/gegl-node.h
+++ b/gegl/graph/gegl-node.h
@@ -667,6 +667,12 @@ GeglNode * gegl_node_new_from_file (const gchar *path);
gchar * gegl_node_to_xml (GeglNode *node,
const gchar *path_root);
+gboolean gegl_node_get_passthrough (GeglNode *node);
+
+void gegl_node_set_passthrough (GeglNode *node,
+ gboolean passthrough);
+
+
G_END_DECLS
#endif /* __GEGL_NODE_H__ */
diff --git a/gegl/operation/gegl-operation.c b/gegl/operation/gegl-operation.c
index add450a..4bcf029 100644
--- a/gegl/operation/gegl-operation.c
+++ b/gegl/operation/gegl-operation.c
@@ -14,7 +14,7 @@
* License along with GEGL; if not, see <http://www.gnu.org/licenses/>.
*
* Copyright 2003 Calvin Williamson
- * 2005-2008 Øyvind Kolås
+ * 2005-2009,2011-2014 Øyvind Kolås
*/
#include "config.h"
@@ -159,6 +159,13 @@ gegl_operation_process (GeglOperation *operation,
return TRUE;
}
+ if (operation->node->passthrough)
+ {
+ GeglBuffer *input = GEGL_BUFFER (gegl_operation_context_get_object (context, "input"));
+ gegl_operation_context_take_object (context, output_pad, g_object_ref (G_OBJECT (input)));
+ return TRUE;
+ }
+
g_return_val_if_fail (klass->process, FALSE);
return klass->process (operation, context, output_pad, result, level);
@@ -173,7 +180,16 @@ gegl_operation_get_bounding_box (GeglOperation *self)
GeglOperationClass *klass = GEGL_OPERATION_GET_CLASS (self);
GeglRectangle rect = { 0, 0, 0, 0 };
- if (klass->get_bounding_box)
+ if (self->node->passthrough)
+ {
+ GeglRectangle result = { 0, 0, 0, 0 };
+ GeglRectangle *in_rect;
+ in_rect = gegl_operation_source_get_bounding_box (self, "input");
+ if (in_rect)
+ return *in_rect;
+ return result;
+ }
+ else if (klass->get_bounding_box)
return klass->get_bounding_box (self);
return rect;
@@ -191,6 +207,9 @@ gegl_operation_get_invalidated_by_change (GeglOperation *self,
g_return_val_if_fail (input_pad != NULL, retval);
g_return_val_if_fail (input_region != NULL, retval);
+ if (self->node && self->node->passthrough)
+ return *input_region;
+
klass = GEGL_OPERATION_GET_CLASS (self);
if (input_region->width == 0 ||
@@ -208,6 +227,9 @@ get_required_for_output (GeglOperation *operation,
const gchar *input_pad,
const GeglRectangle *roi)
{
+ if (operation->node->passthrough)
+ return *roi;
+
if (operation->node->is_graph)
{
return gegl_operation_get_required_for_output (operation, input_pad, roi);
@@ -227,6 +249,9 @@ gegl_operation_get_required_for_output (GeglOperation *operation,
roi->height == 0)
return *roi;
+ if (operation->node->passthrough)
+ return *roi;
+
g_assert (klass->get_required_for_output);
return klass->get_required_for_output (operation, input_pad, roi);
@@ -240,6 +265,9 @@ gegl_operation_get_cached_region (GeglOperation *operation,
{
GeglOperationClass *klass = GEGL_OPERATION_GET_CLASS (operation);
+ if (operation->node->passthrough)
+ return *roi;
+
if (!klass->get_cached_region)
{
return *roi;
@@ -280,6 +308,9 @@ gegl_operation_prepare (GeglOperation *self)
g_return_if_fail (GEGL_IS_OPERATION (self));
+ if (self->node->passthrough)
+ return;
+
klass = GEGL_OPERATION_GET_CLASS (self);
/* build OpenCL kernel */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]