gegl r2125 - in trunk: . gegl gegl/graph



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]