X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=utils%2Fvisual.c;h=89b4f33e69f3d7af84fc2a5931ae594c1916a47e;hb=aa75c7476aeaa84cf3abc192b376a8b03c325213;hp=1bf4942126cd264802fe8392e8f3f32ff92189a3;hpb=72c1f4c1dc6ab07fe121a327ff1c30bf51ef74c1;p=xscreensaver diff --git a/utils/visual.c b/utils/visual.c index 1bf49421..89b4f33e 100644 --- a/utils/visual.c +++ b/utils/visual.c @@ -1,5 +1,4 @@ -/* xscreensaver, Copyright (c) 1993, 1994, 1995, 1996, 1997, 1998, 1999 - * 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 @@ -19,11 +18,15 @@ #include "resources.h" /* for get_string_resource() */ #include "visual.h" +#include +#ifndef HAVE_ANDROID #include +#else +#include "../android/android-visual.h" +#endif extern char *progname; - #ifndef isupper # define isupper(c) ((c) >= 'A' && (c) <= 'Z') #endif @@ -36,8 +39,6 @@ static Visual *pick_best_visual (Screen *, Bool, Bool); static Visual *pick_mono_visual (Screen *); static Visual *pick_best_visual_of_class (Screen *, int); static Visual *pick_best_gl_visual (Screen *); -static Visual *id_to_visual (Screen *, int); -static Visual *id_to_visual (Screen *screen, int id); #define DEFAULT_VISUAL -1 @@ -78,7 +79,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 { @@ -135,7 +136,7 @@ get_visual (Screen *screen, const char *string, Bool prefer_writable_cells, if (visual) result = visual; else if (verbose_p) - fprintf (stderr, "%s: no visual suitable for GL.\n", progname, v); + fprintf (stderr, "%s: no visual suitable for GL.\n", progname); } else if (vclass == SPECIFIC_VISUAL) { @@ -161,7 +162,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); @@ -297,7 +298,7 @@ pick_best_gl_visual (Screen *screen) int ndepths = 0; int *depths = XListDepths (dpy, screen_number (screen), &ndepths); - int screen_depth = depths[ndepths]; + int screen_depth = (depths && ndepths) ? depths[ndepths - 1] : 0; XFree (depths); vi_in.class = TrueColor; @@ -326,7 +327,7 @@ pick_best_gl_visual (Screen *screen) result = vi_out[0].visual; } - if (result) + if (!result) /* No half-depth TrueColor? Ok, try for any TrueColor (the deepest.) */ result = pick_best_visual_of_class (screen, TrueColor); @@ -338,7 +339,7 @@ pick_best_gl_visual (Screen *screen) } -static Visual * +Visual * id_to_visual (Screen *screen, int id) { Display *dpy = DisplayOfScreen (screen); @@ -430,13 +431,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(); @@ -542,3 +542,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; +}