#include #include "x11-inc.h" #include #include #include #include "x11-memdraw.h" static void addrect(Rectangle *rp, Rectangle r) { if(rp->min.x >= rp->max.x) *rp = r; else combinerect(rp, r); } XImage* _xgetxdata(Memimage *m, Rectangle r) { int x, y; uchar *p; Point tp, xdelta, delta; Xmem *xm; xm = m->X; if(xm == nil) return nil; if(xm->dirty == 0) return xm->xi; abort(); /* should never call this now */ r = xm->dirtyr; if(Dx(r)==0 || Dy(r)==0) return xm->xi; delta = subpt(r.min, m->r.min); tp = xm->r.min; /* need temp for Digital UNIX */ xdelta = subpt(r.min, tp); XGetSubImage(_x.display, xm->pixmap, delta.x, delta.y, Dx(r), Dy(r), AllPlanes, ZPixmap, xm->xi, xdelta.x, delta.y); if(_x.usetable && m->chan==CMAP8){ for(y=r.min.y; ydirty = 0; xm->dirtyr = Rect(0,0,0,0); return xm->xi; } void _xputxdata(Memimage *m, Rectangle r) { int x, y; uchar *p; Point tp, xdelta, delta; Xmem *xm; XGC gc; XImage *xi; xm = m->X; if(xm == nil) return; xi = xm->xi; gc = m->chan==GREY1 ? _x.gccopy0 : _x.gccopy; delta = subpt(r.min, m->r.min); tp = xm->r.min; /* need temporary on Digital UNIX */ xdelta = subpt(r.min, tp); if(_x.usetable && m->chan==CMAP8){ for(y=r.min.y; ypixmap, gc, xi, xdelta.x, xdelta.y, delta.x, delta.y, Dx(r), Dy(r)); if(_x.usetable && m->chan==CMAP8){ for(y=r.min.y; yX; if(xm == nil) return; xm->dirty = 1; addrect(&xm->dirtyr, r); }