X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fripples.c;h=8acf707d1b63858666a1c8f44fa74d2d46664102;hb=6afd6db0ae9396cd7ff897ade597cd5483f49b0e;hp=aa286426a960537ce62e6360e1d049bde3d50001;hpb=de460e831dc8578acfa8b72251ab9346c99c1f96;p=xscreensaver diff --git a/hacks/ripples.c b/hacks/ripples.c index aa286426..8acf707d 100644 --- a/hacks/ripples.c +++ b/hacks/ripples.c @@ -62,6 +62,7 @@ struct state { XImage *orig_map, *buffer_map; int ctab[256]; Colormap colormap; + Screen *screen; int ncolors; int light; @@ -495,6 +496,7 @@ setup_X(struct state *st) XGetWindowAttributes(st->dpy, st->window, &xgwa); depth = xgwa.depth; st->colormap = xgwa.colormap; + st->screen = xgwa.screen; st->bigwidth = xgwa.width; st->bigheight = xgwa.height; st->visual = xgwa.visual; @@ -656,7 +658,8 @@ init_oily_colors(struct state *st) if (!mono_p) { colors = (XColor *)malloc(sizeof(*colors) * (st->ncolors+1)); - make_smooth_colormap(st->dpy, st->visual, st->colormap, colors, &st->ncolors, + make_smooth_colormap(st->screen, st->visual, st->colormap, + colors, &st->ncolors, True, /* allocate */ False, /* not writable */ True); /* verbose (complain about failure) */ @@ -703,6 +706,7 @@ sinc(struct state *st, double x) int i; i = (int)(x * TABLE + 0.5); if (i >= TABLE) i = (TABLE-1) - (i-(TABLE-1)); + if (i < 0) return 0.; return st->cos_tab[i]; #elif 0 return cos(x * M_PI/2); @@ -718,19 +722,21 @@ sinc(struct state *st, double x) static void add_circle_drop(struct state *st, int x, int y, int radius, int dheight) { - int i, r2, cx, cy; + int r, r2, cx, cy; short *buf = (random()&1) ? st->bufferA : st->bufferB; - i = y * st->width + x; r2 = radius * radius; + for (cy = -radius; cy <= radius; cy++) for (cx = -radius; cx <= radius; cx++) { - int r = cx*cx + cy*cy; - if (r <= r2) { - buf[i + cx + cy*st->width] = - (short)(dheight * sinc(st, sqrt(r)/radius)); - } + int xx = x+cx; + int yy = y+cy; + if (xx < 0 || yy < 0 || xx >= st->width || yy >= st->height) {break;} + r = cx*cx + cy*cy; + if (r > r2) break; + buf[xx + yy*st->width] = + (short)(dheight * sinc(st, (radius > 0) ? sqrt(r)/radius : 0)); } } @@ -1071,6 +1077,12 @@ ripples_reshape (Display *dpy, Window window, void *closure, static Bool ripples_event (Display *dpy, Window window, void *closure, XEvent *event) { + struct state *st = (struct state *) closure; + if (screenhack_event_helper (dpy, window, event)) + { + st->start_time = 0; + return True; + } return False; } @@ -1091,16 +1103,20 @@ static const char *ripples_defaults[] = "*duration: 120", "*rate: 5", "*box: 0", - "*water: False", + "*water: True", "*oily: False", "*stir: False", "*fluidity: 6", - "*light: 0", + "*light: 4", "*grayscale: False", #ifdef HAVE_XSHM_EXTENSION "*useSHM: True", #else "*useSHM: False", +#endif +#ifdef USE_IPHONE + "*ignoreRotation: True", + "*rotateImages: True", #endif 0 };