Blame


1 28994509 2004-04-21 devnull #include <u.h>
2 28994509 2004-04-21 devnull #include <libc.h>
3 28994509 2004-04-21 devnull #include <bio.h>
4 28994509 2004-04-21 devnull #include <draw.h>
5 28994509 2004-04-21 devnull #include <event.h>
6 28994509 2004-04-21 devnull #include <cursor.h>
7 28994509 2004-04-21 devnull
8 28994509 2004-04-21 devnull typedef struct Icon Icon;
9 28994509 2004-04-21 devnull struct Icon
10 28994509 2004-04-21 devnull {
11 28994509 2004-04-21 devnull Icon *next;
12 28994509 2004-04-21 devnull
13 28994509 2004-04-21 devnull uchar w; /* icon width */
14 28994509 2004-04-21 devnull uchar h; /* icon height */
15 28994509 2004-04-21 devnull ushort ncolor; /* number of colors */
16 28994509 2004-04-21 devnull ushort nplane; /* number of bit planes */
17 28994509 2004-04-21 devnull ushort bits; /* bits per pixel */
18 28994509 2004-04-21 devnull ulong len; /* length of data */
19 28994509 2004-04-21 devnull ulong offset; /* file offset to data */
20 28994509 2004-04-21 devnull
21 28994509 2004-04-21 devnull Image *img;
22 28994509 2004-04-21 devnull Image *mask;
23 28994509 2004-04-21 devnull
24 28994509 2004-04-21 devnull Rectangle r; /* relative */
25 28994509 2004-04-21 devnull Rectangle sr; /* abs */
26 28994509 2004-04-21 devnull };
27 28994509 2004-04-21 devnull
28 28994509 2004-04-21 devnull typedef struct Header Header;
29 28994509 2004-04-21 devnull struct Header
30 28994509 2004-04-21 devnull {
31 28994509 2004-04-21 devnull uint n;
32 28994509 2004-04-21 devnull Icon *first;
33 28994509 2004-04-21 devnull Icon *last;
34 28994509 2004-04-21 devnull };
35 28994509 2004-04-21 devnull
36 28994509 2004-04-21 devnull int debug;
37 28994509 2004-04-21 devnull Mouse mouse;
38 28994509 2004-04-21 devnull Header h;
39 28994509 2004-04-21 devnull Image *background;
40 28994509 2004-04-21 devnull
41 28994509 2004-04-21 devnull ushort
42 28994509 2004-04-21 devnull gets(uchar *p)
43 28994509 2004-04-21 devnull {
44 28994509 2004-04-21 devnull return p[0] | (p[1]<<8);
45 28994509 2004-04-21 devnull }
46 28994509 2004-04-21 devnull
47 28994509 2004-04-21 devnull ulong
48 28994509 2004-04-21 devnull getl(uchar *p)
49 28994509 2004-04-21 devnull {
50 28994509 2004-04-21 devnull return p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24);
51 28994509 2004-04-21 devnull }
52 28994509 2004-04-21 devnull
53 28994509 2004-04-21 devnull int
54 28994509 2004-04-21 devnull Bgetheader(Biobuf *b, Header *h)
55 28994509 2004-04-21 devnull {
56 28994509 2004-04-21 devnull Icon *icon;
57 28994509 2004-04-21 devnull int i;
58 28994509 2004-04-21 devnull uchar buf[40];
59 28994509 2004-04-21 devnull
60 28994509 2004-04-21 devnull memset(h, 0, sizeof(*h));
61 28994509 2004-04-21 devnull if(Bread(b, buf, 6) != 6)
62 28994509 2004-04-21 devnull goto eof;
63 28994509 2004-04-21 devnull if(gets(&buf[0]) != 0)
64 28994509 2004-04-21 devnull goto header;
65 28994509 2004-04-21 devnull if(gets(&buf[2]) != 1)
66 28994509 2004-04-21 devnull goto header;
67 28994509 2004-04-21 devnull h->n = gets(&buf[4]);
68 28994509 2004-04-21 devnull
69 28994509 2004-04-21 devnull for(i = 0; i < h->n; i++){
70 28994509 2004-04-21 devnull icon = mallocz(sizeof(*icon), 1);
71 28994509 2004-04-21 devnull if(icon == nil)
72 28994509 2004-04-21 devnull sysfatal("malloc: %r");
73 28994509 2004-04-21 devnull if(Bread(b, buf, 16) != 16)
74 28994509 2004-04-21 devnull goto eof;
75 28994509 2004-04-21 devnull icon->w = buf[0];
76 28994509 2004-04-21 devnull icon->h = buf[1];
77 28994509 2004-04-21 devnull icon->ncolor = buf[2] == 0 ? 256 : buf[2];
78 28994509 2004-04-21 devnull if(buf[3] != 0)
79 28994509 2004-04-21 devnull goto header;
80 28994509 2004-04-21 devnull icon->nplane = gets(&buf[4]);
81 28994509 2004-04-21 devnull icon->bits = gets(&buf[6]);
82 28994509 2004-04-21 devnull icon->len = getl(&buf[8]);
83 28994509 2004-04-21 devnull icon->offset = getl(&buf[12]);
84 28994509 2004-04-21 devnull
85 28994509 2004-04-21 devnull if(i == 0)
86 28994509 2004-04-21 devnull h->first = icon;
87 28994509 2004-04-21 devnull else
88 28994509 2004-04-21 devnull h->last->next = icon;
89 28994509 2004-04-21 devnull h->last = icon;
90 28994509 2004-04-21 devnull }
91 28994509 2004-04-21 devnull return 0;
92 28994509 2004-04-21 devnull
93 28994509 2004-04-21 devnull eof:
94 28994509 2004-04-21 devnull werrstr("unexpected EOF");
95 28994509 2004-04-21 devnull return -1;
96 28994509 2004-04-21 devnull header:
97 28994509 2004-04-21 devnull werrstr("unknown header format");
98 28994509 2004-04-21 devnull return -1;
99 28994509 2004-04-21 devnull }
100 28994509 2004-04-21 devnull
101 28994509 2004-04-21 devnull uchar*
102 28994509 2004-04-21 devnull transcmap(Icon *icon, uchar *map)
103 28994509 2004-04-21 devnull {
104 28994509 2004-04-21 devnull uchar *m, *p;
105 28994509 2004-04-21 devnull int i;
106 28994509 2004-04-21 devnull
107 28994509 2004-04-21 devnull p = m = malloc(sizeof(int)*(1<<icon->bits));
108 28994509 2004-04-21 devnull for(i = 0; i < icon->ncolor; i++){
109 28994509 2004-04-21 devnull *p++ = rgb2cmap(map[2], map[1], map[0]);
110 28994509 2004-04-21 devnull map += 4;
111 28994509 2004-04-21 devnull }
112 28994509 2004-04-21 devnull return m;
113 28994509 2004-04-21 devnull }
114 28994509 2004-04-21 devnull
115 28994509 2004-04-21 devnull Image*
116 28994509 2004-04-21 devnull xor2img(Icon *icon, uchar *xor, uchar *map)
117 28994509 2004-04-21 devnull {
118 28994509 2004-04-21 devnull uchar *data;
119 28994509 2004-04-21 devnull Image *img;
120 28994509 2004-04-21 devnull int inxlen;
121 28994509 2004-04-21 devnull uchar *from, *to;
122 28994509 2004-04-21 devnull int s, byte, mask;
123 28994509 2004-04-21 devnull int x, y;
124 28994509 2004-04-21 devnull
125 28994509 2004-04-21 devnull inxlen = 4*((icon->bits*icon->w+31)/32);
126 28994509 2004-04-21 devnull to = data = malloc(icon->w*icon->h);
127 28994509 2004-04-21 devnull
128 28994509 2004-04-21 devnull /* rotate around the y axis, go to 8 bits, and convert color */
129 28994509 2004-04-21 devnull mask = (1<<icon->bits)-1;
130 28994509 2004-04-21 devnull for(y = 0; y < icon->h; y++){
131 28994509 2004-04-21 devnull s = -1;
132 28994509 2004-04-21 devnull byte = 0;
133 28994509 2004-04-21 devnull from = xor + (icon->h - 1 - y)*inxlen;
134 28994509 2004-04-21 devnull for(x = 0; x < icon->w; x++){
135 28994509 2004-04-21 devnull if(s < 0){
136 28994509 2004-04-21 devnull byte = *from++;
137 28994509 2004-04-21 devnull s = 8-icon->bits;
138 28994509 2004-04-21 devnull }
139 28994509 2004-04-21 devnull *to++ = map[(byte>>s) & mask];
140 28994509 2004-04-21 devnull s -= icon->bits;
141 28994509 2004-04-21 devnull }
142 28994509 2004-04-21 devnull }
143 28994509 2004-04-21 devnull
144 28994509 2004-04-21 devnull /* stick in an image */
145 28994509 2004-04-21 devnull img = allocimage(display, Rect(0,0,icon->w,icon->h), CMAP8, 0, DNofill);
146 28994509 2004-04-21 devnull loadimage(img, Rect(0,0,icon->w,icon->h), data, icon->h*icon->w);
147 28994509 2004-04-21 devnull
148 28994509 2004-04-21 devnull free(data);
149 28994509 2004-04-21 devnull return img;
150 28994509 2004-04-21 devnull }
151 28994509 2004-04-21 devnull
152 28994509 2004-04-21 devnull Image*
153 28994509 2004-04-21 devnull and2img(Icon *icon, uchar *and)
154 28994509 2004-04-21 devnull {
155 28994509 2004-04-21 devnull uchar *data;
156 28994509 2004-04-21 devnull Image *img;
157 28994509 2004-04-21 devnull int inxlen;
158 28994509 2004-04-21 devnull int outxlen;
159 28994509 2004-04-21 devnull uchar *from, *to;
160 28994509 2004-04-21 devnull int x, y;
161 28994509 2004-04-21 devnull
162 28994509 2004-04-21 devnull inxlen = 4*((icon->w+31)/32);
163 28994509 2004-04-21 devnull to = data = malloc(inxlen*icon->h);
164 28994509 2004-04-21 devnull
165 28994509 2004-04-21 devnull /* rotate around the y axis and invert bits */
166 28994509 2004-04-21 devnull outxlen = (icon->w+7)/8;
167 28994509 2004-04-21 devnull for(y = 0; y < icon->h; y++){
168 28994509 2004-04-21 devnull from = and + (icon->h - 1 - y)*inxlen;
169 28994509 2004-04-21 devnull for(x = 0; x < outxlen; x++){
170 28994509 2004-04-21 devnull *to++ = ~(*from++);
171 28994509 2004-04-21 devnull }
172 28994509 2004-04-21 devnull }
173 28994509 2004-04-21 devnull
174 28994509 2004-04-21 devnull /* stick in an image */
175 28994509 2004-04-21 devnull img = allocimage(display, Rect(0,0,icon->w,icon->h), GREY1, 0, DNofill);
176 28994509 2004-04-21 devnull loadimage(img, Rect(0,0,icon->w,icon->h), data, icon->h*outxlen);
177 28994509 2004-04-21 devnull
178 28994509 2004-04-21 devnull free(data);
179 28994509 2004-04-21 devnull return img;
180 28994509 2004-04-21 devnull }
181 28994509 2004-04-21 devnull
182 28994509 2004-04-21 devnull int
183 28994509 2004-04-21 devnull Bgeticon(Biobuf *b, Icon *icon)
184 28994509 2004-04-21 devnull {
185 28994509 2004-04-21 devnull ulong l;
186 28994509 2004-04-21 devnull ushort s;
187 28994509 2004-04-21 devnull uchar *xor;
188 28994509 2004-04-21 devnull uchar *and;
189 28994509 2004-04-21 devnull uchar *cm;
190 28994509 2004-04-21 devnull uchar *buf;
191 28994509 2004-04-21 devnull uchar *map2map;
192 28994509 2004-04-21 devnull Image *img;
193 28994509 2004-04-21 devnull
194 28994509 2004-04-21 devnull Bseek(b, icon->offset, 0);
195 28994509 2004-04-21 devnull buf = malloc(icon->len);
196 28994509 2004-04-21 devnull if(buf == nil)
197 28994509 2004-04-21 devnull return -1;
198 28994509 2004-04-21 devnull if(Bread(b, buf, icon->len) != icon->len){
199 28994509 2004-04-21 devnull werrstr("unexpected EOF");
200 28994509 2004-04-21 devnull return -1;
201 28994509 2004-04-21 devnull }
202 28994509 2004-04-21 devnull
203 28994509 2004-04-21 devnull /* this header's info takes precedence over previous one */
204 28994509 2004-04-21 devnull if(getl(buf) != 40){
205 28994509 2004-04-21 devnull werrstr("bad icon header");
206 28994509 2004-04-21 devnull return -1;
207 28994509 2004-04-21 devnull }
208 28994509 2004-04-21 devnull l = getl(buf+4);
209 28994509 2004-04-21 devnull if(l != icon->w)
210 28994509 2004-04-21 devnull icon->w = l;
211 28994509 2004-04-21 devnull l = getl(buf+8);
212 28994509 2004-04-21 devnull if(l>>1 != icon->h)
213 28994509 2004-04-21 devnull icon->h = l>>1;
214 28994509 2004-04-21 devnull s = gets(buf+12);
215 28994509 2004-04-21 devnull if(s != icon->nplane)
216 28994509 2004-04-21 devnull icon->nplane = s;
217 28994509 2004-04-21 devnull s = gets(buf+14);
218 28994509 2004-04-21 devnull if(s != icon->bits)
219 28994509 2004-04-21 devnull icon->bits = s;
220 28994509 2004-04-21 devnull
221 28994509 2004-04-21 devnull /* limit what we handle */
222 28994509 2004-04-21 devnull switch(icon->bits){
223 28994509 2004-04-21 devnull case 1:
224 28994509 2004-04-21 devnull case 2:
225 28994509 2004-04-21 devnull case 4:
226 28994509 2004-04-21 devnull case 8:
227 28994509 2004-04-21 devnull break;
228 28994509 2004-04-21 devnull default:
229 28994509 2004-04-21 devnull werrstr("don't support %d bit pixels", icon->bits);
230 28994509 2004-04-21 devnull return -1;
231 28994509 2004-04-21 devnull }
232 28994509 2004-04-21 devnull if(icon->nplane != 1){
233 28994509 2004-04-21 devnull werrstr("don't support %d planes", icon->nplane);
234 28994509 2004-04-21 devnull return -1;
235 28994509 2004-04-21 devnull }
236 28994509 2004-04-21 devnull
237 28994509 2004-04-21 devnull cm = buf + 40;
238 28994509 2004-04-21 devnull xor = cm + 4*icon->ncolor;
239 28994509 2004-04-21 devnull and = xor + icon->h*4*((icon->bits*icon->w+31)/32);
240 28994509 2004-04-21 devnull
241 28994509 2004-04-21 devnull /* translate the color map to a plan 9 one */
242 28994509 2004-04-21 devnull map2map = transcmap(icon, cm);
243 28994509 2004-04-21 devnull
244 28994509 2004-04-21 devnull /* convert the images */
245 28994509 2004-04-21 devnull icon->img = xor2img(icon, xor, map2map);
246 28994509 2004-04-21 devnull icon->mask = and2img(icon, and);
247 28994509 2004-04-21 devnull
248 28994509 2004-04-21 devnull /* so that we save an image with a white background */
249 28994509 2004-04-21 devnull img = allocimage(display, icon->img->r, CMAP8, 0, DWhite);
250 28994509 2004-04-21 devnull draw(img, icon->img->r, icon->img, icon->mask, ZP);
251 28994509 2004-04-21 devnull icon->img = img;
252 28994509 2004-04-21 devnull
253 28994509 2004-04-21 devnull free(buf);
254 28994509 2004-04-21 devnull free(map2map);
255 28994509 2004-04-21 devnull return 0;
256 28994509 2004-04-21 devnull }
257 28994509 2004-04-21 devnull
258 28994509 2004-04-21 devnull void
259 28994509 2004-04-21 devnull usage(void)
260 28994509 2004-04-21 devnull {
261 be36ff68 2004-04-29 devnull fprint(2, "usage: %s -W winsize [file]\n", argv0);
262 28994509 2004-04-21 devnull exits("usage");
263 28994509 2004-04-21 devnull }
264 28994509 2004-04-21 devnull
265 28994509 2004-04-21 devnull enum
266 28994509 2004-04-21 devnull {
267 28994509 2004-04-21 devnull Mimage,
268 28994509 2004-04-21 devnull Mmask,
269 28994509 2004-04-21 devnull Mexit,
270 28994509 2004-04-21 devnull
271 28994509 2004-04-21 devnull Up= 1,
272 28994509 2004-04-21 devnull Down= 0,
273 28994509 2004-04-21 devnull };
274 28994509 2004-04-21 devnull
275 28994509 2004-04-21 devnull char *menu3str[] = {
276 840bb968 2004-04-25 devnull "write image",
277 840bb968 2004-04-25 devnull "write mask",
278 840bb968 2004-04-25 devnull "exit",
279 28994509 2004-04-21 devnull 0,
280 28994509 2004-04-21 devnull };
281 28994509 2004-04-21 devnull
282 28994509 2004-04-21 devnull Menu menu3 = {
283 28994509 2004-04-21 devnull menu3str
284 28994509 2004-04-21 devnull };
285 28994509 2004-04-21 devnull
286 28994509 2004-04-21 devnull Cursor sight = {
287 28994509 2004-04-21 devnull {-7, -7},
288 28994509 2004-04-21 devnull {0x1F, 0xF8, 0x3F, 0xFC, 0x7F, 0xFE, 0xFB, 0xDF,
289 28994509 2004-04-21 devnull 0xF3, 0xCF, 0xE3, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF,
290 28994509 2004-04-21 devnull 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0xC7, 0xF3, 0xCF,
291 28994509 2004-04-21 devnull 0x7B, 0xDF, 0x7F, 0xFE, 0x3F, 0xFC, 0x1F, 0xF8,},
292 28994509 2004-04-21 devnull {0x00, 0x00, 0x0F, 0xF0, 0x31, 0x8C, 0x21, 0x84,
293 28994509 2004-04-21 devnull 0x41, 0x82, 0x41, 0x82, 0x41, 0x82, 0x7F, 0xFE,
294 28994509 2004-04-21 devnull 0x7F, 0xFE, 0x41, 0x82, 0x41, 0x82, 0x41, 0x82,
295 28994509 2004-04-21 devnull 0x21, 0x84, 0x31, 0x8C, 0x0F, 0xF0, 0x00, 0x00,}
296 28994509 2004-04-21 devnull };
297 28994509 2004-04-21 devnull
298 28994509 2004-04-21 devnull void
299 28994509 2004-04-21 devnull buttons(int ud)
300 28994509 2004-04-21 devnull {
301 28994509 2004-04-21 devnull while((mouse.buttons==0) != ud)
302 28994509 2004-04-21 devnull mouse = emouse();
303 28994509 2004-04-21 devnull }
304 28994509 2004-04-21 devnull
305 28994509 2004-04-21 devnull void
306 28994509 2004-04-21 devnull mesg(char *fmt, ...)
307 28994509 2004-04-21 devnull {
308 28994509 2004-04-21 devnull va_list arg;
309 28994509 2004-04-21 devnull char buf[1024];
310 28994509 2004-04-21 devnull static char obuf[1024];
311 28994509 2004-04-21 devnull
312 28994509 2004-04-21 devnull va_start(arg, fmt);
313 28994509 2004-04-21 devnull vseprint(buf, buf+sizeof(buf), fmt, arg);
314 28994509 2004-04-21 devnull va_end(arg);
315 28994509 2004-04-21 devnull string(screen, screen->r.min, background, ZP, font, obuf);
316 28994509 2004-04-21 devnull string(screen, screen->r.min, display->white, ZP, font, buf);
317 28994509 2004-04-21 devnull strcpy(obuf, buf);
318 28994509 2004-04-21 devnull }
319 28994509 2004-04-21 devnull
320 28994509 2004-04-21 devnull void
321 28994509 2004-04-21 devnull doimage(Icon *icon)
322 28994509 2004-04-21 devnull {
323 28994509 2004-04-21 devnull int rv;
324 28994509 2004-04-21 devnull char file[256];
325 28994509 2004-04-21 devnull int fd;
326 28994509 2004-04-21 devnull
327 28994509 2004-04-21 devnull rv = -1;
328 28994509 2004-04-21 devnull snprint(file, sizeof(file), "%dx%d.img", icon->w, icon->h);
329 28994509 2004-04-21 devnull fd = create(file, OWRITE, 0664);
330 28994509 2004-04-21 devnull if(fd >= 0){
331 28994509 2004-04-21 devnull rv = writeimage(fd, icon->img, 0);
332 28994509 2004-04-21 devnull close(fd);
333 28994509 2004-04-21 devnull }
334 28994509 2004-04-21 devnull if(rv < 0)
335 28994509 2004-04-21 devnull mesg("error writing %s: %r", file);
336 28994509 2004-04-21 devnull else
337 28994509 2004-04-21 devnull mesg("created %s", file);
338 28994509 2004-04-21 devnull }
339 28994509 2004-04-21 devnull
340 28994509 2004-04-21 devnull void
341 28994509 2004-04-21 devnull domask(Icon *icon)
342 28994509 2004-04-21 devnull {
343 28994509 2004-04-21 devnull int rv;
344 28994509 2004-04-21 devnull char file[64];
345 28994509 2004-04-21 devnull int fd;
346 28994509 2004-04-21 devnull
347 28994509 2004-04-21 devnull rv = -1;
348 28994509 2004-04-21 devnull snprint(file, sizeof(file), "%dx%d.mask", icon->w, icon->h);
349 28994509 2004-04-21 devnull fd = create(file, OWRITE, 0664);
350 28994509 2004-04-21 devnull if(fd >= 0){
351 28994509 2004-04-21 devnull rv = writeimage(fd, icon->mask, 0);
352 28994509 2004-04-21 devnull close(fd);
353 28994509 2004-04-21 devnull }
354 28994509 2004-04-21 devnull if(rv < 0)
355 28994509 2004-04-21 devnull mesg("error writing %s: %r", file);
356 28994509 2004-04-21 devnull else
357 28994509 2004-04-21 devnull mesg("created %s", file);
358 28994509 2004-04-21 devnull }
359 28994509 2004-04-21 devnull
360 28994509 2004-04-21 devnull void
361 28994509 2004-04-21 devnull apply(void (*f)(Icon*))
362 28994509 2004-04-21 devnull {
363 28994509 2004-04-21 devnull Icon *icon;
364 28994509 2004-04-21 devnull
365 28994509 2004-04-21 devnull esetcursor(&sight);
366 28994509 2004-04-21 devnull buttons(Down);
367 28994509 2004-04-21 devnull if(mouse.buttons == 4)
368 28994509 2004-04-21 devnull for(icon = h.first; icon; icon = icon->next)
369 28994509 2004-04-21 devnull if(ptinrect(mouse.xy, icon->sr)){
370 28994509 2004-04-21 devnull buttons(Up);
371 28994509 2004-04-21 devnull f(icon);
372 28994509 2004-04-21 devnull break;
373 28994509 2004-04-21 devnull }
374 28994509 2004-04-21 devnull buttons(Up);
375 28994509 2004-04-21 devnull esetcursor(0);
376 28994509 2004-04-21 devnull }
377 28994509 2004-04-21 devnull
378 28994509 2004-04-21 devnull void
379 28994509 2004-04-21 devnull menu(void)
380 28994509 2004-04-21 devnull {
381 28994509 2004-04-21 devnull int sel;
382 28994509 2004-04-21 devnull
383 28994509 2004-04-21 devnull sel = emenuhit(3, &mouse, &menu3);
384 28994509 2004-04-21 devnull switch(sel){
385 28994509 2004-04-21 devnull case Mimage:
386 28994509 2004-04-21 devnull apply(doimage);
387 28994509 2004-04-21 devnull break;
388 28994509 2004-04-21 devnull case Mmask:
389 28994509 2004-04-21 devnull apply(domask);
390 28994509 2004-04-21 devnull break;
391 28994509 2004-04-21 devnull case Mexit:
392 28994509 2004-04-21 devnull exits(0);
393 28994509 2004-04-21 devnull break;
394 28994509 2004-04-21 devnull }
395 28994509 2004-04-21 devnull }
396 28994509 2004-04-21 devnull
397 28994509 2004-04-21 devnull void
398 28994509 2004-04-21 devnull mousemoved(void)
399 28994509 2004-04-21 devnull {
400 28994509 2004-04-21 devnull Icon *icon;
401 28994509 2004-04-21 devnull
402 28994509 2004-04-21 devnull for(icon = h.first; icon; icon = icon->next)
403 28994509 2004-04-21 devnull if(ptinrect(mouse.xy, icon->sr)){
404 28994509 2004-04-21 devnull mesg("%dx%d", icon->w, icon->h);
405 28994509 2004-04-21 devnull return;
406 28994509 2004-04-21 devnull }
407 28994509 2004-04-21 devnull mesg("");
408 28994509 2004-04-21 devnull }
409 28994509 2004-04-21 devnull
410 28994509 2004-04-21 devnull enum
411 28994509 2004-04-21 devnull {
412 28994509 2004-04-21 devnull BORDER= 1,
413 28994509 2004-04-21 devnull };
414 28994509 2004-04-21 devnull
415 28994509 2004-04-21 devnull void
416 28994509 2004-04-21 devnull eresized(int new)
417 28994509 2004-04-21 devnull {
418 28994509 2004-04-21 devnull Icon *icon;
419 28994509 2004-04-21 devnull Rectangle r;
420 28994509 2004-04-21 devnull
421 28994509 2004-04-21 devnull if(new && getwindow(display, Refnone) < 0)
422 28994509 2004-04-21 devnull sysfatal("can't reattach to window");
423 28994509 2004-04-21 devnull draw(screen, screen->clipr, background, nil, ZP);
424 28994509 2004-04-21 devnull r.max.x = screen->r.min.x;
425 28994509 2004-04-21 devnull r.min.y = screen->r.min.y + font->height + 2*BORDER;
426 28994509 2004-04-21 devnull for(icon = h.first; icon != nil; icon = icon->next){
427 28994509 2004-04-21 devnull r.min.x = r.max.x + BORDER;
428 28994509 2004-04-21 devnull r.max.x = r.min.x + Dx(icon->img->r);
429 28994509 2004-04-21 devnull r.max.y = r.min.y + Dy(icon->img->r);
430 28994509 2004-04-21 devnull draw(screen, r, icon->img, nil, ZP);
431 28994509 2004-04-21 devnull border(screen, r, -BORDER, display->black, ZP);
432 28994509 2004-04-21 devnull icon->sr = r;
433 28994509 2004-04-21 devnull }
434 28994509 2004-04-21 devnull flushimage(display, 1);
435 28994509 2004-04-21 devnull }
436 28994509 2004-04-21 devnull
437 28994509 2004-04-21 devnull void
438 28994509 2004-04-21 devnull main(int argc, char **argv)
439 28994509 2004-04-21 devnull {
440 28994509 2004-04-21 devnull Biobuf in;
441 28994509 2004-04-21 devnull Icon *icon;
442 28994509 2004-04-21 devnull int fd;
443 28994509 2004-04-21 devnull Rectangle r;
444 28994509 2004-04-21 devnull Event e;
445 28994509 2004-04-21 devnull
446 28994509 2004-04-21 devnull ARGBEGIN{
447 be36ff68 2004-04-29 devnull case 'W':
448 be36ff68 2004-04-29 devnull winsize = EARGF(usage());
449 be36ff68 2004-04-29 devnull break;
450 28994509 2004-04-21 devnull case 'd':
451 28994509 2004-04-21 devnull debug = 1;
452 28994509 2004-04-21 devnull break;
453 28994509 2004-04-21 devnull }ARGEND;
454 28994509 2004-04-21 devnull
455 28994509 2004-04-21 devnull fd = -1;
456 28994509 2004-04-21 devnull switch(argc){
457 28994509 2004-04-21 devnull case 0:
458 28994509 2004-04-21 devnull fd = 0;
459 28994509 2004-04-21 devnull break;
460 28994509 2004-04-21 devnull case 1:
461 28994509 2004-04-21 devnull fd = open(argv[0], OREAD);
462 28994509 2004-04-21 devnull if(fd < 0)
463 28994509 2004-04-21 devnull sysfatal("opening: %r");
464 28994509 2004-04-21 devnull break;
465 28994509 2004-04-21 devnull default:
466 28994509 2004-04-21 devnull usage();
467 28994509 2004-04-21 devnull break;
468 28994509 2004-04-21 devnull }
469 28994509 2004-04-21 devnull
470 28994509 2004-04-21 devnull Binit(&in, fd, OREAD);
471 28994509 2004-04-21 devnull
472 28994509 2004-04-21 devnull if(Bgetheader(&in, &h) < 0)
473 28994509 2004-04-21 devnull sysfatal("reading header: %r");
474 28994509 2004-04-21 devnull
475 840bb968 2004-04-25 devnull initdraw(0, nil, "ico");
476 f940ad06 2005-01-14 devnull background = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x808080FF);
477 28994509 2004-04-21 devnull
478 28994509 2004-04-21 devnull einit(Emouse|Ekeyboard);
479 28994509 2004-04-21 devnull
480 28994509 2004-04-21 devnull r.min = Pt(4, 4);
481 28994509 2004-04-21 devnull for(icon = h.first; icon != nil; icon = icon->next){
482 28994509 2004-04-21 devnull if(Bgeticon(&in, icon) < 0){
483 28994509 2004-04-21 devnull fprint(2, "bad rectangle: %r\n");
484 28994509 2004-04-21 devnull continue;
485 28994509 2004-04-21 devnull }
486 28994509 2004-04-21 devnull if(debug)
487 28994509 2004-04-21 devnull fprint(2, "w %ud h %ud ncolor %ud bits %ud len %lud offset %lud\n",
488 28994509 2004-04-21 devnull icon->w, icon->h, icon->ncolor, icon->bits, icon->len, icon->offset);
489 28994509 2004-04-21 devnull r.max = addpt(r.min, Pt(icon->w, icon->h));
490 28994509 2004-04-21 devnull icon->r = r;
491 28994509 2004-04-21 devnull r.min.x += r.max.x;
492 28994509 2004-04-21 devnull }
493 28994509 2004-04-21 devnull eresized(0);
494 28994509 2004-04-21 devnull
495 28994509 2004-04-21 devnull for(;;)
496 28994509 2004-04-21 devnull switch(event(&e)){
497 28994509 2004-04-21 devnull case Ekeyboard:
498 28994509 2004-04-21 devnull break;
499 28994509 2004-04-21 devnull case Emouse:
500 28994509 2004-04-21 devnull mouse = e.mouse;
501 28994509 2004-04-21 devnull if(mouse.buttons & 4)
502 28994509 2004-04-21 devnull menu();
503 28994509 2004-04-21 devnull else
504 28994509 2004-04-21 devnull mousemoved();
505 28994509 2004-04-21 devnull break;
506 28994509 2004-04-21 devnull }
507 28994509 2004-04-21 devnull }