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