[librsvg/rustification] node.rs / shapes.rs - Start a Rust implementation for nodes



commit 7f696c56a956371230c7ece49712cf95589abcaa
Author: Federico Mena Quintero <federico gnome org>
Date:   Fri Nov 18 18:55:27 2016 -0600

    node.rs / shapes.rs - Start a Rust implementation for nodes

 rust/src/drawing_ctx.rs  |   24 ++++++++++++++++++++++++
 rust/src/handle.rs       |    1 +
 rust/src/lib.rs          |    5 ++++-
 rust/src/node.rs         |   15 +++++++++++++++
 rust/src/path_builder.rs |    1 +
 rust/src/shapes.rs       |   43 +++++++++++++++++++++++++++++++++++++++++++
 rust/src/state.rs        |    1 +
 7 files changed, 89 insertions(+), 1 deletions(-)
---
diff --git a/rust/src/drawing_ctx.rs b/rust/src/drawing_ctx.rs
index 915e717..01da0b0 100644
--- a/rust/src/drawing_ctx.rs
+++ b/rust/src/drawing_ctx.rs
@@ -1,3 +1,8 @@
+extern crate libc;
+
+use state::RsvgState;
+use path_builder::RsvgPathBuilder;
+
 pub enum RsvgDrawingCtx {}
 
 extern "C" {
@@ -10,6 +15,13 @@ extern "C" {
     fn rsvg_drawing_ctx_get_view_box_size (draw_ctx: *const RsvgDrawingCtx,
                                            out_x: *mut f64,
                                            out_y: *mut f64);
+
+    fn rsvg_state_reinherit_top (draw_ctx: *const RsvgDrawingCtx,
+                                 state: *mut RsvgState,
+                                 dominate: libc::c_int);
+
+    fn rsvg_render_path_builder (draw_ctx: *const RsvgDrawingCtx,
+                                 builder: *const RsvgPathBuilder);
 }
 
 pub fn get_dpi (draw_ctx: *const RsvgDrawingCtx) -> (f64, f64) {
@@ -34,3 +46,15 @@ pub fn get_view_box_size (draw_ctx: *const RsvgDrawingCtx) -> (f64, f64) {
 
     (w, h)
 }
+
+pub fn state_reinherit_top (draw_ctx: *const RsvgDrawingCtx,
+                            state: *mut RsvgState,
+                            dominate: i32) {
+    unsafe { rsvg_state_reinherit_top (draw_ctx, state, dominate); }
+}
+
+pub fn render_path_builder (draw_ctx: *const RsvgDrawingCtx,
+                            builder: &RsvgPathBuilder)
+{
+    unsafe { rsvg_render_path_builder (draw_ctx, builder); }
+}
diff --git a/rust/src/handle.rs b/rust/src/handle.rs
new file mode 100644
index 0000000..8c74932
--- /dev/null
+++ b/rust/src/handle.rs
@@ -0,0 +1 @@
+pub enum RsvgHandle {}
diff --git a/rust/src/lib.rs b/rust/src/lib.rs
index 993c814..1283bdc 100644
--- a/rust/src/lib.rs
+++ b/rust/src/lib.rs
@@ -27,10 +27,13 @@ pub use length::{
 };
 
 mod drawing_ctx;
+mod handle;
 mod length;
 mod marker;
-//mod node;
+mod node;
 mod path_builder;
 mod path_parser;
 mod property_bag;
+mod state;
+mod shapes;
 mod strtod;
diff --git a/rust/src/node.rs b/rust/src/node.rs
new file mode 100644
index 0000000..024a4c2
--- /dev/null
+++ b/rust/src/node.rs
@@ -0,0 +1,15 @@
+extern crate libc;
+
+use drawing_ctx;
+use drawing_ctx::RsvgDrawingCtx;
+
+use handle::RsvgHandle;
+
+use property_bag::RsvgPropertyBag;
+
+use state::RsvgState;
+
+pub trait Node {
+    fn set_atts (&self, handle: *const RsvgHandle, pbag: *const RsvgPropertyBag);
+    fn draw (&self, draw_ctx: *const RsvgDrawingCtx, dominate: i32);
+}
diff --git a/rust/src/path_builder.rs b/rust/src/path_builder.rs
index 2065fff..db19331 100644
--- a/rust/src/path_builder.rs
+++ b/rust/src/path_builder.rs
@@ -3,6 +3,7 @@ use std::f64;
 extern crate cairo;
 extern crate cairo_sys;
 
+#[repr(C)]
 pub struct RsvgPathBuilder {
     path_segments: Vec<cairo::PathSegment>,
 }
diff --git a/rust/src/shapes.rs b/rust/src/shapes.rs
new file mode 100644
index 0000000..7eddac1
--- /dev/null
+++ b/rust/src/shapes.rs
@@ -0,0 +1,43 @@
+use std::cell::RefCell;
+
+use drawing_ctx;
+use drawing_ctx::*;
+use handle::RsvgHandle;
+use node::*;
+use path_builder::*;
+use path_parser;
+use property_bag;
+use property_bag::*;
+use state::RsvgState;
+
+struct NodePath {
+    state: *mut RsvgState,
+    builder: RefCell<RsvgPathBuilder>
+}
+
+impl NodePath {
+    fn new (state: *mut RsvgState) -> NodePath {
+        NodePath {
+            state: state,
+            builder: RefCell::new (RsvgPathBuilder::new ())
+        }
+    }
+}
+
+impl Node for NodePath {
+    fn set_atts (&self, _: *const RsvgHandle, pbag: *const RsvgPropertyBag) {
+        if let Some (value) = property_bag::lookup (pbag, "d") {
+            let mut builder = self.builder.borrow_mut ();
+
+            if let Err (_) = path_parser::parse_path_into_builder (&value, &mut *builder) {
+                // FIXME: we don't propagate errors upstream, but creating a partial
+                // path is OK per the spec
+            }
+        }
+    }
+
+    fn draw (&self, 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 ());
+    }
+}
diff --git a/rust/src/state.rs b/rust/src/state.rs
new file mode 100644
index 0000000..cd157d0
--- /dev/null
+++ b/rust/src/state.rs
@@ -0,0 +1 @@
+pub enum RsvgState {}


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