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 [] ={
56 /* leave this off by default, since it slows things down. -- jwz. */
61 static XrmOptionDescRec kumppa_options [] = {
62 {"-delay", ".delay", XrmoptionSepArg, 0 },
63 {"-speed", ".speed", XrmoptionSepArg, 0 },
64 {"-random", ".random", XrmoptionNoArg, "True" },
65 {"-no-random", ".random", XrmoptionNoArg, "False" },
66 {"-db", ".useDBE", XrmoptionNoArg, "True" },
67 {"-no-db", ".useDBE", XrmoptionNoArg, "False" },
71 static const unsigned 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 static const float cosinus[8][6]=
80 {{-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},
81 {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},
82 {-0.02,-0.04,-0.13,34,20,15}};
108 int rotsizeX,rotsizeY;
113 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
116 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
122 static int Satnum(int maxi)
124 return (int)(maxi*frand(1));
128 static void palaRotate(struct state *st, int x,int y)
130 int ax,ay,bx,by,cx,cy;
134 bx=st->rotateX[x+1]+2;
135 by=st->rotateY[y+1]+2;
136 cx=st->rotateX[x]-(y-st->ry)+x-st->rx;
137 cy=st->rotateY[y]+(x-st->rx)+y-st->ry;
148 if (cx+bx-ax>st->sizx) bx=ax-cx+st->sizx;
149 if (cy+by-ay>st->sizy) by=ay-cy+st->sizy;
151 XCopyArea(st->dpy,st->win[0],st->win[1],st->cgc,ax,ay,bx-ax,by-ay,cx,cy);
155 static void rotate(struct state *st)
160 st->rx=st->Xrottable[st->stateX+1]-st->Xrottable[st->stateX];
161 st->ry=st->Yrottable[st->stateY+1]-st->Yrottable[st->stateY];
164 for (x=0;x<=st->rx;x++)
165 st->rotateX[x]=(x)?st->midx-1-st->Xrotations[st->Xrottable[st->stateX+1]-x]:0;
166 for (x=0;x<=st->rx;x++)
167 st->rotateX[x+st->rx+1]=(x==st->rx)?st->sizx-1:st->midx+st->Xrotations[st->Xrottable[st->stateX]+x];
168 for (y=0;y<=st->ry;y++)
169 st->rotateY[y]=(y)?st->midy-1-st->Yrotations[st->Yrottable[st->stateY+1]-y]:0;
170 for (y=0;y<=st->ry;y++)
171 st->rotateY[y+st->ry+1]=(y==st->ry)?st->sizy-1:st->midy+st->Yrotations[st->Yrottable[st->stateY]+y];
173 x=(st->rx>st->ry)?st->rx:st->ry;
174 for (dy=0;dy<(x+1)<<1;dy++)
175 for (dx=0;dx<(x+1)<<1;dx++)
177 y=(st->rx>st->ry)?st->ry-st->rx:0;
178 if (dy+y>=0 && dy<(st->ry+1)<<1 && dx<(st->rx+1)<<1)
179 if (dy+y+dx<=st->ry+st->rx && dy+y-dx<=st->ry-st->rx)
181 palaRotate(st, (st->rx<<1)+1-dx,dy+y);
182 palaRotate(st, dx,(st->ry<<1)+1-dy-y);
184 y=(st->ry>st->rx)?st->rx-st->ry:0;
185 if (dy+y>=0 && dx<(st->ry+1)<<1 && dy<(st->rx+1)<<1)
186 if (dy+y+dx<=st->ry+st->rx && dx-dy-y>=st->ry-st->rx)
188 palaRotate(st, dy+y,dx);
189 palaRotate(st, (st->rx<<1)+1-dy-y,(st->ry<<1)+1-dx);
193 if (st->stateX==st->rotsizeX) st->stateX=0;
195 if (st->stateY==st->rotsizeY) st->stateY=0;
200 static Bool make_rots(struct state *st, double xspeed,double yspeed)
202 int a,b,c,f,g,j,k=0,l;
209 st->rotsizeX=(int)(2/xspeed+1);
210 ix=(double)(st->midx+1)/(double)(st->rotsizeX);
211 st->rotsizeY=(int)(2/yspeed+1);
212 iy=(double)(st->midy+1)/(double)(st->rotsizeY);
214 st->Xrotations=malloc((st->midx+2)*sizeof(unsigned int));
215 st->Xrottable=malloc((st->rotsizeX+1)*sizeof(unsigned int));
216 st->Yrotations=malloc((st->midy+2)*sizeof(unsigned int));
217 st->Yrottable=malloc((st->rotsizeY+1)*sizeof(unsigned int));
218 chks=malloc(((st->midx>st->midy)?st->midx:st->midy)*sizeof(Bool));
219 if (!st->Xrottable || !st->Yrottable || !st->Xrotations || !st->Yrotations || !chks) return False;
226 for (a=0;a<st->midx;a++) chks[a]=True;
227 for (a=0;a<st->rotsizeX;a++)
230 f=(int)(d+ix)-g; /*viivojen lkm.*/
240 for (j=0;j<st->midx;j++) /*testi*/
247 while (j+l<st->midx && om+12*ok>m)
249 if (j-l>=0) if (chks[j-l]) om+=ok;
250 else; else if (chks[l-j]) om+=ok;
251 if (chks[j+l]) om+=ok;
264 while (l>=st->Xrottable[a])
266 if (l!=st->Xrottable[a]) st->Xrotations[l]=st->Xrotations[l-1];
267 if (k>st->Xrotations[l] || l==st->Xrottable[a])
277 if (maxi<c-st->Xrottable[a]) maxi=c-st->Xrottable[a];
280 st->rotateX=malloc((maxi+2)*sizeof(int)<<1);
281 if (!st->rotateX) return False;
287 for (a=0;a<st->midy;a++) chks[a]=True;
288 for (a=0;a<st->rotsizeY;a++)
291 f=(int)(d+iy)-g; /*viivojen lkm.*/
301 for (j=0;j<st->midy;j++) /*testi*/
308 while (j+l<st->midy && om+12*ok>m)
310 if (j-l>=0) if (chks[j-l]) om+=ok;
311 else; else if (chks[l-j]) om+=ok;
312 if (chks[j+l]) om+=ok;
325 while (l>=st->Yrottable[a])
327 if (l!=st->Yrottable[a]) st->Yrotations[l]=st->Yrotations[l-1];
328 if (k>st->Yrotations[l] || l==st->Yrottable[a])
339 if (maxi<c-st->Yrottable[a]) maxi=c-st->Yrottable[a];
342 st->rotateY=malloc((maxi+2)*sizeof(int)<<1);
343 if (!st->rotateY) return False;
350 static Bool InitializeAll(struct state *st)
353 XWindowAttributes xgwa;
354 /* XSetWindowAttributes xswa;*/
360 st->cosilines = True;
362 XGetWindowAttributes(st->dpy,st->win[0],&xgwa);
364 /* xswa.backing_store=Always;
365 XChangeWindowAttributes(st->dpy,st->win[0],CWBackingStore,&xswa);*/
366 xgcv.function=GXcopy;
368 xgcv.foreground=get_pixel_resource (st->dpy, cmap, "background", "Background");
369 st->fgc[32]=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv);
374 st->fgc[0]=st->fgc[32];
375 xgcv.foreground=get_pixel_resource (st->dpy, cmap, "foreground", "Foreground");
376 st->fgc[1]=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv);
377 for (i=0;i<32;i+=2) st->fgc[i]=st->fgc[0];
378 for (i=1;i<32;i+=2) st->fgc[i]=st->fgc[1];
382 color.red=colors[n++]<<8;
383 color.green=colors[n++]<<8;
384 color.blue=colors[n++]<<8;
385 color.flags=DoRed|DoGreen|DoBlue;
386 XAllocColor(st->dpy,cmap,&color);
387 xgcv.foreground=color.pixel;
388 st->fgc[i]=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv);
390 st->cgc=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv);
391 XSetGraphicsExposures(st->dpy,st->cgc,False);
393 st->cosilines = get_boolean_resource(st->dpy, "random","Boolean");
395 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
396 if (get_boolean_resource (st->dpy, "useDBE", "Boolean"))
397 st->usedouble = True;
398 st->win[1] = xdbe_get_backbuffer (st->dpy, st->win[0], XdbeUndefined);
401 st->usedouble = False;
402 st->win[1] = st->win[0];
404 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
406 st->delay=get_integer_resource(st->dpy, "delay","Integer");
407 rspeed=get_float_resource(st->dpy, "speed","Float");
408 if (rspeed<0.0001 || rspeed>0.2)
410 fprintf(stderr,"Speed not in valid range! (0.0001 - 0.2), using 0.1 \n");
415 st->sizy=xgwa.height;
416 st->midx=st->sizx>>1;
417 st->midy=st->sizy>>1;
421 if (!make_rots(st,rspeed,rspeed))
423 fprintf(stderr,"Not enough memory for tables!\n");
430 kumppa_init (Display *d, Window w)
432 struct state *st = (struct state *) calloc (1, sizeof(*st));
435 if (!InitializeAll(st)) abort();
437 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
440 st->xdswp.swap_action=XdbeUndefined;
441 st->xdswp.swap_window=st->win[0];
444 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
445 st->win[1]=st->win[0];
451 kumppa_draw (Display *d, Window w, void *closure)
453 struct state *st = (struct state *) closure;
464 st->acosinus[a][b]+=cosinus[a][b];
465 f+=cosinus[a][b+3]*sin((double)st->acosinus[a][b]);
467 st->coords[a]=(int)f;
471 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]
472 ,st->midx+st->coords[a<<1],st->midy+st->coords[(a<<1)+1]);
473 st->ocoords[a<<1]=st->coords[a<<1];
474 st->ocoords[(a<<1)+1]=st->coords[(a<<1)+1];
484 b=Satnum(32)-16+st->midx;
485 st->draw_count=Satnum(32)-16+st->midy;
486 XFillRectangle(st->dpy,st->win[0],st->fgc[a],b,st->draw_count,2,2);
489 XFillRectangle(st->dpy,st->win[0],st->fgc[32],st->midx-2,st->midy-2,4,4);
491 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
492 if (st->usedouble) XdbeSwapBuffers(st->dpy,&st->xdswp,1);
493 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
500 kumppa_reshape (Display *dpy, Window window, void *closure,
501 unsigned int w, unsigned int h)
503 struct state *st = (struct state *) closure;
506 st->midx=st->sizx>>1;
507 st->midy=st->sizy>>1;
513 kumppa_event (Display *dpy, Window window, void *closure, XEvent *event)
519 kumppa_free (Display *dpy, Window window, void *closure)
521 struct state *st = (struct state *) closure;
523 for (i = 0; i < countof(st->fgc); i++)
524 if (st->fgc[i]) XFreeGC (dpy, st->fgc[i]);
525 XFreeGC (dpy, st->cgc);
526 free (st->Xrotations);
527 free (st->Yrotations);
528 free (st->Xrottable);
529 free (st->Yrottable);
533 XSCREENSAVER_MODULE ("Kumppa", kumppa)