X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fkumppa.c;h=44df19b41a34cc48854bfef81ec67e5535f27e59;hb=4ade52359b6eba3621566dac79793a33aa4c915f;hp=7e8839265c602c46ed0ffe957c49f8ed30b13c27;hpb=df7adbee81405e2849728a24b498ad2117784b1f;p=xscreensaver diff --git a/hacks/kumppa.c b/hacks/kumppa.c index 7e883926..44df19b4 100644 --- a/hacks/kumppa.c +++ b/hacks/kumppa.c @@ -37,7 +37,6 @@ from the X Consortium. */ - #include #include "screenhack.h" @@ -45,438 +44,493 @@ from the X Consortium. # include "xdbe.h" #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */ -char *progclass="Kumppa"; - -char *defaults [] ={ - ".background: black", - "*speed: 0.1", - "*delay: 0", -#ifdef HAVE_DOUBLE_BUFFER_EXTENSION - /* leave this off by default, since it slows things down. -- jwz. */ - "*useDBE: False", -#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */ - 0 +#undef countof +#define countof(x) (sizeof((x))/sizeof((*x))) + +static const char *kumppa_defaults [] ={ + ".background: black", + "*fpsSolid: true", + "*speed: 0.1", + "*delay: 10000", + "*random: True", + /* leave this off by default, since it slows things down. -- jwz. */ + "*useDBE: False", +#ifdef USE_IPHONE + "*ignoreRotation: True", +#endif + 0 }; -XrmOptionDescRec options [] = { - {"-delay",".delay",XrmoptionSepArg,0}, - {"-speed",".speed",XrmoptionSepArg,0}, - {"-random",".random",XrmoptionIsArg,0}, -#ifdef HAVE_DOUBLE_BUFFER_EXTENSION - {"-dbuf",".dbuf",XrmoptionIsArg,0}, -#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */ - {0,0,0,0} +static XrmOptionDescRec kumppa_options [] = { + {"-delay", ".delay", XrmoptionSepArg, 0 }, + {"-speed", ".speed", XrmoptionSepArg, 0 }, + {"-random", ".random", XrmoptionNoArg, "True" }, + {"-no-random", ".random", XrmoptionNoArg, "False" }, + {"-db", ".useDBE", XrmoptionNoArg, "True" }, + {"-no-db", ".useDBE", XrmoptionNoArg, "False" }, + {0,0,0,0} }; -const char colors[96]= - {0,0,255, 0,51,255, 0,102,255, 0,153,255, 0,204,255, - 0,255,255,0,255,204, 0,255,153, 0,255,102, 0,255,51, - 0,255,0, 51,255,0, 102,255,0, 153,255,0, 204,255,0, - 255,255,0, 255,204,0, 255,153,0, 255,102,0, 255,51,0, - 255,0,0, 255,0,51, 255,0,102, 255,0,153, 255,0,204, - 255,0,255, 219,0,255, 182,0,255, 146,0,255, 109,0,255, - 73,0,255, 37,0,255}; -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}, - {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}, - {-0.02,-0.04,-0.13,34,20,15}}; - -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}}; -static int coords[8]; -static int ocoords[8]={0,0,0,0,0,0,0,0}; - -static Display *dpy; -static Window win[2]; -static GC fgc[33]; -static GC cgc; -static int sizx,sizy; -static int midx,midy; -static unsigned long delay; -static Bool cosilines=True; -#ifdef HAVE_DOUBLE_BUFFER_EXTENSION -static Bool usedouble=False; -#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */ +static const unsigned char colors[96]= + {0,0,255, 0,51,255, 0,102,255, 0,153,255, 0,204,255, + 0,255,255,0,255,204, 0,255,153, 0,255,102, 0,255,51, + 0,255,0, 51,255,0, 102,255,0, 153,255,0, 204,255,0, + 255,255,0, 255,204,0, 255,153,0, 255,102,0, 255,51,0, + 255,0,0, 255,0,51, 255,0,102, 255,0,153, 255,0,204, + 255,0,255, 219,0,255, 182,0,255, 146,0,255, 109,0,255, + 73,0,255, 37,0,255}; +static 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}, + {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}, + {-0.02,-0.04,-0.13,34,20,15}}; + -static int *Xrotations; -static int *Yrotations; -static int *Xrottable; -static int *Yrottable; +struct state { + Display *dpy; + Window win[2]; -static int *rotateX; -static int *rotateY; + float acosinus[8][3]; + int coords[8]; + int ocoords[8]; -static int rotsizeX,rotsizeY; -static int stateX,stateY; + GC fgc[33]; + GC cgc; + int sizx,sizy; + int midx,midy; + unsigned long delay; + Bool cosilines; -static int rx,ry; + int *Xrotations; + int *Yrotations; + int *Xrottable; + int *Yrottable; + int *rotateX; + int *rotateY; -int Satnum(int maxi) + int rotsizeX,rotsizeY; + int stateX,stateY; + + int rx,ry; + +#ifdef HAVE_DOUBLE_BUFFER_EXTENSION + XdbeSwapInfo xdswp; + Bool usedouble; +#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */ + + int draw_count; +}; + + +static int Satnum(int maxi) { -return (int)(maxi*frand(1)); + return (int)(maxi*frand(1)); } -void palaRotate(int x,int y) +static void palaRotate(struct state *st, int x,int y) { -int ax,ay,bx,by,cx,cy; - -ax=rotateX[x]; -ay=rotateY[y]; -bx=rotateX[x+1]+2; -by=rotateY[y+1]+2; -cx=rotateX[x]-(y-ry)+x-rx; -cy=rotateY[y]+(x-rx)+y-ry; -if (cx<0) - { - ax-=cx; - cx=0; - } -if (cy<0) - { - ay-=cy; - cy=0; - } -if (cx+bx-ax>sizx) bx=ax-cx+sizx; -if (cy+by-ay>sizy) by=ay-cy+sizy; -if (axrotateX[x]; + ay=st->rotateY[y]; + bx=st->rotateX[x+1]+2; + by=st->rotateY[y+1]+2; + cx=st->rotateX[x]-(y-st->ry)+x-st->rx; + cy=st->rotateY[y]+(x-st->rx)+y-st->ry; + if (cx<0) + { + ax-=cx; + cx=0; + } + if (cy<0) + { + ay-=cy; + cy=0; + } + if (cx+bx-ax>st->sizx) bx=ax-cx+st->sizx; + if (cy+by-ay>st->sizy) by=ay-cy+st->sizy; + if (axdpy,st->win[0],st->win[1],st->cgc,ax,ay,bx-ax,by-ay,cx,cy); } -void rotate(void) +static void rotate(struct state *st) { -int x,y; -int dx,dy; - -rx=Xrottable[stateX+1]-Xrottable[stateX]; -ry=Yrottable[stateY+1]-Yrottable[stateY]; - - -for (x=0;x<=rx;x++) - rotateX[x]=(x)?midx-1-Xrotations[Xrottable[stateX+1]-x]:0; -for (x=0;x<=rx;x++) - rotateX[x+rx+1]=(x==rx)?sizx-1:midx+Xrotations[Xrottable[stateX]+x]; -for (y=0;y<=ry;y++) - rotateY[y]=(y)?midy-1-Yrotations[Yrottable[stateY+1]-y]:0; -for (y=0;y<=ry;y++) - rotateY[y+ry+1]=(y==ry)?sizy-1:midy+Yrotations[Yrottable[stateY]+y]; - -x=(rx>ry)?rx:ry; -for (dy=0;dy<(x+1)<<1;dy++) - for (dx=0;dx<(x+1)<<1;dx++) - { - y=(rx>ry)?ry-rx:0; - if (dy+y>=0 && dy<(ry+1)<<1 && dx<(rx+1)<<1) - if (dy+y+dx<=ry+rx && dy+y-dx<=ry-rx) - { - palaRotate((rx<<1)+1-dx,dy+y); - palaRotate(dx,(ry<<1)+1-dy-y); - } - y=(ry>rx)?rx-ry:0; - if (dy+y>=0 && dx<(ry+1)<<1 && dy<(rx+1)<<1) - if (dy+y+dx<=ry+rx && dx-dy-y>=ry-rx) - { - palaRotate(dy+y,dx); - palaRotate((rx<<1)+1-dy-y,(ry<<1)+1-dx); - } - } -stateX++; -if (stateX==rotsizeX) stateX=0; -stateY++; -if (stateY==rotsizeY) stateY=0; + int x,y; + int dx,dy; + + st->rx=st->Xrottable[st->stateX+1]-st->Xrottable[st->stateX]; + st->ry=st->Yrottable[st->stateY+1]-st->Yrottable[st->stateY]; + + + for (x=0;x<=st->rx;x++) + st->rotateX[x]=(x)?st->midx-1-st->Xrotations[st->Xrottable[st->stateX+1]-x]:0; + for (x=0;x<=st->rx;x++) + st->rotateX[x+st->rx+1]=(x==st->rx)?st->sizx-1:st->midx+st->Xrotations[st->Xrottable[st->stateX]+x]; + for (y=0;y<=st->ry;y++) + st->rotateY[y]=(y)?st->midy-1-st->Yrotations[st->Yrottable[st->stateY+1]-y]:0; + for (y=0;y<=st->ry;y++) + st->rotateY[y+st->ry+1]=(y==st->ry)?st->sizy-1:st->midy+st->Yrotations[st->Yrottable[st->stateY]+y]; + + x=(st->rx>st->ry)?st->rx:st->ry; + for (dy=0;dy<(x+1)<<1;dy++) + for (dx=0;dx<(x+1)<<1;dx++) + { + y=(st->rx>st->ry)?st->ry-st->rx:0; + if (dy+y>=0 && dy<(st->ry+1)<<1 && dx<(st->rx+1)<<1) + if (dy+y+dx<=st->ry+st->rx && dy+y-dx<=st->ry-st->rx) + { + palaRotate(st, (st->rx<<1)+1-dx,dy+y); + palaRotate(st, dx,(st->ry<<1)+1-dy-y); + } + y=(st->ry>st->rx)?st->rx-st->ry:0; + if (dy+y>=0 && dx<(st->ry+1)<<1 && dy<(st->rx+1)<<1) + if (dy+y+dx<=st->ry+st->rx && dx-dy-y>=st->ry-st->rx) + { + palaRotate(st, dy+y,dx); + palaRotate(st, (st->rx<<1)+1-dy-y,(st->ry<<1)+1-dx); + } + } + st->stateX++; + if (st->stateX==st->rotsizeX) st->stateX=0; + st->stateY++; + if (st->stateY==st->rotsizeY) st->stateY=0; } -Bool make_rots(double xspeed,double yspeed) +static Bool make_rots(struct state *st, double xspeed,double yspeed) { -int a,b,c,f,g,j,k=0,l; -double m,om,ok; -double d,ix,iy; -int maxi; - -Bool *chks; - -rotsizeX=(int)(2/xspeed+1); -ix=(double)(midx+1)/(double)(rotsizeX); -rotsizeY=(int)(2/yspeed+1); -iy=(double)(midy+1)/(double)(rotsizeY); - -Xrotations=malloc((midx+2)*sizeof(unsigned int)); -Xrottable=malloc((rotsizeX+1)*sizeof(unsigned int)); -Yrotations=malloc((midy+2)*sizeof(unsigned int)); -Yrottable=malloc((rotsizeY+1)*sizeof(unsigned int)); -chks=malloc(((midx>midy)?midx:midy)*sizeof(Bool)); -if (!Xrottable || !Yrottable || !Xrotations || !Yrotations || !chks) return False; - - -maxi=0; -c=0; -d=0; -g=0; -for (a=0;amidx) - { - f-=g-midx; - g=midx; - } - for (b=0;bm) - { - if (j-l>=0) if (chks[j-l]) om+=ok; - else; else if (chks[l-j]) om+=ok; - if (chks[j+l]) om+=ok; - ok/=1.5; - l++; - } - if (om>=m) - { - k=j; - m=om; - } - } - } - chks[k]=False; - l=c; - while (l>=Xrottable[a]) - { - if (l!=Xrottable[a]) Xrotations[l]=Xrotations[l-1]; - if (k>Xrotations[l] || l==Xrottable[a]) - { - Xrotations[l]=k; - c++; - l=Xrottable[a]; - } - l--; - } - } - d+=ix; - if (maximidy) - { - f-=g-midy; - g=midy; - } - for (b=0;bm) - { - if (j-l>=0) if (chks[j-l]) om+=ok; - else; else if (chks[l-j]) om+=ok; - if (chks[j+l]) om+=ok; - ok/=1.5; - l++; - } - if (om>=m) - { - k=j; - m=om; - } - } - } - chks[k]=False; - l=c; - while (l>=Yrottable[a]) - { - if (l!=Yrottable[a]) Yrotations[l]=Yrotations[l-1]; - if (k>Yrotations[l] || l==Yrottable[a]) - { - Yrotations[l]=k; - c++; - l=Yrottable[a]; - } - l--; - } - - } - d+=iy; - if (maxirotsizeX=(int)(2/xspeed+1); + ix=(double)(st->midx+1)/(double)(st->rotsizeX); + st->rotsizeY=(int)(2/yspeed+1); + iy=(double)(st->midy+1)/(double)(st->rotsizeY); + + st->Xrotations=malloc((st->midx+2)*sizeof(unsigned int)); + st->Xrottable=malloc((st->rotsizeX+1)*sizeof(unsigned int)); + st->Yrotations=malloc((st->midy+2)*sizeof(unsigned int)); + st->Yrottable=malloc((st->rotsizeY+1)*sizeof(unsigned int)); + chks=malloc(((st->midx>st->midy)?st->midx:st->midy)*sizeof(Bool)); + if (!st->Xrottable || !st->Yrottable || !st->Xrotations || !st->Yrotations || !chks) return False; + + + maxi=0; + c=0; + d=0; + g=0; + for (a=0;amidx;a++) chks[a]=True; + for (a=0;arotsizeX;a++) + { + st->Xrottable[a]=c; + f=(int)(d+ix)-g; /*viivojen lkm.*/ + g+=f; + if (g>st->midx) + { + f-=g-st->midx; + g=st->midx; + } + for (b=0;bmidx;j++) /*testi*/ + { + if (chks[j]) + { + om=0; + ok=1; + l=0; + while (j+lmidx && om+12*ok>m) + { + if (j-l>=0) if (chks[j-l]) om+=ok; + else; else if (chks[l-j]) om+=ok; + if (chks[j+l]) om+=ok; + ok/=1.5; + l++; + } + if (om>=m) + { + k=j; + m=om; + } + } + } + chks[k]=False; + l=c; + while (l>=st->Xrottable[a]) + { + if (l!=st->Xrottable[a]) st->Xrotations[l]=st->Xrotations[l-1]; + if (k>st->Xrotations[l] || l==st->Xrottable[a]) + { + st->Xrotations[l]=k; + c++; + l=st->Xrottable[a]; + } + l--; + } + } + d+=ix; + if (maxiXrottable[a]) maxi=c-st->Xrottable[a]; + } + st->Xrottable[a]=c; + st->rotateX=malloc((maxi+2)*sizeof(int)<<1); + if (!st->rotateX) return False; + + maxi=0; + c=0; + d=0; + g=0; + for (a=0;amidy;a++) chks[a]=True; + for (a=0;arotsizeY;a++) + { + st->Yrottable[a]=c; + f=(int)(d+iy)-g; /*viivojen lkm.*/ + g+=f; + if (g>st->midy) + { + f-=g-st->midy; + g=st->midy; + } + for (b=0;bmidy;j++) /*testi*/ + { + if (chks[j]) + { + om=0; + ok=1; + l=0; + while (j+lmidy && om+12*ok>m) + { + if (j-l>=0) if (chks[j-l]) om+=ok; + else; else if (chks[l-j]) om+=ok; + if (chks[j+l]) om+=ok; + ok/=1.5; + l++; + } + if (om>=m) + { + k=j; + m=om; + } + } + } + chks[k]=False; + l=c; + while (l>=st->Yrottable[a]) + { + if (l!=st->Yrottable[a]) st->Yrotations[l]=st->Yrotations[l-1]; + if (k>st->Yrotations[l] || l==st->Yrottable[a]) + { + st->Yrotations[l]=k; + c++; + l=st->Yrottable[a]; + } + l--; + } + + } + d+=iy; + if (maxiYrottable[a]) maxi=c-st->Yrottable[a]; + } + st->Yrottable[a]=c; + st->rotateY=malloc((maxi+2)*sizeof(int)<<1); + if (!st->rotateY) return False; + + free(chks); + return (True); } -Bool InitializeAll(void) +static Bool InitializeAll(struct state *st) { -XGCValues xgcv; -XWindowAttributes xgwa; -XSetWindowAttributes xswa; -Colormap cmap; -XColor color; -int n,i; -double rspeed; - -XGetWindowAttributes(dpy,win[0],&xgwa); -cmap=xgwa.colormap; -xswa.backing_store=Always; -XChangeWindowAttributes(dpy,win[0],CWBackingStore,&xswa); -xgcv.function=GXcopy; - -xgcv.foreground=get_pixel_resource ("background", "Background", dpy, cmap); -fgc[32]=XCreateGC(dpy,win[0],GCForeground|GCFunction,&xgcv); - -n=0; -if (mono_p) - { - fgc[0]=fgc[32]; - xgcv.foreground=get_pixel_resource ("foreground", "Foreground", dpy, cmap); - fgc[1]=XCreateGC(dpy,win[0],GCForeground|GCFunction,&xgcv); - for (i=0;i<32;i+=2) fgc[i]=fgc[0]; - for (i=1;i<32;i+=2) fgc[i]=fgc[1]; - } else - for (i=0;i<32;i++) - { - color.red=colors[n++]<<8; - color.green=colors[n++]<<8; - color.blue=colors[n++]<<8; - color.flags=DoRed|DoGreen|DoBlue; - XAllocColor(dpy,cmap,&color); - xgcv.foreground=color.pixel; - fgc[i]=XCreateGC(dpy,win[0],GCForeground|GCFunction,&xgcv); - } -cgc=XCreateGC(dpy,win[0],GCForeground|GCFunction,&xgcv); -XSetGraphicsExposures(dpy,cgc,False); - -if (get_string_resource("random","String")!=NULL && get_string_resource("random","String")[0]!=0) cosilines=False; + XGCValues xgcv; + XWindowAttributes xgwa; +/* XSetWindowAttributes xswa;*/ + Colormap cmap; + XColor color; + int n,i; + double rspeed; + + st->cosilines = True; + + XGetWindowAttributes(st->dpy,st->win[0],&xgwa); + cmap=xgwa.colormap; +/* xswa.backing_store=Always; + XChangeWindowAttributes(st->dpy,st->win[0],CWBackingStore,&xswa);*/ + xgcv.function=GXcopy; + + xgcv.foreground=get_pixel_resource (st->dpy, cmap, "background", "Background"); + st->fgc[32]=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv); + + n=0; + if (mono_p) + { + st->fgc[0]=st->fgc[32]; + xgcv.foreground=get_pixel_resource (st->dpy, cmap, "foreground", "Foreground"); + st->fgc[1]=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv); + for (i=0;i<32;i+=2) st->fgc[i]=st->fgc[0]; + for (i=1;i<32;i+=2) st->fgc[i]=st->fgc[1]; + } else + for (i=0;i<32;i++) + { + color.red=colors[n++]<<8; + color.green=colors[n++]<<8; + color.blue=colors[n++]<<8; + color.flags=DoRed|DoGreen|DoBlue; + XAllocColor(st->dpy,cmap,&color); + xgcv.foreground=color.pixel; + st->fgc[i]=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv); + } + st->cgc=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv); + XSetGraphicsExposures(st->dpy,st->cgc,False); + + st->cosilines = get_boolean_resource(st->dpy, "random","Boolean"); #ifdef HAVE_DOUBLE_BUFFER_EXTENSION - usedouble = True; - win[1] = xdbe_get_backbuffer (dpy, win[0], XdbeUndefined); - if (!win[1]) - { - usedouble = False; - win[1] = win[0]; - } + if (get_boolean_resource (st->dpy, "useDBE", "Boolean")) + st->usedouble = True; + st->win[1] = xdbe_get_backbuffer (st->dpy, st->win[0], XdbeUndefined); + if (!st->win[1]) + { + st->usedouble = False; + st->win[1] = st->win[0]; + } #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */ -delay=get_integer_resource("delay","Integer"); -rspeed=get_float_resource("speed","Float"); -if (rspeed<0.0001 || rspeed>0.2) - { - fprintf(stderr,"Speed not in valid range! (0.0001 - 0.2), using 0.1 \n"); - rspeed=0.1; - } - -sizx=xgwa.width; -sizy=xgwa.height; -midx=sizx>>1; -midy=sizy>>1; -stateX=0; -stateY=0; - -if (!make_rots(rspeed,rspeed)) - { - fprintf(stderr,"Not enough memory for tables!\n"); - return False; - } -return True; + st->delay=get_integer_resource(st->dpy, "delay","Integer"); + rspeed=get_float_resource(st->dpy, "speed","Float"); + if (rspeed<0.0001 || rspeed>0.2) + { + fprintf(stderr,"Speed not in valid range! (0.0001 - 0.2), using 0.1 \n"); + rspeed=0.1; + } + + st->sizx=xgwa.width; + st->sizy=xgwa.height; + st->midx=st->sizx>>1; + st->midy=st->sizy>>1; + st->stateX=0; + st->stateY=0; + + if (!make_rots(st,rspeed,rspeed)) + { + fprintf(stderr,"Not enough memory for tables!\n"); + return False; + } + return True; } - -void screenhack(Display *d, Window w) +static void * +kumppa_init (Display *d, Window w) { + struct state *st = (struct state *) calloc (1, sizeof(*st)); + st->dpy=d; + st->win[0]=w; + if (!InitializeAll(st)) abort(); + #ifdef HAVE_DOUBLE_BUFFER_EXTENSION -XdbeSwapInfo xdswp; + if (st->usedouble) + { + st->xdswp.swap_action=XdbeUndefined; + st->xdswp.swap_window=st->win[0]; + } + else #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */ -int a,b,c=0,e; -float f; + st->win[1]=st->win[0]; -dpy=d; -win[0]=w; -if (!InitializeAll()) return; + return st; +} +static unsigned long +kumppa_draw (Display *d, Window w, void *closure) +{ + struct state *st = (struct state *) closure; + if (st->cosilines) + { + int a; + st->draw_count++; + for (a=0;a<8;a++) + { + float f=0; + int b; + for (b=0;b<3;b++) + { + st->acosinus[a][b]+=cosinus[a][b]; + f+=cosinus[a][b+3]*sin((double)st->acosinus[a][b]); + } + st->coords[a]=(int)f; + } + for (a=0;a<4;a++) + { + 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] + ,st->midx+st->coords[a<<1],st->midy+st->coords[(a<<1)+1]); + st->ocoords[a<<1]=st->coords[a<<1]; + st->ocoords[(a<<1)+1]=st->coords[(a<<1)+1]; + } + + } else { + int e; + for (e=0;e<8;e++) + { + int a=Satnum(50); + int b; + if (a>=32) a=32; + b=Satnum(32)-16+st->midx; + st->draw_count=Satnum(32)-16+st->midy; + XFillRectangle(st->dpy,st->win[0],st->fgc[a],b,st->draw_count,2,2); + } + } + XFillRectangle(st->dpy,st->win[0],st->fgc[32],st->midx-2,st->midy-2,4,4); + rotate(st); #ifdef HAVE_DOUBLE_BUFFER_EXTENSION -if (usedouble) - { - xdswp.swap_action=XdbeUndefined; - xdswp.swap_window=win[0]; - } - else -#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */ - win[1]=win[0]; - -while (0==0) - { - if (cosilines) - { - c++; - for (a=0;a<8;a++) - { - f=0; - for (b=0;b<3;b++) - { - acosinus[a][b]+=cosinus[a][b]; - f+=cosinus[a][b+3]*sin((double)acosinus[a][b]); - } - coords[a]=(int)f; - } - for (a=0;a<4;a++) - { - XDrawLine(dpy,win[0],(mono_p)?fgc[1]:fgc[((a<<2)+c)&31],midx+ocoords[a<<1],midy+ocoords[(a<<1)+1] - ,midx+coords[a<<1],midy+coords[(a<<1)+1]); - ocoords[a<<1]=coords[a<<1]; - ocoords[(a<<1)+1]=coords[(a<<1)+1]; - } - - } else { - for (e=0;e<8;e++) - { - a=Satnum(50); - if (a>=32) a=32; - b=Satnum(32)-16+midx; - c=Satnum(32)-16+midy; - XFillRectangle(dpy,win[0],fgc[a],b,c,2,2); - } - } - XFillRectangle(dpy,win[0],fgc[32],midx-2,midy-2,4,4); - rotate(); -#ifdef HAVE_DOUBLE_BUFFER_EXTENSION - if (usedouble) XdbeSwapBuffers(dpy,&xdswp,1); + if (st->usedouble) XdbeSwapBuffers(st->dpy,&st->xdswp,1); #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */ - XSync(dpy, False); - screenhack_handle_events (dpy); - if (delay) usleep (delay); - } + + return st->delay; } + + +static void +kumppa_reshape (Display *dpy, Window window, void *closure, + unsigned int w, unsigned int h) +{ + struct state *st = (struct state *) closure; + st->sizx=w; + st->sizy=w; + st->midx=st->sizx>>1; + st->midy=st->sizy>>1; + st->stateX=0; + st->stateY=0; +} + +static Bool +kumppa_event (Display *dpy, Window window, void *closure, XEvent *event) +{ + return False; +} + +static void +kumppa_free (Display *dpy, Window window, void *closure) +{ + struct state *st = (struct state *) closure; + int i; + for (i = 0; i < countof(st->fgc); i++) + if (st->fgc[i]) XFreeGC (dpy, st->fgc[i]); + XFreeGC (dpy, st->cgc); + free (st->Xrotations); + free (st->Yrotations); + free (st->Xrottable); + free (st->Yrottable); + free (st); +} + +XSCREENSAVER_MODULE ("Kumppa", kumppa)