X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fxflame.c;h=9d0883c50167cdc8fff486fa0c0939bc7eeac013;hb=0ed85ca0e4b0eae40a4f50a51d63f2f41e45373a;hp=dcac9600e7497ece737f5590d6d5f5cb608be535;hpb=551b3de3f619c04c2dd1971ee9b3f02e270c28c9;p=xscreensaver diff --git a/hacks/xflame.c b/hacks/xflame.c old mode 100755 new mode 100644 index dcac9600..9d0883c5 --- a/hacks/xflame.c +++ b/hacks/xflame.c @@ -38,6 +38,9 @@ behavioral constants. - General cleanup and portability tweaks. + + * 4-Oct-99, jwz: added support for packed-24bpp (versus 32bpp.) + */ @@ -67,7 +70,7 @@ # endif /* VMS */ #endif /* HAVE_XMU */ -#define MAX 255 +#define MAX_VAL 255 static Display *display; static Window window; @@ -77,6 +80,7 @@ static int height; static Colormap colormap; static Visual *visual; static Bool shared; +static Bool bloom; static XImage *xim; #ifdef HAVE_XSHM_EXTENSION static XShmSegmentInfo shminfo; @@ -155,13 +159,27 @@ MakeImage(void) static void InitColors(void) { - int i = 0, j = 0; + int i = 0, j = 0, red = 0, green = 0, blue = 0; + XColor fg; + + /* Make it possible to set the color of the flames, + by Raymond Medeiros and jwz. + */ + fg.pixel = get_pixel_resource ("foreground", "Foreground", + display, colormap); + XQueryColor (display, colormap, &fg); + + red = 255 - (fg.red >> 8); + green = 255 - (fg.green >> 8); + blue = 255 - (fg.blue >> 8); + + for (i = 0; i < 256 * 2; i += 2) { XColor xcl; - int r = (i - 0) * 3; - int g = (i - 80) * 3; - int b = (i - 160) * 3; + int r = (i - red) * 3; + int g = (i - green) * 3; + int b = (i - blue) * 3; if (r < 0) r = 0; if (r > 255) r = 255; @@ -216,6 +234,7 @@ InitFlame(void) iresidual = get_integer_resource("residual", "Integer"); variance = get_integer_resource("variance", "Integer"); vartrend = get_integer_resource("vartrend", "Integer"); + bloom = get_boolean_resource("bloom", "Boolean"); # define THROTTLE(VAR,NAME) \ if (VAR < 0 || VAR > 255) { \ @@ -303,6 +322,55 @@ Flame2Image32(void) } } +static void +Flame2Image24(void) +{ + int x,y; + unsigned char *ptr; + unsigned char *ptr1; + int v1,v2,v3,v4; + + ptr = (unsigned char *)xim->data; + ptr += (top << 1) * xim->bytes_per_line; + ptr1 = flame + 1 + (top * (fwidth + 2)); + + for( y = top; y < fheight; y++) + { + unsigned char *last_ptr = ptr; + for( x = 0; x < fwidth; x++) + { + v1 = (int)*ptr1; + v2 = (int)*(ptr1 + 1); + v3 = (int)*(ptr1 + fwidth + 2); + v4 = (int)*(ptr1 + fwidth + 2 + 1); + ptr1++; + + ptr[2] = ((unsigned int)ctab[v1] & 0x00FF0000) >> 16; + ptr[1] = ((unsigned int)ctab[v1] & 0x0000FF00) >> 8; + ptr[0] = ((unsigned int)ctab[v1] & 0x000000FF); + ptr += 3; + + ptr[2] = ((unsigned int)ctab[(v1 + v2) >> 1] & 0x00FF0000) >> 16; + ptr[1] = ((unsigned int)ctab[(v1 + v2) >> 1] & 0x0000FF00) >> 8; + ptr[0] = ((unsigned int)ctab[(v1 + v2) >> 1] & 0x000000FF); + ptr += ((width - 1) * 3); + + ptr[2] = ((unsigned int)ctab[(v1 + v3) >> 1] & 0x00FF0000) >> 16; + ptr[1] = ((unsigned int)ctab[(v1 + v3) >> 1] & 0x0000FF00) >> 8; + ptr[0] = ((unsigned int)ctab[(v1 + v3) >> 1] & 0x000000FF); + ptr += 3; + + ptr[2] = ((unsigned int)ctab[(v1 + v4) >> 1] & 0x00FF0000) >> 16; + ptr[1] = ((unsigned int)ctab[(v1 + v4) >> 1] & 0x0000FF00) >> 8; + ptr[0] = ((unsigned int)ctab[(v1 + v4) >> 1] & 0x000000FF); + ptr -= ((width - 1) * 3); + } + + ptr = last_ptr + (xim->bytes_per_line << 1); + ptr1 += 2; + } +} + static void Flame2Image8(void) { @@ -365,14 +433,22 @@ Flame2Image1234567(void) static void Flame2Image(void) { - if (depth >= 24) Flame2Image32(); - else if (depth == 16) Flame2Image16(); - else if (depth == 8) Flame2Image8(); - else if (depth == 15) Flame2Image16(); - else if (depth < 8) Flame2Image1234567(); - else if (depth == 12) Flame2Image16(); + switch (xim->bits_per_pixel) + { + case 32: Flame2Image32(); break; + case 24: Flame2Image24(); break; + case 16: Flame2Image16(); break; + case 8: Flame2Image8(); break; + default: + if (xim->bits_per_pixel <= 7) + Flame2Image1234567(); + else + abort(); + break; + } } + static void FlameActive(void) { @@ -388,13 +464,16 @@ FlameActive(void) *ptr1++ = v1 % 255; } - v1= (random() % 100); - if (v1 == 10) - residual += (random()%10); - else if (v1 == 20) - hspread += (random()%15); - else if (v1 == 30) - vspread += (random()%20); + if (bloom) + { + v1= (random() % 100); + if (v1 == 10) + residual += (random()%10); + else if (v1 == 20) + hspread += (random()%15); + else if (v1 == 30) + vspread += (random()%20); + } residual = ((iresidual* 10) + (residual *90)) / 100; hspread = ((ihspread * 10) + (hspread *90)) / 100; @@ -424,21 +503,21 @@ FlameAdvance(void) v3 = (v1 * vspread) >> 8; v2 = (int)*(ptr2); v2 += v3; - if (v2 > MAX) - v2 = MAX; + if (v2 > MAX_VAL) + v2 = MAX_VAL; *(ptr2) = (unsigned char)v2; v3 = (v1 * hspread) >> 8; v2 = (int)*(ptr2 + 1); v2 += v3; - if (v2 > MAX) - v2 = MAX; + if (v2 > MAX_VAL) + v2 = MAX_VAL; *(ptr2 + 1) = (unsigned char)v2; v2 = (int)*(ptr2 - 1); v2 += v3; - if (v2 > MAX) - v2 = MAX; + if (v2 > MAX_VAL) + v2 = MAX_VAL; *(ptr2 - 1) = (unsigned char)v2; @@ -651,7 +730,7 @@ char *progclass = "XFlame"; char *defaults [] = { ".background: black", - ".foreground: red", + ".foreground: #FFAF5F", "*bitmap: none", "*bitmapBaseline: 20", "*delay: 10000", @@ -660,6 +739,7 @@ char *defaults [] = { "*residual: 99", "*variance: 50", "*vartrend: 20", + "*bloom: True", #ifdef HAVE_XSHM_EXTENSION "*useSHM: False", /* xshm turns out not to help. */ @@ -676,6 +756,8 @@ XrmOptionDescRec options [] = { { "-residual", ".residual", XrmoptionSepArg, 0 }, { "-variance", ".variance", XrmoptionSepArg, 0 }, { "-vartrend", ".vartrend", XrmoptionSepArg, 0 }, + { "-bloom", ".bloom", XrmoptionNoArg, "True" }, + { "-no-bloom", ".bloom", XrmoptionNoArg, "False" }, #ifdef HAVE_XSHM_EXTENSION { "-shm", ".useSHM", XrmoptionNoArg, "True" }, { "-no-shm", ".useSHM", XrmoptionNoArg, "False" },