* 31 Oct 1999: Added in lighting hack
* 13 Nov 1999: Speed up tweaks
* Adjust "light" for different bits per colour (-water only)
+ * 09 Oct 2016: Updated for new xshm.c
*
*/
typedef enum {ripple_drop, ripple_blob, ripple_box, ripple_stir} ripple_mode;
-#ifdef HAVE_XSHM_EXTENSION
#include "xshm.h"
-#endif /* HAVE_XSHM_EXTENSION */
#define TABLE 256
XImage *orig_map, *buffer_map;
int ctab[256];
Colormap colormap;
+ Screen *screen;
int ncolors;
int light;
int draw_count;
int iterations, delay, rate, box, oily, stir, fluidity;
+ int duration;
+ time_t start_time;
void (*draw_transparent) (struct state *st, short *src);
async_load_state *img_loader;
-#ifdef HAVE_XSHM_EXTENSION
- Bool use_shm;
XShmSegmentInfo shm_info;
-#endif /* HAVE_XSHM_EXTENSION */
};
static void
-set_mask(unsigned long color, unsigned long *mask, int *shift)
+set_mask(unsigned long *mask, int *shift)
{
+ unsigned long color = *mask;
*shift = 0;
while (color != 0 && (color & 1) == 0) {
(*shift)++;
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;
st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
st->window, 0, 0);
+ st->start_time = time ((time_t *) 0);
} else {
XGCValues gcv;
exit(1);
}
- st->buffer_map = 0;
-
-#ifdef HAVE_XSHM_EXTENSION
- if (st->use_shm) {
- st->buffer_map = create_xshm_image(st->dpy, xgwa.visual, depth,
- ZPixmap, 0, &st->shm_info, st->bigwidth, st->bigheight);
- if (!st->buffer_map) {
- st->use_shm = False;
- fprintf(stderr, "create_xshm_image failed\n");
- }
- }
-#endif /* HAVE_XSHM_EXTENSION */
-
- if (!st->buffer_map) {
- st->buffer_map = XCreateImage(st->dpy, xgwa.visual,
- depth, ZPixmap, 0, 0,
- st->bigwidth, st->bigheight, 8, 0);
- st->buffer_map->data = (char *)
- calloc(st->buffer_map->height, st->buffer_map->bytes_per_line);
- }
+ st->buffer_map = create_xshm_image(st->dpy, xgwa.visual, depth,
+ ZPixmap, &st->shm_info, st->bigwidth, st->bigheight);
}
static void
DisplayImage(struct state *st)
{
-#ifdef HAVE_XSHM_EXTENSION
- if (st->use_shm)
- XShmPutImage(st->dpy, st->window, st->gc, st->buffer_map, 0, 0, 0, 0,
- st->bigwidth, st->bigheight, False);
- else
-#endif /* HAVE_XSHM_EXTENSION */
- XPutImage(st->dpy, st->window, st->gc, st->buffer_map, 0, 0, 0, 0,
- st->bigwidth, st->bigheight);
+ put_xshm_image(st->dpy, st->window, st->gc, st->buffer_map, 0, 0, 0, 0,
+ st->bigwidth, st->bigheight, &st->shm_info);
}
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) */
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);
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));
}
}
case ripple_blob: {
double power;
+ int tmp_i, tmp_j;
power = drop_dist[random() % (sizeof(drop_dist)/sizeof(drop_dist[0]))]; /* clumsy */
dheight = (int)(drop * (power + 0.01));
- newx = radius + border + (random() % (int)(st->width - 2*border - 2*radius*power));
- newy = radius + border + (random() % (int)(st->height - 2*border - 2*radius*power));
+ tmp_i = (int)(st->width - 2*border - 2*radius*power);
+ tmp_j = (int)(st->height - 2*border - 2*radius*power);
+ newx = radius + border + ((tmp_i > 0) ? random() % tmp_i : 0);
+ newy = radius + border + ((tmp_j > 0) ? random() % tmp_j : 0);
add_circle_drop(st, newx, newy, radius, dheight);
}
break;
int x;
int cx, cy;
short *buf = (random()&1) ? st->bufferA : st->bufferB;
+ int tmp_i, tmp_j;
radius = (1 + (random() % 5)) * (1 + (random() % 5));
dheight = drop / 128;
if (random() & 1) dheight = -dheight;
- newx = radius + border + (random() % (st->width - 2*border - 2*radius));
- newy = radius + border + (random() % (st->height - 2*border - 2*radius));
+ tmp_i = st->width - 2*border - 2*radius;
+ tmp_j = st->height - 2*border - 2*radius;
+ newx = radius + border + ((tmp_i > 0) ? random() % tmp_i : 0);
+ newy = radius + border + ((tmp_j > 0) ? random() % tmp_j : 0);
x = newy * st->width + newx;
for (cy = -radius; cy <= radius; cy++)
for (cx = -radius; cx <= radius; cx++)
st->window = win;
st->iterations = 0;
st->delay = get_integer_resource(disp, "delay", "Integer");
+ st->duration = get_integer_resource (st->dpy, "duration", "Seconds");
st->rate = get_integer_resource(disp, "rate", "Integer");
st->box = get_integer_resource(disp, "box", "Integer");
st->oily = get_boolean_resource(disp, "oily", "Boolean");
st->fluidity = get_integer_resource(disp, "fluidity", "Integer");
st->transparent = get_boolean_resource(disp, "water", "Boolean");
st->grayscale_p = get_boolean_resource(disp, "grayscale", "Boolean");
-#ifdef HAVE_XSHM_EXTENSION
- st->use_shm = get_boolean_resource(disp, "useSHM", "Boolean");
-#endif /* HAVE_XSHM_EXTENSION */
st->light = get_integer_resource(disp, "light", "Integer");
+ if (st->delay < 0) st->delay = 0;
+ if (st->duration < 1) st->duration = 1;
if (st->fluidity <= 1) st->fluidity = 1;
if (st->fluidity > 16) st->fluidity = 16; /* 16 = sizeof(short) */
if (st->light < 0) st->light = 0;
if (st->transparent && st->light > 0) {
int maxbits;
st->draw_transparent = draw_transparent_light;
- set_mask(st->visual->red_mask, &st->rmask, &st->rshift);
- set_mask(st->visual->green_mask, &st->gmask, &st->gshift);
- set_mask(st->visual->blue_mask, &st->bmask, &st->bshift);
+ visual_rgb_masks (st->screen, st->visual,
+ &st->rmask, &st->gmask, &st->bmask);
+ set_mask(&st->rmask, &st->rshift);
+ set_mask(&st->gmask, &st->gshift);
+ set_mask(&st->bmask, &st->bshift);
if (st->rmask == 0) st->draw_transparent = draw_transparent_vanilla;
/* Adjust the shift value "light" when we don't have 8 bits per colour */
} else {
if (st->grayscale_p)
{
- set_mask(st->visual->red_mask, &st->rmask, &st->rshift);
- set_mask(st->visual->green_mask, &st->gmask, &st->gshift);
- set_mask(st->visual->blue_mask, &st->bmask, &st->bshift);
+ visual_rgb_masks (st->screen, st->visual,
+ &st->rmask, &st->gmask, &st->bmask);
+ set_mask(&st->rmask, &st->rshift);
+ set_mask(&st->gmask, &st->gshift);
+ set_mask(&st->bmask, &st->bshift);
}
st->draw_transparent = draw_transparent_vanilla;
}
if (! st->img_loader) { /* just finished */
XWindowAttributes xgwa;
XGetWindowAttributes(st->dpy, st->window, &xgwa);
+ st->start_time = time ((time_t *) 0);
st->orig_map = XGetImage (st->dpy, st->window, 0, 0,
xgwa.width, xgwa.height,
~0L, ZPixmap);
return st->delay;
}
+ if (!st->img_loader &&
+ st->start_time + st->duration < time ((time_t *) 0)) {
+ XWindowAttributes xgwa;
+ XGetWindowAttributes(st->dpy, st->window, &xgwa);
+ st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
+ st->window, 0, 0);
+ st->start_time = time ((time_t *) 0);
+ return st->delay;
+ }
+
if (st->rate > 0 && (st->iterations % st->rate) == 0)
add_drop(st, ripple_blob, -SPLASH);
if (st->stir)
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;
}
"*colors: 200",
"*dontClearRoot: True",
"*delay: 50000",
+ "*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 HAVE_MOBILE
+ "*ignoreRotation: True",
+ "*rotateImages: True",
#endif
0
};
{ "-colors", ".colors", XrmoptionSepArg, 0},
{ "-colours", ".colors", XrmoptionSepArg, 0},
{"-delay", ".delay", XrmoptionSepArg, 0},
+ {"-duration", ".duration", XrmoptionSepArg, 0 },
{"-rate", ".rate", XrmoptionSepArg, 0},
{"-box", ".box", XrmoptionSepArg, 0},
{"-water", ".water", XrmoptionNoArg, "True"},