[librsvg: 1/2] drawing_ctx: move add_node_and_ancestors to rust
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 1/2] drawing_ctx: move add_node_and_ancestors to rust
- Date: Mon, 18 Jun 2018 13:28:24 +0000 (UTC)
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]