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.
41 #include "screenhack.h"
43 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
45 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
48 #define countof(x) (sizeof((x))/sizeof((*x)))
50 static const char *kumppa_defaults [] ={
55 /* leave this off by default, since it slows things down. -- jwz. */
60 static XrmOptionDescRec kumppa_options [] = {
61 {"-delay", ".delay", XrmoptionSepArg, 0 },
62 {"-speed", ".speed", XrmoptionSepArg, 0 },
63 {"-random", ".random", XrmoptionNoArg, "True" },
64 {"-no-random", ".random", XrmoptionNoArg, "False" },
65 {"-db", ".useDBE", XrmoptionNoArg, "True" },
66 {"-no-db", ".useDBE", XrmoptionNoArg, "False" },
70 static const unsigned char colors[96]=
71 {0,0,255, 0,51,255, 0,102,255, 0,153,255, 0,204,255,
72 0,255,255,0,255,204, 0,255,153, 0,255,102, 0,255,51,
73 0,255,0, 51,255,0, 102,255,0, 153,255,0, 204,255,0,
74 255,255,0, 255,204,0, 255,153,0, 255,102,0, 255,51,0,
75 255,0,0, 255,0,51, 255,0,102, 255,0,153, 255,0,204,
76 255,0,255, 219,0,255, 182,0,255, 146,0,255, 109,0,255,
78 static const float cosinus[8][6]=
79 {{-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}};
107 int rotsizeX,rotsizeY;
112 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
115 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
121 static int Satnum(int maxi)
123 return (int)(maxi*frand(1));
127 static void palaRotate(struct state *st, int x,int y)
129 int ax,ay,bx,by,cx,cy;
133 bx=st->rotateX[x+1]+2;
134 by=st->rotateY[y+1]+2;
135 cx=st->rotateX[x]-(y-st->ry)+x-st->rx;
136 cy=st->rotateY[y]+(x-st->rx)+y-st->ry;
147 if (cx+bx-ax>st->sizx) bx=ax-cx+st->sizx;
148 if (cy+by-ay>st->sizy) by=ay-cy+st->sizy;
150 XCopyArea(st->dpy,st->win[0],st->win[1],st->cgc,ax,ay,bx-ax,by-ay,cx,cy);
154 static void rotate(struct state *st)
159 st->rx=st->Xrottable[st->stateX+1]-st->Xrottable[st->stateX];
160 st->ry=st->Yrottable[st->stateY+1]-st->Yrottable[st->stateY];
163 for (x=0;x<=st->rx;x++)
164 st->rotateX[x]=(x)?st->midx-1-st->Xrotations[st->Xrottable[st->stateX+1]-x]:0;
165 for (x=0;x<=st->rx;x++)
166 st->rotateX[x+st->rx+1]=(x==st->rx)?st->sizx-1:st->midx+st->Xrotations[st->Xrottable[st->stateX]+x];
167 for (y=0;y<=st->ry;y++)
168 st->rotateY[y]=(y)?st->midy-1-st->Yrotations[st->Yrottable[st->stateY+1]-y]:0;
169 for (y=0;y<=st->ry;y++)
170 st->rotateY[y+st->ry+1]=(y==st->ry)?st->sizy-1:st->midy+st->Yrotations[st->Yrottable[st->stateY]+y];
172 x=(st->rx>st->ry)?st->rx:st->ry;
173 for (dy=0;dy<(x+1)<<1;dy++)
174 for (dx=0;dx<(x+1)<<1;dx++)
176 y=(st->rx>st->ry)?st->ry-st->rx:0;
177 if (dy+y>=0 && dy<(st->ry+1)<<1 && dx<(st->rx+1)<<1)
178 if (dy+y+dx<=st->ry+st->rx && dy+y-dx<=st->ry-st->rx)
180 palaRotate(st, (st->rx<<1)+1-dx,dy+y);
181 palaRotate(st, dx,(st->ry<<1)+1-dy-y);
183 y=(st->ry>st->rx)?st->rx-st->ry:0;
184 if (dy+y>=0 && dx<(st->ry+1)<<1 && dy<(st->rx+1)<<1)
185 if (dy+y+dx<=st->ry+st->rx && dx-dy-y>=st->ry-st->rx)
187 palaRotate(st, dy+y,dx);
188 palaRotate(st, (st->rx<<1)+1-dy-y,(st->ry<<1)+1-dx);
192 if (st->stateX==st->rotsizeX) st->stateX=0;
194 if (st->stateY==st->rotsizeY) st->stateY=0;
199 static Bool make_rots(struct state *st, double xspeed,double yspeed)
201 int a,b,c,f,g,j,k=0,l;
208 st->rotsizeX=(int)(2/xspeed+1);
209 ix=(double)(st->midx+1)/(double)(st->rotsizeX);
210 st->rotsizeY=(int)(2/yspeed+1);
211 iy=(double)(st->midy+1)/(double)(st->rotsizeY);
213 st->Xrotations=malloc((st->midx+2)*sizeof(unsigned int));
214 st->Xrottable=malloc((st->rotsizeX+1)*sizeof(unsigned int));
215 st->Yrotations=malloc((st->midy+2)*sizeof(unsigned int));
216 st->Yrottable=malloc((st->rotsizeY+1)*sizeof(unsigned int));
217 chks=malloc(((st->midx>st->midy)?st->midx:st->midy)*sizeof(Bool));
218 if (!st->Xrottable || !st->Yrottable || !st->Xrotations || !st->Yrotations || !chks) return False;
225 for (a=0;a<st->midx;a++) chks[a]=True;
226 for (a=0;a<st->rotsizeX;a++)
229 f=(int)(d+ix)-g; /*viivojen lkm.*/
239 for (j=0;j<st->midx;j++) /*testi*/
246 while (j+l<st->midx && om+12*ok>m)
248 if (j-l>=0) if (chks[j-l]) om+=ok;
249 else; else if (chks[l-j]) om+=ok;
250 if (chks[j+l]) om+=ok;
263 while (l>=st->Xrottable[a])
265 if (l!=st->Xrottable[a]) st->Xrotations[l]=st->Xrotations[l-1];
266 if (k>st->Xrotations[l] || l==st->Xrottable[a])
276 if (maxi<c-st->Xrottable[a]) maxi=c-st->Xrottable[a];
279 st->rotateX=malloc((maxi+2)*sizeof(int)<<1);
280 if (!st->rotateX) return False;
286 for (a=0;a<st->midy;a++) chks[a]=True;
287 for (a=0;a<st->rotsizeY;a++)
290 f=(int)(d+iy)-g; /*viivojen lkm.*/
300 for (j=0;j<st->midy;j++) /*testi*/
307 while (j+l<st->midy && om+12*ok>m)
309 if (j-l>=0) if (chks[j-l]) om+=ok;
310 else; else if (chks[l-j]) om+=ok;
311 if (chks[j+l]) om+=ok;
324 while (l>=st->Yrottable[a])
326 if (l!=st->Yrottable[a]) st->Yrotations[l]=st->Yrotations[l-1];
327 if (k>st->Yrotations[l] || l==st->Yrottable[a])
338 if (maxi<c-st->Yrottable[a]) maxi=c-st->Yrottable[a];
341 st->rotateY=malloc((maxi+2)*sizeof(int)<<1);
342 if (!st->rotateY) return False;
349 static Bool InitializeAll(struct state *st)
352 XWindowAttributes xgwa;
353 /* XSetWindowAttributes xswa;*/
359 st->cosilines = True;
361 XGetWindowAttributes(st->dpy,st->win[0],&xgwa);
363 /* xswa.backing_store=Always;
364 XChangeWindowAttributes(st->dpy,st->win[0],CWBackingStore,&xswa);*/
365 xgcv.function=GXcopy;
367 xgcv.foreground=get_pixel_resource (st->dpy, cmap, "background", "Background");
368 st->fgc[32]=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv);
373 st->fgc[0]=st->fgc[32];
374 xgcv.foreground=get_pixel_resource (st->dpy, cmap, "foreground", "Foreground");
375 st->fgc[1]=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv);
376 for (i=0;i<32;i+=2) st->fgc[i]=st->fgc[0];
377 for (i=1;i<32;i+=2) st->fgc[i]=st->fgc[1];
381 color.red=colors[n++]<<8;
382 color.green=colors[n++]<<8;
383 color.blue=colors[n++]<<8;
384 color.flags=DoRed|DoGreen|DoBlue;
385 XAllocColor(st->dpy,cmap,&color);
386 xgcv.foreground=color.pixel;
387 st->fgc[i]=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv);
389 st->cgc=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv);
390 XSetGraphicsExposures(st->dpy,st->cgc,False);
392 st->cosilines = get_boolean_resource(st->dpy, "random","Boolean");
394 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
395 if (get_boolean_resource (st->dpy, "useDBE", "Boolean"))
396 st->usedouble = True;
397 st->win[1] = xdbe_get_backbuffer (st->dpy, st->win[0], XdbeUndefined);
400 st->usedouble = False;
401 st->win[1] = st->win[0];
403 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
405 st->delay=get_integer_resource(st->dpy, "delay","Integer");
406 rspeed=get_float_resource(st->dpy, "speed","Float");
407 if (rspeed<0.0001 || rspeed>0.2)
409 fprintf(stderr,"Speed not in valid range! (0.0001 - 0.2), using 0.1 \n");
414 st->sizy=xgwa.height;
415 st->midx=st->sizx>>1;
416 st->midy=st->sizy>>1;
420 if (!make_rots(st,rspeed,rspeed))
422 fprintf(stderr,"Not enough memory for tables!\n");
429 kumppa_init (Display *d, Window w)
431 struct state *st = (struct state *) calloc (1, sizeof(*st));
434 if (!InitializeAll(st)) abort();
436 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
439 st->xdswp.swap_action=XdbeUndefined;
440 st->xdswp.swap_window=st->win[0];
443 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
444 st->win[1]=st->win[0];
450 kumppa_draw (Display *d, Window w, void *closure)
452 struct state *st = (struct state *) closure;
463 st->acosinus[a][b]+=cosinus[a][b];
464 f+=cosinus[a][b+3]*sin((double)st->acosinus[a][b]);
466 st->coords[a]=(int)f;
470 XDrawLine(st->dpy,st->win[0],(mono_p)?st->fgc[1]:st->fgc[((a<<2)+st->draw_count)&31],st->midx+st->ocoords[a<<1],st->midy+st->ocoords[(a<<1)+1]
471 ,st->midx+st->coords[a<<1],st->midy+st->coords[(a<<1)+1]);
472 st->ocoords[a<<1]=st->coords[a<<1];
473 st->ocoords[(a<<1)+1]=st->coords[(a<<1)+1];
483 b=Satnum(32)-16+st->midx;
484 st->draw_count=Satnum(32)-16+st->midy;
485 XFillRectangle(st->dpy,st->win[0],st->fgc[a],b,st->draw_count,2,2);
488 XFillRectangle(st->dpy,st->win[0],st->fgc[32],st->midx-2,st->midy-2,4,4);
490 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
491 if (st->usedouble) XdbeSwapBuffers(st->dpy,&st->xdswp,1);
492 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
499 kumppa_reshape (Display *dpy, Window window, void *closure,
500 unsigned int w, unsigned int h)
502 struct state *st = (struct state *) closure;
505 st->midx=st->sizx>>1;
506 st->midy=st->sizy>>1;
512 kumppa_event (Display *dpy, Window window, void *closure, XEvent *event)
518 kumppa_free (Display *dpy, Window window, void *closure)
520 struct state *st = (struct state *) closure;
522 for (i = 0; i < countof(st->fgc); i++)
523 if (st->fgc[i]) XFreeGC (dpy, st->fgc[i]);
524 XFreeGC (dpy, st->cgc);
525 free (st->Xrotations);
526 free (st->Yrotations);
527 free (st->Xrottable);
528 free (st->Yrottable);
532 XSCREENSAVER_MODULE ("Kumppa", kumppa)