|  | #include <u.h> | 
|  | #include "x11-inc.h" | 
|  | #include <libc.h> | 
|  | #include <draw.h> | 
|  | #include <memdraw.h> | 
|  | #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; y<r.max.y; y++) | 
|  | for(x=r.min.x, p=byteaddr(m, Pt(x,y)); x<r.max.x; x++, p++) | 
|  | *p = _x.toplan9[*p]; | 
|  | } | 
|  | xm->dirty = 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; y<r.max.y; y++) | 
|  | for(x=r.min.x, p=byteaddr(m, Pt(x,y)); x<r.max.x; x++, p++) | 
|  | *p = _x.tox11[*p]; | 
|  | } | 
|  |  | 
|  | XPutImage(_x.display, xm->pixmap, 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; y<r.max.y; y++) | 
|  | for(x=r.min.x, p=byteaddr(m, Pt(x,y)); x<r.max.x; x++, p++) | 
|  | *p = _x.toplan9[*p]; | 
|  | } | 
|  | } | 
|  |  | 
|  | void | 
|  | _xdirtyxdata(Memimage *m, Rectangle r) | 
|  | { | 
|  | Xmem *xm; | 
|  |  | 
|  | xm = m->X; | 
|  | if(xm == nil) | 
|  | return; | 
|  |  | 
|  | xm->dirty = 1; | 
|  | addrect(&xm->dirtyr, r); | 
|  | } | 
|  |  | 
|  |  | 
|  |  |