From c207b78d079803605d8aec2fe63a059fc4bdb2c6 Mon Sep 17 00:00:00 2001 From: Ori Bernstein Date: Sat, 9 Jan 2021 12:20:49 -0800 Subject: [PATCH] libdraw: add bezierpts This patch exposes the bezierpts function, providing a way to get the points on a path, similar how bezsplinepts gives them for b splines. --- sys/include/draw.h | 1 + sys/man/2/draw | 12 ++++++++++++ sys/src/libdraw/bezier.c | 17 ++++++++++++++--- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/sys/include/draw.h b/sys/include/draw.h index 2200b0243..36a672bb4 100644 --- a/sys/include/draw.h +++ b/sys/include/draw.h @@ -436,6 +436,7 @@ extern Point _string(Image*, Point, Image*, Point, Font*, char*, Rune*, int, Rec extern Point stringsubfont(Image*, Point, Image*, Subfont*, char*); extern int bezier(Image*, Point, Point, Point, Point, int, int, int, Image*, Point); extern int bezierop(Image*, Point, Point, Point, Point, int, int, int, Image*, Point, Drawop); +extern int bezierpts(Point, Point, Point, Point, Point**); extern int bezspline(Image*, Point*, int, int, int, int, Image*, Point); extern int bezsplineop(Image*, Point*, int, int, int, int, Image*, Point, Drawop); extern int bezsplinepts(Point*, int, Point**); diff --git a/sys/man/2/draw b/sys/man/2/draw index 79e7c0ddf..878ea3c6c 100644 --- a/sys/man/2/draw +++ b/sys/man/2/draw @@ -103,6 +103,8 @@ int bezierop(Image *dst, Point p0, Point p1, Point p2, Point p3, int end0, int end1, int radius, Image *src, Point sp, Drawop op) .PB +int bezierpts(Point p0, Point p1, Point p2, Point p3, Point **pp) +.PB int bezspline(Image *dst, Point *pt, int npt, int end0, int end1, int radius, Image *src, Point sp) .PB @@ -603,6 +605,16 @@ corresponds to in .IR dst . .TP +\f5bezierpts(\f2a\fP, \f2b\fP, \f2c\fP, \f2d\fP, \f2pp\fP) +.I Bezierpts +returns in +.I pp +a list of points making up the open polygon that +.I bezier +would draw. +The caller is responsible for freeing +.IR *pp . +.TP \f5bezspline(\f2dst\fP, \f2p\fP, \f2np\fP, \f2end0\fP, \f2end1\fP, \f2thick\fP, \f2src\fP, \f2sp\fP) .I Bezspline takes the same arguments as diff --git a/sys/src/libdraw/bezier.c b/sys/src/libdraw/bezier.c index dca61bc0b..55465226c 100644 --- a/sys/src/libdraw/bezier.c +++ b/sys/src/libdraw/bezier.c @@ -98,12 +98,23 @@ bpts(Plist *l, Point p0, Point p1, Point p2, Point p3) } static void -bezierpts(Plist *l, Point p0, Point p1, Point p2, Point p3) +_bezierpts(Plist *l, Point p0, Point p1, Point p2, Point p3) { bpts(l, p0, p1, p2, p3); appendpt(l, p3); } +int +bezierpts(Point p0, Point p1, Point p2, Point p3, Point **pp) +{ + Plist l; + l.p = nil; + l.np = 0; + _bezierpts(&l, p0, p1, p2, p3); + *pp = l.p; + return l.np; +} + static void _bezsplinepts(Plist *l, Point *pt, int npt) { @@ -167,7 +178,7 @@ bezierop(Image *dst, Point p0, Point p1, Point p2, Point p3, int end0, int end1, Plist l; l.np = 0; - bezierpts(&l, p0, p1, p2, p3); + _bezierpts(&l, p0, p1, p2, p3); if(l.np == -1) return 0; if(l.np != 0){ @@ -211,7 +222,7 @@ fillbezierop(Image *dst, Point p0, Point p1, Point p2, Point p3, int w, Image *s Plist l; l.np = 0; - bezierpts(&l, p0, p1, p2, p3); + _bezierpts(&l, p0, p1, p2, p3); if(l.np == -1) return 0; if(l.np != 0){