Expose more stroke features in the C API

This commit is contained in:
Patrick Walton 2019-06-20 13:01:54 -07:00
parent 71623eaab3
commit d2fbb23031
2 changed files with 45 additions and 1 deletions

View File

@ -25,6 +25,10 @@ extern "C" {
#define PF_LINE_CAP_SQUARE 1 #define PF_LINE_CAP_SQUARE 1
#define PF_LINE_CAP_ROUND 2 #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` // `gl`
#define PF_GL_VERSION_GL3 0 #define PF_GL_VERSION_GL3 0
@ -45,6 +49,7 @@ typedef struct PFPath *PFPathRef;
struct PFCanvasFontContext; struct PFCanvasFontContext;
typedef struct PFCanvasFontContext *PFCanvasFontContextRef; typedef struct PFCanvasFontContext *PFCanvasFontContextRef;
typedef uint8_t PFLineCap; typedef uint8_t PFLineCap;
typedef uint8_t PFLineJoin;
// `geometry` // `geometry`
@ -116,6 +121,12 @@ void PFCanvasFillRect(PFCanvasRef canvas, const PFRectF *rect);
void PFCanvasStrokeRect(PFCanvasRef canvas, const PFRectF *rect); void PFCanvasStrokeRect(PFCanvasRef canvas, const PFRectF *rect);
void PFCanvasSetLineWidth(PFCanvasRef canvas, float new_line_width); void PFCanvasSetLineWidth(PFCanvasRef canvas, float new_line_width);
void PFCanvasSetLineCap(PFCanvasRef canvas, PFLineCap new_line_cap); 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 PFCanvasFillPath(PFCanvasRef canvas, PFPathRef path);
void PFCanvasStrokePath(PFCanvasRef canvas, PFPathRef path); void PFCanvasStrokePath(PFCanvasRef canvas, PFPathRef path);
PFPathRef PFPathCreate(); PFPathRef PFPathCreate();

View File

@ -11,7 +11,7 @@
//! C bindings to Pathfinder. //! C bindings to Pathfinder.
use gl; 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::vector::{Vector2F, Vector2I};
use pathfinder_geometry::basic::rect::{RectF, RectI}; use pathfinder_geometry::basic::rect::{RectF, RectI};
use pathfinder_geometry::color::ColorF; use pathfinder_geometry::color::ColorF;
@ -27,14 +27,20 @@ use pathfinder_renderer::scene::Scene;
use pathfinder_simd::default::F32x4; use pathfinder_simd::default::F32x4;
use std::ffi::CString; use std::ffi::CString;
use std::os::raw::{c_char, c_void}; use std::os::raw::{c_char, c_void};
use std::slice;
// Constants // Constants
// `canvas` // `canvas`
pub const PF_LINE_CAP_BUTT: u8 = 0; pub const PF_LINE_CAP_BUTT: u8 = 0;
pub const PF_LINE_CAP_SQUARE: u8 = 1; pub const PF_LINE_CAP_SQUARE: u8 = 1;
pub const PF_LINE_CAP_ROUND: u8 = 2; 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` // `renderer`
pub const PF_RENDERER_OPTIONS_FLAGS_HAS_BACKGROUND_COLOR: u8 = 0x1; 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 PFPathRef = *mut Path2D;
pub type PFCanvasFontContextRef = *mut CanvasFontContext; pub type PFCanvasFontContextRef = *mut CanvasFontContext;
pub type PFLineCap = u8; pub type PFLineCap = u8;
pub type PFLineJoin = u8;
// `geometry` // `geometry`
#[repr(C)] #[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. /// Consumes the path.
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn PFCanvasFillPath(canvas: PFCanvasRef, path: PFPathRef) { pub unsafe extern "C" fn PFCanvasFillPath(canvas: PFCanvasRef, path: PFPathRef) {