diff --git a/gtkarea/draw.c b/gtkarea/draw.c index 8a516971..7a10460b 100644 --- a/gtkarea/draw.c +++ b/gtkarea/draw.c @@ -36,6 +36,12 @@ void uiDrawLineTo(uiDrawContext *c, intmax_t x, intmax_t y) cairo_line_to(c->cr, (double) x + 0.5, (double) y + 0.5); } +void uiDrawCloseFigure(uiDrawContext *c) +{ + prepPath(c); + cairo_close_path(c->cr); +} + #define R(c) (((c) >> 16) & 0xFF) #define G(c) (((c) >> 8) & 0xFF) #define B(c) ((c) & 0xFF) @@ -69,7 +75,8 @@ void uiDrawStroke(uiDrawContext *c, uiDrawStrokeParams *p) cairo_set_line_join(c->cr, CAIRO_LINE_JOIN_BEVEL); break; } - cairo_set_line_width(c->cr, p->Thickness); + // TODO comment the /2 here + cairo_set_line_width(c->cr, ((double) p->Thickness) / 2); cairo_stroke(c->cr); c->hasPath = FALSE; } diff --git a/gtkarea/main.c b/gtkarea/main.c index 3e8fd57a..6d43c190 100644 --- a/gtkarea/main.c +++ b/gtkarea/main.c @@ -22,16 +22,18 @@ static void handlerDraw(uiAreaHandler *a, uiArea *area, uiAreaDrawParams *p) sp.Cap = uiDrawLineCapFlat; sp.Join = uiDrawLineJoinMiter; sp.Thickness = 1; - sp.MiterLimit = 10; + sp.MiterLimit = uiDrawDefaultMiterLimit; uiDrawStroke(p->Context, &sp); uiDrawMoveTo(p->Context, p->ClipX, p->ClipY); uiDrawLineTo(p->Context, p->ClipX + p->ClipWidth, p->ClipY); + uiDrawLineTo(p->Context, 50, 150); + uiDrawLineTo(p->Context, 50, 50); + uiDrawCloseFigure(p->Context); sp.RGB = 0x000080; sp.Cap = uiDrawLineCapFlat; - sp.Join = uiDrawLineJoinMiter; - sp.Thickness = 1; - sp.MiterLimit = 10; + sp.Join = uiDrawLineJoinRound; + sp.Thickness = 5; uiDrawStroke(p->Context, &sp); } diff --git a/gtkarea/ui.h b/gtkarea/ui.h index c6e3c93d..e2601786 100644 --- a/gtkarea/ui.h +++ b/gtkarea/ui.h @@ -30,16 +30,14 @@ struct uiAreaDrawParams { intmax_t VScrollPos; }; -// TODO default miter limit? -// cairo - 10.0 -// GDI - ? -// Core Graphics - ? - +// TODO proper sources // TODO dotting/dashing typedef struct uiDrawStrokeParams uiDrawStrokeParams; +typedef struct uiDrawFillParams uiDrawFillParams; typedef enum uiDrawLineCap uiDrawLineCap; typedef enum uiDrawLineJoin uiDrawLineJoin; +typedef enum uiDrawFillMode uiDrawFillMode; typedef uint32_t uiRGB; @@ -55,14 +53,31 @@ enum uiDrawLineJoin { uiDrawLineJoinBevel, }; +// this is the default for botoh cairo and GDI +// Core Graphics doesn't explicitly specify a default, but NSBezierPath allows you to choose one, and this is the initial value +// so we're good to use it too! +#define uiDrawDefaultMiterLimit 10.0 + +enum uiDrawFillMode { + uiDrawFillModeWinding, + uiDrawFillModeAlternate, +}; + struct uiDrawStrokeParams { uiRGB RGB; uiDrawLineCap Cap; uiDrawLineJoin Join; intmax_t Thickness; - intmax_t MiterLimit; + // TODO float for GDI? + double MiterLimit; +}; + +struct uiDrawFillParams { + uiRGB RGB; + uiDrawFillMode FillMode; }; void uiDrawMoveTo(uiDrawContext *, intmax_t, intmax_t); void uiDrawLineTo(uiDrawContext *, intmax_t, intmax_t); +void uiDrawCloseFigure(uiDrawContext *); void uiDrawStroke(uiDrawContext *, uiDrawStrokeParams *);