aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/devdraw/x11-get.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2006-06-25 19:18:39 +0000
committerrsc <devnull@localhost>2006-06-25 19:18:39 +0000
commitc66b52501b630f6c0cdee1ed6cf81ad153e1183f (patch)
treeec935772fd77c3aa2337598c25a6c71ba84a9275 /src/cmd/devdraw/x11-get.c
parentf97f53744067400bec4dbd7aae5eafde54e99b7f (diff)
downloadplan9port-c66b52501b630f6c0cdee1ed6cf81ad153e1183f.tar.gz
plan9port-c66b52501b630f6c0cdee1ed6cf81ad153e1183f.tar.bz2
plan9port-c66b52501b630f6c0cdee1ed6cf81ad153e1183f.zip
new draw server
Diffstat (limited to 'src/cmd/devdraw/x11-get.c')
-rw-r--r--src/cmd/devdraw/x11-get.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/src/cmd/devdraw/x11-get.c b/src/cmd/devdraw/x11-get.c
new file mode 100644
index 00000000..395f4555
--- /dev/null
+++ b/src/cmd/devdraw/x11-get.c
@@ -0,0 +1,112 @@
+#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 offset, 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;
+ if(m->depth == 24)
+ offset = r.min.x & 3;
+ else
+ offset = r.min.x & (31/m->depth);
+
+ 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);
+}
+
+
+