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