X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=blobdiff_plain;f=utils%2Fvisual.c;fp=utils%2Fvisual.c;h=b3f06061a01b41b58261b2564b52a3735fe3eca6;hp=7c89f5a0c7a55bcdcbc3b70aed3d56c9afab2aab;hb=8afc01a67be4fbf3f1cc0fce9adf01b5289a21c6;hpb=3f1091236d800c43a3124c44c7da54e53f205b13 diff --git a/utils/visual.c b/utils/visual.c index 7c89f5a0..b3f06061 100644 --- a/utils/visual.c +++ b/utils/visual.c @@ -1,7 +1,4 @@ -/* xscreensaver, Copyright (c) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2003, 2006 - * - * - * 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 @@ -542,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; +}