Blob


1 #include "x11-inc.h"
3 #include <u.h>
4 #include <libc.h>
5 #include <draw.h>
6 #include <memdraw.h>
7 #include "x11-memdraw.h"
9 static void
10 addrect(Rectangle *rp, Rectangle r)
11 {
12 if(rp->min.x >= rp->max.x)
13 *rp = r;
14 else
15 combinerect(rp, r);
16 }
18 XImage*
19 xgetxdata(Memimage *m, Rectangle r)
20 {
21 int x, y;
22 uchar *p;
23 Point tp, xdelta, delta;
24 Xmem *xm;
26 xm = m->X;
27 if(xm == nil)
28 return nil;
30 if(xm->dirty == 0)
31 return xm->xi;
33 abort(); /* should never call this now */
35 r = xm->dirtyr;
36 if(Dx(r)==0 || Dy(r)==0)
37 return xm->xi;
39 delta = subpt(r.min, m->r.min);
41 tp = xm->r.min; /* need temp for Digital UNIX */
42 xdelta = subpt(r.min, tp);
44 XGetSubImage(_x.display, xm->pixmap, delta.x, delta.y, Dx(r), Dy(r),
45 AllPlanes, ZPixmap, xm->xi, xdelta.x, delta.y);
47 if(_x.usetable && m->chan==CMAP8){
48 for(y=r.min.y; y<r.max.y; y++)
49 for(x=r.min.x, p=byteaddr(m, Pt(x,y)); x<r.max.x; x++, p++)
50 *p = _x.toplan9[*p];
51 }
52 xm->dirty = 0;
53 xm->dirtyr = Rect(0,0,0,0);
54 return xm->xi;
55 }
57 void
58 xputxdata(Memimage *m, Rectangle r)
59 {
60 int offset, x, y;
61 uchar *p;
62 Point tp, xdelta, delta;
63 Xmem *xm;
64 XGC gc;
65 XImage *xi;
67 xm = m->X;
68 if(xm == nil)
69 return;
71 xi = xm->xi;
72 gc = m->chan==GREY1 ? _x.gccopy0 : _x.gccopy;
73 if(m->depth == 24)
74 offset = r.min.x & 3;
75 else
76 offset = r.min.x & (31/m->depth);
78 delta = subpt(r.min, m->r.min);
80 tp = xm->r.min; /* need temporary on Digital UNIX */
81 xdelta = subpt(r.min, tp);
83 if(_x.usetable && m->chan==CMAP8){
84 for(y=r.min.y; y<r.max.y; y++)
85 for(x=r.min.x, p=byteaddr(m, Pt(x,y)); x<r.max.x; x++, p++)
86 *p = _x.tox11[*p];
87 }
89 XPutImage(_x.display, xm->pixmap, gc, xi, xdelta.x, xdelta.y, delta.x, delta.y,
90 Dx(r), Dy(r));
92 if(_x.usetable && m->chan==CMAP8){
93 for(y=r.min.y; y<r.max.y; y++)
94 for(x=r.min.x, p=byteaddr(m, Pt(x,y)); x<r.max.x; x++, p++)
95 *p = _x.toplan9[*p];
96 }
97 }
99 void
100 xdirtyxdata(Memimage *m, Rectangle r)
102 Xmem *xm;
104 xm = m->X;
105 if(xm == nil)
106 return;
108 xm->dirty = 1;
109 addrect(&xm->dirtyr, r);