[librsvg] pattern.rs: Remove rsvg_pattern_node_has_children(); implement in Rust



commit e440ddfd00ee8ffb2810e441a3eb618afb37199a
Author: Federico Mena Quintero <federico gnome org>
Date:   Tue Feb 28 19:08:20 2017 -0600

    pattern.rs: Remove rsvg_pattern_node_has_children(); implement in Rust
    
    node.rs: Make Node.children public

 rsvg-paint-server.c |   27 ---------------------------
 rsvg-paint-server.h |    3 ---
 rust/src/node.rs    |   10 +++++-----
 rust/src/pattern.rs |   14 ++++++++++----
 4 files changed, 15 insertions(+), 39 deletions(-)
---
diff --git a/rsvg-paint-server.c b/rsvg-paint-server.c
index 0130825..807373f 100644
--- a/rsvg-paint-server.c
+++ b/rsvg-paint-server.c
@@ -566,30 +566,3 @@ rsvg_pattern_node_to_rust_pattern (RsvgNode *node)
 
     return pattern;
 }
-
-static gboolean
-count_one_child_fn (RsvgNode *child, gpointer data)
-{
-    gboolean *has_children = data;
-
-    *has_children = TRUE;
-    return FALSE;
-}
-
-static gboolean
-node_has_at_least_one_child (RsvgNode *node)
-{
-    gboolean has_children = FALSE;
-
-    rsvg_node_foreach_child (node, count_one_child_fn, &has_children);
-    return has_children;
-}
-
-gboolean
-rsvg_pattern_node_has_children (RsvgNode *node)
-{
-    if (rsvg_node_get_type (node) != RSVG_NODE_TYPE_PATTERN)
-        return FALSE;
-
-    return node_has_at_least_one_child (node);
-}
diff --git a/rsvg-paint-server.h b/rsvg-paint-server.h
index d952972..25df375 100644
--- a/rsvg-paint-server.h
+++ b/rsvg-paint-server.h
@@ -176,9 +176,6 @@ gboolean pattern_resolve_fallbacks_and_set_pattern (Pattern        *pattern,
 G_GNUC_INTERNAL
 Pattern *rsvg_pattern_node_to_rust_pattern (RsvgNode *node);
 
-G_GNUC_INTERNAL
-gboolean rsvg_pattern_node_has_children (RsvgNode *node);
-
 
 struct _RsvgSolidColor {
     gboolean currentcolor;
diff --git a/rust/src/node.rs b/rust/src/node.rs
index dfcc2b0..4498972 100644
--- a/rust/src/node.rs
+++ b/rust/src/node.rs
@@ -36,11 +36,11 @@ pub trait NodeTrait: Downcast {
 impl_downcast! (NodeTrait);
 
 pub struct Node {
-    node_type: NodeType,
-    parent:    Option<Weak<Node>>,       // optional; weak ref to parent
-    children:  RefCell<Vec<Rc<Node>>>,   // strong references to children
-    state:     *mut RsvgState,
-    node_impl: Box<NodeTrait>
+    node_type:     NodeType,
+    parent:        Option<Weak<Node>>,       // optional; weak ref to parent
+    pub children:  RefCell<Vec<Rc<Node>>>,   // strong references to children
+    state:         *mut RsvgState,
+    node_impl:     Box<NodeTrait>
 }
 
 /* Keep this in sync with rsvg-private.h:RsvgNodeType */
diff --git a/rust/src/pattern.rs b/rust/src/pattern.rs
index 897961f..f4c1b72 100644
--- a/rust/src/pattern.rs
+++ b/rust/src/pattern.rs
@@ -10,7 +10,7 @@ use length::*;
 
 use drawing_ctx;
 use drawing_ctx::RsvgDrawingCtx;
-use node::RsvgNode;
+use node::*;
 
 use bbox::*;
 use util::*;
@@ -39,11 +39,17 @@ pub struct Pattern {
 
 extern "C" {
     fn rsvg_pattern_node_to_rust_pattern (node: *const RsvgNode) -> *mut Pattern;
-    fn rsvg_pattern_node_has_children (node: *const RsvgNode) -> bool;
 }
 
-fn pattern_node_has_children (c_node: *const RsvgNode) -> bool {
-    unsafe { rsvg_pattern_node_has_children (c_node) }
+fn pattern_node_has_children (raw_node: *const RsvgNode) -> bool {
+    assert! (!raw_node.is_null ());
+    let node: &RsvgNode = unsafe { & *raw_node };
+
+    if node.get_type () == NodeType::Pattern {
+        node.children.borrow ().len () > 0
+    } else {
+        false
+    }
 }
 
 // All of the Pattern's fields are Option<foo> values, because


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