/* 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
* 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;
#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.
{
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)
{
}
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
#undef countof
#define countof(x) (sizeof((x))/sizeof((*x)))
+#if 0
static Bool
bigendian (void)
{
u.i = 1;
return !u.c[0];
}
+#endif
/* The libxpm version of this function...
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);
}
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))
things as necessary) OpenGL pretends everything is client-side, so
we need to pack things in the right order for the client machine.
*/
+#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++)