1 76193d7c 2003-09-30 devnull #include <u.h>
2 76193d7c 2003-09-30 devnull #include <libc.h>
3 76193d7c 2003-09-30 devnull #include <draw.h>
6 76193d7c 2003-09-30 devnull allocimage(Display *d, Rectangle r, u32int chan, int repl, u32int val)
8 76193d7c 2003-09-30 devnull return _allocimage(nil, d, r, chan, repl, val, 0, 0);
12 76193d7c 2003-09-30 devnull _allocimage(Image *ai, Display *d, Rectangle r, u32int chan, int repl, u32int val, int screenid, int refresh)
14 76193d7c 2003-09-30 devnull uchar *a;
15 76193d7c 2003-09-30 devnull char *err;
16 76193d7c 2003-09-30 devnull Image *i;
17 76193d7c 2003-09-30 devnull Rectangle clipr;
19 76193d7c 2003-09-30 devnull int depth;
24 76193d7c 2003-09-30 devnull if(chan == 0){
25 76193d7c 2003-09-30 devnull werrstr("bad channel descriptor");
26 76193d7c 2003-09-30 devnull return nil;
29 76193d7c 2003-09-30 devnull depth = chantodepth(chan);
30 76193d7c 2003-09-30 devnull if(depth == 0){
31 76193d7c 2003-09-30 devnull err = "bad channel descriptor";
34 76193d7c 2003-09-30 devnull werrstr("allocimage: %s", err);
36 76193d7c 2003-09-30 devnull werrstr("allocimage: %r");
38 76193d7c 2003-09-30 devnull return 0;
41 76193d7c 2003-09-30 devnull /* flush pending data so we don't get error allocating the image */
42 76193d7c 2003-09-30 devnull flushimage(d, 0);
43 76193d7c 2003-09-30 devnull a = bufimage(d, 1+4+4+1+4+1+4*4+4*4+4);
44 76193d7c 2003-09-30 devnull if(a == 0)
45 76193d7c 2003-09-30 devnull goto Error;
46 76193d7c 2003-09-30 devnull d->imageid++;
47 76193d7c 2003-09-30 devnull id = d->imageid;
48 76193d7c 2003-09-30 devnull a[0] = 'b';
49 76193d7c 2003-09-30 devnull BPLONG(a+1, id);
50 76193d7c 2003-09-30 devnull BPLONG(a+5, screenid);
51 76193d7c 2003-09-30 devnull a[9] = refresh;
52 76193d7c 2003-09-30 devnull BPLONG(a+10, chan);
53 76193d7c 2003-09-30 devnull a[14] = repl;
54 76193d7c 2003-09-30 devnull BPLONG(a+15, r.min.x);
55 76193d7c 2003-09-30 devnull BPLONG(a+19, r.min.y);
56 76193d7c 2003-09-30 devnull BPLONG(a+23, r.max.x);
57 76193d7c 2003-09-30 devnull BPLONG(a+27, r.max.y);
59 76193d7c 2003-09-30 devnull /* huge but not infinite, so various offsets will leave it huge, not overflow */
60 76193d7c 2003-09-30 devnull clipr = Rect(-0x3FFFFFFF, -0x3FFFFFFF, 0x3FFFFFFF, 0x3FFFFFFF);
62 76193d7c 2003-09-30 devnull clipr = r;
63 76193d7c 2003-09-30 devnull BPLONG(a+31, clipr.min.x);
64 76193d7c 2003-09-30 devnull BPLONG(a+35, clipr.min.y);
65 76193d7c 2003-09-30 devnull BPLONG(a+39, clipr.max.x);
66 76193d7c 2003-09-30 devnull BPLONG(a+43, clipr.max.y);
67 76193d7c 2003-09-30 devnull BPLONG(a+47, val);
68 76193d7c 2003-09-30 devnull if(flushimage(d, 0) < 0)
69 76193d7c 2003-09-30 devnull goto Error;
74 76193d7c 2003-09-30 devnull i = malloc(sizeof(Image));
75 76193d7c 2003-09-30 devnull if(i == nil){
76 76193d7c 2003-09-30 devnull a = bufimage(d, 1+4);
78 76193d7c 2003-09-30 devnull a[0] = 'f';
79 76193d7c 2003-09-30 devnull BPLONG(a+1, id);
80 76193d7c 2003-09-30 devnull flushimage(d, 0);
82 76193d7c 2003-09-30 devnull goto Error;
85 76193d7c 2003-09-30 devnull i->display = d;
86 76193d7c 2003-09-30 devnull i->id = id;
87 76193d7c 2003-09-30 devnull i->depth = depth;
88 76193d7c 2003-09-30 devnull i->chan = chan;
89 76193d7c 2003-09-30 devnull i->r = r;
90 76193d7c 2003-09-30 devnull i->clipr = clipr;
91 76193d7c 2003-09-30 devnull i->repl = repl;
92 76193d7c 2003-09-30 devnull i->screen = 0;
93 76193d7c 2003-09-30 devnull i->next = 0;
94 76193d7c 2003-09-30 devnull return i;
98 76193d7c 2003-09-30 devnull namedimage(Display *d, char *name)
100 76193d7c 2003-09-30 devnull uchar *a;
101 76193d7c 2003-09-30 devnull char *err, buf[12*12+1];
102 76193d7c 2003-09-30 devnull Image *i;
103 76193d7c 2003-09-30 devnull int id, n;
104 76193d7c 2003-09-30 devnull u32int chan;
106 76193d7c 2003-09-30 devnull err = 0;
109 76193d7c 2003-09-30 devnull n = strlen(name);
110 76193d7c 2003-09-30 devnull if(n >= 256){
111 76193d7c 2003-09-30 devnull err = "name too long";
114 76193d7c 2003-09-30 devnull werrstr("namedimage: %s", err);
116 76193d7c 2003-09-30 devnull werrstr("namedimage: %r");
118 76193d7c 2003-09-30 devnull free(i);
119 76193d7c 2003-09-30 devnull return 0;
121 76193d7c 2003-09-30 devnull /* flush pending data so we don't get error allocating the image */
122 76193d7c 2003-09-30 devnull flushimage(d, 0);
123 76193d7c 2003-09-30 devnull a = bufimage(d, 1+4+1+n+1);
124 76193d7c 2003-09-30 devnull if(a == 0)
125 76193d7c 2003-09-30 devnull goto Error;
126 76193d7c 2003-09-30 devnull d->imageid++;
127 76193d7c 2003-09-30 devnull id = d->imageid;
128 76193d7c 2003-09-30 devnull a[0] = 'n';
129 76193d7c 2003-09-30 devnull BPLONG(a+1, id);
130 76193d7c 2003-09-30 devnull a[5] = n;
131 76193d7c 2003-09-30 devnull memmove(a+6, name, n);
132 76193d7c 2003-09-30 devnull a[6+n] = 'I';
133 76193d7c 2003-09-30 devnull if(flushimage(d, 0) < 0)
134 76193d7c 2003-09-30 devnull goto Error;
135 76193d7c 2003-09-30 devnull if(_drawmsgread(d, buf, sizeof buf) < 12*12)
136 76193d7c 2003-09-30 devnull goto Error;
137 76193d7c 2003-09-30 devnull buf[12*12] = '\0';
139 76193d7c 2003-09-30 devnull i = malloc(sizeof(Image));
140 76193d7c 2003-09-30 devnull if(i == nil){
142 76193d7c 2003-09-30 devnull a = bufimage(d, 1+4);
144 76193d7c 2003-09-30 devnull a[0] = 'f';
145 76193d7c 2003-09-30 devnull BPLONG(a+1, id);
146 76193d7c 2003-09-30 devnull flushimage(d, 0);
148 76193d7c 2003-09-30 devnull goto Error;
150 76193d7c 2003-09-30 devnull i->display = d;
151 76193d7c 2003-09-30 devnull i->id = id;
152 76193d7c 2003-09-30 devnull if((chan=strtochan(buf+2*12))==0){
153 76193d7c 2003-09-30 devnull werrstr("bad channel '%.12s' from devdraw", buf+2*12);
154 76193d7c 2003-09-30 devnull goto Error1;
156 76193d7c 2003-09-30 devnull i->chan = chan;
157 76193d7c 2003-09-30 devnull i->depth = chantodepth(chan);
158 76193d7c 2003-09-30 devnull i->repl = atoi(buf+3*12);
159 76193d7c 2003-09-30 devnull i->r.min.x = atoi(buf+4*12);
160 76193d7c 2003-09-30 devnull i->r.min.y = atoi(buf+5*12);
161 76193d7c 2003-09-30 devnull i->r.max.x = atoi(buf+6*12);
162 76193d7c 2003-09-30 devnull i->r.max.y = atoi(buf+7*12);
163 76193d7c 2003-09-30 devnull i->clipr.min.x = atoi(buf+8*12);
164 76193d7c 2003-09-30 devnull i->clipr.min.y = atoi(buf+9*12);
165 76193d7c 2003-09-30 devnull i->clipr.max.x = atoi(buf+10*12);
166 76193d7c 2003-09-30 devnull i->clipr.max.y = atoi(buf+11*12);
167 76193d7c 2003-09-30 devnull i->screen = 0;
168 76193d7c 2003-09-30 devnull i->next = 0;
169 76193d7c 2003-09-30 devnull return i;
173 76193d7c 2003-09-30 devnull nameimage(Image *i, char *name, int in)
175 76193d7c 2003-09-30 devnull uchar *a;
178 76193d7c 2003-09-30 devnull n = strlen(name);
179 76193d7c 2003-09-30 devnull a = bufimage(i->display, 1+4+1+1+n);
180 76193d7c 2003-09-30 devnull if(a == 0)
181 76193d7c 2003-09-30 devnull return 0;
182 76193d7c 2003-09-30 devnull a[0] = 'N';
183 76193d7c 2003-09-30 devnull BPLONG(a+1, i->id);
184 76193d7c 2003-09-30 devnull a[5] = in;
185 76193d7c 2003-09-30 devnull a[6] = n;
186 76193d7c 2003-09-30 devnull memmove(a+7, name, n);
187 76193d7c 2003-09-30 devnull if(flushimage(i->display, 0) < 0)
188 76193d7c 2003-09-30 devnull return 0;
189 76193d7c 2003-09-30 devnull return 1;
193 76193d7c 2003-09-30 devnull _freeimage1(Image *i)
195 76193d7c 2003-09-30 devnull uchar *a;
196 76193d7c 2003-09-30 devnull Display *d;
197 76193d7c 2003-09-30 devnull Image *w;
199 ca63c078 2005-07-13 devnull if(i == 0 || i->display == 0)
200 76193d7c 2003-09-30 devnull return 0;
201 76193d7c 2003-09-30 devnull /* make sure no refresh events occur on this if we block in the write */
202 76193d7c 2003-09-30 devnull d = i->display;
203 76193d7c 2003-09-30 devnull /* flush pending data so we don't get error deleting the image */
204 76193d7c 2003-09-30 devnull flushimage(d, 0);
205 76193d7c 2003-09-30 devnull a = bufimage(d, 1+4);
206 76193d7c 2003-09-30 devnull if(a == 0)
207 76193d7c 2003-09-30 devnull return -1;
208 76193d7c 2003-09-30 devnull a[0] = 'f';
209 76193d7c 2003-09-30 devnull BPLONG(a+1, i->id);
210 76193d7c 2003-09-30 devnull if(i->screen){
211 76193d7c 2003-09-30 devnull w = d->windows;
212 76193d7c 2003-09-30 devnull if(w == i)
213 76193d7c 2003-09-30 devnull d->windows = i->next;
215 76193d7c 2003-09-30 devnull while(w){
216 76193d7c 2003-09-30 devnull if(w->next == i){
217 76193d7c 2003-09-30 devnull w->next = i->next;
220 76193d7c 2003-09-30 devnull w = w->next;
223 76193d7c 2003-09-30 devnull if(flushimage(d, i->screen!=0) < 0)
224 76193d7c 2003-09-30 devnull return -1;
226 76193d7c 2003-09-30 devnull return 0;
230 76193d7c 2003-09-30 devnull freeimage(Image *i)
232 76193d7c 2003-09-30 devnull int ret;
234 148f25d3 2005-11-07 devnull if(i == screen)
235 148f25d3 2005-11-07 devnull abort();
237 76193d7c 2003-09-30 devnull ret = _freeimage1(i);
238 76193d7c 2003-09-30 devnull free(i);
239 76193d7c 2003-09-30 devnull return ret;