diff options
Diffstat (limited to 'src/libui_sdl/libui/unix/draw.c')
-rw-r--r-- | src/libui_sdl/libui/unix/draw.c | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/src/libui_sdl/libui/unix/draw.c b/src/libui_sdl/libui/unix/draw.c new file mode 100644 index 0000000..2d7a636 --- /dev/null +++ b/src/libui_sdl/libui/unix/draw.c @@ -0,0 +1,141 @@ +// 6 september 2015 +#include "uipriv_unix.h" +#include "draw.h" + +uiDrawContext *newContext(cairo_t *cr) +{ + uiDrawContext *c; + + c = uiNew(uiDrawContext); + c->cr = cr; + return c; +} + +void freeContext(uiDrawContext *c) +{ + uiFree(c); +} + +static cairo_pattern_t *mkbrush(uiDrawBrush *b) +{ + cairo_pattern_t *pat; + size_t i; + + switch (b->Type) { + case uiDrawBrushTypeSolid: + pat = cairo_pattern_create_rgba(b->R, b->G, b->B, b->A); + break; + case uiDrawBrushTypeLinearGradient: + pat = cairo_pattern_create_linear(b->X0, b->Y0, b->X1, b->Y1); + break; + case uiDrawBrushTypeRadialGradient: + // make the start circle radius 0 to make it a point + pat = cairo_pattern_create_radial( + b->X0, b->Y0, 0, + b->X1, b->Y1, b->OuterRadius); + break; +// case uiDrawBrushTypeImage: + } + if (cairo_pattern_status(pat) != CAIRO_STATUS_SUCCESS) + implbug("error creating pattern in mkbrush(): %s", + cairo_status_to_string(cairo_pattern_status(pat))); + switch (b->Type) { + case uiDrawBrushTypeLinearGradient: + case uiDrawBrushTypeRadialGradient: + for (i = 0; i < b->NumStops; i++) + cairo_pattern_add_color_stop_rgba(pat, + b->Stops[i].Pos, + b->Stops[i].R, + b->Stops[i].G, + b->Stops[i].B, + b->Stops[i].A); + } + return pat; +} + +void uiDrawStroke(uiDrawContext *c, uiDrawPath *path, uiDrawBrush *b, uiDrawStrokeParams *p) +{ + cairo_pattern_t *pat; + + runPath(path, c->cr); + pat = mkbrush(b); + cairo_set_source(c->cr, pat); + switch (p->Cap) { + case uiDrawLineCapFlat: + cairo_set_line_cap(c->cr, CAIRO_LINE_CAP_BUTT); + break; + case uiDrawLineCapRound: + cairo_set_line_cap(c->cr, CAIRO_LINE_CAP_ROUND); + break; + case uiDrawLineCapSquare: + cairo_set_line_cap(c->cr, CAIRO_LINE_CAP_SQUARE); + break; + } + switch (p->Join) { + case uiDrawLineJoinMiter: + cairo_set_line_join(c->cr, CAIRO_LINE_JOIN_MITER); + cairo_set_miter_limit(c->cr, p->MiterLimit); + break; + case uiDrawLineJoinRound: + cairo_set_line_join(c->cr, CAIRO_LINE_JOIN_ROUND); + break; + case uiDrawLineJoinBevel: + cairo_set_line_join(c->cr, CAIRO_LINE_JOIN_BEVEL); + break; + } + cairo_set_line_width(c->cr, p->Thickness); + cairo_set_dash(c->cr, p->Dashes, p->NumDashes, p->DashPhase); + cairo_stroke(c->cr); + cairo_pattern_destroy(pat); +} + +void uiDrawFill(uiDrawContext *c, uiDrawPath *path, uiDrawBrush *b) +{ + cairo_pattern_t *pat; + + runPath(path, c->cr); + pat = mkbrush(b); + cairo_set_source(c->cr, pat); + switch (pathFillMode(path)) { + 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); + cairo_pattern_destroy(pat); +} + +void uiDrawTransform(uiDrawContext *c, uiDrawMatrix *m) +{ + cairo_matrix_t cm; + + m2c(m, &cm); + cairo_transform(c->cr, &cm); +} + +void uiDrawClip(uiDrawContext *c, uiDrawPath *path) +{ + runPath(path, c->cr); + switch (pathFillMode(path)) { + 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_clip(c->cr); +} + +void uiDrawSave(uiDrawContext *c) +{ + cairo_save(c->cr); +} + +void uiDrawRestore(uiDrawContext *c) +{ + cairo_restore(c->cr); +} |