gegl r2125 - in trunk: . gegl gegl/graph
- From: ok svn gnome org
- To: svn-commits-list gnome org
- Subject: gegl r2125 - in trunk: . gegl gegl/graph
- Date: Tue, 26 Feb 2008 23:58:54 +0000 (GMT)
Author: ok
Date: Tue Feb 26 23:58:54 2008
New Revision: 2125
URL: http://svn.gnome.org/viewvc/gegl?rev=2125&view=rev
Log:
* gegl/gegl.h.in: added gegl_node_adopt_child and
gegl_node_get_parent.
* gegl/graph/gegl-node.c: (gegl_node_remove_child): added sanity
assert.
(gegl_node_get_parent), (gegl_node_adopt_child): added
(gegl_node_new_child), (gegl_node_create_child): modified to allow a
NULL parent argument to indicate creation of orphaned nodes.
Modified:
trunk/ChangeLog
trunk/gegl/gegl.h.in
trunk/gegl/graph/gegl-node.c
Modified: trunk/gegl/gegl.h.in
==============================================================================
--- trunk/gegl/gegl.h.in (original)
+++ trunk/gegl/gegl.h.in Tue Feb 26 23:58:54 2008
@@ -129,8 +129,8 @@
* the running process.
*/
void gegl_get_version (int *major,
- int *minor,
- int *micro);
+ int *minor,
+ int *micro);
/***
* Available operations:
@@ -480,6 +480,40 @@
void gegl_node_process (GeglNode *sink_node);
+/***
+ * Reparenting:
+ *
+ * Sometimes it is useful to be able to move nodes between graphs or even
+ * handle orphaned nods that are not part of a graph. gegl_node_adopt_child
+ * and gegl_node_get_parent are provided ot handle such cases.
+ */
+
+/**
+ * gegl_node_adopt_child:
+ * @parent: a #GeglNode or NULL.
+ * @child: a #GeglNode
+ *
+ * Adds @child to the responsibilities of @node, this makes the parent node
+ * take a reference on the child that is kept as long as the parent itself is
+ * being referenced. The node is stolen from an existing parent if there is one,
+ * or a presumed existing reference is used. If @parent is NULL the child will
+ * be orphaned and the developer is given a reference to be responsible of.
+ *
+ * Returns the child, or NULL if there was a problem with the arguments.
+ */
+GeglNode * gegl_node_adopt_child (GeglNode *parent,
+ GeglNode *child);
+
+/**
+ * gegl_node_get_parent:
+ * @node: a #GeglNode
+ *
+ * Returns a GeglNode that keeps a reference on a child.
+ *
+ * Returns the parent of a node or NULL.
+ */
+GeglNode * gegl_node_get_parent (GeglNode *node);
+
/***
* State queries:
Modified: trunk/gegl/graph/gegl-node.c
==============================================================================
--- trunk/gegl/graph/gegl-node.c (original)
+++ trunk/gegl/graph/gegl-node.c Tue Feb 26 23:58:54 2008
@@ -1882,6 +1882,10 @@
self_priv = GEGL_NODE_GET_PRIVATE (self);
child_priv = GEGL_NODE_GET_PRIVATE (child);
+ g_assert (child_priv->parent == self ||
+ child_priv->parent == NULL);
+ g_return_val_if_fail (GEGL_IS_NODE (child), NULL);
+
self_priv->children = g_slist_remove (self_priv->children, child);
if (child_priv->parent != NULL)
@@ -1899,6 +1903,44 @@
return child;
}
+GeglNode *
+gegl_node_get_parent (GeglNode *self)
+{
+ GeglNodePrivate *self_priv;
+
+ g_return_val_if_fail (GEGL_IS_NODE (self), NULL);
+
+ self_priv = GEGL_NODE_GET_PRIVATE (self);
+ return self_priv->parent;
+}
+
+GeglNode *
+gegl_node_adopt_child (GeglNode *self,
+ GeglNode *child)
+{
+ GeglNode *old_parent;
+
+ g_return_val_if_fail (GEGL_IS_NODE (child), NULL);
+ g_object_ref (child);
+ old_parent = gegl_node_get_parent (child);
+ if (old_parent)
+ {
+ gegl_node_remove_child (old_parent, child);
+ }
+
+ if (self)
+ {
+ gegl_node_add_child (self, child);
+ }
+ else
+ {
+ g_object_ref (child);
+ }
+
+ g_object_unref (child);
+ return child;
+}
+
gint
gegl_node_get_num_children (GeglNode *self)
{
@@ -1943,25 +1985,25 @@
* returns a freshly created node, owned by the graph, and thus freed with it
*/
GeglNode *
-gegl_node_new_child (GeglNode *node,
+gegl_node_new_child (GeglNode *parent,
const gchar *first_property_name,
...)
{
- GeglNode *self = node;
+ GeglNode *node;
va_list var_args;
const gchar *name;
- g_return_val_if_fail (GEGL_IS_NODE (self), NULL);
-
node = g_object_new (GEGL_TYPE_NODE, NULL);
- gegl_node_add_child (self, node);
+ if (parent)
+ gegl_node_add_child (parent, node);
name = first_property_name;
va_start (var_args, first_property_name);
gegl_node_set_valist (node, first_property_name, var_args);
va_end (var_args);
- g_object_unref (node);
+ if (parent)
+ g_object_unref (node);
return node;
}
@@ -1969,7 +2011,6 @@
gegl_node_create_child (GeglNode *self,
const gchar *operation)
{
- g_return_val_if_fail (GEGL_IS_NODE (self), NULL);
g_return_val_if_fail (operation != NULL, NULL);
return gegl_node_new_child (self, "operation", operation, NULL);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]