http://ftp.ksu.edu.tw/FTP/FreeBSD/distfiles/xscreensaver-4.23.tar.gz
[xscreensaver] / hacks / glx / xpm-ximage.c
index 77210ecaab3defae89686a23b2674ee2f23ea53d..c32250a4b9d9af6a14b252844674803e716013ad 100644 (file)
@@ -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 <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1998-2003 Jamie Zawinski <jwz@jwz.org>
  *
  * 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 <lassauge@mail.dotcom.fr>.
+ * Alpha channel support by Eric Lassauge <lassauge@users.sourceforge.net>
  */
 
 #ifdef HAVE_CONFIG_H
 
 #include <stdlib.h>
 #include <stdio.h>
+#include <X11/Xlib.h>
 
 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 <gdk-pixbuf/gdk-pixbuf.h>
-# include <gdk-pixbuf/gdk-pixbuf-xlib.h>
+
+# ifdef HAVE_GTK2
+#  include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h>
+# else  /* !HAVE_GTK2 */
+#  include <gdk-pixbuf/gdk-pixbuf-xlib.h>
+# 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++)