[librsvg] shapes.rs: Fully implement NodePath in Rust. Yay!



commit f7593e3b802afa4971db80c373dcfec1c8f4b8c5
Author: Federico Mena Quintero <federico gnome org>
Date:   Mon Feb 20 14:01:02 2017 -0600

    shapes.rs: Fully implement NodePath in Rust.  Yay!

 rsvg-base.c        |    2 +-
 rsvg-shapes.c      |   61 ----------------------------------------------------
 rsvg-shapes.h      |    4 ++-
 rust/src/lib.rs    |   51 +++++++++++++++++++++++--------------------
 rust/src/shapes.rs |   25 +++++++++++++++------
 5 files changed, 49 insertions(+), 94 deletions(-)
---
diff --git a/rsvg-base.c b/rsvg-base.c
index e3e8b3f..17df81c 100644
--- a/rsvg-base.c
+++ b/rsvg-base.c
@@ -313,7 +313,7 @@ static const NodeCreator node_creators[] = {
     /* "missing-glyph",      TRUE,  */
     /* "mpath"               FALSE, */
     { "multiImage",          FALSE, rsvg_new_switch }, /* hack to make multiImage sort-of work */
-    { "path",                TRUE,  rsvg_new_path },
+    { "path",                TRUE,  rsvg_node_path_new },
     { "pattern",             TRUE,  rsvg_new_pattern },
     { "polygon",             TRUE,  rsvg_new_polygon },
     { "polyline",            TRUE,  rsvg_new_polyline },
diff --git a/rsvg-shapes.c b/rsvg-shapes.c
index 2e0906f..9f9f98b 100644
--- a/rsvg-shapes.c
+++ b/rsvg-shapes.c
@@ -41,67 +41,6 @@
 /* 4/3 * (1-cos 45ƒ)/sin 45ƒ = 4/3 * sqrt(2) - 1 */
 #define RSVG_ARC_MAGIC ((double) 0.5522847498)
 
-typedef struct _RsvgNodePath RsvgNodePath;
-
-struct _RsvgNodePath {
-    RsvgPathBuilder *builder;
-};
-
-static void
-rsvg_node_path_free (gpointer impl)
-{
-    RsvgNodePath *path = impl;
-
-    if (path->builder)
-        rsvg_path_builder_destroy (path->builder);
-
-    g_free (path);
-}
-
-static void
-rsvg_node_path_draw (RsvgNode *node, gpointer impl, RsvgDrawingCtx *ctx, int dominate)
-{
-    RsvgNodePath *path = impl;
-
-    if (!path->builder)
-        return;
-
-    rsvg_state_reinherit_top (ctx, rsvg_node_get_state (node), dominate);
-
-    rsvg_render_path_builder (ctx, path->builder);
-    rsvg_render_markers (ctx, path->builder);
-}
-
-static void
-rsvg_node_path_set_atts (RsvgNode *node, gpointer impl, RsvgHandle *handle, RsvgPropertyBag * atts)
-{
-    RsvgNodePath *path = impl;
-    const char *value;
-
-    if ((value = rsvg_property_bag_lookup (atts, "d"))) {
-        if (path->builder)
-            rsvg_path_builder_destroy (path->builder);
-        path->builder = rsvg_path_parser_from_str_into_builder (value);
-    }
-}
-
-RsvgNode *
-rsvg_new_path (const char *element_name, RsvgNode *parent)
-{
-    RsvgNodePath *path;
-
-    path = g_new0 (RsvgNodePath, 1);
-    path->builder = NULL;
-
-    return rsvg_rust_cnode_new (RSVG_NODE_TYPE_PATH,
-                                parent,
-                                rsvg_state_new (),
-                                path,
-                                rsvg_node_path_set_atts,
-                                rsvg_node_path_draw,
-                                rsvg_node_path_free);
-}
-
 typedef struct _RsvgNodePoly RsvgNodePoly;
 
 struct _RsvgNodePoly {
diff --git a/rsvg-shapes.h b/rsvg-shapes.h
index 686badf..c6b33b5 100644
--- a/rsvg-shapes.h
+++ b/rsvg-shapes.h
@@ -36,8 +36,10 @@
 
 G_BEGIN_DECLS 
 
+/* Implemented in rust/src/shapes.rs */
 G_GNUC_INTERNAL
-RsvgNode *rsvg_new_path (const char *element_name, RsvgNode *parent);
+RsvgNode *rsvg_node_path_new (const char *element_name, RsvgNode *parent);
+
 G_GNUC_INTERNAL
 RsvgNode *rsvg_new_polygon (const char *element_name, RsvgNode *parent);
 G_GNUC_INTERNAL
diff --git a/rust/src/lib.rs b/rust/src/lib.rs
index 8826619..512f368 100644
--- a/rust/src/lib.rs
+++ b/rust/src/lib.rs
@@ -18,6 +18,11 @@ pub use bbox::{
     rsvg_bbox_clip
 };
 
+pub use cnode::{
+    rsvg_rust_cnode_new,
+    rsvg_rust_cnode_get_impl
+};
+
 pub use gradient::{
     gradient_linear_new,
     gradient_radial_new,
@@ -26,25 +31,6 @@ pub use gradient::{
     gradient_resolve_fallbacks_and_set_pattern
 };
 
-pub use path_builder::{
-    rsvg_path_builder_new,
-    rsvg_path_builder_destroy,
-    rsvg_path_builder_move_to,
-    rsvg_path_builder_line_to,
-    rsvg_path_builder_curve_to,
-    rsvg_path_builder_close_path,
-    rsvg_path_builder_arc,
-    rsvg_path_builder_add_to_cairo_context
-};
-
-pub use marker::{
-    rsvg_render_markers,
-};
-
-pub use path_parser::{
-    rsvg_path_parser_from_str_into_builder
-};
-
 pub use length::{
     LengthUnit,
     LengthDir,
@@ -54,6 +40,10 @@ pub use length::{
     rsvg_length_hand_normalize,
 };
 
+pub use marker::{
+    rsvg_render_markers,
+};
+
 pub use node::{
     rsvg_node_get_type,
     rsvg_node_get_parent,
@@ -67,13 +57,19 @@ pub use node::{
     rsvg_node_foreach_child,
 };
 
-pub use cnode::{
-    rsvg_rust_cnode_new,
-    rsvg_rust_cnode_get_impl
+pub use path_builder::{
+    rsvg_path_builder_new,
+    rsvg_path_builder_destroy,
+    rsvg_path_builder_move_to,
+    rsvg_path_builder_line_to,
+    rsvg_path_builder_curve_to,
+    rsvg_path_builder_close_path,
+    rsvg_path_builder_arc,
+    rsvg_path_builder_add_to_cairo_context
 };
 
-pub use viewbox::{
-    RsvgViewBox
+pub use path_parser::{
+    rsvg_path_parser_from_str_into_builder
 };
 
 pub use pattern::{
@@ -82,6 +78,13 @@ pub use pattern::{
     pattern_resolve_fallbacks_and_set_pattern,
 };
 
+pub use shapes::{
+    rsvg_node_path_new,
+};
+pub use viewbox::{
+    RsvgViewBox
+};
+
 
 mod aspect_ratio;
 mod bbox;
diff --git a/rust/src/shapes.rs b/rust/src/shapes.rs
index 41f478d..fb889e5 100644
--- a/rust/src/shapes.rs
+++ b/rust/src/shapes.rs
@@ -1,6 +1,9 @@
 use std::cell::RefCell;
 use std::ptr;
+use std::rc::Rc;
+extern crate libc;
 
+use cnode::*;
 use drawing_ctx;
 use drawing_ctx::*;
 use handle::RsvgHandle;
@@ -13,14 +16,12 @@ use property_bag::*;
 use state::RsvgState;
 
 struct NodePath {
-    state: *mut RsvgState,
     builder: RefCell<RsvgPathBuilder>
 }
 
 impl NodePath {
-    fn new (state: *mut RsvgState) -> NodePath {
+    fn new () -> NodePath {
         NodePath {
-            state: state,
             builder: RefCell::new (RsvgPathBuilder::new ())
         }
     }
@@ -38,13 +39,23 @@ impl NodeTrait for NodePath {
         }
     }
 
-    fn draw (&self, _: &RsvgNode, draw_ctx: *const RsvgDrawingCtx, dominate: i32) {
-        drawing_ctx::state_reinherit_top (draw_ctx, self.state, dominate);
-        drawing_ctx::render_path_builder (draw_ctx, &*self.builder.borrow ());
-        marker::render_markers_for_path_builder (&*self.builder.borrow (), draw_ctx);
+    fn draw (&self, node: &RsvgNode, draw_ctx: *const RsvgDrawingCtx, dominate: i32) {
+        let builder = &*self.builder.borrow ();
+
+        drawing_ctx::state_reinherit_top (draw_ctx, node.get_state (), dominate);
+        drawing_ctx::render_path_builder (draw_ctx, builder);
+        marker::render_markers_for_path_builder (builder, draw_ctx);
     }
 
     fn get_c_impl (&self) -> *const RsvgCNodeImpl {
         ptr::null ()
     }
 }
+
+#[no_mangle]
+pub extern fn rsvg_node_path_new (element_name: *const libc::c_char, raw_parent: *const RsvgNode) -> *const 
RsvgNode {
+    box_node (Rc::new (Node::new (NodeType::Path,
+                                  parent_ptr_to_weak (raw_parent),
+                                  drawing_ctx::state_new (),
+                                  Box::new (NodePath::new ()))))
+}


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