[librsvg] shapes.rs: Render the path's markers
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg] shapes.rs: Render the path's markers
- Date: Mon, 20 Feb 2017 20:13:14 +0000 (UTC)
commit 8e824c8eb682edb134c85955f88c23ea58f83909
Author: Federico Mena Quintero <federico gnome org>
Date: Mon Feb 20 08:01:16 2017 -0600
shapes.rs: Render the path's markers
rust/src/marker.rs | 56 +++++++++++++++++++++++++++------------------------
rust/src/shapes.rs | 5 ++-
2 files changed, 33 insertions(+), 28 deletions(-)
---
diff --git a/rust/src/marker.rs b/rust/src/marker.rs
index 95f2186..1fe21f0 100644
--- a/rust/src/marker.rs
+++ b/rust/src/marker.rs
@@ -340,12 +340,12 @@ extern "C" {
ypos: f64,
orient: f64,
linewidth: f64,
- ctx: *mut RsvgDrawingCtx);
- fn rsvg_get_normalized_stroke_width (ctx: *const RsvgDrawingCtx) -> f64;
+ draw_ctx: *const RsvgDrawingCtx);
+ fn rsvg_get_normalized_stroke_width (draw_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;
+ fn rsvg_get_start_marker (draw_ctx: *const RsvgDrawingCtx) -> *const libc::c_char;
+ fn rsvg_get_middle_marker (draw_ctx: *const RsvgDrawingCtx) -> *const libc::c_char;
+ fn rsvg_get_end_marker (draw_ctx: *const RsvgDrawingCtx) -> *const libc::c_char;
}
enum SubpathState {
@@ -357,7 +357,7 @@ fn render_marker_at_start_of_segment (segment: &Segment,
marker_name: *const libc::c_char,
orient: f64,
linewidth: f64,
- ctx: *mut RsvgDrawingCtx) {
+ draw_ctx: *const RsvgDrawingCtx) {
let xpos: f64;
let ypos: f64;
@@ -373,14 +373,14 @@ fn render_marker_at_start_of_segment (segment: &Segment,
}
}
- unsafe { rsvg_marker_render (marker_name, xpos, ypos, orient, linewidth, ctx); }
+ unsafe { rsvg_marker_render (marker_name, xpos, ypos, orient, linewidth, draw_ctx); }
}
fn render_marker_at_end_of_segment (segment: &Segment,
marker_name: *const libc::c_char,
orient: f64,
linewidth: f64,
- ctx: *mut RsvgDrawingCtx) {
+ draw_ctx: *const RsvgDrawingCtx) {
let xpos: f64;
let ypos: f64;
@@ -396,29 +396,26 @@ fn render_marker_at_end_of_segment (segment: &Segment,
}
}
- unsafe { rsvg_marker_render (marker_name, xpos, ypos, orient, linewidth, ctx); }
+ unsafe { rsvg_marker_render (marker_name, xpos, ypos, orient, linewidth, draw_ctx); }
}
-#[no_mangle]
-pub extern fn rsvg_render_markers (ctx: *mut RsvgDrawingCtx,
- raw_builder: *mut RsvgPathBuilder) {
- let linewidth: f64 = unsafe { rsvg_get_normalized_stroke_width (ctx) };
+pub fn render_markers_for_path_builder (builder: &RsvgPathBuilder,
+ draw_ctx: *const RsvgDrawingCtx) {
+
+ let linewidth: f64 = unsafe { rsvg_get_normalized_stroke_width (draw_ctx) };
if linewidth == 0.0 {
return;
}
- 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) };
+ let start_marker = unsafe { rsvg_get_start_marker (draw_ctx) };
+ let middle_marker = unsafe { rsvg_get_middle_marker (draw_ctx) };
+ let end_marker = unsafe { rsvg_get_end_marker (draw_ctx) };
if start_marker.is_null () && middle_marker.is_null () && end_marker.is_null () {
return;
}
- assert! (!raw_builder.is_null ());
- let builder: &mut RsvgPathBuilder = unsafe { &mut (*raw_builder) };
-
/* Convert the path to a list of segments and bare points */
let segments = path_builder_to_segments (builder);
@@ -434,14 +431,14 @@ pub extern fn rsvg_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], end_marker, 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, draw_ctx);
},
_ => { }
}
/* Render marker for the lone point; no directionality */
- render_marker_at_start_of_segment (segment, middle_marker, 0.0, linewidth, ctx);
+ render_marker_at_start_of_segment (segment, middle_marker, 0.0, linewidth, draw_ctx);
subpath_state = SubpathState::NoSubpath;
},
@@ -452,7 +449,7 @@ pub extern fn rsvg_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, start_marker, 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, draw_ctx);
subpath_state = SubpathState::InSubpath;
},
@@ -481,7 +478,7 @@ pub extern fn rsvg_render_markers (ctx: *mut RsvgDrawingCtx,
angle = 0.0;
}
- render_marker_at_start_of_segment (segment, middle_marker, angle, linewidth, ctx);
+ render_marker_at_start_of_segment (segment, middle_marker, angle, linewidth,
draw_ctx);
}
}
}
@@ -496,7 +493,7 @@ pub extern fn rsvg_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, end_marker, 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, draw_ctx);
},
_ => { }
@@ -504,6 +501,15 @@ pub extern fn rsvg_render_markers (ctx: *mut RsvgDrawingCtx,
}
}
+#[no_mangle]
+pub extern fn rsvg_render_markers (draw_ctx: *const RsvgDrawingCtx,
+ raw_builder: *const RsvgPathBuilder) {
+ assert! (!raw_builder.is_null ());
+ let builder: &RsvgPathBuilder = unsafe { &*raw_builder };
+
+ render_markers_for_path_builder (builder, draw_ctx);
+}
+
/******************** Tests ********************/
@@ -511,8 +517,6 @@ pub extern fn rsvg_render_markers (ctx: *mut RsvgDrawingCtx,
mod tests {
use std::f64::consts::*;
use super::*;
- use path_builder::*;
- use util::*;
extern crate cairo;
fn test_bisection_angle (expected: f64,
diff --git a/rust/src/shapes.rs b/rust/src/shapes.rs
index 78b2ccd..41f478d 100644
--- a/rust/src/shapes.rs
+++ b/rust/src/shapes.rs
@@ -4,6 +4,7 @@ use std::ptr;
use drawing_ctx;
use drawing_ctx::*;
use handle::RsvgHandle;
+use marker;
use node::*;
use path_builder::*;
use path_parser;
@@ -39,10 +40,10 @@ 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 ());
+ drawing_ctx::render_path_builder (draw_ctx, &*self.builder.borrow ());
+ marker::render_markers_for_path_builder (&*self.builder.borrow (), draw_ctx);
}
-
fn get_c_impl (&self) -> *const RsvgCNodeImpl {
ptr::null ()
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]