From eeaf51ce729b8091c5048987babd2591ba83c005 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Thu, 30 May 2019 21:28:52 -0700 Subject: [PATCH] Expose line cap features to C --- c/include/pathfinder/pathfinder.h | 8 ++++++++ c/src/lib.rs | 15 +++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/c/include/pathfinder/pathfinder.h b/c/include/pathfinder/pathfinder.h index a879a05f..b047b87a 100644 --- a/c/include/pathfinder/pathfinder.h +++ b/c/include/pathfinder/pathfinder.h @@ -19,6 +19,12 @@ extern "C" { // Macros +// `canvas` + +#define PF_LINE_CAP_BUTT 0 +#define PF_LINE_CAP_SQUARE 1 +#define PF_LINE_CAP_ROUND 2 + // `gl` #define PF_GL_VERSION_GL3 0 @@ -41,6 +47,7 @@ struct PFPath; typedef struct PFPath *PFPathRef; struct PFCanvasFontContext; typedef struct PFCanvasFontContext *PFCanvasFontContextRef; +typedef uint8_t PFLineCap; // `geometry` @@ -113,6 +120,7 @@ PFSceneRef PFCanvasCreateScene(PFCanvasRef canvas); 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 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 5cfeedc1..4cd7ff68 100644 --- a/c/src/lib.rs +++ b/c/src/lib.rs @@ -15,6 +15,7 @@ use pathfinder_canvas::{CanvasFontContext, CanvasRenderingContext2D, Path2D}; use pathfinder_geometry::basic::point::{Point2DF, Point2DI}; use pathfinder_geometry::basic::rect::{RectF, RectI}; use pathfinder_geometry::color::ColorF; +use pathfinder_geometry::stroke::LineCap; use pathfinder_gl::{GLDevice, GLVersion}; use pathfinder_gpu::resources::{FilesystemResourceLoader, ResourceLoader}; use pathfinder_gpu::{ClearParams, Device}; @@ -29,6 +30,10 @@ use std::os::raw::{c_char, c_void}; // Constants +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_CLEAR_FLAGS_HAS_COLOR: u8 = 0x1; pub const PF_CLEAR_FLAGS_HAS_DEPTH: u8 = 0x2; pub const PF_CLEAR_FLAGS_HAS_STENCIL: u8 = 0x4; @@ -40,6 +45,7 @@ pub const PF_CLEAR_FLAGS_HAS_RECT: u8 = 0x8; pub type PFCanvasRef = *mut CanvasRenderingContext2D; pub type PFPathRef = *mut Path2D; pub type PFCanvasFontContextRef = *mut CanvasFontContext; +pub type PFLineCap = u8; // `geometry` #[repr(C)] @@ -146,6 +152,15 @@ pub unsafe extern "C" fn PFCanvasSetLineWidth(canvas: PFCanvasRef, new_line_widt (*canvas).set_line_width(new_line_width) } +#[no_mangle] +pub unsafe extern "C" fn PFCanvasSetLineCap(canvas: PFCanvasRef, new_line_cap: PFLineCap) { + (*canvas).set_line_cap(match new_line_cap { + PF_LINE_CAP_SQUARE => LineCap::Square, + PF_LINE_CAP_ROUND => LineCap::Round, + _ => LineCap::Butt, + }); +} + /// Consumes the path. #[no_mangle] pub unsafe extern "C" fn PFCanvasFillPath(canvas: PFCanvasRef, path: PFPathRef) {