| #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)); |
| } |
| |
| |