X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=utils%2Fvisual.c;h=b3f06061a01b41b58261b2564b52a3735fe3eca6;hb=8afc01a67be4fbf3f1cc0fce9adf01b5289a21c6;hp=c9f5f27817e3192c7b59c6ec6cbd4c5f42f62393;hpb=c28aecf9fc41e3a03494bacf7279745425e2fa18;p=xscreensaver diff --git a/utils/visual.c b/utils/visual.c index c9f5f278..b3f06061 100644 --- a/utils/visual.c +++ b/utils/visual.c @@ -1,5 +1,4 @@ -/* xscreensaver, Copyright (c) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 - * by Jamie Zawinski +/* xscreensaver, Copyright (c) 1993-2014 by Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -77,7 +76,7 @@ get_visual (Screen *screen, const char *string, Bool prefer_writable_cells, else if (!strcmp (v, "greyscale")) vclass = GrayScale; else if (!strcmp (v, "pseudocolor")) vclass = PseudoColor; else if (!strcmp (v, "directcolor")) vclass = DirectColor; - else if (1 == sscanf (v, " %ld %c", &id, &c)) vclass = SPECIFIC_VISUAL; + else if (1 == sscanf (v, " %lu %c", &id, &c)) vclass = SPECIFIC_VISUAL; else if (1 == sscanf (v, " 0x%lx %c", &id, &c)) vclass = SPECIFIC_VISUAL; else { @@ -160,7 +159,7 @@ Visual * get_visual_resource (Screen *screen, char *name, char *class, Bool prefer_writable_cells) { - char *string = get_string_resource (name, class); + char *string = get_string_resource (DisplayOfScreen (screen), name, class); Visual *v = get_visual (screen, string, prefer_writable_cells, True); if (string) free(string); @@ -429,13 +428,12 @@ has_writable_cells (Screen *screen, Visual *visual) { case GrayScale: /* Mappable grays. */ case PseudoColor: /* Mappable colors. */ + case DirectColor: /* Like TrueColor, but with three colormaps: + one each for red, green, and blue. */ return True; case StaticGray: /* Fixed grays. */ case TrueColor: /* Fixed colors. */ - case StaticColor: /* (What's the difference again?) */ - case DirectColor: /* DirectColor visuals are like TrueColor, but have - three colormaps - one for each component of RGB. - Screw it. */ + case StaticColor: /* Like PseudoColor with an unmodifiable colormap. */ return False; default: abort(); @@ -541,3 +539,48 @@ find_similar_visual(Screen *screen, Visual *old_visual) return result; } + + +int +get_bits_per_pixel(Display *dpy, int depth) +{ + unsigned i = 0; + int count, result; + XPixmapFormatValues *formats = XListPixmapFormats(dpy, &count); + + /* XCreateImage calls _XGetBitsPerPixel to figure this out, but that function + is private to Xlib. + + For some reason, _XGetBitsPerPixel tries a hard-coded list of depths if + it doesn't find a matching pixmap format, but I (Dave Odell) couldn't + find any justification for this in the X11 spec. And the XFree86 CVS + repository doesn't quite go back far enough to shed any light on what + the deal is with that. + http://cvsweb.xfree86.org/cvsweb/xc/lib/X11/ImUtil.c + + The hard-coded list apparently was added between X11R5 and X11R6. + See . + */ + + if (!formats) return 0; + + for (;;) + { + if (i == (unsigned)count) + { + result = 0; + break; + } + + if (formats[i].depth == depth) + { + result = formats[i].bits_per_pixel; + break; + } + + ++i; + } + + XFree (formats); + return result; +}