[librsvg/rustification] node.rs / shapes.rs - Start a Rust implementation for nodes
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg/rustification] node.rs / shapes.rs - Start a Rust implementation for nodes
- Date: Fri, 25 Nov 2016 22:38:14 +0000 (UTC)
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]