diff options
Diffstat (limited to 'hacks/interaggregate.c')
-rw-r--r-- | hacks/interaggregate.c | 988 |
1 files changed, 0 insertions, 988 deletions
diff --git a/hacks/interaggregate.c b/hacks/interaggregate.c deleted file mode 100644 index 999ef9e..0000000 --- a/hacks/interaggregate.c +++ /dev/null @@ -1,988 +0,0 @@ -/* - * InterAggregate (dagraz@gmail.com) - * Based on code from complexification.net Intersection Aggregate - * http://www.complexification.net/gallery/machines/interAggregate/index.php - * - * Intersection Aggregate code: - * j.tarbell May, 2004 - * Albuquerque, New Mexico - * complexification.net - * - * Also based on substrate, a port of j.tarbell's Substrate Art done - * by dragorn@kismetwireless.net - * - * - * Interesting command line options, all of which serve to - * concentrate the painting in some way: - * - * -percent-orbits 100 -base-orbits 50 -base-on-center -growth-delay 0 - * - * Paint should be concentrated in the center of the canvas, orbiting - * about it. -percent-orbits 100 implies -base-on-center, so that's - * not really needed. - * - * - * -percent-orbits 99 -base-orbits 50 -growth-delay 0 - * - * Like the above example, but the 'center' will rove about the screen. - * - * -percent-orbits 98 -base-orbits 50 -growth-delay 0 - * - * Like the above example, but there will be two roving centers. - * - * - * TODO: - * -fix alpha blending / byte ordering - * - * CHANGES - * - * - * Directly based the hacks of: - * - * xscreensaver, Copyright (c) 1997, 1998, 2002 Jamie Zawinski <jwz@jwz.org> - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation. No representations are made about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - */ - -#include <math.h> -#include "screenhack.h" - - -/* this program goes faster if some functions are inline. The following is - * borrowed from ifs.c */ -#if !defined( __GNUC__ ) && !defined(__cplusplus) && !defined(c_plusplus) -#undef inline -#define inline /* */ -#endif - -#ifndef MIN -#define MIN(x,y) ((x < y) ? x : y) -#endif - -#ifndef MAX -#define MAX(x,y) ((x < y) ? y : x) -#endif - -static const char *interaggregate_defaults[] = -{ - ".background: white", - ".foreground: black", - "*fpsSolid: true", - "*maxCycles: 100000", -#ifdef TIME_ME - "*growthDelay: 0", -#else - "*growthDelay: 18000", -#endif - "*numCircles: 100", - "*percentOrbits: 0", - "*baseOrbits: 75", - "*baseOnCenter: False", - "*drawCenters: False", -#ifdef HAVE_MOBILE - "*ignoreRotation: True", -#endif - 0 -}; - -static XrmOptionDescRec interaggregate_options[] = -{ - {"-background", ".background", XrmoptionSepArg, 0}, - {"-foreground", ".foreground", XrmoptionSepArg, 0}, - {"-max-cycles", ".maxCycles", XrmoptionSepArg, 0}, - {"-growth-delay", ".growthDelay", XrmoptionSepArg, 0}, - {"-num-circles", ".numCircles", XrmoptionSepArg, 0}, - {"-percent-orbits", ".percentOrbits", XrmoptionSepArg, 0}, - {"-base-orbits", ".baseOrbits", XrmoptionSepArg, 0}, - {"-base-on-center", ".baseOnCenter", XrmoptionNoArg, "true"}, - {"-draw-centers", ".drawCenters", XrmoptionNoArg, "true"}, - {0, 0, 0, 0} -}; - -/* Raw colormap extracted from pollockEFF.gif */ -#if 0 -char *rgb_colormap[] = -{ - "#FFFFFF", /* white */ - "#000000", /* black */ - "#000000", /* more black */ - /* "#736451", */ - "#4e3e2e", /* olive */ - /* "#666666", */ - "#694d35", /* camel */ - "#b9a88c", /* tan */ - 0 -}; -#endif - -static const char *rgb_colormap[] = -{ - "#FFFFFF", /* white */ - "#000000", /* more black */ - "#000000", /* more black */ - "#4e3e2e", /* olive */ - "#694d35", /* camel */ - "#b0a085", /* tan */ - "#e6d3ae", - 0 -}; - -/* black white brown olive grey camel */ - -typedef enum { LINEAR, ORBIT } PathType; - -typedef struct -{ - - unsigned long color; - double gain; - double p; - -} SandPainter; - -typedef struct _circle -{ - double radius; - - double x; - double y; - - PathType path_type; - - /* for a linear path */ - double dx; - double dy; - - /* for orbital path */ - double theta; - double r; - double dtheta; - - struct _circle* center; - - int num_painters; - SandPainter* painters; - -} Circle; - - -struct field -{ - int height; - int width; - - int num_circles; - Circle* circles; - - int percent_orbits; - int base_orbits; - Bool base_on_center; - - /* used for orbits circling the center of the screen */ - Circle center_of_universe; - - /* Raw map of pixels we need to keep for alpha blending */ - unsigned long int *off_img; - - /* color parms */ - int numcolors; - unsigned long *parsedcolors; - unsigned long fgcolor; - unsigned long bgcolor; - int visdepth; - - unsigned int cycles; - - double max_gain; - - /* for debugging */ - Bool draw_centers; - - /* for profiling whatnot */ - int possible_intersections; - int intersection_count; -}; - - -static struct field * -init_field(void) -{ - struct field *f = (struct field*) malloc(sizeof(struct field)); - if ( f == NULL ) - { - fprintf(stderr, "%s: Failed to allocate field!\n", progname); - exit(1); - } - - f->height = 0; - f->width = 0; - f->num_circles = 0; - f->circles = NULL; - f->percent_orbits = 0; - f->base_orbits = 0; - f->base_on_center = False; - f->off_img = NULL; - f->numcolors = 0; - f->parsedcolors = NULL; - f->fgcolor = 0; - f->bgcolor = 0; - f->visdepth = 0; - - f->cycles = 0; - - f->max_gain = 0.22; - - f->draw_centers = False; - - f->possible_intersections = 0; - f->intersection_count = 0; - - return f; -} - -/* Quick references to pixels in the offscreen map and in the crack grid */ -#define ref_pixel(f, x, y) ((f)->off_img[(y) * (f)->width + (x)]) - -#define in_bounds(f, x, y) ((x >= 0) && (x < f->width) && (y >= 0) && (y < f->height)) - -/* Consider rewriting with XQueryColor, or ImageByteOrder */ - -static inline void point2rgb(int depth, unsigned long c, int *r, int *g, int *b) -{ - switch(depth) - { - case 32: - case 24: -#ifdef HAVE_JWXYZ - /* This program idiotically does not go through a color map, so - we have to hardcode in knowledge of how jwxyz.a packs pixels! - Fix it to go through st->colors[st->ncolors] instead! - */ - *r = (c & 0x00ff0000) >> 16; - *g = (c & 0x0000ffff) >> 8; - *b = (c & 0x000000ff); -#else - *b = c & 0xff; - *g = (c & 0xff00) >> 8; - *r = (c & 0xff0000) >> 16; -#endif - break; - case 16: - *b = (int) (c & 0x1f) << 3; - *g = (int) ((c >> 5) & 0x3f) << 2; - *r = (int) ((c >> 11) & 0x1f) << 3; - break; - case 15: - *b = (int) (c & 0x1f) << 3; - *g = (int) ((c >> 5) & 0x1f) << 3; - *r = (int) ((c >> 10) & 0x1f) << 3; - break; - } -} - -static inline unsigned long rgb2point(int depth, int r, int g, int b) -{ - unsigned long ret = 0; - - switch(depth) - { - case 32: - case 24: -#ifdef HAVE_JWXYZ - /* This program idiotically does not go through a color map, so - we have to hardcode in knowledge of how jwxyz.a packs pixels! - Fix it to go through st->colors[st->ncolors] instead! - */ - ret = 0xFF000000 | (r << 16) | (g << 8) | b; -#else - ret |= (r << 16) | (g << 8) | b; -#endif - break; - case 16: - ret = ((r>>3) << 11) | ((g>>2)<<5) | (b>>3); - break; - case 15: - ret = ((r>>3) << 10) | ((g>>3)<<5) | (b>>3); - break; - } - - return ret; -} - -/* alpha blended point drawing -- this is Not Right and will likely fail on - * non-intel platforms as it is now, needs fixing */ -static inline unsigned long trans_point(int x1, int y1, unsigned long myc, double a, - struct field *f) -{ - if (a >= 1.0) - { - ref_pixel(f, x1, y1) = myc; - return myc; - } - else - { - int or=0, og=0, ob=0; - int r=0, g=0, b=0; - int nr, ng, nb; - unsigned long c; - - c = ref_pixel(f, x1, y1); - - point2rgb(f->visdepth, c, &or, &og, &ob); - point2rgb(f->visdepth, myc, &r, &g, &b); - - nr = or + (r - or) * a; - ng = og + (g - og) * a; - nb = ob + (b - ob) * a; - - c = rgb2point(f->visdepth, nr, ng, nb); - - ref_pixel(f, x1, y1) = c; - - return c; - } -} - -static inline void drawPoint(int x, int y, unsigned long color, double intensity, - Display *dpy, Window window, GC fgc, struct field *f) - -{ - unsigned long c; - - while ( x >= f->width ) x -= f->width; - while ( x < 0 ) x += f->width; - - while ( y >= f->height ) y -= f->height; - while ( y < 0 ) y += f->height; - - /* if ( in_bounds(f, x, y) ) ... */ - - c = trans_point(x, y, color, intensity, f); - - XSetForeground(dpy, fgc, c); - XDrawPoint(dpy, window, fgc, x, y); -} - -static inline void paint(SandPainter* painter, double ax, double ay, double bx, double by, - Display *dpy, Window window, GC fgc, - struct field *f) -{ - /* the sand painter */ - - double inc, sandp; - int i; - - /* XXX try adding tpoint here, like orig */ - - /* jitter the painter's values */ - painter->gain += frand(0.05) - 0.025; - - if ( painter->gain > f->max_gain ) - painter->gain = -f->max_gain; - else if ( painter->gain < -f->max_gain ) - painter->gain = f->max_gain; - - painter->p += frand(0.1) - 0.05; - - if ( 0 < painter->p ) - painter->p = 0; - else if ( painter->p > 1.0 ) - painter->p = 1.0; - - /* replace 0.1 with 1 / f->grains */ - inc = painter->gain * 0.1; - sandp = 0; - - for(i = 0; i <= 10; ++i) - { - int drawx, drawy; - double sp, sm; - double intensity = 0.1 - 0.009 * i; - - sp = sin(painter->p + sandp); - drawx = ax + (bx - ax) * sp; - drawy = ay + (by - ay) * sp; - - drawPoint(drawx, drawy, painter->color, - intensity, - dpy, window, fgc, f); - - sm = sin(painter->p - sandp); - drawx = ax + (bx - ax) * sm; - drawy = ay + (by - ay) * sm; - - drawPoint(drawx, drawy, painter->color, - intensity, - dpy, window, fgc, f); - - sandp += inc; - } -} - -static void build_colors(struct field *f, Display *dpy, XWindowAttributes *xgwa) -{ - - XColor tmpcolor; - int i; - /* Count the colors in our map and assign them in a horrifically inefficient - * manner but it only happens once */ - - for( f->numcolors = 0; - rgb_colormap[f->numcolors] != NULL; - ++f->numcolors ) - { - ; - } - - if (f->numcolors < 1) f->numcolors = 1; - f->parsedcolors = (unsigned long *) calloc(f->numcolors, - sizeof(unsigned long)); - if ( f->parsedcolors == NULL ) - { - fprintf(stderr, "%s: Failed to allocate parsedcolors\n", - progname); - exit(1); - } - - for(i = 0; i < f->numcolors; ++i) - { - if (!XParseColor(dpy, xgwa->colormap, - rgb_colormap[i], &tmpcolor)) - { - fprintf(stderr, "%s: couldn't parse color %s\n", progname, - rgb_colormap[i]); - exit(1); - } - - if (!XAllocColor(dpy, xgwa->colormap, &tmpcolor)) - { - fprintf(stderr, "%s: couldn't allocate color %s\n", progname, - rgb_colormap[i]); - exit(1); - } - - f->parsedcolors[i] = tmpcolor.pixel; - - } -} - -/* used when the window is resized */ -static void build_img(struct field *f) -{ - if (f->off_img) { - free(f->off_img); - f->off_img = NULL; - } - - f->off_img = (unsigned long *) calloc(f->width * f->height, - sizeof(unsigned long)); - - - if ( f->off_img == NULL ) - { - fprintf(stderr, "%s: Failed to allocate off_img\n", - progname); - exit(1); - } - - memset(f->off_img, f->bgcolor, - sizeof(unsigned long) * f->width * f->height); -} - -static void free_circles(struct field *f) -{ - int i; - - if ( f->circles != NULL ) - { - for(i = 0; i < f->num_circles; ++i) - { - free (f->circles[i].painters); - } - - free (f->circles); - f->circles = NULL; - } -} - -static void build_field(Display *dpy, Window window, XWindowAttributes xgwa, GC fgc, - struct field *f) -{ - int i; - int num_orbits; - int base_orbits; - int orbit_start; - build_img(f); - - f->center_of_universe.x = f->width / 2.0; - f->center_of_universe.y = f->height / 2.0; - f->center_of_universe.r = MAX(f->width, f->height) / 2.0; - - num_orbits = (f->percent_orbits * f->num_circles) / 100; - orbit_start = f->num_circles - num_orbits; - base_orbits = orbit_start + (num_orbits * f->base_orbits) / 100; - - free_circles(f); - - f->circles = (Circle*) calloc(f->num_circles, sizeof(Circle)); - if ( f->circles == NULL ) - { - fprintf(stderr, "%s: Failed to allocate off_img\n", - progname); - exit(1); - } - - for(i = 0; i < f->num_circles; ++i) - { - int j; - Circle *circle = f->circles + i; - - /* make this a pref */ - - if ( i >= orbit_start ) - circle->path_type = ORBIT; - else - circle->path_type = LINEAR; - - - if ( circle->path_type == LINEAR ) - { - circle->x = frand(f->width); - circle->y = frand(f->height); - - circle->dx = frand(0.5) - 0.25; - circle->dy = frand(0.5) - 0.25; - /* circle->dy = 0; */ - /* circle->r = f->height * (0.05 + frand(0.1)); */ - circle->radius = 5 + frand(55); - - /* in case we want orbits based on lines */ - circle->r = MIN(f->width, f->height) / 2.0; - circle->center = NULL; - } - else /* == ORBIT */ - { - if (i < base_orbits ) - { - if ( f->base_on_center ) - circle->center = &f->center_of_universe; - else - { - circle->center = f->circles + - ((int)frand(orbit_start - 0.1)); - } - - circle->r = 1 + frand(MIN(f->width, f->height) / 2.0); - - /* circle->radius = 5 + frand(55); */ - } - else - { - /* give a preference for the earlier circles */ - - double p = frand(0.9); - - circle->center = f->circles + (int) (p*i); - - circle->r = 1 + 0.5 * circle->center->r + 0.5 * frand(circle->center->r); - /* circle->r = 1 + frand(circle->center->r / 2); */ - - - /* circle->radius = MAX(5, frand(circle->r)); */ - /* circle->radius = 5 + frand(55); */ - } - - circle->radius = 5 + frand(MIN(55, circle->r)); - circle->dtheta = (frand(0.5) - 0.25) / circle->r; - circle->theta = frand(2 * M_PI); - - circle->x = circle->r * cos(circle->theta) + circle->center->x; - circle->y = circle->r * sin(circle->theta) + circle->center->y; - - } - - /* make this a command line option */ - circle->num_painters = 3; - circle->painters = (SandPainter*) calloc(circle->num_painters, - sizeof(SandPainter)); - if ( circle->painters == NULL ) - { - fprintf(stderr, "%s: failed to allocate painters", progname); - exit(1); - } - - for(j = 0; j < circle->num_painters; ++j) - { - SandPainter *painter = circle->painters + j; - - painter->gain = frand(0.09) + 0.01; - painter->p = frand(1.0); - painter->color = - f->parsedcolors[(int)(frand(0.999) * f->numcolors)]; - } - } -} - -static void moveCircles(struct field *f) -{ - int i; - - for(i = 0; i < f->num_circles; ++i) - { - Circle *circle = f->circles + i; - - if ( circle->path_type == LINEAR ) - { - circle->x += circle->dx; - circle->y += circle->dy; - -#if 0 - if ( circle->x < -circle->radius ) - circle->x = f->width + circle->radius; - else if ( circle->x >= f->width + circle->radius ) - circle->x = -circle->radius; - - if ( circle->y < -circle->radius ) - circle->y = f->height + circle->radius; - else if ( circle->y >= f->height + circle->radius ) - circle->y = -circle->radius; -#else - if ( circle->x < 0 ) circle->x += f->width; - else if ( circle->x >= f->width ) circle->x -= f->width; - - if ( circle->y < 0 ) circle->y += f->height; - else if ( circle->y >= f->height ) circle->y -= f->height; -#endif - } - else /* (circle->path_type == ORBIT) */ - { - circle->theta += circle->dtheta; - - if ( circle->theta < 0 ) circle->theta += 2 * M_PI; - else if ( circle->theta > 2 * M_PI ) circle->theta -= 2 * M_PI; - - circle->x = circle->r * cos(circle->theta) + circle->center->x; - circle->y = circle->r * sin(circle->theta) + circle->center->y; - -#if 0 - if ( circle->x < -circle->radius ) - circle->x += f->width + 2 * circle->radius; - else if ( circle->x >= f->width + circle->radius ) - circle->x -= f->width + 2 * circle->radius; - - if ( circle->y < -circle->radius ) - circle->y += f->height + 2 * circle->radius; - else if ( circle->y >= f->height + circle->radius ) - circle->y -= f->height + 2 * circle->radius; -#else - if ( circle->x < 0 ) circle->x += f->width; - else if ( circle->x >= f->width ) circle->x -= f->width; - - if ( circle->y < 0 ) circle->y += f->height; - else if ( circle->y >= f->height ) circle->y -= f->height; -#endif - } - } -} - -static void drawIntersections(Display *dpy, Window window, GC fgc, struct field *f) -{ - int i,j; - - /* One might be tempted to think 'hey, this is a crude algorithm - * that is going to check each of the n (n-1) / 2 possible - * intersections! Why not try bsp trees, quad trees, etc, etc, - * etc' - * - * In practice the time spent drawing the intersection of two - * circles dwarfs the time takes to check for intersection. - * Profiling on a 640x480 screen with 100 circles shows possible - * speed gains to be only a couple of percent. - * - * But hey, if you're bored, go have fun. Let me know how it - * turns out. - */ - - - for(i = 0; i < f->num_circles; ++i) - { - Circle *c1 = f->circles + i; - - if ( !f->draw_centers ) - { - /* the default branch */ - - for(j = i + 1; j < f->num_circles; ++j) - { - double d, dsqr, dx, dy; - Circle *c2 = f->circles + j; - -#ifdef TIME_ME - ++f->possible_intersections; -#endif - dx = c2->x - c1->x; - dy = c2->y - c1->y; - - dsqr = dx * dx + dy * dy; - d = sqrt(dsqr); - - if ( (fabs(dx) < (c1->radius + c2->radius)) && - (fabs(dy) < (c1->radius + c2->radius)) && - ( d < (c1->radius + c2->radius) ) && - ( d > fabs(c1->radius - c2->radius) ) ) - { - double d1, d2, r1sqr; - double bx, by; - double midpx, midpy; - double int1x, int1y; - double int2x, int2y; - int s; - - /* woo-hoo. the circles are neither outside nor - * inside each other. they intersect. - * - * Now, compute the coordinates of the points of - * intersection - */ - -#ifdef TIME_ME - ++f->intersection_count; -#endif - - /* unit vector in direction of c1 to c2 */ - bx = dx / d; - by = dy / d; - - r1sqr = c1->radius * c1->radius; - - /* distance from c1's center midpoint of intersection - * points */ - - d1 = 0.5 * (r1sqr - c2->radius * c2->radius + dsqr) / d; - - midpx = c1->x + d1 * bx; - midpy = c1->y + d1 * by; - - /* distance from midpoint to points of intersection */ - - d2 = sqrt(r1sqr - d1 * d1); - - int1x = midpx + d2 * by; - int1y = midpy - d2 * bx; - - int2x = midpx - d2 * by; - int2y = midpy + d2 * bx; - - for(s = 0; s < c1->num_painters; ++s) - { - paint(c1->painters + s, int1x, int1y, int2x, int2y, - dpy, window, fgc, f); - } - } - } - } - else /* f->draw_centers */ - { - XDrawPoint(dpy, window, fgc, c1->x, c1->y); - } - } -} - -struct state { - Display *dpy; - Window window; - - unsigned int max_cycles; - int growth_delay; - GC fgc; - XGCValues gcv; - XWindowAttributes xgwa; - - struct field *f; -}; - - -static void * -interaggregate_init (Display *dpy, Window window) -{ - struct state *st = (struct state *) calloc (1, sizeof(*st)); - -#ifdef TIME_ME - int frames; - struct timeval tm1, tm2; - double tdiff; -#endif - - st->dpy = dpy; - st->window = window; - st->f = init_field(); - st->growth_delay = (get_integer_resource(st->dpy, "growthDelay", "Integer")); - st->max_cycles = (get_integer_resource(st->dpy, "maxCycles", "Integer")); - st->f->num_circles = (get_integer_resource(st->dpy, "numCircles", "Integer")); - st->f->percent_orbits = (get_integer_resource(st->dpy, "percentOrbits", "Integer")); - st->f->base_orbits = (get_integer_resource(st->dpy, "baseOrbits", "Integer")); - st->f->base_on_center = (get_boolean_resource(st->dpy, "baseOnCenter", "Boolean")); - st->f->draw_centers = (get_boolean_resource(st->dpy, "drawCenters", "Boolean")); - - if (st->f->num_circles <= 1) - { - fprintf(stderr, "%s: Minimum number of circles is 2\n", - progname); - exit (1); - } - - if ( (st->f->percent_orbits < 0) || (st->f->percent_orbits > 100) ) - { - fprintf(stderr, "%s: percent-oribts must be between 0 and 100\n", - progname); - exit (1); - } - - if ( (st->f->base_orbits < 0) || (st->f->base_orbits > 100) ) - { - fprintf(stderr, "%s: base-oribts must be between 0 and 100\n", - progname); - exit (1); - } - - if ( st->f->percent_orbits == 100 ) - st->f->base_on_center = True; - - XGetWindowAttributes(st->dpy, st->window, &st->xgwa); - - build_colors(st->f, st->dpy, &st->xgwa); - - st->gcv.foreground = get_pixel_resource(st->dpy, st->xgwa.colormap, - "foreground", "Foreground"); - st->gcv.background = get_pixel_resource(st->dpy, st->xgwa.colormap, - "background", "Background"); - - st->fgc = XCreateGC(st->dpy, st->window, GCForeground, &st->gcv); - - st->f->height = st->xgwa.height; - st->f->width = st->xgwa.width; - st->f->visdepth = st->xgwa.depth; - st->f->fgcolor = st->gcv.foreground; - st->f->bgcolor = st->gcv.background; - - /* Initialize stuff */ - build_field(st->dpy, st->window, st->xgwa, st->fgc, st->f); - -#ifdef TIME_ME - gettimeofday(&tm1, NULL); - frames = 0; -#endif - - return st; -} - - -static unsigned long -interaggregate_draw (Display *dpy, Window window, void *closure) -{ - struct state *st = (struct state *) closure; - - if ((st->f->cycles % 10) == 0) - { - /* Restart if the window size changes */ - XGetWindowAttributes(st->dpy, st->window, &st->xgwa); - - if (st->f->height != st->xgwa.height || st->f->width != st->xgwa.width) - { - st->f->height = st->xgwa.height; - st->f->width = st->xgwa.width; - st->f->visdepth = st->xgwa.depth; - - build_field(st->dpy, st->window, st->xgwa, st->fgc, st->f); - XSetForeground(st->dpy, st->fgc, st->gcv.background); - XFillRectangle(st->dpy, st->window, st->fgc, 0, 0, st->xgwa.width, st->xgwa.height); - XSetForeground(st->dpy, st->fgc, st->gcv.foreground); - } - } - - moveCircles(st->f); - drawIntersections(st->dpy, st->window, st->fgc, st->f); - - st->f->cycles++; - - - if (st->f->cycles >= st->max_cycles && st->max_cycles != 0) - { - build_field(st->dpy, st->window, st->xgwa, st->fgc, st->f); - XSetForeground(st->dpy, st->fgc, st->gcv.background); - XFillRectangle(st->dpy, st->window, st->fgc, 0, 0, st->xgwa.width, st->xgwa.height); - XSetForeground(st->dpy, st->fgc, st->gcv.foreground); - } - -#ifdef TIME_ME - frames++; - gettimeofday(&tm2, NULL); - - tdiff = (tm2.tv_sec - tm1.tv_sec) - + (tm2.tv_usec - tm1.tv_usec) * 0.00001; - - if ( tdiff > 1 ) - { - fprintf(stderr, "fps: %d %f %f\n", - frames, tdiff, frames / tdiff ); - - fprintf(stderr, "intersections: %d %d %f\n", - f->intersection_count, f->possible_intersections, - ((double)f->intersection_count) / - f->possible_intersections); - - fprintf(stderr, "fpi: %f\n", - ((double)frames) / f->intersection_count ); - - frames = 0; - tm1.tv_sec = tm2.tv_sec; - tm1.tv_usec = tm2.tv_usec; - - f->intersection_count = f->possible_intersections = 0; - } -#endif - - return st->growth_delay; -} - - -static void -interaggregate_reshape (Display *dpy, Window window, void *closure, - unsigned int w, unsigned int h) -{ -} - -static Bool -interaggregate_event (Display *dpy, Window window, void *closure, XEvent *event) -{ - struct state *st = (struct state *) closure; - if (screenhack_event_helper (dpy, window, event)) - { - st->f->height--; /* act like a resize */ - return True; - } - return False; -} - -static void -interaggregate_free (Display *dpy, Window window, void *closure) -{ - struct state *st = (struct state *) closure; - if (st->f) { - free_circles (st->f); - if (st->f->off_img) free (st->f->off_img); - if (st->f->parsedcolors) free (st->f->parsedcolors); - free (st->f); - } - if (st->fgc) XFreeGC (st->dpy, st->fgc); - free (st); -} - - -XSCREENSAVER_MODULE ("Interaggregate", interaggregate) |