3 Copyright (C) Teemu Suutari (temisu@utu.fi) Feb 1998
5 Permission is hereby granted, free of charge, to any person obtaining
6 a copy of this software and associated documentation files (the
7 "Software"), to deal in the Software without restriction, including
8 without limitation the rights to use, copy, modify, merge, publish,
9 distribute, sublicense, and/or sell copies of the Software, and to
10 permit persons to whom the Software is furnished to do so, subject to
11 the following conditions:
13 The above copyright notice and this permission notice shall be included
14 in all copies or substantial portions of the Software.
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19 IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 OTHER DEALINGS IN THE SOFTWARE.
24 Except as contained in this notice, the name of the X Consortium shall
25 not be used in advertising or otherwise to promote the sale, use or
26 other dealings in this Software without prior written authorization
27 from the X Consortium.
36 *** This is contest-version. Don't look any further, code is *very* ugly.
42 #include "screenhack.h"
44 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
46 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
48 char *progclass="Kumppa";
54 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
55 /* leave this off by default, since it slows things down. -- jwz. */
57 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
61 XrmOptionDescRec options [] = {
62 {"-delay",".delay",XrmoptionSepArg,0},
63 {"-speed",".speed",XrmoptionSepArg,0},
64 {"-random",".random",XrmoptionIsArg,0},
65 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
66 {"-dbuf",".dbuf",XrmoptionIsArg,0},
67 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
71 const char colors[96]=
72 {0,0,255, 0,51,255, 0,102,255, 0,153,255, 0,204,255,
73 0,255,255,0,255,204, 0,255,153, 0,255,102, 0,255,51,
74 0,255,0, 51,255,0, 102,255,0, 153,255,0, 204,255,0,
75 255,255,0, 255,204,0, 255,153,0, 255,102,0, 255,51,0,
76 255,0,0, 255,0,51, 255,0,102, 255,0,153, 255,0,204,
77 255,0,255, 219,0,255, 182,0,255, 146,0,255, 109,0,255,
79 const float cosinus[8][6]={{-0.07,0.12,-0.06,32,25,37},{0.08,-0.03,0.05,51,46,32},{0.12,0.07,-0.13,27,45,36},
80 {0.05,-0.04,-0.07,36,27,39},{-0.02,-0.07,0.1,21,43,42},{-0.11,0.06,0.02,51,25,34},{0.04,-0.15,0.02,42,32,25},
81 {-0.02,-0.04,-0.13,34,20,15}};
83 static float acosinus[8][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}};
85 static int ocoords[8]={0,0,0,0,0,0,0,0};
93 static unsigned long delay;
94 static Bool cosilines=True;
95 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
96 static Bool usedouble=False;
97 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
99 static int *Xrotations;
100 static int *Yrotations;
101 static int *Xrottable;
102 static int *Yrottable;
107 static int rotsizeX,rotsizeY;
108 static int stateX,stateY;
115 return (int)(maxi*frand(1));
119 void palaRotate(int x,int y)
121 int ax,ay,bx,by,cx,cy;
127 cx=rotateX[x]-(y-ry)+x-rx;
128 cy=rotateY[y]+(x-rx)+y-ry;
139 if (cx+bx-ax>sizx) bx=ax-cx+sizx;
140 if (cy+by-ay>sizy) by=ay-cy+sizy;
142 XCopyArea(dpy,win[0],win[1],cgc,ax,ay,bx-ax,by-ay,cx,cy);
151 rx=Xrottable[stateX+1]-Xrottable[stateX];
152 ry=Yrottable[stateY+1]-Yrottable[stateY];
156 rotateX[x]=(x)?midx-1-Xrotations[Xrottable[stateX+1]-x]:0;
158 rotateX[x+rx+1]=(x==rx)?sizx-1:midx+Xrotations[Xrottable[stateX]+x];
160 rotateY[y]=(y)?midy-1-Yrotations[Yrottable[stateY+1]-y]:0;
162 rotateY[y+ry+1]=(y==ry)?sizy-1:midy+Yrotations[Yrottable[stateY]+y];
165 for (dy=0;dy<(x+1)<<1;dy++)
166 for (dx=0;dx<(x+1)<<1;dx++)
169 if (dy+y>=0 && dy<(ry+1)<<1 && dx<(rx+1)<<1)
170 if (dy+y+dx<=ry+rx && dy+y-dx<=ry-rx)
172 palaRotate((rx<<1)+1-dx,dy+y);
173 palaRotate(dx,(ry<<1)+1-dy-y);
176 if (dy+y>=0 && dx<(ry+1)<<1 && dy<(rx+1)<<1)
177 if (dy+y+dx<=ry+rx && dx-dy-y>=ry-rx)
180 palaRotate((rx<<1)+1-dy-y,(ry<<1)+1-dx);
184 if (stateX==rotsizeX) stateX=0;
186 if (stateY==rotsizeY) stateY=0;
191 Bool make_rots(double xspeed,double yspeed)
193 int a,b,c,f,g,j,k=0,l;
200 rotsizeX=(int)(2/xspeed+1);
201 ix=(double)(midx+1)/(double)(rotsizeX);
202 rotsizeY=(int)(2/yspeed+1);
203 iy=(double)(midy+1)/(double)(rotsizeY);
205 Xrotations=malloc((midx+2)*sizeof(unsigned int));
206 Xrottable=malloc((rotsizeX+1)*sizeof(unsigned int));
207 Yrotations=malloc((midy+2)*sizeof(unsigned int));
208 Yrottable=malloc((rotsizeY+1)*sizeof(unsigned int));
209 chks=malloc(((midx>midy)?midx:midy)*sizeof(Bool));
210 if (!Xrottable || !Yrottable || !Xrotations || !Yrotations || !chks) return False;
217 for (a=0;a<midx;a++) chks[a]=True;
218 for (a=0;a<rotsizeX;a++)
221 f=(int)(d+ix)-g; /*viivojen lkm.*/
231 for (j=0;j<midx;j++) /*testi*/
238 while (j+l<midx && om+12*ok>m)
240 if (j-l>=0) if (chks[j-l]) om+=ok;
241 else; else if (chks[l-j]) om+=ok;
242 if (chks[j+l]) om+=ok;
255 while (l>=Xrottable[a])
257 if (l!=Xrottable[a]) Xrotations[l]=Xrotations[l-1];
258 if (k>Xrotations[l] || l==Xrottable[a])
268 if (maxi<c-Xrottable[a]) maxi=c-Xrottable[a];
271 rotateX=malloc((maxi+2)*sizeof(int)<<1);
272 if (!rotateX) return False;
278 for (a=0;a<midy;a++) chks[a]=True;
279 for (a=0;a<rotsizeY;a++)
282 f=(int)(d+iy)-g; /*viivojen lkm.*/
292 for (j=0;j<midy;j++) /*testi*/
299 while (j+l<midy && om+12*ok>m)
301 if (j-l>=0) if (chks[j-l]) om+=ok;
302 else; else if (chks[l-j]) om+=ok;
303 if (chks[j+l]) om+=ok;
316 while (l>=Yrottable[a])
318 if (l!=Yrottable[a]) Yrotations[l]=Yrotations[l-1];
319 if (k>Yrotations[l] || l==Yrottable[a])
330 if (maxi<c-Yrottable[a]) maxi=c-Yrottable[a];
333 rotateY=malloc((maxi+2)*sizeof(int)<<1);
334 if (!rotateY) return False;
341 Bool InitializeAll(void)
344 XWindowAttributes xgwa;
345 XSetWindowAttributes xswa;
351 XGetWindowAttributes(dpy,win[0],&xgwa);
353 xswa.backing_store=Always;
354 XChangeWindowAttributes(dpy,win[0],CWBackingStore,&xswa);
355 xgcv.function=GXcopy;
357 xgcv.foreground=get_pixel_resource ("background", "Background", dpy, cmap);
358 fgc[32]=XCreateGC(dpy,win[0],GCForeground|GCFunction,&xgcv);
364 xgcv.foreground=get_pixel_resource ("foreground", "Foreground", dpy, cmap);
365 fgc[1]=XCreateGC(dpy,win[0],GCForeground|GCFunction,&xgcv);
366 for (i=0;i<32;i+=2) fgc[i]=fgc[0];
367 for (i=1;i<32;i+=2) fgc[i]=fgc[1];
371 color.red=colors[n++]<<8;
372 color.green=colors[n++]<<8;
373 color.blue=colors[n++]<<8;
374 color.flags=DoRed|DoGreen|DoBlue;
375 XAllocColor(dpy,cmap,&color);
376 xgcv.foreground=color.pixel;
377 fgc[i]=XCreateGC(dpy,win[0],GCForeground|GCFunction,&xgcv);
379 cgc=XCreateGC(dpy,win[0],GCForeground|GCFunction,&xgcv);
380 XSetGraphicsExposures(dpy,cgc,False);
382 if (get_string_resource("random","String")!=NULL && get_string_resource("random","String")[0]!=0) cosilines=False;
384 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
386 win[1] = xdbe_get_backbuffer (dpy, win[0], XdbeUndefined);
392 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
394 delay=get_integer_resource("delay","Integer");
395 rspeed=get_float_resource("speed","Float");
396 if (rspeed<0.0001 || rspeed>0.2)
398 fprintf(stderr,"Speed not in valid range! (0.0001 - 0.2), using 0.1 \n");
409 if (!make_rots(rspeed,rspeed))
411 fprintf(stderr,"Not enough memory for tables!\n");
418 void screenhack(Display *d, Window w)
420 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
422 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
428 if (!InitializeAll()) return;
430 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
433 xdswp.swap_action=XdbeUndefined;
434 xdswp.swap_window=win[0];
437 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
450 acosinus[a][b]+=cosinus[a][b];
451 f+=cosinus[a][b+3]*sin((double)acosinus[a][b]);
457 XDrawLine(dpy,win[0],(mono_p)?fgc[1]:fgc[((a<<2)+c)&31],midx+ocoords[a<<1],midy+ocoords[(a<<1)+1]
458 ,midx+coords[a<<1],midy+coords[(a<<1)+1]);
459 ocoords[a<<1]=coords[a<<1];
460 ocoords[(a<<1)+1]=coords[(a<<1)+1];
468 b=Satnum(32)-16+midx;
469 c=Satnum(32)-16+midy;
470 XFillRectangle(dpy,win[0],fgc[a],b,c,2,2);
473 XFillRectangle(dpy,win[0],fgc[32],midx-2,midy-2,4,4);
475 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
476 if (usedouble) XdbeSwapBuffers(dpy,&xdswp,1);
477 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
479 screenhack_handle_events (dpy);
480 if (delay) usleep (delay);