X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fxpm-ximage.c;h=c32250a4b9d9af6a14b252844674803e716013ad;hb=0d6b320def9180cf907ceaed56b23a972a11b757;hp=a524e7659adb6ed55495592577e1176e08503fb7;hpb=96bdd7cf6ea60c418a76921acaf0e34d6f5be930;p=xscreensaver diff --git a/hacks/glx/xpm-ximage.c b/hacks/glx/xpm-ximage.c index a524e765..c32250a4 100644 --- a/hacks/glx/xpm-ximage.c +++ b/hacks/glx/xpm-ximage.c @@ -9,7 +9,7 @@ * software for any purpose. It is provided "as is" without express or * implied warranty. * - * Alpha channel support by Eric Lassauge . + * Alpha channel support by Eric Lassauge */ #ifdef HAVE_CONFIG_H @@ -23,6 +23,15 @@ extern char *progname; +static Bool +bigendian (void) +{ + union { int i; char c[sizeof(int)]; } u; + u.i = 1; + return !u.c[0]; +} + + #if defined(HAVE_GDK_PIXBUF) # include @@ -86,6 +95,15 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap, image = XCreateImage (dpy, visual, 32, ZPixmap, 0, 0, w, h, 32, 0); image->data = (char *) malloc(h * image->bytes_per_line); + + /* Set the bit order in the XImage structure to whatever the + local host's native bit order is. + */ + image->bitmap_bit_order = + image->byte_order = + (bigendian() ? MSBFirst : LSBFirst); + + if (!image->data) { fprintf (stderr, "%s: out of memory (%d x %d)\n", progname, w, h); @@ -165,13 +183,6 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap, #undef countof #define countof(x) (sizeof((x))/sizeof((*x))) -static Bool -bigendian (void) -{ - union { int i; char c[sizeof(int)]; } u; - u.i = 1; - return !u.c[0]; -} /* The libxpm version of this function... @@ -267,9 +278,20 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap, things as necessary) OpenGL pretends everything is client-side, so we need to pack things in the right order for the client machine. */ + + ximage->bitmap_bit_order = + ximage->byte_order = + (bigendian() ? MSBFirst : LSBFirst); + +#if 0 + /* #### Cherub says that the little-endian case must be taken on MacOSX, + or else the colors/alpha are the wrong way around. How can + that be the case? + */ if (bigendian()) rpos = 24, gpos = 16, bpos = 8, apos = 0; else +#endif rpos = 0, gpos = 8, bpos = 16, apos = 24; for (y = 0; y < xpm_image.height; y++)