1 /*
2 * graphics.c - Xpipeman
3 *
4 * Send Constructive comments, bug reports, etc. to either
5 *
6 * JANET: pavern@uk.ac.man.cs
7 *
8 * or INER : pavern%cs.man.ac.uk@nsfnet-relay.ac.uk
9 *
10 * All other comments > /dev/null !!
11 *
12 * Copyright 1991 Nigel Paver
13 *
14 * Permission to use, copy, modify, distribute, and sell this software and its
15 * documentation for any purpose is hereby granted without fee, provided that
16 * the above copyright notice appear in all copies and that both that
17 * copyright notice and this permission notice appear in supporting
18 * documentation, and that the author's name not be used in advertising or
19 * publicity pertaining to distribution of the software without specific,
20 * written prior permission. The author makes no representations about the
21 * suitability of this software for any purpose. It is provided "as is"
22 * without express or implied warranty.
23 *
24 * THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
25 * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE
26 * AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
27 * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
28 * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
29 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
30 *
31 *
32 *
33 * Acknowledgements to Brian Warkentine (brian@sun.COM) for his xrobots
34 * program (copyright 1989) which I cannibalized to write this program
35 */
36
37 #include <X11/X.h>
38 #include <X11/Intrinsic.h>
39 #include <X11/Shell.h>
40 #include "xpipeman.h"
41 #include "bitmaps1.h"
42 #include "bitmaps2.h"
43 #include "icon.h"
44
45 static Pixmap iconP;
46
47
48 static Pixmap tmp_pixmap[NUM_TMP_CURSOR_PIXMAPS];
49
50 /*----------------------------------------------------------------------*/
51
52 void
init_pixmaps(top_shell)53 init_pixmaps(top_shell)
54 Widget top_shell;
55 {
56 /*
57 * Let's make some pixmaps and some cursors.
58 * And then let's set the iconpixmap.
59 */
60 Pixmap tmpP;
61 XColor fgcolor,bgcolor;
62 Arg arg;
63
64 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
65
66 fgcolor.pixel = app_data.fg;
67 bgcolor.pixel = app_data.bg;
68 fgcolor.flags = DoRed | DoGreen | DoBlue;
69 bgcolor.flags = DoRed | DoGreen | DoBlue;
70 XQueryColor(display,DefaultColormapOfScreen(XtScreen(playfield_widget)), &fgcolor);
71 XQueryColor(display,DefaultColormapOfScreen(XtScreen(playfield_widget)), &bgcolor);
72
73
74 iconP = XCreateBitmapFromData(display,playfield,
75 icon_bits,icon_width,icon_height);
76
77 tmp_pixmap[EMPTY] = XCreateBitmapFromData(display,playfield,
78 empty_bits, empty_width, empty_height);
79
80 tmp_pixmap[1] = XCreateBitmapFromData(display,playfield, b1_bits,
81 b1_width, b1_height);
82
83 tmp_pixmap[2] = XCreateBitmapFromData(display,playfield, b2_bits,
84 b2_width, b2_height);
85
86 tmp_pixmap[3] = XCreateBitmapFromData(display,playfield, b3_bits,
87 b3_width, b3_height);
88
89 tmp_pixmap[4] = XCreateBitmapFromData(display,playfield, b4_bits,
90 b4_width, b4_height);
91
92 tmp_pixmap[5] = XCreateBitmapFromData(display,playfield, b5_bits,
93 b5_width, b5_height);
94
95 tmp_pixmap[6] = XCreateBitmapFromData(display,playfield, b6_bits,
96 b6_width, b6_height);
97
98 tmp_pixmap[7] = XCreateBitmapFromData(display,playfield, b7_bits,
99 b7_width, b7_height);
100
101 tmp_pixmap[ONEWAY] = XCreateBitmapFromData(display,playfield, b11w_bits,
102 b11w_width, b11w_height);
103
104 tmp_pixmap[ONEWAY+1] = XCreateBitmapFromData(display,playfield, b21w_bits,
105 b21w_width, b21w_height);
106
107 tmp_pixmap[ONEWAY+2] = XCreateBitmapFromData(display,playfield, b31w_bits,
108 b31w_width, b31w_height);
109
110 tmp_pixmap[ONEWAY+3] = XCreateBitmapFromData(display,playfield, b41w_bits,
111 b41w_width, b41w_height);
112
113 tmp_pixmap[ONEWAY+4] = XCreateBitmapFromData(display,playfield, b51w_bits,
114 b51w_width, b51w_height);
115
116 tmp_pixmap[ONEWAY+5] = XCreateBitmapFromData(display,playfield, b61w_bits,
117 b61w_width, b61w_height);
118
119 tmp_pixmap[HFULL] = XCreateBitmapFromData(display,playfield, b8_bits,
120 b8_width, b8_height);
121
122 tmp_pixmap[VFULL] = XCreateBitmapFromData(display,playfield, b9_bits,
123 b9_width, b9_height);
124
125 tmp_pixmap[FILLBLKSTART] = XCreateBitmapFromData(display,playfield, b11_bits,
126 block_width, block_height);
127
128 tmp_pixmap[FILLBLKSTART+1] = XCreateBitmapFromData(display,playfield, b12_bits,
129 block_width, block_height);
130
131 tmp_pixmap[FILLBLKSTART+2] = XCreateBitmapFromData(display,playfield, b13_bits,
132 block_width, block_height);
133
134 tmp_pixmap[FILLBLKSTART+3] = XCreateBitmapFromData(display,playfield, b14_bits,
135 block_width, block_height);
136
137 tmp_pixmap[FILLBLKSTART+4] = XCreateBitmapFromData(display,playfield, b15_bits,
138 block_width, block_height);
139
140 tmp_pixmap[FILLBLKSTART+5] = XCreateBitmapFromData(display,playfield, b21_bits,
141 block_width, block_height);
142
143 tmp_pixmap[FILLBLKSTART+6] = XCreateBitmapFromData(display,playfield, b22_bits,
144 block_width, block_height);
145
146 tmp_pixmap[FILLBLKSTART+7] = XCreateBitmapFromData(display,playfield, b23_bits,
147 block_width, block_height);
148
149 tmp_pixmap[FILLBLKSTART+8] = XCreateBitmapFromData(display,playfield, b24_bits,
150 block_width, block_height);
151
152 tmp_pixmap[FILLBLKSTART+9] = XCreateBitmapFromData(display,playfield, b25_bits,
153 block_width, block_height);
154
155 tmp_pixmap[FILLBLKSTART+10] = XCreateBitmapFromData(display,playfield, b31_bits,
156 block_width, block_height);
157
158 tmp_pixmap[FILLBLKSTART+11] = XCreateBitmapFromData(display,playfield, b32_bits,
159 block_width, block_height);
160
161 tmp_pixmap[FILLBLKSTART+12] = XCreateBitmapFromData(display,playfield, b33_bits,
162 block_width, block_height);
163
164 tmp_pixmap[FILLBLKSTART+13] = XCreateBitmapFromData(display,playfield, b34_bits,
165 block_width, block_height);
166
167 tmp_pixmap[FILLBLKSTART+14] = XCreateBitmapFromData(display,playfield, b35_bits,
168 block_width, block_height);
169
170 tmp_pixmap[FILLBLKSTART+15] = XCreateBitmapFromData(display,playfield, b41_bits,
171 block_width, block_height);
172
173 tmp_pixmap[FILLBLKSTART+16] = XCreateBitmapFromData(display,playfield, b42_bits,
174 block_width, block_height);
175
176 tmp_pixmap[FILLBLKSTART+17] = XCreateBitmapFromData(display,playfield, b43_bits,
177 block_width, block_height);
178
179 tmp_pixmap[FILLBLKSTART+18] = XCreateBitmapFromData(display,playfield, b44_bits,
180 block_width, block_height);
181
182 tmp_pixmap[FILLBLKSTART+19] = XCreateBitmapFromData(display,playfield, b45_bits,
183 block_width, block_height);
184
185 tmp_pixmap[FILLBLKSTART+20] = XCreateBitmapFromData(display,playfield, b51_bits,
186 block_width, block_height);
187
188 tmp_pixmap[FILLBLKSTART+21] = XCreateBitmapFromData(display,playfield, b52_bits,
189 block_width, block_height);
190
191 tmp_pixmap[FILLBLKSTART+22] = XCreateBitmapFromData(display,playfield, b53_bits,
192 block_width, block_height);
193
194 tmp_pixmap[FILLBLKSTART+23] = XCreateBitmapFromData(display,playfield, b54_bits,
195 block_width, block_height);
196
197 tmp_pixmap[FILLBLKSTART+24] = XCreateBitmapFromData(display,playfield, b55_bits,
198 block_width, block_height);
199
200 tmp_pixmap[FILLBLKSTART+25] = XCreateBitmapFromData(display,playfield, b61_bits,
201 block_width, block_height);
202
203 tmp_pixmap[FILLBLKSTART+26] = XCreateBitmapFromData(display,playfield, b62_bits,
204 block_width, block_height);
205
206 tmp_pixmap[FILLBLKSTART+27] = XCreateBitmapFromData(display,playfield, b63_bits,
207 block_width, block_height);
208
209 tmp_pixmap[FILLBLKSTART+28] = XCreateBitmapFromData(display,playfield, b64_bits,
210 block_width, block_height);
211
212 tmp_pixmap[FILLBLKSTART+29] = XCreateBitmapFromData(display,playfield, b65_bits,
213 block_width, block_height);
214
215 tmp_pixmap[FILLBLKSTART+30] = XCreateBitmapFromData(display,playfield, b71_bits,
216 block_width, block_height);
217
218 tmp_pixmap[FILLBLKSTART+31] = XCreateBitmapFromData(display,playfield, b72_bits,
219 block_width, block_height);
220
221 tmp_pixmap[FILLBLKSTART+32] = XCreateBitmapFromData(display,playfield, b73_bits,
222 block_width, block_height);
223
224 tmp_pixmap[FILLBLKSTART+33] = XCreateBitmapFromData(display,playfield, b74_bits,
225 block_width, block_height);
226
227 tmp_pixmap[FILLBLKSTART+34] = XCreateBitmapFromData(display,playfield, b75_bits,
228 block_width, block_height);
229
230 tmp_pixmap[FILLBLKSTART+35] = XCreateBitmapFromData(display,playfield, b76_bits,
231 block_width, block_height);
232
233 tmp_pixmap[FILLBLKSTART+36] = XCreateBitmapFromData(display,playfield, b77_bits,
234 block_width, block_height);
235
236 tmp_pixmap[FILLBLKSTART+37] = XCreateBitmapFromData(display,playfield, b78_bits,
237 block_width, block_height);
238
239 tmp_pixmap[FILLBLKSTART+38] = XCreateBitmapFromData(display,playfield, b79_bits,
240 block_width, block_height);
241
242 tmp_pixmap[FILLBLKSTART+39] = XCreateBitmapFromData(display,playfield, b7a_bits,
243 block_width, block_height);
244
245 tmp_pixmap[FILLBLKSTART+40] = XCreateBitmapFromData(display,playfield, b81_bits,
246 block_width, block_height);
247
248 tmp_pixmap[FILLBLKSTART+41] = XCreateBitmapFromData(display,playfield, b82_bits,
249 block_width, block_height);
250
251 tmp_pixmap[FILLBLKSTART+42] = XCreateBitmapFromData(display,playfield, b83_bits,
252 block_width, block_height);
253
254 tmp_pixmap[FILLBLKSTART+43] = XCreateBitmapFromData(display,playfield, b84_bits,
255 block_width, block_height);
256
257 tmp_pixmap[FILLBLKSTART+44] = XCreateBitmapFromData(display,playfield, b85_bits,
258 block_width, block_height);
259
260 tmp_pixmap[FILLBLKSTART+45] = XCreateBitmapFromData(display,playfield, b91_bits,
261 block_width, block_height);
262
263 tmp_pixmap[FILLBLKSTART+46] = XCreateBitmapFromData(display,playfield, b92_bits,
264 block_width, block_height);
265
266 tmp_pixmap[FILLBLKSTART+47] = XCreateBitmapFromData(display,playfield, b93_bits,
267 block_width, block_height);
268
269 tmp_pixmap[FILLBLKSTART+48] = XCreateBitmapFromData(display,playfield, b94_bits,
270 block_width, block_height);
271
272 tmp_pixmap[FILLBLKSTART+49] = XCreateBitmapFromData(display,playfield, b95_bits,
273 block_width, block_height);
274
275 tmp_pixmap[OBSRT] = XCreateBitmapFromData(display,playfield, ob1_bits,
276 block_width, block_height);
277
278 tmp_pixmap[OBSRT+1] = XCreateBitmapFromData(display,playfield, ob2_bits,
279 block_width, block_height);
280
281 tmp_pixmap[OBSRT+2] = XCreateBitmapFromData(display,playfield, ob3_bits,
282 block_width, block_height);
283
284 tmp_pixmap[OBSRT+3] = XCreateBitmapFromData(display,playfield, ob4_bits,
285 block_width, block_height);
286
287 tmp_pixmap[OBSRT+4] = XCreateBitmapFromData(display,playfield, ob5_bits,
288 block_width, block_height);
289
290 tmp_pixmap[OBSRT+5] = XCreateBitmapFromData(display,playfield, ob6_bits,
291 block_width, block_height);
292
293 tmp_pixmap[OBSFIN] = XCreateBitmapFromData(display,playfield, ob7_bits,
294 block_width, block_height);
295
296 tmp_pixmap[SHOWFLOW] = XCreateBitmapFromData(display,playfield, fbar_bits,
297 fbar_width, fbar_height);
298
299 tmp_pixmap[SHOWFLOW+1] = XCreateBitmapFromData(display,playfield, fbar1_bits,
300 fbar_width, fbar_height);
301
302 tmp_pixmap[SHOWFLOW+2] = XCreateBitmapFromData(display,playfield, fbar2_bits,
303 fbar_width, fbar_height);
304
305 tmp_pixmap[SHOWFLOW+3] = XCreateBitmapFromData(display,playfield, flowst_bits,
306 flowst_width, flowst_height);
307
308 tmp_pixmap[START] = XCreateBitmapFromData(display,playfield, start_bits,
309 start_width, start_height);
310
311 tmp_pixmap[STARTFULL] = XCreateBitmapFromData(display,playfield, startfull_bits,
312 startfull_width, startfull_height);
313
314 tmp_pixmap[ARROW] = XCreateBitmapFromData(display,playfield, arrow_bits,
315 arrow_width, arrow_height);
316
317 tmp_pixmap[BAR] = XCreateBitmapFromData(display,playfield, bar_bits,
318 bar_width, bar_height);
319
320 XtSetArg(arg,XtNiconPixmap,iconP);
321 XtSetValues(top_shell,&arg,1);
322 }
323
324
325 /*----------------------------------------------------------------------*/
326
display_allpixmaps()327 void display_allpixmaps()
328 {
329 /* displays all the pixmaps used to construct the pipe and their filling*/
330 int x,y;
331 for (x=1 ; x < 10; x++)
332 pipe_board[x-1][0]=x;
333
334 for (x=2 ; x<8; x++)
335 for (y=1; y<6; y++)
336 pipe_board[x-2][y]= (x*5) +(y-1);
337 x=8;
338 for (y=1; y<10; y++)
339 pipe_board[x-2][y]= (x*5) +(y-1);
340 for (x=9 ; x<11; x++)
341 for (y=1; y<6; y++)
342 pipe_board[x-2][y]= (x*5) +(y-1) + 5;
343 display_level();
344 }
345 /*----------------------------------------------------------------------*/
346
347 void
display_level()348 display_level()
349 {
350 /* Naive refresh algorithm.... */
351 int x,y;
352
353 XClearWindow(display,playfield);
354 for(y=0;y<MAXY;y++)
355 {
356 for(x=0;x<MAXX;x++)
357 if (pipe_board[x][y] < (BAR+1))
358 {
359 XCopyPlane(display,tmp_pixmap[pipe_board[x][y]],playfield,gc,0,0,
360 block_width,block_height,
361 pos_to_coord(x),pos_to_coord(y),1);
362 }
363 }
364
365 if (INXRANGE(block_x) && INYRANGE(block_y)) /*overlay current block */
366 XCopyPlane(display,tmp_pixmap[current_block],playfield,gc,0,0,
367 block_width,block_height,
368 pos_to_coord(block_x),pos_to_coord(block_y),1);
369
370 }
371 /*----------------------------------------------------------------------*/
372
373 void
redisplay_sequence()374 redisplay_sequence()
375 {
376 /* Naive refresh algorithm.... for sequence */
377 int x=(MAXX-2),y;
378 for(y=0;y<MAXY;y++)
379 {
380 if (pipe_board[x][y] < (BAR+1))
381 {
382 XCopyPlane(display,tmp_pixmap[pipe_board[x][y]],playfield,gc,0,0,
383 block_width,block_height,
384 pos_to_coord(x),pos_to_coord(y),1);
385 }
386 }
387 x = MAXX -3 ; y = MAXY -1;
388 if (pipe_board[x][y] < (BAR+1))
389 {
390 XCopyPlane(display,tmp_pixmap[pipe_board[x][y]],playfield,gc,0,0,
391 block_width,block_height,
392 pos_to_coord(x),pos_to_coord(y),1);
393 }
394 }
395 /*----------------------------------------------------------------------*/
396
397 void
redraw_block(x,y)398 redraw_block(x,y)
399 {
400 /*redraws a single block*/
401 XCopyPlane(display,tmp_pixmap[pipe_board[x][y]],playfield,gc,0,0,
402 block_width,block_height,
403 pos_to_coord(x),pos_to_coord(y),1);
404
405 }
406 /*----------------------------------------------------------------------*/
407
408 void
show_movement()409 show_movement()
410 {
411 /*
412 * redraws previous position and overlays current block on new position.
413 */
414 int x,y;
415
416 if (INXRANGE(last_block_x) && INYRANGE(last_block_y))
417 redraw_block(last_block_x,last_block_y);
418
419
420 if (INXRANGE(block_x) && INYRANGE(block_y))
421 XCopyPlane(display,tmp_pixmap[current_block],playfield,gc,0,0,
422 block_width,block_height,
423 pos_to_coord(block_x),pos_to_coord(block_y),1);
424
425 }
426
427 /*----------------------------------------------------------------------*/
428
429 /*ARGSUSED*/
430 XtEventHandler
redisplay_level(w,closure,event)431 redisplay_level(w, closure, event)
432 Widget w;
433 caddr_t closure;
434 XExposeEvent *event;
435 {
436 /* refresh entire screen -- e.g. expose events. Just a little naive. */
437 display_level();
438 XFlush(display);
439 }
440
441 /*----------------------------------------------------------------------*/
442
free_pixmaps()443 void free_pixmaps()
444 {
445 int i;
446
447 for(i=0;i<NUM_TMP_CURSOR_PIXMAPS;i++)
448 XFreePixmap(display,tmp_pixmap[i]);
449
450 }
451
452
453
454 /*----------------------------------------------------------------------*/
455
456
457
458