Set up a new way to specify the color used to perform a stroke or fill. GDI restrictions necessitate this.
This commit is contained in:
parent
bf4f5388d0
commit
2dc3dba97b
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
struct uiDrawContext {
|
struct uiDrawContext {
|
||||||
cairo_t *cr;
|
cairo_t *cr;
|
||||||
gboolean hasPath;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
uiDrawContext *newContext(cairo_t *cr)
|
uiDrawContext *newContext(cairo_t *cr)
|
||||||
|
@ -12,46 +11,35 @@ uiDrawContext *newContext(cairo_t *cr)
|
||||||
|
|
||||||
c = (uiDrawContext *) g_malloc0(sizeof (uiDrawContext));
|
c = (uiDrawContext *) g_malloc0(sizeof (uiDrawContext));
|
||||||
c->cr = cr;
|
c->cr = cr;
|
||||||
c->hasPath = FALSE;
|
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void prepPath(uiDrawContext *c)
|
void uiDrawBeginPathRGB(uiDrawContext *c, uint8_t r, uint8_t g, uint8_t b)
|
||||||
{
|
{
|
||||||
if (c->hasPath)
|
cairo_set_source_rgb(c->cr,
|
||||||
return;
|
((double) r) / 255,
|
||||||
|
((double) g) / 255,
|
||||||
|
((double) b) / 255);
|
||||||
cairo_new_path(c->cr);
|
cairo_new_path(c->cr);
|
||||||
c->hasPath = TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void uiDrawMoveTo(uiDrawContext *c, intmax_t x, intmax_t y)
|
void uiDrawMoveTo(uiDrawContext *c, intmax_t x, intmax_t y)
|
||||||
{
|
{
|
||||||
prepPath(c);
|
|
||||||
cairo_move_to(c->cr, (double) x + 0.5, (double) y + 0.5);
|
cairo_move_to(c->cr, (double) x + 0.5, (double) y + 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
void uiDrawLineTo(uiDrawContext *c, intmax_t x, intmax_t y)
|
void uiDrawLineTo(uiDrawContext *c, intmax_t x, intmax_t y)
|
||||||
{
|
{
|
||||||
prepPath(c);
|
|
||||||
cairo_line_to(c->cr, (double) x + 0.5, (double) y + 0.5);
|
cairo_line_to(c->cr, (double) x + 0.5, (double) y + 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
void uiDrawCloseFigure(uiDrawContext *c)
|
void uiDrawCloseFigure(uiDrawContext *c)
|
||||||
{
|
{
|
||||||
prepPath(c);
|
|
||||||
cairo_close_path(c->cr);
|
cairo_close_path(c->cr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define R(c) (((c) >> 16) & 0xFF)
|
|
||||||
#define G(c) (((c) >> 8) & 0xFF)
|
|
||||||
#define B(c) ((c) & 0xFF)
|
|
||||||
|
|
||||||
void uiDrawStroke(uiDrawContext *c, uiDrawStrokeParams *p)
|
void uiDrawStroke(uiDrawContext *c, uiDrawStrokeParams *p)
|
||||||
{
|
{
|
||||||
cairo_set_source_rgb(c->cr,
|
|
||||||
((double) R(p->RGB)) / 255,
|
|
||||||
((double) G(p->RGB)) / 255,
|
|
||||||
((double) B(p->RGB)) / 255);
|
|
||||||
switch (p->Cap) {
|
switch (p->Cap) {
|
||||||
case uiDrawLineCapFlat:
|
case uiDrawLineCapFlat:
|
||||||
cairo_set_line_cap(c->cr, CAIRO_LINE_CAP_BUTT);
|
cairo_set_line_cap(c->cr, CAIRO_LINE_CAP_BUTT);
|
||||||
|
@ -78,5 +66,4 @@ void uiDrawStroke(uiDrawContext *c, uiDrawStrokeParams *p)
|
||||||
// TODO comment the /2 here
|
// TODO comment the /2 here
|
||||||
cairo_set_line_width(c->cr, ((double) p->Thickness) / 2);
|
cairo_set_line_width(c->cr, ((double) p->Thickness) / 2);
|
||||||
cairo_stroke(c->cr);
|
cairo_stroke(c->cr);
|
||||||
c->hasPath = FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,25 +16,34 @@ static void handlerDraw(uiAreaHandler *a, uiArea *area, uiAreaDrawParams *p)
|
||||||
{
|
{
|
||||||
uiDrawStrokeParams sp;
|
uiDrawStrokeParams sp;
|
||||||
|
|
||||||
|
uiDrawBeginPathRGB(p->Context, 0xFF, 0x00, 0x00);
|
||||||
uiDrawMoveTo(p->Context, p->ClipX + 5, p->ClipY + 5);
|
uiDrawMoveTo(p->Context, p->ClipX + 5, p->ClipY + 5);
|
||||||
uiDrawLineTo(p->Context, (p->ClipX + p->ClipWidth) - 5, (p->ClipY + p->ClipHeight) - 5);
|
uiDrawLineTo(p->Context, (p->ClipX + p->ClipWidth) - 5, (p->ClipY + p->ClipHeight) - 5);
|
||||||
sp.RGB = 0xFF0000;
|
|
||||||
sp.Cap = uiDrawLineCapFlat;
|
sp.Cap = uiDrawLineCapFlat;
|
||||||
sp.Join = uiDrawLineJoinMiter;
|
sp.Join = uiDrawLineJoinMiter;
|
||||||
sp.Thickness = 1;
|
sp.Thickness = 1;
|
||||||
sp.MiterLimit = uiDrawDefaultMiterLimit;
|
sp.MiterLimit = uiDrawDefaultMiterLimit;
|
||||||
uiDrawStroke(p->Context, &sp);
|
uiDrawStroke(p->Context, &sp);
|
||||||
|
|
||||||
|
uiDrawBeginPathRGB(p->Context, 0x00, 0x00, 0x80);
|
||||||
uiDrawMoveTo(p->Context, p->ClipX, p->ClipY);
|
uiDrawMoveTo(p->Context, p->ClipX, p->ClipY);
|
||||||
uiDrawLineTo(p->Context, p->ClipX + p->ClipWidth, p->ClipY);
|
uiDrawLineTo(p->Context, p->ClipX + p->ClipWidth, p->ClipY);
|
||||||
uiDrawLineTo(p->Context, 50, 150);
|
uiDrawLineTo(p->Context, 50, 150);
|
||||||
uiDrawLineTo(p->Context, 50, 50);
|
uiDrawLineTo(p->Context, 50, 50);
|
||||||
uiDrawCloseFigure(p->Context);
|
uiDrawCloseFigure(p->Context);
|
||||||
sp.RGB = 0x000080;
|
|
||||||
sp.Cap = uiDrawLineCapFlat;
|
sp.Cap = uiDrawLineCapFlat;
|
||||||
sp.Join = uiDrawLineJoinRound;
|
sp.Join = uiDrawLineJoinRound;
|
||||||
sp.Thickness = 5;
|
sp.Thickness = 5;
|
||||||
uiDrawStroke(p->Context, &sp);
|
uiDrawStroke(p->Context, &sp);
|
||||||
|
|
||||||
|
uiDrawBeginPathRGB(p->Context, 0x00, 0x80, 0x00);
|
||||||
|
uiDrawMoveTo(p->Context, 5, 10);
|
||||||
|
uiDrawLineTo(p->Context, 5, 50);
|
||||||
|
sp.Cap = uiDrawLineCapFlat;
|
||||||
|
sp.Join = uiDrawLineJoinMiter;
|
||||||
|
sp.Thickness = 1;
|
||||||
|
sp.MiterLimit = uiDrawDefaultMiterLimit;
|
||||||
|
uiDrawStroke(p->Context, &sp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uintmax_t handlerHScrollMax(uiAreaHandler *a, uiArea *area)
|
static uintmax_t handlerHScrollMax(uiAreaHandler *a, uiArea *area)
|
||||||
|
|
12
gtkarea/ui.h
12
gtkarea/ui.h
|
@ -34,13 +34,10 @@ struct uiAreaDrawParams {
|
||||||
// TODO dotting/dashing
|
// TODO dotting/dashing
|
||||||
|
|
||||||
typedef struct uiDrawStrokeParams uiDrawStrokeParams;
|
typedef struct uiDrawStrokeParams uiDrawStrokeParams;
|
||||||
typedef struct uiDrawFillParams uiDrawFillParams;
|
|
||||||
typedef enum uiDrawLineCap uiDrawLineCap;
|
typedef enum uiDrawLineCap uiDrawLineCap;
|
||||||
typedef enum uiDrawLineJoin uiDrawLineJoin;
|
typedef enum uiDrawLineJoin uiDrawLineJoin;
|
||||||
typedef enum uiDrawFillMode uiDrawFillMode;
|
typedef enum uiDrawFillMode uiDrawFillMode;
|
||||||
|
|
||||||
typedef uint32_t uiRGB;
|
|
||||||
|
|
||||||
enum uiDrawLineCap {
|
enum uiDrawLineCap {
|
||||||
uiDrawLineCapFlat,
|
uiDrawLineCapFlat,
|
||||||
uiDrawLineCapRound,
|
uiDrawLineCapRound,
|
||||||
|
@ -67,7 +64,6 @@ enum uiDrawFillMode {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct uiDrawStrokeParams {
|
struct uiDrawStrokeParams {
|
||||||
uiRGB RGB;
|
|
||||||
uiDrawLineCap Cap;
|
uiDrawLineCap Cap;
|
||||||
uiDrawLineJoin Join;
|
uiDrawLineJoin Join;
|
||||||
intmax_t Thickness;
|
intmax_t Thickness;
|
||||||
|
@ -75,15 +71,15 @@ struct uiDrawStrokeParams {
|
||||||
double MiterLimit;
|
double MiterLimit;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct uiDrawFillParams {
|
void uiDrawBeginPathRGB(uiDrawContext *, uint8_t, uint8_t, uint8_t);
|
||||||
uiRGB RGB;
|
//TODO void uiDrawBeginPathRGBA(uiDrawContext *, uint8_t, uint8_t, uint8_t, uint8_t);
|
||||||
uiDrawFillMode FillMode;
|
|
||||||
};
|
|
||||||
|
|
||||||
void uiDrawMoveTo(uiDrawContext *, intmax_t, intmax_t);
|
void uiDrawMoveTo(uiDrawContext *, intmax_t, intmax_t);
|
||||||
void uiDrawLineTo(uiDrawContext *, intmax_t, intmax_t);
|
void uiDrawLineTo(uiDrawContext *, intmax_t, intmax_t);
|
||||||
void uiDrawCloseFigure(uiDrawContext *);
|
void uiDrawCloseFigure(uiDrawContext *);
|
||||||
|
|
||||||
void uiDrawStroke(uiDrawContext *, uiDrawStrokeParams *);
|
void uiDrawStroke(uiDrawContext *, uiDrawStrokeParams *);
|
||||||
|
//TODO void uiDrawFill(uiDrawContext *, uiDrawFillMode);
|
||||||
|
|
||||||
// path functions
|
// path functions
|
||||||
// cairo gdi core graphics
|
// cairo gdi core graphics
|
||||||
|
|
Loading…
Reference in New Issue