Blame


1 c66b5250 2006-06-25 devnull #include <u.h>
2 c66b5250 2006-06-25 devnull #include "x11-inc.h"
3 c66b5250 2006-06-25 devnull #include <libc.h>
4 c66b5250 2006-06-25 devnull #include <draw.h>
5 c66b5250 2006-06-25 devnull #include <memdraw.h>
6 c66b5250 2006-06-25 devnull #include "x11-memdraw.h"
7 c66b5250 2006-06-25 devnull
8 a7415518 2007-02-22 devnull AUTOLIB(X11);
9 a7415518 2007-02-22 devnull
10 c66b5250 2006-06-25 devnull /*
11 c66b5250 2006-06-25 devnull * Allocate a Memimage with an optional pixmap backing on the X server.
12 c66b5250 2006-06-25 devnull */
13 c66b5250 2006-06-25 devnull Memimage*
14 c66b5250 2006-06-25 devnull _xallocmemimage(Rectangle r, u32int chan, int pixmap)
15 c66b5250 2006-06-25 devnull {
16 c66b5250 2006-06-25 devnull int d, offset;
17 c66b5250 2006-06-25 devnull Memimage *m;
18 c66b5250 2006-06-25 devnull Xmem *xm;
19 c66b5250 2006-06-25 devnull XImage *xi;
20 c66b5250 2006-06-25 devnull
21 c66b5250 2006-06-25 devnull m = _allocmemimage(r, chan);
22 c66b5250 2006-06-25 devnull if(chan != GREY1 && chan != _x.chan)
23 c66b5250 2006-06-25 devnull return m;
24 c66b5250 2006-06-25 devnull if(_x.display == 0)
25 c66b5250 2006-06-25 devnull return m;
26 c66b5250 2006-06-25 devnull
27 c66b5250 2006-06-25 devnull /*
28 c66b5250 2006-06-25 devnull * For bootstrapping, don't bother storing 1x1 images
29 c66b5250 2006-06-25 devnull * on the X server. Memimageinit needs to allocate these
30 c66b5250 2006-06-25 devnull * and we memimageinit before we do the rest of the X stuff.
31 c66b5250 2006-06-25 devnull * Of course, 1x1 images on the server are useless anyway.
32 c66b5250 2006-06-25 devnull */
33 c66b5250 2006-06-25 devnull if(Dx(r)==1 && Dy(r)==1)
34 c66b5250 2006-06-25 devnull return m;
35 c66b5250 2006-06-25 devnull
36 c66b5250 2006-06-25 devnull xm = mallocz(sizeof(Xmem), 1);
37 c66b5250 2006-06-25 devnull if(xm == nil){
38 c66b5250 2006-06-25 devnull freememimage(m);
39 c66b5250 2006-06-25 devnull return nil;
40 c66b5250 2006-06-25 devnull }
41 c66b5250 2006-06-25 devnull
42 c66b5250 2006-06-25 devnull /*
43 c66b5250 2006-06-25 devnull * Allocate backing store.
44 c66b5250 2006-06-25 devnull */
45 c66b5250 2006-06-25 devnull if(chan == GREY1)
46 c66b5250 2006-06-25 devnull d = 1;
47 c66b5250 2006-06-25 devnull else
48 c66b5250 2006-06-25 devnull d = _x.depth;
49 c66b5250 2006-06-25 devnull if(pixmap != PMundef)
50 c66b5250 2006-06-25 devnull xm->pixmap = pixmap;
51 c66b5250 2006-06-25 devnull else
52 c66b5250 2006-06-25 devnull xm->pixmap = XCreatePixmap(_x.display, _x.drawable, Dx(r), Dy(r), d);
53 c66b5250 2006-06-25 devnull
54 c66b5250 2006-06-25 devnull /*
55 c66b5250 2006-06-25 devnull * We want to align pixels on word boundaries.
56 c66b5250 2006-06-25 devnull */
57 c66b5250 2006-06-25 devnull if(m->depth == 24)
58 c66b5250 2006-06-25 devnull offset = r.min.x&3;
59 c66b5250 2006-06-25 devnull else
60 c66b5250 2006-06-25 devnull offset = r.min.x&(31/m->depth);
61 c66b5250 2006-06-25 devnull r.min.x -= offset;
62 c66b5250 2006-06-25 devnull assert(wordsperline(r, m->depth) <= m->width);
63 c66b5250 2006-06-25 devnull
64 c66b5250 2006-06-25 devnull /*
65 c66b5250 2006-06-25 devnull * Wrap our data in an XImage structure.
66 c66b5250 2006-06-25 devnull */
67 c66b5250 2006-06-25 devnull xi = XCreateImage(_x.display, _x.vis, d,
68 c66b5250 2006-06-25 devnull ZPixmap, 0, (char*)m->data->bdata, Dx(r), Dy(r),
69 c66b5250 2006-06-25 devnull 32, m->width*sizeof(u32int));
70 c66b5250 2006-06-25 devnull if(xi == nil){
71 c66b5250 2006-06-25 devnull freememimage(m);
72 c66b5250 2006-06-25 devnull if(xm->pixmap != pixmap)
73 c66b5250 2006-06-25 devnull XFreePixmap(_x.display, xm->pixmap);
74 c66b5250 2006-06-25 devnull return nil;
75 c66b5250 2006-06-25 devnull }
76 c66b5250 2006-06-25 devnull
77 c66b5250 2006-06-25 devnull xm->xi = xi;
78 c66b5250 2006-06-25 devnull xm->r = r;
79 c66b5250 2006-06-25 devnull
80 c66b5250 2006-06-25 devnull /*
81 c66b5250 2006-06-25 devnull * Set the XImage parameters so that it looks exactly like
82 c66b5250 2006-06-25 devnull * a Memimage -- we're using the same data.
83 c66b5250 2006-06-25 devnull */
84 c66b5250 2006-06-25 devnull if(m->depth < 8 || m->depth == 24)
85 c66b5250 2006-06-25 devnull xi->bitmap_unit = 8;
86 c66b5250 2006-06-25 devnull else
87 c66b5250 2006-06-25 devnull xi->bitmap_unit = m->depth;
88 c66b5250 2006-06-25 devnull xi->byte_order = LSBFirst;
89 c66b5250 2006-06-25 devnull xi->bitmap_bit_order = MSBFirst;
90 c66b5250 2006-06-25 devnull xi->bitmap_pad = 32;
91 c66b5250 2006-06-25 devnull XInitImage(xi);
92 c66b5250 2006-06-25 devnull XFlush(_x.display);
93 c66b5250 2006-06-25 devnull
94 c66b5250 2006-06-25 devnull m->X = xm;
95 c66b5250 2006-06-25 devnull return m;
96 c66b5250 2006-06-25 devnull }
97 c66b5250 2006-06-25 devnull
98 c66b5250 2006-06-25 devnull Memimage*
99 c66b5250 2006-06-25 devnull allocmemimage(Rectangle r, u32int chan)
100 c66b5250 2006-06-25 devnull {
101 c66b5250 2006-06-25 devnull return _xallocmemimage(r, chan, PMundef);
102 c66b5250 2006-06-25 devnull }
103 c66b5250 2006-06-25 devnull
104 c66b5250 2006-06-25 devnull void
105 c66b5250 2006-06-25 devnull freememimage(Memimage *m)
106 c66b5250 2006-06-25 devnull {
107 c66b5250 2006-06-25 devnull Xmem *xm;
108 c66b5250 2006-06-25 devnull
109 c66b5250 2006-06-25 devnull if(m == nil)
110 c66b5250 2006-06-25 devnull return;
111 c66b5250 2006-06-25 devnull
112 c66b5250 2006-06-25 devnull xm = m->X;
113 c66b5250 2006-06-25 devnull if(xm && m->data->ref == 1){
114 c66b5250 2006-06-25 devnull if(xm->xi){
115 c66b5250 2006-06-25 devnull xm->xi->data = nil;
116 c66b5250 2006-06-25 devnull XFree(xm->xi);
117 c66b5250 2006-06-25 devnull }
118 c66b5250 2006-06-25 devnull XFreePixmap(_x.display, xm->pixmap);
119 c66b5250 2006-06-25 devnull free(xm);
120 c66b5250 2006-06-25 devnull m->X = nil;
121 c66b5250 2006-06-25 devnull }
122 c66b5250 2006-06-25 devnull _freememimage(m);
123 c66b5250 2006-06-25 devnull }
124 c66b5250 2006-06-25 devnull