X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=blobdiff_plain;f=hacks%2Flightning.c;h=1f5d70234231f58477f9181371d55d47e0980dc1;hp=77be5783a22fa3f0eabee252b57ab7af2b06161c;hb=4361b69d3178d7fc98d0388f9a223af6c2651aba;hpb=ce3185de9d9705e259f2b60dd4b5509007fa17d4 diff --git a/hacks/lightning.c b/hacks/lightning.c index 77be5783..1f5d7023 100644 --- a/hacks/lightning.c +++ b/hacks/lightning.c @@ -1,11 +1,12 @@ -/* -*- Mode: C; tab-width: 4 -*- - * lightning --- fractal lightning bolts. - */ -#if !defined( lint ) && !defined( SABER ) -static const char sccsid[] = "@(#)lightning.c 4.00 97/01/01 xlockmore"; +/* -*- Mode: C; tab-width: 4 -*- */ +/* lightning --- fractal lightning bolds */ + +#if 0 +static const char sccsid[] = "@(#)lightning.c 5.00 2000/11/01 xlockmore"; #endif -/* Copyright (c) 1996 by Keith Romberg . +/*- + * Copyright (c) 1996 by Keith Romberg * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, @@ -20,28 +21,38 @@ static const char sccsid[] = "@(#)lightning.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. - * 14-Jul-96: Cleaned up code. - * 27-Jun-96: Written and submitted by Keith Romberg . + * 01-Nov-2000: Allocation checks + * 10-May-1997: Compatible with xscreensaver + * 14-Jul-1996: Cleaned up code. + * 27-Jun-1996: Written and submitted by Keith Romberg . */ #ifdef STANDALONE -# define PROGCLASS "Lightning" -# define HACK_INIT init_lightning -# define HACK_DRAW draw_lightning -# define lightning_opts xlockmore_opts -# define DEFAULTS "*delay: 10000 \n" \ - "*ncolors: 200 \n" +# define MODE_lightning +# define DEFAULTS "*delay: 10000 \n" \ + "*ncolors: 64 \n" + # define BRIGHT_COLORS -# include "xlockmore.h" /* from the xscreensaver distribution */ -#else /* !STANDALONE */ -# include "xlock.h" /* from the xlockmore distribution */ -#endif /* !STANDALONE */ +# define reshape_lightning 0 +# define lightning_handle_event 0 +# include "xlockmore.h" /* in xscreensaver distribution */ +#else /* STANDALONE */ +# include "xlock.h" /* in xlockmore distribution */ +#endif /* STANDALONE */ -ModeSpecOpt lightning_opts = { - 0, NULL, 0, NULL, NULL }; +#ifdef MODE_lightning -/*---------------------------- defines -------------------------------*/ +ENTRYPOINT ModeSpecOpt lightning_opts = +{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL}; + +#ifdef USE_MODULES +ModStruct lightning_description = +{"lightning", "init_lightning", "draw_lightning", "release_lightning", + "refresh_lightning", "init_lightning", (char *) NULL, &lightning_opts, + 10000, 1, 1, 1, 64, 0.6, "", + "Shows Keith's fractal lightning bolts", 0, NULL}; + +#endif #define BOLT_NUMBER 4 #define BOLT_ITERATION 4 @@ -100,10 +111,11 @@ typedef struct { int give_it_hell; int draw_time; int stage; + int busyLoop; unsigned long color; } Storm; -static Storm *Helga = NULL; +static Storm *Helga = (Storm *) NULL; /*------------------- function prototypes ----------------------------*/ @@ -113,7 +125,7 @@ static int setup_multi_strike(void); static int flashing_strike(void); static void flash_duration(int *start, int *end, int total_duration); static void random_storm(Storm * st); -static void generate(XPoint A, XPoint B, int iter, XPoint * verts, int *index); +static void generate(XPoint A, XPoint B, int iter, XPoint * verts, int *vert_index); static void create_fork(Fork * f, XPoint start, XPoint end, int level); static void first_strike(Lightning bolt, ModeInfo * mi); @@ -123,7 +135,7 @@ static void level1_strike(Lightning bolt, ModeInfo * mi); static void level2_strike(Lightning bolt, ModeInfo * mi); static int storm_active(Storm * st); -static void update_bolt(Lightning * bolt, int time); +static void update_bolt(Lightning * bolt, int time_now); static void wiggle_bolt(Lightning * bolt); static void wiggle_line(XPoint * p, int number, int wiggle_amount); @@ -220,7 +232,7 @@ random_storm(Storm * st) } static void -generate(XPoint A, XPoint B, int iter, XPoint * verts, int *index) +generate(XPoint A, XPoint B, int iter, XPoint * verts, int *vert_index) { XPoint mid; @@ -228,13 +240,13 @@ generate(XPoint A, XPoint B, int iter, XPoint * verts, int *index) mid.y = (A.y + B.y) / 2 + NRAND(HEIGHT_VARIATION) - HEIGHT_VARIATION / 2; if (!iter) { - verts[*index].x = mid.x; - verts[*index].y = mid.y; - (*index)++; + verts[*vert_index].x = mid.x; + verts[*vert_index].y = mid.y; + (*vert_index)++; return; } - generate(A, mid, iter - 1, verts, index); - generate(mid, B, iter - 1, verts, index); + generate(A, mid, iter - 1, verts, vert_index); + generate(mid, B, iter - 1, verts, vert_index); } /*------------------------------------------------------------------------*/ @@ -270,30 +282,30 @@ create_fork(Fork * f, XPoint start, XPoint end, int level) /*------------------------------------------------------------------------*/ static void -update_bolt(Lightning * bolt, int time) +update_bolt(Lightning * bolt, int time_now) { wiggle_bolt(bolt); if ((bolt->wiggle_amount == 0) && (bolt->wiggle_number > 2)) bolt->wiggle_number = 0; - if (((time % 3) == 0)) + if (((time_now % 3) == 0)) bolt->wiggle_amount++; - if (((time >= bolt->delay_time) && (time < bolt->flash_begin)) || - (time > bolt->flash_stop)) + if (((time_now >= bolt->delay_time) && (time_now < bolt->flash_begin)) || + (time_now > bolt->flash_stop)) bolt->visible = 1; else bolt->visible = 0; - if (time == bolt->delay_time) + if (time_now == bolt->delay_time) bolt->strike_level = FIRST_LEVEL_STRIKE; - else if (time == (bolt->delay_time + 1)) + else if (time_now == (bolt->delay_time + 1)) bolt->strike_level = LEVEL_ONE_STRIKE; - else if ((time > (bolt->delay_time + 1)) && - (time <= (bolt->delay_time + bolt->flash_begin - 2))) + else if ((time_now > (bolt->delay_time + 1)) && + (time_now <= (bolt->delay_time + bolt->flash_begin - 2))) bolt->strike_level = LEVEL_TWO_STRIKE; - else if (time == (bolt->delay_time + bolt->flash_begin - 1)) + else if (time_now == (bolt->delay_time + bolt->flash_begin - 1)) bolt->strike_level = LEVEL_ONE_STRIKE; - else if (time == (bolt->delay_time + bolt->flash_stop + 1)) + else if (time_now == (bolt->delay_time + bolt->flash_stop + 1)) bolt->strike_level = LEVEL_ONE_STRIKE; else bolt->strike_level = LEVEL_TWO_STRIKE; @@ -324,7 +336,7 @@ first_strike(Lightning bolt, ModeInfo * mi) GC gc = MI_GC(mi); int i; - XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + XSetForeground(display, gc, MI_WHITE_PIXEL(mi)); XDrawLine(display, window, gc, bolt.end1.x, bolt.end1.y, bolt.middle[0].x, bolt.middle[0].y); draw_line(mi, bolt.middle, BOLT_VERTICIES, gc, 0); @@ -375,7 +387,7 @@ level1_strike(Lightning bolt, ModeInfo * mi) if (MI_NPIXELS(mi) > 2) /* color */ XSetForeground(display, gc, MI_PIXEL(mi, st->color)); else - XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + XSetForeground(display, gc, MI_WHITE_PIXEL(mi)); XDrawLine(display, window, gc, bolt.end1.x - 1, bolt.end1.y, bolt.middle[0].x - 1, bolt.middle[0].y); draw_line(mi, bolt.middle, BOLT_VERTICIES, gc, -1); @@ -403,7 +415,7 @@ level1_strike(Lightning bolt, ModeInfo * mi) static int distance(XPoint a, XPoint b) { - return ((int) sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y))); + return ((int) sqrt((double) (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y))); } /*------------------------------------------------------------------------*/ @@ -424,7 +436,7 @@ level2_strike(Lightning bolt, ModeInfo * mi) if (MI_NPIXELS(mi) > 2) XSetForeground(display, gc, MI_PIXEL(mi, st->color)); else - XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + XSetForeground(display, gc, MI_WHITE_PIXEL(mi)); XDrawLine(display, window, gc, bolt.end1.x - 2, bolt.end1.y, bolt.middle[0].x - 2, bolt.middle[0].y); draw_line(mi, bolt.middle, BOLT_VERTICIES, gc, -2); @@ -501,20 +513,16 @@ wiggle_line(XPoint * p, int number, int amount) /*------------------------------------------------------------------------*/ -void -init_lightning(ModeInfo * mi) +ENTRYPOINT void +init_lightning (ModeInfo * mi) { Storm *st; - if (Helga == NULL) { - if ((Helga = (Storm *) calloc(MI_NUM_SCREENS(mi), - sizeof (Storm))) == NULL) - return; - } + MI_INIT (mi, Helga, 0); st = &Helga[MI_SCREEN(mi)]; - st->scr_width = MI_WIN_WIDTH(mi); - st->scr_height = MI_WIN_HEIGHT(mi); + st->scr_width = MI_WIDTH(mi); + st->scr_height = MI_HEIGHT(mi); st->multi_strike = setup_multi_strike(); random_storm(st); @@ -523,21 +531,28 @@ init_lightning(ModeInfo * mi) /*------------------------------------------------------------------------*/ -void -draw_lightning(ModeInfo * mi) +ENTRYPOINT void +draw_lightning (ModeInfo * mi) { - Storm *st = &Helga[MI_SCREEN(mi)]; int i; + Storm *st; + if (Helga == NULL) + return; + st = &Helga[MI_SCREEN(mi)]; + MI_IS_DRAWN(mi) = True; switch (st->stage) { case 0: - XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); + MI_IS_DRAWN(mi) = False; + MI_CLEARWINDOW(mi); + MI_IS_DRAWN(mi) = True; + st->color = NRAND(MI_NPIXELS(mi)); st->draw_time = 0; if (storm_active(st)) st->stage++; else - st->stage = 3; + st->stage = 4; break; case 1: for (i = 0; i < st->multi_strike; i++) { @@ -546,35 +561,50 @@ draw_lightning(ModeInfo * mi) update_bolt(&(st->bolts[i]), st->draw_time); } st->draw_time++; - XFlush(MI_DISPLAY(mi)); - MI_PAUSE(mi) = 60000; st->stage++; + st->busyLoop = 0; break; case 2: - XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); + if (++st->busyLoop > 6) { + st->stage++; + st->busyLoop = 0; + } + break; + case 3: + MI_IS_DRAWN(mi) = False; + MI_CLEARWINDOW(mi); + MI_IS_DRAWN(mi) = True; + if (storm_active(st)) st->stage = 1; else st->stage++; break; - case 3: - MI_PAUSE(mi) = 1000000; + case 4: + if (++st->busyLoop > 100) { + st->busyLoop = 0; + } init_lightning(mi); break; } } -void +ENTRYPOINT void release_lightning(ModeInfo * mi) { if (Helga != NULL) { (void) free((void *) Helga); - Helga = NULL; + Helga = (Storm *) NULL; } } -void +ENTRYPOINT void refresh_lightning(ModeInfo * mi) { /* Do nothing, it will refresh by itself */ } + +XSCREENSAVER_MODULE ("Lightning", lightning) + + +#endif /* MODE_lightning */