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=77210ecaab3defae89686a23b2674ee2f23ea53d;hpb=a94197e76a5dea5cb60542840809d6c20d0abbf3;p=xscreensaver diff --git a/hacks/glx/xpm-ximage.c b/hacks/glx/xpm-ximage.c index 77210eca..c32250a4 100644 --- a/hacks/glx/xpm-ximage.c +++ b/hacks/glx/xpm-ximage.c @@ -1,5 +1,5 @@ /* xpm-ximage.c --- converts XPM data to an XImage for use with OpenGL. - * xscreensaver, Copyright (c) 1998, 2001, 2002 Jamie Zawinski + * xscreensaver, Copyright (c) 1998-2003 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 @@ -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 @@ -18,14 +18,29 @@ #include #include +#include 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 -# include + +# ifdef HAVE_GTK2 +# include +# else /* !HAVE_GTK2 */ +# include +# endif /* !HAVE_GTK2 */ /* Returns an XImage structure containing the bits of the given XPM image. @@ -47,16 +62,26 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap, { GdkPixbuf *pb; static int initted = 0; +#ifdef HAVE_GTK2 + GError *gerr = NULL; +#endif if (!initted) { +#ifdef HAVE_GTK2 + g_type_init (); +#endif gdk_pixbuf_xlib_init (dpy, DefaultScreen (dpy)); xlib_rgb_init (dpy, DefaultScreenOfDisplay (dpy)); initted = 1; } pb = (filename +#ifdef HAVE_GTK2 + ? gdk_pixbuf_new_from_file (filename, &gerr) +#else ? gdk_pixbuf_new_from_file (filename) +#endif /* HAVE_GTK2 */ : gdk_pixbuf_new_from_xpm_data ((const char **) xpm_data)); if (pb) { @@ -70,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); @@ -114,13 +148,18 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap, } row += stride; } - /* gdk_pixbuf_unref (pb); -- #### does doing this free colors? */ + gdk_pixbuf_unref (pb); /* #### does doing this free colors? */ return image; } else if (filename) { +#ifdef HAVE_GTK2 + fprintf (stderr, "%s: %s\n", progname, gerr->message); + g_error_free (gerr); +#else fprintf (stderr, "%s: unable to load %s\n", progname, filename); +#endif /* HAVE_GTK2 */ exit (1); } else @@ -144,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... @@ -185,7 +217,7 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap, xpm_data = 0; if (! XpmReadFileToData ((char *) filename, &xpm_data)) { - fprintf (stderr, "%s: unable to read XPM file %f\n", + fprintf (stderr, "%s: unable to read XPM file %s\n", progname, filename); exit (1); } @@ -220,7 +252,7 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap, const char *c = xpm_image.colorTable[i].c_color; if (!c) { - fprintf(stderr, "%s: bogus color table? ($d)\n", progname, i); + fprintf(stderr, "%s: bogus color table? (%d)\n", progname, i); exit (1); } else if (!strncasecmp (c, "None", 4)) @@ -246,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++)