[librsvg: 1/2] drawing_ctx: move add_node_and_ancestors to rust



commit 5eea10873969149857afed6bf27d5aeba2717f88
Author: Paolo Borelli <pborelli gnome org>
Date:   Sat Jun 16 14:41:12 2018 +0200

    drawing_ctx: move add_node_and_ancestors to rust
    
    This might seem a little bit odd, since it adds more code than
    it removes, but I want to try to push toward the goals of having
    drawing ctx C functions called only by drawing_ctx.rs.
    Beside iterating the ancestors in rust is not as trivial as it
    sounds...

 librsvg/rsvg-drawing-ctx.c        | 11 ++---------
 librsvg/rsvg-drawing-ctx.h        |  7 ++++++-
 librsvg/rsvg-handle.c             |  4 +++-
 rsvg_internals/src/drawing_ctx.rs | 25 +++++++++++++++++++++++++
 rsvg_internals/src/lib.rs         |  1 +
 5 files changed, 37 insertions(+), 11 deletions(-)
---
diff --git a/librsvg/rsvg-drawing-ctx.c b/librsvg/rsvg-drawing-ctx.c
index 379b75c5..66e1dd91 100644
--- a/librsvg/rsvg-drawing-ctx.c
+++ b/librsvg/rsvg-drawing-ctx.c
@@ -235,16 +235,9 @@ rsvg_drawing_ctx_get_defs (RsvgDrawingCtx *ctx)
 }
 
 void
-rsvg_drawing_ctx_add_node_and_ancestors_to_stack (RsvgDrawingCtx *draw_ctx, RsvgNode *node)
+rsvg_drawing_ctx_add_node_to_stack (RsvgDrawingCtx *draw_ctx, RsvgNode *node)
 {
-    if (node) {
-        node = rsvg_node_ref (node);
-
-        while (node != NULL) {
-            draw_ctx->drawsub_stack = g_slist_prepend (draw_ctx->drawsub_stack, node);
-            node = rsvg_node_get_parent (node);
-        }
-    }
+    draw_ctx->drawsub_stack = g_slist_prepend (draw_ctx->drawsub_stack, rsvg_node_ref (node));
 }
 
 gboolean
diff --git a/librsvg/rsvg-drawing-ctx.h b/librsvg/rsvg-drawing-ctx.h
index f6142cdd..5bc6d4a1 100644
--- a/librsvg/rsvg-drawing-ctx.h
+++ b/librsvg/rsvg-drawing-ctx.h
@@ -90,7 +90,12 @@ G_GNUC_INTERNAL
 RsvgDefs *rsvg_drawing_ctx_get_defs (RsvgDrawingCtx *ctx);
 
 G_GNUC_INTERNAL
-void rsvg_drawing_ctx_add_node_and_ancestors_to_stack (RsvgDrawingCtx *draw_ctx, RsvgNode *node);
+void rsvg_drawing_ctx_add_node_stack (RsvgDrawingCtx *draw_ctx, RsvgNode *node);
+
+/* Defined in rsvg_internals/src/drawing_ctx.rs */
+G_GNUC_INTERNAL
+void rsvg_drawing_ctx_add_node_and_ancestors_to_stack (RsvgDrawingCtx *draw_ctx,
+                                                       RsvgNode        *node);
 
 G_GNUC_INTERNAL
 gboolean rsvg_drawing_ctx_should_draw_node_from_stack (RsvgDrawingCtx *ctx,
diff --git a/librsvg/rsvg-handle.c b/librsvg/rsvg-handle.c
index b2b7a214..383c187e 100644
--- a/librsvg/rsvg-handle.c
+++ b/librsvg/rsvg-handle.c
@@ -836,7 +836,9 @@ rsvg_handle_render_cairo_sub (RsvgHandle * handle, cairo_t * cr, const char *id)
 
     draw = rsvg_handle_create_drawing_ctx (handle, cr, &dimensions);
 
-    rsvg_drawing_ctx_add_node_and_ancestors_to_stack (draw, drawsub);
+    if (drawsub != NULL) {
+        rsvg_drawing_ctx_add_node_and_ancestors_to_stack (draw, drawsub);
+    }
 
     cairo_save (cr);
 
diff --git a/rsvg_internals/src/drawing_ctx.rs b/rsvg_internals/src/drawing_ctx.rs
index 4e6d74aa..b2d744ba 100644
--- a/rsvg_internals/src/drawing_ctx.rs
+++ b/rsvg_internals/src/drawing_ctx.rs
@@ -50,6 +50,8 @@ extern "C" {
 
     fn rsvg_drawing_ctx_pop_view_box(draw_ctx: *const RsvgDrawingCtx);
 
+    fn rsvg_drawing_ctx_add_node_to_stack(draw_ctx: *const RsvgDrawingCtx, node: *const RsvgNode);
+
     fn rsvg_drawing_ctx_prepend_acquired_node(
         draw_ctx: *const RsvgDrawingCtx,
         node: *mut RsvgNode,
@@ -662,6 +664,29 @@ pub extern "C" fn rsvg_drawing_ctx_draw_node_from_stack(
     draw_node_from_stack(draw_ctx, &cascaded, node, clipping);
 }
 
+fn add_node_and_ancestors_to_stack(draw_ctx: *const RsvgDrawingCtx, node: &RsvgNode) {
+    unsafe {
+        rsvg_drawing_ctx_add_node_to_stack(draw_ctx, node);
+    }
+
+    if let Some(ref parent) = node.get_parent() {
+        add_node_and_ancestors_to_stack(draw_ctx, parent);
+    }
+}
+
+#[no_mangle]
+pub extern "C" fn rsvg_drawing_ctx_add_node_and_ancestors_to_stack(
+    draw_ctx: *const RsvgDrawingCtx,
+    raw_node: *const RsvgNode,
+) {
+    assert!(!draw_ctx.is_null());
+
+    assert!(!raw_node.is_null());
+    let node = unsafe { &*raw_node };
+
+    add_node_and_ancestors_to_stack(draw_ctx, node);
+}
+
 pub struct AcquiredNode(*const RsvgDrawingCtx, *mut RsvgNode);
 
 impl Drop for AcquiredNode {
diff --git a/rsvg_internals/src/lib.rs b/rsvg_internals/src/lib.rs
index 43a91350..e6feef87 100644
--- a/rsvg_internals/src/lib.rs
+++ b/rsvg_internals/src/lib.rs
@@ -39,6 +39,7 @@ pub use cnode::{rsvg_rust_cnode_get_impl, rsvg_rust_cnode_new};
 pub use color::{rsvg_css_parse_color, ColorKind, ColorSpec};
 
 pub use drawing_ctx::{
+    rsvg_drawing_ctx_add_node_and_ancestors_to_stack,
     rsvg_drawing_ctx_draw_node_from_stack,
     rsvg_drawing_ctx_transformed_image_bounding_box,
 };


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