1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
use crate::{Stroker, StrokeStyle, Point};
type OutputVertex = crate::Vertex;
#[repr(C)]
pub struct VertexBuffer {
data: *const OutputVertex,
len: usize
}
#[no_mangle]
pub extern "C" fn aa_stroke_new(
style: &StrokeStyle,
output_ptr: *mut OutputVertex,
output_capacity: usize,
) -> *mut Stroker {
let mut s = Stroker::new(style);
if output_ptr != std::ptr::null_mut() {
let slice = unsafe { std::slice::from_raw_parts_mut(output_ptr, output_capacity) };
s.set_output_buffer(slice);
}
Box::into_raw(Box::new(s))
}
#[no_mangle]
pub extern "C" fn aa_stroke_move_to(s: &mut Stroker, x: f32, y: f32, closed: bool) {
s.move_to(Point::new(x, y), closed);
}
#[no_mangle]
pub extern "C" fn aa_stroke_line_to(s: &mut Stroker, x: f32, y: f32, end: bool) {
if end {
s.line_to_capped(Point::new(x, y))
} else {
s.line_to(Point::new(x, y));
}
}
#[no_mangle]
pub extern "C" fn aa_stroke_curve_to(s: &mut Stroker, c1x: f32, c1y: f32, c2x: f32, c2y: f32, x: f32, y: f32, end: bool) {
if end {
s.curve_to_capped(Point::new(c1x, c1y), Point::new(c2x, c2y), Point::new(x, y));
} else {
s.curve_to(Point::new(c1x, c1y), Point::new(c2x, c2y), Point::new(x, y));
}
}
/*
#[no_mangle]
pub extern "C" fn aa_stroke_quad_to(s: &mut Stroker, cx: f32, cy: f32, x: f32, y: f32) {
s.quad_to(cx, cy, x, y);
}*/
#[no_mangle]
pub extern "C" fn aa_stroke_close(s: &mut Stroker) {
s.close();
}
#[no_mangle]
pub extern "C" fn aa_stroke_finish(s: &mut Stroker) -> VertexBuffer {
let stroked_path = s.get_stroked_path();
if let Some(output_buffer_size) = stroked_path.get_output_buffer_size() {
VertexBuffer {
data: std::ptr::null(),
len: output_buffer_size,
}
} else {
let result = stroked_path.finish();
let vb = VertexBuffer { data: result.as_ptr(), len: result.len() };
std::mem::forget(result);
vb
}
}
#[no_mangle]
pub extern "C" fn aa_stroke_vertex_buffer_release(vb: VertexBuffer)
{
if vb.data != std::ptr::null() {
unsafe {
drop(Box::from_raw(std::slice::from_raw_parts_mut(vb.data as *mut OutputVertex, vb.len)));
}
}
}
#[no_mangle]
pub unsafe extern "C" fn aa_stroke_release(s: *mut Stroker) {
drop(Box::from_raw(s));
}
#[test]
fn simple() {
let style = StrokeStyle::default();
let s = unsafe { &mut *aa_stroke_new(&style, std::ptr::null_mut(), 0) } ;
aa_stroke_move_to(s, 10., 10., false);
aa_stroke_line_to(s, 100., 100., false);
aa_stroke_line_to(s, 100., 10., true);
let vb = aa_stroke_finish(s);
aa_stroke_vertex_buffer_release(vb);
unsafe { aa_stroke_release(s) } ;
}
|