X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fbraid.c;h=c73b89d785e039b4051394e480c4356498197f81;hb=4ade52359b6eba3621566dac79793a33aa4c915f;hp=9d9c4e5fd37d7191520da055279ae13f4e204f3e;hpb=df7adbee81405e2849728a24b498ad2117784b1f;p=xscreensaver diff --git a/hacks/braid.c b/hacks/braid.c index 9d9c4e5f..c73b89d7 100644 --- a/hacks/braid.c +++ b/hacks/braid.c @@ -1,11 +1,14 @@ -/* -*- Mode: C; tab-width: 4 -*- - * braid --- draws random color-cyling rotating braids around a circle. +/* -*- Mode: C; tab-width: 4 -*- */ +/*- + * braid --- random braids around a circle and then changes the color in + * a rotational pattern */ -#if !defined( lint ) && !defined( SABER ) -static const char sccsid[] = "@(#)braid.c 4.00 97/01/01 xlockmore"; + +#if 0 +static const char sccsid[] = "@(#)braid.c 5.00 2000/11/01 xlockmore"; #endif -/* +/*- * Copyright (c) 1995 by John Neil. * * Permission to use, copy, modify, and distribute this software and its @@ -21,31 +24,43 @@ static const char sccsid[] = "@(#)braid.c 4.00 97/01/01 xlockmore"; * other special, indirect and consequential damages. * * Revision History: - * 10-May-97: jwz@jwz.org: turned into a standalone program. - * 01-Sep-95: color knotted components differently, J. Neil. - * 29-Aug-95: Written. John Neil + * 01-Nov-2000: Allocation checks + * 10-May-1997: Jamie Zawinski compatible with xscreensaver + * 01-Sep-1995: color knotted components differently, J. Neil. + * 29-Aug-1995: Written. John Neil */ #ifdef STANDALONE -# define PROGCLASS "Braid" -# define HACK_INIT init_braid -# define HACK_DRAW draw_braid -# define braid_opts xlockmore_opts -# define DEFAULTS "*count: 15 \n" \ - "*size: -7 \n" \ - "*cycles: 100 \n" \ - "*delay: 1000 \n" \ - "*ncolors: 64 \n" +# define MODE_braid +# define DEFAULTS "*delay: 1000 \n" \ + "*count: 15 \n" \ + "*cycles: 100 \n" \ + "*size: -7 \n" \ + "*ncolors: 64 \n" \ + "*fpsSolid: true \n" \ + "*ignoreRotation: True" \ + # define UNIFORM_COLORS -# include "xlockmore.h" /* from the xscreensaver distribution */ +# define braid_handle_event 0 +# include "xlockmore.h" # include "erase.h" -#else /* !STANDALONE */ -# include "xlock.h" /* from the xlockmore distribution */ -#endif /* !STANDALONE */ +#else /* STANDALONE */ +# include "xlock.h" +# define ENTRYPOINT /**/ +#endif /* STANDALONE */ + +#ifdef MODE_braid -ModeSpecOpt braid_opts = { - 0, NULL, 0, NULL, NULL }; +ENTRYPOINT ModeSpecOpt braid_opts = {0, NULL, 0, NULL, NULL}; +#ifdef USE_MODULES +ModStruct braid_description = +{"braid", "init_braid", "draw_braid", "release_braid", + "refresh_braid", "init_braid", (char *) NULL, &braid_opts, + 1000, 15, 100, 1, 64, 1.0, "", + "Shows random braids and knots", 0, NULL}; + +#endif #if defined( COLORROUND ) && defined( COLORCOMP ) #undef COLORROUND @@ -72,6 +87,7 @@ ModeSpecOpt braid_opts = { #define FLOATRAND(min,max) ((min)+((double) LRAND()/((double) MAXRAND))*((max)-(min))) typedef struct { + int linewidth; int braidword[MAXLENGTH]; int components[MAXSTRANDS]; int startcomp[MAXLENGTH][MAXSTRANDS]; @@ -84,10 +100,13 @@ typedef struct { float max_radius; float top, bottom, left, right; int age; - int color_direction; + int color_direction; +#ifdef STANDALONE + eraser_state *eraser; +#endif } braidtype; -static braidtype *braids = NULL; +static braidtype *braids = (braidtype *) NULL; static int applyword(braidtype * braid, int string, int position) @@ -144,10 +163,9 @@ applywordbackto(braidtype * braid, int string, int position) return c; } -void +ENTRYPOINT void init_braid(ModeInfo * mi) { - Display *display = MI_DISPLAY(mi); braidtype *braid; int used[MAXSTRANDS]; int i, count, comp, c; @@ -160,25 +178,28 @@ init_braid(ModeInfo * mi) } braid = &braids[MI_SCREEN(mi)]; - braid->center_x = MI_WIN_WIDTH(mi) / 2; - braid->center_y = MI_WIN_HEIGHT(mi) / 2; + braid->center_x = MI_WIDTH(mi) / 2; + braid->center_y = MI_HEIGHT(mi) / 2; braid->age = 0; /* jwz: go in the other direction sometimes. */ braid->color_direction = ((LRAND() & 1) ? 1 : -1); - XClearWindow(display, MI_WINDOW(mi)); + +#ifndef STANDALONE + MI_CLEARWINDOW(mi); +#endif min_length = (braid->center_x > braid->center_y) ? braid->center_y : braid->center_x; braid->min_radius = min_length * 0.30; braid->max_radius = min_length * 0.90; - if (MI_BATCHCOUNT(mi) < MINSTRANDS) + if (MI_COUNT(mi) < MINSTRANDS) braid->nstrands = MINSTRANDS; else braid->nstrands = INTRAND(MINSTRANDS, - MAX(MIN(MIN(MAXSTRANDS, MI_BATCHCOUNT(mi)), - (int) ((braid->max_radius - braid->min_radius) / 5.0)), MINSTRANDS)); + MAX(MIN(MIN(MAXSTRANDS, MI_COUNT(mi)), + (int) ((braid->max_radius - braid->min_radius) / 5.0)), MINSTRANDS)); braid->braidlength = INTRAND(MINLENGTH, MIN(MAXLENGTH, braid->nstrands * 6)); for (i = 0; i < braid->braidlength; i++) { @@ -214,7 +235,7 @@ init_braid(ModeInfo * mi) braid->startcolor = (MI_NPIXELS(mi) > 2) ? (float) NRAND(MI_NPIXELS(mi)) : 0.0; - /* XSetLineAttributes (display, MI_GC(mi), 2, LineSolid, CapRound, + /* XSetLineAttributes (display, MI_GC(mi), 2, LineSolid, CapRound, JoinRound); */ (void) memset((char *) braid->components, 0, sizeof (braid->components)); @@ -237,47 +258,54 @@ init_braid(ModeInfo * mi) } } while (count > 0); - { - int line_width = MI_SIZE(mi); - if (line_width == 0) - line_width = -8; - if (line_width < 0) - line_width = NRAND(-line_width)+1; - if (line_width == 1) - line_width = 0; - XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), line_width, - LineSolid, - (line_width <= 3 ? CapButt : CapRound), - JoinMiter); - } - + braid->linewidth = MI_SIZE(mi); + if (braid->linewidth < 0) + braid->linewidth = NRAND(-braid->linewidth) + 1; + if (braid->linewidth * braid->linewidth * 8 > MIN(MI_WIDTH(mi), MI_HEIGHT(mi))) + braid->linewidth = MIN(1, (int) sqrt((double) MIN(MI_WIDTH(mi), MI_HEIGHT(mi)) / 8)); for (i = 0; i < braid->nstrands; i++) if (!(braid->components[i] & 1)) braid->components[i] *= -1; } -void +ENTRYPOINT void draw_braid(ModeInfo * mi) { Display *display = MI_DISPLAY(mi); Window window = MI_WINDOW(mi); - braidtype *braid = &braids[MI_SCREEN(mi)]; - float num_points, t_inc; + int num_points = 500; + float t_inc; float theta, psi; float t, r_diff; int i, s; float x_1, y_1, x_2, y_2, r1, r2; float color, color_use = 0.0, color_inc; + braidtype *braid; - num_points = 500.0; - theta = (2.0 * M_PI) / (float) (braid->braidlength); - t_inc = (2.0 * M_PI) / num_points; - color_inc = (float) MI_NPIXELS(mi) / num_points; - color_inc *= braid->color_direction; + if (braids == NULL) + return; + braid = &braids[MI_SCREEN(mi)]; + +#ifdef STANDALONE + if (braid->eraser) { + braid->eraser = erase_window (MI_DISPLAY(mi), MI_WINDOW(mi), braid->eraser); + return; + } +#endif + + MI_IS_DRAWN(mi) = True; + XSetLineAttributes(display, MI_GC(mi), braid->linewidth, + LineSolid, + (braid->linewidth <= 3 ? CapButt : CapRound), + JoinMiter); + theta = (2.0 * M_PI) / (float) (braid->braidlength); + t_inc = (2.0 * M_PI) / (float) num_points; + color_inc = (float) MI_NPIXELS(mi) * braid->color_direction / + (float) num_points; braid->startcolor += SPINRATE * color_inc; - if (braid->startcolor >= MI_NPIXELS(mi)) + if (((int) braid->startcolor) >= MI_NPIXELS(mi)) braid->startcolor = 0.0; r_diff = (braid->max_radius - braid->min_radius) / (float) (braid->nstrands); @@ -289,7 +317,7 @@ draw_braid(ModeInfo * mi) for (t = 0.0; t < theta; t += t_inc) { #ifdef COLORROUND color += color_inc; - if (color >= (float) (MI_NPIXELS(mi))) + if (((int) color) >= MI_NPIXELS(mi)) color = 0.0; color_use = color; #endif @@ -303,16 +331,16 @@ draw_braid(ModeInfo * mi) color_use = color + SPINRATE * braid->components[applywordbackto(braid, s, i)] + (psi + t) / 2.0 / M_PI * (float) MI_NPIXELS(mi); - while (color_use >= (float) MI_NPIXELS(mi)) + while (((int) color_use) >= MI_NPIXELS(mi)) color_use -= (float) MI_NPIXELS(mi); - while (color_use < 0.0) + while (((int) color_use) < 0) color_use += (float) MI_NPIXELS(mi); } #endif #ifdef COLORROUND if (MI_NPIXELS(mi) > 2) { color_use += SPINRATE * color_inc; - while (color_use >= (float) (MI_NPIXELS(mi))) + while (((int) color_use) >= MI_NPIXELS(mi)) color_use -= (float) MI_NPIXELS(mi); } #endif @@ -335,7 +363,7 @@ draw_braid(ModeInfo * mi) if (MI_NPIXELS(mi) > 2) XSetForeground(display, MI_GC(mi), MI_PIXEL(mi, (int) color_use)); else - XSetForeground(display, MI_GC(mi), MI_WIN_WHITE_PIXEL(mi)); + XSetForeground(display, MI_GC(mi), MI_WHITE_PIXEL(mi)); XDrawLine(display, window, MI_GC(mi), (int) (x_1), (int) (y_1), (int) (x_2), (int) (y_2)); @@ -345,9 +373,9 @@ draw_braid(ModeInfo * mi) color_use = color + SPINRATE * braid->components[applywordbackto(braid, s + 1, i)] + (psi + t) / 2.0 / M_PI * (float) MI_NPIXELS(mi); - while (color_use >= (float) MI_NPIXELS(mi)) + while (((int) color_use) >= MI_NPIXELS(mi)) color_use -= (float) MI_NPIXELS(mi); - while (color_use < 0.0) + while (((int) color_use) < 0) color_use += (float) MI_NPIXELS(mi); } #endif @@ -368,7 +396,7 @@ draw_braid(ModeInfo * mi) if (MI_NPIXELS(mi) > 2) XSetForeground(display, MI_GC(mi), MI_PIXEL(mi, (int) color_use)); else - XSetForeground(display, MI_GC(mi), MI_WIN_WHITE_PIXEL(mi)); + XSetForeground(display, MI_GC(mi), MI_WHITE_PIXEL(mi)); XDrawLine(display, window, MI_GC(mi), (int) (x_1), (int) (y_1), (int) (x_2), (int) (y_2)); @@ -380,16 +408,16 @@ draw_braid(ModeInfo * mi) color_use = color + SPINRATE * braid->components[applywordbackto(braid, s, i)] + (psi + t) / 2.0 / M_PI * (float) MI_NPIXELS(mi); - while (color_use >= (float) MI_NPIXELS(mi)) + while (((int) color_use) >= MI_NPIXELS(mi)) color_use -= (float) MI_NPIXELS(mi); - while (color_use < 0.0) + while (((int) color_use) < 0) color_use += (float) MI_NPIXELS(mi); } #endif #ifdef COLORROUND if (MI_NPIXELS(mi) > 2) { color_use += SPINRATE * color_inc; - while (color_use >= (float) MI_NPIXELS(mi)) + while (((int) color_use) >= MI_NPIXELS(mi)) color_use -= (float) MI_NPIXELS(mi); } #endif @@ -401,7 +429,7 @@ draw_braid(ModeInfo * mi) if (MI_NPIXELS(mi) > 2) XSetForeground(display, MI_GC(mi), MI_PIXEL(mi, (int) color_use)); else - XSetForeground(display, MI_GC(mi), MI_WIN_WHITE_PIXEL(mi)); + XSetForeground(display, MI_GC(mi), MI_WHITE_PIXEL(mi)); XDrawLine(display, window, MI_GC(mi), (int) (x_1), (int) (y_1), (int) (x_2), (int) (y_2)); @@ -409,26 +437,38 @@ draw_braid(ModeInfo * mi) } } } + XSetLineAttributes(display, MI_GC(mi), 1, LineSolid, CapNotLast, JoinRound); if (++braid->age > MI_CYCLES(mi)) { #ifdef STANDALONE - erase_full_window(MI_DISPLAY(mi), MI_WINDOW(mi)); + braid->eraser = erase_window (MI_DISPLAY(mi), MI_WINDOW(mi), braid->eraser); #endif - init_braid(mi); + init_braid(mi); } } -void +ENTRYPOINT void +reshape_braid(ModeInfo * mi, int width, int height) +{ + XClearWindow (MI_DISPLAY (mi), MI_WINDOW(mi)); + init_braid (mi); +} + +ENTRYPOINT void release_braid(ModeInfo * mi) { if (braids != NULL) { (void) free((void *) braids); - braids = NULL; + braids = (braidtype *) NULL; } } -void +ENTRYPOINT void refresh_braid(ModeInfo * mi) { - /* Do nothing, it will refresh by itself */ + MI_CLEARWINDOW(mi); } + +XSCREENSAVER_MODULE ("Braid", braid) + +#endif /* MODE_braid */