Sorry, the patch is broken:
* it does not look very well on a screen of color depth 16
* it causes floating point exception on a screen of color depth 8
A new patch is attached.
--
Oohara Yuuma <[EMAIL PROTECTED]>
Lord, what fools these mortals be!
--- William Shakespeare, "A Midsummer-Night's Dream"
unchanged:
--- xscreensaver-4.21-unmodified/hacks/ripples.c 2005-02-12
08:32:43.000000000 +0900
+++ xscreensaver-4.21/hacks/ripples.c 2005-10-03 02:06:41.000000000 +0900
@@ -99,6 +99,9 @@
- (((x)>>3)&0x11111111))
+static Bool grayscale_p;
+static unsigned long grayscale(unsigned long color);
+
/* ------------------------------------------- */
@@ -197,13 +200,13 @@
if (dirty[pixel] > 0) {
XPutPixel(buffer_map, (across<<1), (down<<1),
- XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady));
+ grayscale(XGetPixel(orig_map, (across<<1) + gradx, (down<<1)
+ grady)));
XPutPixel(buffer_map, (across<<1)+1,(down<<1),
- XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady));
+ grayscale(XGetPixel(orig_map, (across<<1) + gradx1,(down<<1)
+ grady)));
XPutPixel(buffer_map, (across<<1), (down<<1)+1,
- XGetPixel(orig_map, (across<<1) + gradx, (down<<1) +
grady1));
+ grayscale(XGetPixel(orig_map, (across<<1) + gradx, (down<<1)
+ grady1)));
XPutPixel(buffer_map, (across<<1)+1,(down<<1)+1,
- XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) +
grady1));
+ grayscale(XGetPixel(orig_map, (across<<1) + gradx1,(down<<1)
+ grady1)));
}
}
}
@@ -257,6 +260,52 @@
}
+static unsigned long
+grayscale(unsigned long color)
+{
+ int red;
+ int green;
+ int blue;
+ int total;
+ int gray_r;
+ int gray_g;
+ int gray_b;
+
+ if (!grayscale_p)
+ return color;
+ if (!transparent)
+ return color;
+ if ((rmask == 0) || (gmask == 0) || (bmask == 0))
+ return color;
+
+ red = ((color >> rshift) & rmask);
+ green = ((color >> gshift) & gmask);
+ blue = ((color >> bshift) & bmask);
+ total = red * gmask * bmask + green * rmask * bmask + blue * rmask * gmask;
+
+ gray_r = total / (3 * gmask * bmask);
+ if (gray_r < 0)
+ gray_r = 0;
+ if (gray_r > rmask)
+ gray_r = rmask;
+
+ gray_g = total / (3 * rmask * bmask);
+ if (gray_g < 0)
+ gray_g = 0;
+ if (gray_g > gmask)
+ gray_g = gmask;
+
+ gray_b = total / (3 * rmask * gmask);
+ if (gray_b < 0)
+ gray_b = 0;
+ if (gray_b > bmask)
+ gray_b = bmask;
+
+ return ((unsigned long)
+ ((gray_r << rshift) | (gray_g << gshift) | (gray_b << bshift)));
+}
+
+
static void
draw_transparent_light(short *src)
{
@@ -310,23 +359,23 @@
if (dx != 0) {
XPutPixel(buffer_map, (across<<1), (down<<1),
- bright(dx, XGetPixel(orig_map, (across<<1) + gradx,
(down<<1) + grady)));
+ bright(dx, grayscale(XGetPixel(orig_map, (across<<1) +
gradx, (down<<1) + grady))));
XPutPixel(buffer_map, (across<<1)+1,(down<<1),
- bright(dx, XGetPixel(orig_map, (across<<1) +
gradx1,(down<<1) + grady)));
+ bright(dx, grayscale(XGetPixel(orig_map, (across<<1) +
gradx1,(down<<1) + grady))));
XPutPixel(buffer_map, (across<<1), (down<<1)+1,
- bright(dx, XGetPixel(orig_map, (across<<1) + gradx,
(down<<1) + grady1)));
+ bright(dx, grayscale(XGetPixel(orig_map, (across<<1) +
gradx, (down<<1) + grady1))));
XPutPixel(buffer_map, (across<<1)+1,(down<<1)+1,
- bright(dx, XGetPixel(orig_map, (across<<1) +
gradx1,(down<<1) + grady1)));
+ bright(dx, grayscale(XGetPixel(orig_map, (across<<1) +
gradx1,(down<<1) + grady1))));
} else {
/* Could use XCopyArea, but XPutPixel is faster */
XPutPixel(buffer_map, (across<<1), (down<<1),
- XGetPixel(orig_map, (across<<1) + gradx, (down<<1) +
grady));
+ grayscale(XGetPixel(orig_map, (across<<1) + gradx,
(down<<1) + grady)));
XPutPixel(buffer_map, (across<<1)+1,(down<<1),
- XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) +
grady));
+ grayscale(XGetPixel(orig_map, (across<<1) +
gradx1,(down<<1) + grady)));
XPutPixel(buffer_map, (across<<1), (down<<1)+1,
- XGetPixel(orig_map, (across<<1) + gradx, (down<<1) +
grady1));
+ grayscale(XGetPixel(orig_map, (across<<1) + gradx,
(down<<1) + grady1)));
XPutPixel(buffer_map, (across<<1)+1,(down<<1)+1,
- XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) +
grady1));
+ grayscale(XGetPixel(orig_map, (across<<1) +
gradx1,(down<<1) + grady1)));
}
}
}
@@ -757,9 +806,20 @@
add_drop(ripple_blob, splash);
if (transparent) {
+ if (grayscale_p)
+ {
+ int across, down;
+ for (down = 0; down < bigheight; down++)
+ for (across = 0; across < bigwidth; across++)
+ XPutPixel(buffer_map, across, down,
+ grayscale(XGetPixel(orig_map, across, down)));
+ }
+ else
+ {
/* There's got to be a better way of doing this XCopyArea? */
memcpy(buffer_map->data, orig_map->data,
bigheight * buffer_map->bytes_per_line);
+ }
} else {
int across, down, color;
@@ -892,6 +952,7 @@
"*stir: False",
"*fluidity: 6",
"*light: 0",
+ "*grayscale: False",
#ifdef HAVE_XSHM_EXTENSION
"*useSHM: True",
#endif /* HAVE_XSHM_EXTENSION */
@@ -910,6 +971,7 @@
{"-stir", ".stir", XrmoptionNoArg, "True"},
{"-fluidity", ".fluidity", XrmoptionSepArg, 0},
{"-light", ".light", XrmoptionSepArg, 0},
+ {"-grayscale", ".grayscale", XrmoptionNoArg, "True"},
#ifdef HAVE_XSHM_EXTENSION
{"-shm", ".useSHM", XrmoptionNoArg, "True"},
{"-no-shm", ".useSHM", XrmoptionNoArg, "False"},
@@ -928,6 +990,7 @@
int stir = get_boolean_resource("stir", "Boolean");
int fluidity = get_integer_resource("fluidity", "Integer");
transparent = get_boolean_resource("water", "Boolean");
+ grayscale_p = get_boolean_resource("grayscale", "Boolean");
#ifdef HAVE_XSHM_EXTENSION
use_shm = get_boolean_resource("useSHM", "Boolean");
#endif /* HAVE_XSHM_EXTENSION */
@@ -964,9 +1027,16 @@
maxbits = MIN(MIN(BITCOUNT(rmask), BITCOUNT(gmask)), BITCOUNT(bmask));
light -= 8-maxbits;
if (light < 0) light = 0;
- } else
+ } else {
+ if (grayscale_p)
+ {
+ set_mask(visual->red_mask, &rmask, &rshift);
+ set_mask(visual->green_mask, &gmask, &gshift);
+ set_mask(visual->blue_mask, &bmask, &bshift);
+ }
draw_transparent = draw_transparent_vanilla;
-
+ }
+
init_ripples(0, -SPLASH); /* Start off without any drops */
/* Main drawing loop */
only in patch2:
unchanged:
--- xscreensaver-4.21-unmodified/hacks/ripples.man 2002-05-31
12:05:47.000000000 +0900
+++ xscreensaver-4.21/hacks/ripples.man 2005-10-03 02:07:52.000000000 +0900
@@ -14,6 +14,7 @@
[\-water]
[\-stir]
[\-oily]
+[\-grayscale]
[\-colors \fInumber\fP]
[\-no-shm]
.SH DESCRIPTION
@@ -53,6 +54,11 @@
.B \-oily | \-no-oily
Psychedelic Colors. Boolean.
.TP 8
+.B \-grayscale
+Convert the screen image to grayscale.
+Ignored if we don't grab the screen image or if our screen doesn't have
+enough color depth.
+.TP 8
.B \-colors \fInumber\fP
Colors Two. Default: 200.
.TP 8