From 850f996d2746770ba6e12f014e00e56b6c07c123 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Mon, 7 Sep 2015 10:25:59 -0400 Subject: [PATCH] More drawing API work. --- gtkarea/draw.c | 28 ++++++++++++++++++++++++++++ gtkarea/main.c | 6 +++++- gtkarea/ui.h | 6 ++++-- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/gtkarea/draw.c b/gtkarea/draw.c index 50cd88f6..bf3448f3 100644 --- a/gtkarea/draw.c +++ b/gtkarea/draw.c @@ -23,6 +23,16 @@ void uiDrawBeginPathRGB(uiDrawContext *c, uint8_t r, uint8_t g, uint8_t b) cairo_new_path(c->cr); } +void uiDrawBeginPathRGBA(uiDrawContext *c, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + cairo_set_source_rgba(c->cr, + ((double) r) / 255, + ((double) g) / 255, + ((double) b) / 255, + ((double) a) / 255); + cairo_new_path(c->cr); +} + void uiDrawMoveTo(uiDrawContext *c, intmax_t x, intmax_t y) { cairo_move_to(c->cr, (double) x + 0.5, (double) y + 0.5); @@ -33,6 +43,11 @@ void uiDrawLineTo(uiDrawContext *c, intmax_t x, intmax_t y) cairo_line_to(c->cr, (double) x + 0.5, (double) y + 0.5); } +void uiDrawRectangle(uiDrawContext *c, intmax_t x, intmax_t y, intmax_t width, intmax_t height) +{ + cairo_rectangle(c->cr, (double) x + 0.5, (double) y + 0.5, width, height); +} + void uiDrawCloseFigure(uiDrawContext *c) { cairo_close_path(c->cr); @@ -67,3 +82,16 @@ void uiDrawStroke(uiDrawContext *c, uiDrawStrokeParams *p) cairo_set_line_width(c->cr, ((double) p->Thickness) / 2); cairo_stroke(c->cr); } + +void uiDrawFill(uiDrawContext *c, uiDrawFillMode mode) +{ + switch (mode) { + case uiDrawFillModeWinding: + cairo_set_fill_rule(c->cr, CAIRO_FILL_RULE_WINDING); + break; + case uiDrawFillModeAlternate: + cairo_set_fill_rule(c->cr, CAIRO_FILL_RULE_EVEN_ODD); + break; + } + cairo_fill(c->cr); +} diff --git a/gtkarea/main.c b/gtkarea/main.c index 0940c918..052ffab7 100644 --- a/gtkarea/main.c +++ b/gtkarea/main.c @@ -25,7 +25,7 @@ static void handlerDraw(uiAreaHandler *a, uiArea *area, uiAreaDrawParams *p) sp.MiterLimit = uiDrawDefaultMiterLimit; uiDrawStroke(p->Context, &sp); - uiDrawBeginPathRGB(p->Context, 0x00, 0x00, 0x80); + uiDrawBeginPathRGB(p->Context, 0x00, 0x00, 0xC0); uiDrawMoveTo(p->Context, p->ClipX, p->ClipY); uiDrawLineTo(p->Context, p->ClipX + p->ClipWidth, p->ClipY); uiDrawLineTo(p->Context, 50, 150); @@ -36,6 +36,10 @@ static void handlerDraw(uiAreaHandler *a, uiArea *area, uiAreaDrawParams *p) sp.Thickness = 5; uiDrawStroke(p->Context, &sp); + uiDrawBeginPathRGBA(p->Context, 0x00, 0xC0, 0x00, 0x80); + uiDrawRectangle(p->Context, 120, 80, 50, 50); + uiDrawFill(p->Context, uiDrawFillModeWinding); + uiDrawBeginPathRGB(p->Context, 0x00, 0x80, 0x00); uiDrawMoveTo(p->Context, 5, 10); uiDrawLineTo(p->Context, 5, 50); diff --git a/gtkarea/ui.h b/gtkarea/ui.h index 14c261d2..a9d785e8 100644 --- a/gtkarea/ui.h +++ b/gtkarea/ui.h @@ -60,6 +60,7 @@ enum uiDrawLineJoin { // - os x: FillPath/EOFillPath functions enum uiDrawFillMode { uiDrawFillModeWinding, + // TODO rename to EvenOdd? uiDrawFillModeAlternate, }; @@ -72,14 +73,15 @@ struct uiDrawStrokeParams { }; void uiDrawBeginPathRGB(uiDrawContext *, uint8_t, uint8_t, uint8_t); -//TODO void uiDrawBeginPathRGBA(uiDrawContext *, uint8_t, uint8_t, uint8_t, uint8_t); +void uiDrawBeginPathRGBA(uiDrawContext *, uint8_t, uint8_t, uint8_t, uint8_t); void uiDrawMoveTo(uiDrawContext *, intmax_t, intmax_t); void uiDrawLineTo(uiDrawContext *, intmax_t, intmax_t); +void uiDrawRectangle(uiDrawContext *, intmax_t, intmax_t, intmax_t, intmax_t); void uiDrawCloseFigure(uiDrawContext *); void uiDrawStroke(uiDrawContext *, uiDrawStrokeParams *); -//TODO void uiDrawFill(uiDrawContext *, uiDrawFillMode); +void uiDrawFill(uiDrawContext *, uiDrawFillMode); // path functions // cairo gdi core graphics