X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fgoop.c;h=119fec55f277ccda63c42010aa6ee06260522d89;hb=d1ae2829ff0fd2a96c16a0c8c5420efaa47d7b30;hp=4241950c0c386dc43a4cef014fb2358cf6c69a84;hpb=49f5b54f312fe4ac2e9bc47581a72451bd0e8439;p=xscreensaver diff --git a/hacks/goop.c b/hacks/goop.c index 4241950c..119fec55 100644 --- a/hacks/goop.c +++ b/hacks/goop.c @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 1997, 2006 Jamie Zawinski +/* xscreensaver, Copyright (c) 1997-2008 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -47,7 +47,6 @@ #define SCALE 10000 /* fixed-point math, for sub-pixel motion */ #define DEF_COUNT 12 /* When planes and count are 0, how many blobs. */ - #define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n)))) #define RANDSIGN() ((random() & 1) ? 1 : -1) @@ -126,10 +125,18 @@ make_blob (Display *dpy, int maxx, int maxy, int size) b->spline = make_spline (b->npoints); b->r = (long *) malloc (sizeof(*b->r) * b->npoints); for (i = 0; i < b->npoints; i++) - b->r[i] = ((random() % mid) + (mid/2)) * RANDSIGN(); + b->r[i] = (long) ((random() % mid) + (mid/2)) * RANDSIGN(); return b; } +static void +free_blob(struct blob *blob) +{ + free_spline(blob->spline); + free(blob->r); + free(blob); +} + static void throb_blob (struct blob *b) { @@ -258,9 +265,11 @@ make_layer (Display *dpy, Window window, int width, int height, int nblobs) blob_max = (width < height ? width : height) / 2; blob_min = (blob_max * 2) / 3; - for (i = 0; i < layer->nblobs; i++) + for (i = 0; i < layer->nblobs; i++){ + int j = blob_max - blob_min; layer->blobs[i] = make_blob (dpy, width, height, - (random() % (blob_max-blob_min)) + blob_min); + (j ? random() % j : 0) + blob_min); + } layer->pixmap = XCreatePixmap (dpy, window, width, height, 1); layer->gc = XCreateGC (dpy, layer->pixmap, 0, &gcv); @@ -272,6 +281,18 @@ make_layer (Display *dpy, Window window, int width, int height, int nblobs) return layer; } +static void +free_layer(struct layer *layer, Display *dpy) +{ + int i; + for (i = 0; i < layer->nblobs; i++){ + free_blob(layer->blobs[i]); + } + free(layer->blobs); + XFreeGC(dpy, layer->gc); + free(layer); +} + #ifndef HAVE_COCOA static void @@ -329,6 +350,7 @@ make_goop (Screen *screen, Visual *visual, Window window, Colormap cmap, goop->mode = xor; else fprintf (stderr, "%s: bogus mode: \"%s\"\n", progname, s); + free(s); goop->delay = get_integer_resource (dpy, "delay", "Integer"); @@ -338,7 +360,9 @@ make_goop (Screen *screen, Visual *visual, Window window, Colormap cmap, goop->nlayers = get_integer_resource (dpy, "planes", "Planes"); if (goop->nlayers <= 0) goop->nlayers = (random() % (depth-2)) + 2; - goop->layers = (struct layer **) malloc(sizeof(*goop->layers)*goop->nlayers); + if (! goop->layers) + goop->layers = (struct layer **) + malloc(sizeof(*goop->layers)*goop->nlayers); goop->additive_p = get_boolean_resource (dpy, "additive", "Additive"); goop->cmap_p = has_writable_cells (screen, visual); @@ -418,7 +442,7 @@ make_goop (Screen *screen, Visual *visual, Window window, Colormap cmap, { /* give a non-opaque alpha to the color */ unsigned long pixel = goop->layers[i]->pixel; - unsigned long amask = BlackPixelOfScreen (0); + unsigned long amask = BlackPixelOfScreen (screen); unsigned long a = (0xBBBBBBBB & amask); pixel = (pixel & (~amask)) | a; goop->layers[i]->pixel = pixel; @@ -443,6 +467,21 @@ make_goop (Screen *screen, Visual *visual, Window window, Colormap cmap, return goop; } +/* Well, the naming of this function is + confusing with goop_free()... */ +static void +free_goop (struct goop *goop, Display *dpy) +{ + int i; + for (i = 0; i < goop->nlayers; i++){ + struct layer * layer = goop->layers[i]; + free_layer(layer, dpy); + } + free(goop->layers); + XFreeGC(dpy, goop->pixmap_gc); + XFreeGC(dpy, goop->window_gc); +} + static void * goop_init (Display *dpy, Window window) { @@ -541,7 +580,12 @@ static void goop_reshape (Display *dpy, Window window, void *closure, unsigned int w, unsigned int h) { - /* #### write me */ + struct goop *goop = (struct goop *) closure; + + struct goop *goop2 = goop_init (dpy, window); + free_goop(goop, dpy); + memcpy (goop, goop2, sizeof(*goop)); + free(goop2); } static Bool @@ -553,6 +597,9 @@ goop_event (Display *dpy, Window window, void *closure, XEvent *event) static void goop_free (Display *dpy, Window window, void *closure) { + struct goop *goop = (struct goop *) closure; + free_goop(goop, dpy); + free(goop); } @@ -564,12 +611,15 @@ static const char *goop_defaults [] = { "*delay: 12000", "*additive: true", "*mode: transparent", - "*count: 0", - "*planes: 0", + "*count: 1", + "*planes: 12", "*thickness: 5", "*torque: 0.0075", "*elasticity: 0.9", "*maxVelocity: 0.5", +#ifdef USE_IPHONE + "*ignoreRotation: True", +#endif 0 };