Blame


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>
4 76193d7c 2003-09-30 devnull
5 76193d7c 2003-09-30 devnull Image*
6 76193d7c 2003-09-30 devnull allocimage(Display *d, Rectangle r, u32int chan, int repl, u32int val)
7 76193d7c 2003-09-30 devnull {
8 76193d7c 2003-09-30 devnull return _allocimage(nil, d, r, chan, repl, val, 0, 0);
9 76193d7c 2003-09-30 devnull }
10 76193d7c 2003-09-30 devnull
11 76193d7c 2003-09-30 devnull Image*
12 76193d7c 2003-09-30 devnull _allocimage(Image *ai, Display *d, Rectangle r, u32int chan, int repl, u32int val, int screenid, int refresh)
13 76193d7c 2003-09-30 devnull {
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;
18 76193d7c 2003-09-30 devnull int id;
19 76193d7c 2003-09-30 devnull int depth;
20 76193d7c 2003-09-30 devnull
21 76193d7c 2003-09-30 devnull err = 0;
22 76193d7c 2003-09-30 devnull i = 0;
23 76193d7c 2003-09-30 devnull
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;
27 76193d7c 2003-09-30 devnull }
28 76193d7c 2003-09-30 devnull
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";
32 76193d7c 2003-09-30 devnull Error:
33 76193d7c 2003-09-30 devnull if(err)
34 76193d7c 2003-09-30 devnull werrstr("allocimage: %s", err);
35 76193d7c 2003-09-30 devnull else
36 76193d7c 2003-09-30 devnull werrstr("allocimage: %r");
37 76193d7c 2003-09-30 devnull free(i);
38 76193d7c 2003-09-30 devnull return 0;
39 76193d7c 2003-09-30 devnull }
40 76193d7c 2003-09-30 devnull
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);
58 76193d7c 2003-09-30 devnull if(repl)
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);
61 76193d7c 2003-09-30 devnull else
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;
70 76193d7c 2003-09-30 devnull
71 76193d7c 2003-09-30 devnull if(ai)
72 76193d7c 2003-09-30 devnull i = ai;
73 76193d7c 2003-09-30 devnull else{
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);
77 76193d7c 2003-09-30 devnull if(a){
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);
81 76193d7c 2003-09-30 devnull }
82 76193d7c 2003-09-30 devnull goto Error;
83 76193d7c 2003-09-30 devnull }
84 76193d7c 2003-09-30 devnull }
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;
95 76193d7c 2003-09-30 devnull }
96 76193d7c 2003-09-30 devnull
97 76193d7c 2003-09-30 devnull Image*
98 76193d7c 2003-09-30 devnull namedimage(Display *d, char *name)
99 76193d7c 2003-09-30 devnull {
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;
105 76193d7c 2003-09-30 devnull
106 76193d7c 2003-09-30 devnull err = 0;
107 76193d7c 2003-09-30 devnull i = 0;
108 76193d7c 2003-09-30 devnull
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";
112 76193d7c 2003-09-30 devnull Error:
113 76193d7c 2003-09-30 devnull if(err)
114 76193d7c 2003-09-30 devnull werrstr("namedimage: %s", err);
115 76193d7c 2003-09-30 devnull else
116 76193d7c 2003-09-30 devnull werrstr("namedimage: %r");
117 76193d7c 2003-09-30 devnull if(i)
118 76193d7c 2003-09-30 devnull free(i);
119 76193d7c 2003-09-30 devnull return 0;
120 76193d7c 2003-09-30 devnull }
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 74dc60da 2006-06-25 devnull if(_displayrddraw(d, buf, sizeof buf) < 12*12)
136 76193d7c 2003-09-30 devnull goto Error;
137 76193d7c 2003-09-30 devnull buf[12*12] = '\0';
138 76193d7c 2003-09-30 devnull
139 76193d7c 2003-09-30 devnull i = malloc(sizeof(Image));
140 76193d7c 2003-09-30 devnull if(i == nil){
141 76193d7c 2003-09-30 devnull Error1:
142 76193d7c 2003-09-30 devnull a = bufimage(d, 1+4);
143 76193d7c 2003-09-30 devnull if(a){
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);
147 76193d7c 2003-09-30 devnull }
148 76193d7c 2003-09-30 devnull goto Error;
149 76193d7c 2003-09-30 devnull }
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;
155 76193d7c 2003-09-30 devnull }
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;
170 76193d7c 2003-09-30 devnull }
171 76193d7c 2003-09-30 devnull
172 76193d7c 2003-09-30 devnull int
173 76193d7c 2003-09-30 devnull nameimage(Image *i, char *name, int in)
174 76193d7c 2003-09-30 devnull {
175 76193d7c 2003-09-30 devnull uchar *a;
176 76193d7c 2003-09-30 devnull int n;
177 76193d7c 2003-09-30 devnull
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;
190 76193d7c 2003-09-30 devnull }
191 76193d7c 2003-09-30 devnull
192 76193d7c 2003-09-30 devnull int
193 76193d7c 2003-09-30 devnull _freeimage1(Image *i)
194 76193d7c 2003-09-30 devnull {
195 76193d7c 2003-09-30 devnull uchar *a;
196 76193d7c 2003-09-30 devnull Display *d;
197 76193d7c 2003-09-30 devnull Image *w;
198 76193d7c 2003-09-30 devnull
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;
214 76193d7c 2003-09-30 devnull else
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;
218 76193d7c 2003-09-30 devnull break;
219 76193d7c 2003-09-30 devnull }
220 76193d7c 2003-09-30 devnull w = w->next;
221 76193d7c 2003-09-30 devnull }
222 76193d7c 2003-09-30 devnull }
223 76193d7c 2003-09-30 devnull if(flushimage(d, i->screen!=0) < 0)
224 76193d7c 2003-09-30 devnull return -1;
225 76193d7c 2003-09-30 devnull
226 76193d7c 2003-09-30 devnull return 0;
227 76193d7c 2003-09-30 devnull }
228 76193d7c 2003-09-30 devnull
229 76193d7c 2003-09-30 devnull int
230 76193d7c 2003-09-30 devnull freeimage(Image *i)
231 76193d7c 2003-09-30 devnull {
232 76193d7c 2003-09-30 devnull int ret;
233 76193d7c 2003-09-30 devnull
234 e4c74b87 2006-01-28 devnull if(i == nil)
235 b4d406b7 2006-01-29 devnull return 0;
236 148f25d3 2005-11-07 devnull if(i == screen)
237 148f25d3 2005-11-07 devnull abort();
238 76193d7c 2003-09-30 devnull ret = _freeimage1(i);
239 76193d7c 2003-09-30 devnull free(i);
240 76193d7c 2003-09-30 devnull return ret;
241 76193d7c 2003-09-30 devnull }