diff options
Diffstat (limited to 'src/cmd/devdraw/x11-fill.c')
-rw-r--r-- | src/cmd/devdraw/x11-fill.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/cmd/devdraw/x11-fill.c b/src/cmd/devdraw/x11-fill.c new file mode 100644 index 00000000..fc43a684 --- /dev/null +++ b/src/cmd/devdraw/x11-fill.c @@ -0,0 +1,56 @@ +#include <u.h> +#include "x11-inc.h" +#include <libc.h> +#include <draw.h> +#include <memdraw.h> +#include "x11-memdraw.h" + +void +memfillcolor(Memimage *m, u32int val) +{ + _memfillcolor(m, val); + if(m->X == nil) + return; + if((val & 0xFF) == 0xFF) /* full alpha */ + _xfillcolor(m, m->r, _rgbatoimg(m, val)); + else + _xputxdata(m, m->r); +} + +void +_xfillcolor(Memimage *m, Rectangle r, u32int v) +{ + Point p; + Xmem *xm; + XGC gc; + + xm = m->X; + assert(xm != nil); + + /* + * Set up fill context appropriately. + */ + if(m->chan == GREY1){ + gc = _x.gcfill0; + if(_x.gcfill0color != v){ + XSetForeground(_x.display, gc, v); + _x.gcfill0color = v; + } + }else{ + if(m->chan == CMAP8 && _x.usetable) + v = _x.tox11[v]; + gc = _x.gcfill; + if(_x.gcfillcolor != v){ + XSetForeground(_x.display, gc, v); + _x.gcfillcolor = v; + } + } + + /* + * XFillRectangle takes coordinates relative to image rectangle. + */ + p = subpt(r.min, m->r.min); + XFillRectangle(_x.display, xm->pixmap, gc, p.x, p.y, Dx(r), Dy(r)); +} + + |