Blame


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