[librsvg/rustification] Move rsvg_render_markers() completely into Rust



commit d81282c2ee8ad5fa99db091e6a967ed701f13d1a
Author: Federico Mena Quintero <federico gnome org>
Date:   Tue Nov 8 19:13:59 2016 -0600

    Move rsvg_render_markers() completely into Rust
    
    We used to have an rsvg_render_markers() in C, and after pulling some
    data out of ctx and state, it would call the actual implementation in
    Rust.  Now that we can extract that data from ctx with accessor
    functions, we can have the whole implementation of rsvg_render_markers()
    in Rust.

 rsvg-marker.c      |   17 -----------------
 rsvg-marker.h      |    2 ++
 rust/src/lib.rs    |    2 +-
 rust/src/marker.rs |   27 ++++++++++++++++-----------
 4 files changed, 19 insertions(+), 29 deletions(-)
---
diff --git a/rsvg-marker.c b/rsvg-marker.c
index e280216..62d4e70 100644
--- a/rsvg-marker.c
+++ b/rsvg-marker.c
@@ -202,20 +202,3 @@ rsvg_marker_render (const char * marker_name, gdouble xpos, gdouble ypos, gdoubl
 
     rsvg_release_node (ctx, (RsvgNode *) self);
 }
-
-extern void rsvg_rust_render_markers (RsvgDrawingCtx *ctx,
-                                      RsvgPathBuilder *builder,
-                                      const char *startmarker,
-                                      const char *middlemarker,
-                                      const char *endmarker);
-
-void
-rsvg_render_markers (RsvgDrawingCtx *ctx,
-                     RsvgPathBuilder *builder)
-{
-    rsvg_rust_render_markers (ctx,
-                              builder,
-                              rsvg_get_start_marker (ctx),
-                              rsvg_get_middle_marker (ctx),
-                              rsvg_get_end_marker (ctx));
-}
diff --git a/rsvg-marker.h b/rsvg-marker.h
index 44d4799..0071bd6 100644
--- a/rsvg-marker.h
+++ b/rsvg-marker.h
@@ -32,6 +32,8 @@ G_BEGIN_DECLS
 
 G_GNUC_INTERNAL
 RsvgNode    *rsvg_new_marker       (void);
+
+/* In the Rust code */
 G_GNUC_INTERNAL
 void        rsvg_render_markers    (RsvgDrawingCtx *ctx, RsvgPathBuilder *builder);
 
diff --git a/rust/src/lib.rs b/rust/src/lib.rs
index 345ff55..e9adc6d 100644
--- a/rust/src/lib.rs
+++ b/rust/src/lib.rs
@@ -10,7 +10,7 @@ pub use path_builder::{
 };
 
 pub use marker::{
-    rsvg_rust_render_markers,
+    rsvg_render_markers,
 };
 
 pub use path_parser::{
diff --git a/rust/src/marker.rs b/rust/src/marker.rs
index d9088cf..f9e6673 100644
--- a/rust/src/marker.rs
+++ b/rust/src/marker.rs
@@ -301,6 +301,10 @@ extern "C" {
                            linewidth: f64,
                            ctx: *mut RsvgDrawingCtx);
     fn rsvg_get_normalized_stroke_width (ctx: *const RsvgDrawingCtx) -> f64;
+
+    fn rsvg_get_start_marker (ctx: *const RsvgDrawingCtx) -> *const libc::c_char;
+    fn rsvg_get_middle_marker (ctx: *const RsvgDrawingCtx) -> *const libc::c_char;
+    fn rsvg_get_end_marker (ctx: *const RsvgDrawingCtx) -> *const libc::c_char;
 }
 
 enum SubpathState {
@@ -355,18 +359,19 @@ fn render_marker_at_end_of_segment (segment: &Segment,
 }
 
 #[no_mangle]
-pub extern fn rsvg_rust_render_markers (ctx: *mut RsvgDrawingCtx,
-                                        raw_builder: *mut RsvgPathBuilder,
-                                        startmarker: *const libc::c_char,
-                                        middlemarker: *const libc::c_char,
-                                        endmarker: *const libc::c_char) {
+pub extern fn rsvg_render_markers (ctx: *mut RsvgDrawingCtx,
+                                   raw_builder: *mut RsvgPathBuilder) {
     let linewidth: f64 = unsafe { rsvg_get_normalized_stroke_width (ctx) };
 
     if linewidth == 0.0 {
         return;
     }
 
-    if startmarker.is_null () && middlemarker.is_null () && endmarker.is_null () {
+    let start_marker = unsafe { rsvg_get_start_marker (ctx) };
+    let middle_marker = unsafe { rsvg_get_middle_marker (ctx) };
+    let end_marker = unsafe { rsvg_get_end_marker (ctx) };
+
+    if start_marker.is_null () && middle_marker.is_null () && end_marker.is_null () {
         return;
     }
 
@@ -388,14 +393,14 @@ pub extern fn rsvg_rust_render_markers (ctx: *mut RsvgDrawingCtx,
                         /* Got a lone point after a subpath; render the subpath's end marker first */
 
                         let (_, incoming_vx, incoming_vy) = find_incoming_directionality_backwards 
(&segments, i - 1);
-                        render_marker_at_end_of_segment (&segments[i - 1], endmarker, angle_from_vector 
(incoming_vx, incoming_vy), linewidth, ctx);
+                        render_marker_at_end_of_segment (&segments[i - 1], end_marker, angle_from_vector 
(incoming_vx, incoming_vy), linewidth, ctx);
                     },
 
                     _ => { }
                 }
 
                 /* Render marker for the lone point; no directionality */
-                render_marker_at_start_of_segment (segment, middlemarker, 0.0, linewidth, ctx);
+                render_marker_at_start_of_segment (segment, middle_marker, 0.0, linewidth, ctx);
 
                 subpath_state = SubpathState::NoSubpath;
             },
@@ -406,7 +411,7 @@ pub extern fn rsvg_rust_render_markers (ctx: *mut RsvgDrawingCtx,
                 match subpath_state {
                     SubpathState::NoSubpath => {
                         let (_, outgoing_vx, outgoing_vy) = find_outgoing_directionality_forwards 
(&segments, i);
-                        render_marker_at_start_of_segment (segment, startmarker, angle_from_vector 
(outgoing_vx, outgoing_vy), linewidth, ctx);
+                        render_marker_at_start_of_segment (segment, start_marker, angle_from_vector 
(outgoing_vx, outgoing_vy), linewidth, ctx);
 
                         subpath_state = SubpathState::InSubpath;
                     },
@@ -435,7 +440,7 @@ pub extern fn rsvg_rust_render_markers (ctx: *mut RsvgDrawingCtx,
                             angle = 0.0;
                         }
 
-                        render_marker_at_start_of_segment (segment, middlemarker, angle, linewidth, ctx);
+                        render_marker_at_start_of_segment (segment, middle_marker, angle, linewidth, ctx);
                     }
                 }
             }
@@ -450,7 +455,7 @@ pub extern fn rsvg_rust_render_markers (ctx: *mut RsvgDrawingCtx,
             Segment::LineOrCurve { .. } => {
                 let (_, incoming_vx, incoming_vy) = find_incoming_directionality_backwards (&segments, 
segments.len () - 1);
 
-                render_marker_at_end_of_segment (&segment, endmarker, angle_from_vector (incoming_vx, 
incoming_vy), linewidth, ctx);
+                render_marker_at_end_of_segment (&segment, end_marker, angle_from_vector (incoming_vx, 
incoming_vy), linewidth, ctx);
             },
 
             _ => { }


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