X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fspeedmine.c;h=17a3f2a4d695d6de696f12bdfd3c46d90e2d09f8;hb=aa75c7476aeaa84cf3abc192b376a8b03c325213;hp=312e51604d7f109ec88d29c9dbd5e49205f34e1e;hpb=49f5b54f312fe4ac2e9bc47581a72451bd0e8439;p=xscreensaver diff --git a/hacks/speedmine.c b/hacks/speedmine.c index 312e5160..17a3f2a4 100644 --- a/hacks/speedmine.c +++ b/hacks/speedmine.c @@ -47,8 +47,10 @@ */ /* Define or undefine NDEBUG to turn assert and abort debugging off or on */ -#define NDEBUG -#include +/*#define NDEBUG*/ +/*#include */ +#define assert(X) +#define DEBUG_FLAG 0 #include @@ -67,11 +69,6 @@ /* No. of shades of each color (ground, walls, bonuses) */ #define MAX_COLORS 32 -#ifdef NDEBUG -#define DEBUG_FLAG 0 -#else -#define DEBUG_FLAG 1 -#endif #define FORWARDS 1 @@ -110,6 +107,8 @@ struct state { Pixmap dbuf, stars_mask; Colormap cmap; + Visual *visual; + Screen *screen; unsigned int default_fg_pixel; GC draw_gc, erase_gc, tunnelend_gc, stars_gc, stars_erase_gc; @@ -476,7 +475,8 @@ generate_terrain (struct state *st, int start, int end, int final) for (w= diff/2, l=TERRAIN_BREADTH/4; w >= final || l >= final; w /= 2, l /= 2) { - if (w<1) w=1; if (l<1) l=1; + if (w<1) w=1; + if (l<1) l=1; for (i=start+w-1; i < end; i += (w*2)) { ip = i-w; MODULO(ip, TERRAIN_LENGTH); @@ -881,6 +881,7 @@ render_quads (struct state *st, Drawable d, int t, int dt, int i) } if (st->be_wormy && st->psychedelic_flag) index += st->ncolors/4; + if (st->ncolors > MAX_COLORS) abort(); index = MIN (index, st->ncolors-1); index = MAX (index, 0); @@ -1104,7 +1105,7 @@ render_speedmine (struct state *st, Drawable d) } else { t = MAX(begin_at(st), TERRAIN_LENGTH/4); /*t = TERRAIN_LENGTH/4; dt = 2; */ - dt = (t >= 3*TERRAIN_LENGTH/4 ? 1 : 2); + /*dt = (t >= 3*TERRAIN_LENGTH/4 ? 1 : 2);*/ i = (st->nearest -t + TERRAIN_LENGTH) % TERRAIN_LENGTH; render_block (st, d, st->tunnelend_gc, t); } @@ -1259,13 +1260,14 @@ speedmine_color_ramp (struct state *st, GC *gcs, XColor * colors, h1 = h2 = RAND(360); } - make_color_ramp (st->dpy, st->cmap, + make_color_ramp (st->screen, st->visual, st->cmap, h1, s1, v1, h2, s2, v2, colors, ncolors, False, True, False); flags = GCForeground; for (i=0; i < *ncolors; i++) { gcv.foreground = colors[i].pixel; + if (gcs[i]) XFreeGC (st->dpy, gcs[i]); gcs[i] = XCreateGC (st->dpy, st->dbuf, flags, &gcv); } @@ -1284,28 +1286,29 @@ change_colors (struct state *st) double s1, s2; if (st->psychedelic_flag) { - free_colors (st->dpy, st->cmap, st->bonus_colors, st->nr_bonus_colors); - free_colors (st->dpy, st->cmap, st->wall_colors, st->nr_wall_colors); - free_colors (st->dpy, st->cmap, st->ground_colors, st->nr_ground_colors); - st->ncolors = MAX_COLORS; - + free_colors (st->screen, st->cmap, st->bonus_colors, st->nr_bonus_colors); + free_colors (st->screen, st->cmap, st->wall_colors, st->nr_wall_colors); + free_colors (st->screen, st->cmap, st->ground_colors, st->nr_ground_colors); s1 = 0.4; s2 = 0.9; + st->ncolors = MAX_COLORS; speedmine_color_ramp (st, st->ground_gcs, st->ground_colors, &st->ncolors, 0.0, 0.8, 0.0, 0.9); st->nr_ground_colors = st->ncolors; } else { - free_colors (st->dpy, st->cmap, st->bonus_colors, st->nr_bonus_colors); - free_colors (st->dpy, st->cmap, st->wall_colors, st->nr_wall_colors); + free_colors (st->screen, st->cmap, st->bonus_colors, st->nr_bonus_colors); + free_colors (st->screen, st->cmap, st->wall_colors, st->nr_wall_colors); st->ncolors = st->nr_ground_colors; s1 = 0.0; s2 = 0.6; } + st->ncolors = MAX_COLORS; speedmine_color_ramp (st, st->wall_gcs, st->wall_colors, &st->ncolors, s1, s2, 0.0, 0.9); st->nr_wall_colors = st->ncolors; + st->ncolors = MAX_COLORS; speedmine_color_ramp (st, st->bonus_gcs, st->bonus_colors, &st->ncolors, 0.6, 0.9, 0.4, 1.0); st->nr_bonus_colors = st->ncolors; @@ -1325,15 +1328,16 @@ init_psychedelic_colors (struct state *st) st->tunnelend_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv); st->ncolors = MAX_COLORS; - speedmine_color_ramp (st, st->ground_gcs, st->ground_colors, &st->ncolors, 0.0, 0.8, 0.0, 0.9); st->nr_ground_colors = st->ncolors; + st->ncolors = MAX_COLORS; speedmine_color_ramp (st, st->wall_gcs, st->wall_colors, &st->ncolors, 0.0, 0.6, 0.0, 0.9); st->nr_wall_colors = st->ncolors; + st->ncolors = MAX_COLORS; speedmine_color_ramp (st, st->bonus_gcs, st->bonus_colors, &st->ncolors, 0.6, 0.9, 0.4, 1.0); st->nr_bonus_colors = st->ncolors; @@ -1367,7 +1371,8 @@ init_colors (struct state *st) rgb_to_hsv (dark.red, dark.green, dark.blue, &h1, &s1, &v1); rgb_to_hsv (light.red, light.green, light.blue, &h2, &s2, &v2); - make_color_ramp (st->dpy, st->cmap, h1, s1, v1, h2, s2, v2, + make_color_ramp (st->screen, st->visual, st->cmap, + h1, s1, v1, h2, s2, v2, st->ground_colors, &st->ncolors, False, True, False); st->nr_ground_colors = st->ncolors; @@ -1377,10 +1382,12 @@ init_colors (struct state *st) st->ground_gcs[i] = XCreateGC (st->dpy, st->dbuf, flags, &gcv); } + st->ncolors = MAX_COLORS; speedmine_color_ramp (st, st->wall_gcs, st->wall_colors, &st->ncolors, 0.0, 0.6, 0.0, 0.9); st->nr_wall_colors = st->ncolors; + st->ncolors = MAX_COLORS; speedmine_color_ramp (st, st->bonus_gcs, st->bonus_colors, &st->ncolors, 0.6, 0.9, 0.4, 1.0); st->nr_bonus_colors = st->ncolors; @@ -1426,12 +1433,14 @@ speedmine_init (Display *dpy, Window window) XGetWindowAttributes (st->dpy, st->window, &xgwa); st->cmap = xgwa.colormap; + st->visual = xgwa.visual; + st->screen = xgwa.screen; st->width = xgwa.width; st->height = xgwa.height; st->verbose_flag = get_boolean_resource (st->dpy, "verbose", "Boolean"); -# ifdef HAVE_COCOA /* Don't second-guess Quartz's double-buffering */ +# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */ st->dbuf = st->window; #else st->dbuf = XCreatePixmap (st->dpy, st->window, st->width, st->height, xgwa.depth); @@ -1532,6 +1541,16 @@ static void speedmine_reshape (Display *dpy, Window window, void *closure, unsigned int w, unsigned int h) { + struct state *st = (struct state *) closure; + st->width = w; + st->height = h; + if (st->dbuf != st->window) { + XWindowAttributes xgwa; + XGetWindowAttributes (st->dpy, st->window, &xgwa); + XFreePixmap (dpy, st->dbuf); + st->dbuf = XCreatePixmap (st->dpy, st->window, + st->width, st->height, xgwa.depth); + } } static Bool @@ -1622,7 +1641,7 @@ static XrmOptionDescRec speedmine_options [] = { }; -XSCREENSAVER_MODULE ("Speedmine", speedmine) +XSCREENSAVER_MODULE ("SpeedMine", speedmine) /* vim: ts=4 */