From d2fbb23031f0eb2608d598bdec2cdd34cf1cb0c0 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Thu, 20 Jun 2019 13:01:54 -0700 Subject: [PATCH] Expose more stroke features in the C API --- c/include/pathfinder/pathfinder.h | 11 ++++++++++ c/src/lib.rs | 35 ++++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/c/include/pathfinder/pathfinder.h b/c/include/pathfinder/pathfinder.h index d924ce7b..b89404d4 100644 --- a/c/include/pathfinder/pathfinder.h +++ b/c/include/pathfinder/pathfinder.h @@ -25,6 +25,10 @@ extern "C" { #define PF_LINE_CAP_SQUARE 1 #define PF_LINE_CAP_ROUND 2 +#define PF_LINE_JOIN_MITER 0 +#define PF_LINE_JOIN_BEVEL 1 +#define PF_LINE_JOIN_ROUND 2 + // `gl` #define PF_GL_VERSION_GL3 0 @@ -45,6 +49,7 @@ typedef struct PFPath *PFPathRef; struct PFCanvasFontContext; typedef struct PFCanvasFontContext *PFCanvasFontContextRef; typedef uint8_t PFLineCap; +typedef uint8_t PFLineJoin; // `geometry` @@ -116,6 +121,12 @@ void PFCanvasFillRect(PFCanvasRef canvas, const PFRectF *rect); void PFCanvasStrokeRect(PFCanvasRef canvas, const PFRectF *rect); void PFCanvasSetLineWidth(PFCanvasRef canvas, float new_line_width); void PFCanvasSetLineCap(PFCanvasRef canvas, PFLineCap new_line_cap); +void PFCanvasSetLineJoin(PFCanvasRef canvas, PFLineJoin new_line_join); +void PFCanvasSetMiterLimit(PFCanvasRef canvas, float new_miter_limit); +void PFCanvasSetLineDash(PFCanvasRef canvas, + const float *new_line_dashes, + size_t new_line_dash_count); +void PFCanvasSetLineDashOffset(PFCanvasRef canvas, float offset); void PFCanvasFillPath(PFCanvasRef canvas, PFPathRef path); void PFCanvasStrokePath(PFCanvasRef canvas, PFPathRef path); PFPathRef PFPathCreate(); diff --git a/c/src/lib.rs b/c/src/lib.rs index 7454e90c..e9cb913d 100644 --- a/c/src/lib.rs +++ b/c/src/lib.rs @@ -11,7 +11,7 @@ //! C bindings to Pathfinder. use gl; -use pathfinder_canvas::{CanvasFontContext, CanvasRenderingContext2D, Path2D}; +use pathfinder_canvas::{CanvasFontContext, CanvasRenderingContext2D, LineJoin, Path2D}; use pathfinder_geometry::basic::vector::{Vector2F, Vector2I}; use pathfinder_geometry::basic::rect::{RectF, RectI}; use pathfinder_geometry::color::ColorF; @@ -27,14 +27,20 @@ use pathfinder_renderer::scene::Scene; use pathfinder_simd::default::F32x4; use std::ffi::CString; use std::os::raw::{c_char, c_void}; +use std::slice; // Constants // `canvas` + pub const PF_LINE_CAP_BUTT: u8 = 0; pub const PF_LINE_CAP_SQUARE: u8 = 1; pub const PF_LINE_CAP_ROUND: u8 = 2; +pub const PF_LINE_JOIN_MITER: u8 = 0; +pub const PF_LINE_JOIN_BEVEL: u8 = 1; +pub const PF_LINE_JOIN_ROUND: u8 = 2; + // `renderer` pub const PF_RENDERER_OPTIONS_FLAGS_HAS_BACKGROUND_COLOR: u8 = 0x1; @@ -45,6 +51,7 @@ pub type PFCanvasRef = *mut CanvasRenderingContext2D; pub type PFPathRef = *mut Path2D; pub type PFCanvasFontContextRef = *mut CanvasFontContext; pub type PFLineCap = u8; +pub type PFLineJoin = u8; // `geometry` #[repr(C)] @@ -164,6 +171,32 @@ pub unsafe extern "C" fn PFCanvasSetLineCap(canvas: PFCanvasRef, new_line_cap: P }); } +#[no_mangle] +pub unsafe extern "C" fn PFCanvasSetLineJoin(canvas: PFCanvasRef, new_line_join: PFLineJoin) { + (*canvas).set_line_join(match new_line_join { + PF_LINE_JOIN_BEVEL => LineJoin::Bevel, + PF_LINE_JOIN_ROUND => LineJoin::Round, + _ => LineJoin::Miter, + }); +} + +#[no_mangle] +pub unsafe extern "C" fn PFCanvasSetMiterLimit(canvas: PFCanvasRef, new_miter_limit: f32) { + (*canvas).set_miter_limit(new_miter_limit); +} + +#[no_mangle] +pub unsafe extern "C" fn PFCanvasSetLineDash(canvas: PFCanvasRef, + new_line_dashes: *const f32, + new_line_dash_count: usize) { + (*canvas).set_line_dash(slice::from_raw_parts(new_line_dashes, new_line_dash_count).to_vec()) +} + +#[no_mangle] +pub unsafe extern "C" fn PFCanvasSetLineDashOffset(canvas: PFCanvasRef, new_offset: f32) { + (*canvas).set_line_dash_offset(new_offset) +} + /// Consumes the path. #[no_mangle] pub unsafe extern "C" fn PFCanvasFillPath(canvas: PFCanvasRef, path: PFPathRef) {