X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fxpm-ximage.c;h=798fff067640955edc39ba47af6ee290cd81db52;hb=39809ded547bdbb08207d3e514950425215b4410;hp=07e41683e890dd1aa0ffc29e8e3d14a8f708bfac;hpb=d1ae2829ff0fd2a96c16a0c8c5420efaa47d7b30;p=xscreensaver diff --git a/hacks/glx/xpm-ximage.c b/hacks/glx/xpm-ximage.c index 07e41683..798fff06 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-2013 Jamie Zawinski + * xscreensaver, Copyright (c) 1998-2016 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,7 +19,7 @@ #include #include -#if defined(HAVE_COCOA) || defined(HAVE_ANDROID) +#ifdef HAVE_JWXYZ # include "jwxyz.h" #else # include @@ -27,6 +27,10 @@ #include "xpm-ximage.h" +#ifdef HAVE_COCOA +# include "grabscreen.h" /* for osx_load_image_file() */ +#endif + extern char *progname; @@ -361,7 +365,7 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap, const char *filename, char **xpm_data) { int iw, ih, w8, x, y; - XImage *ximage; + XImage *ximage = 0; char *data; unsigned char *mask = 0; int depth = 32; @@ -375,18 +379,57 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap, unsigned long rmsk=0, gmsk=0, bmsk=0, amsk=0; unsigned long rsiz=0, gsiz=0, bsiz=0, asiz=0; +# ifdef HAVE_COCOA + if (filename) { + XRectangle geom; + Screen *screen = DefaultScreenOfDisplay (dpy); + Window window = RootWindowOfScreen (screen); + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + Pixmap pixmap = + XCreatePixmap (dpy, window, xgwa.width, xgwa.height, xgwa.depth); + + if (osx_load_image_file (screen, window, pixmap, filename, &geom)) { + ximage = XGetImage (dpy, pixmap, geom.x, geom.y, geom.width, geom.height, + ~0L, ZPixmap); + + /* Have to convert BGRA to ARGB */ + if (ximage) { + for (y = 0; y < ximage->height; y++) + for (x = 0; x < ximage->width; x++) { + unsigned long p = XGetPixel (ximage, x, y); + unsigned long b = (p >> 24) & 0xFF; + unsigned long g = (p >> 16) & 0xFF; + unsigned long r = (p >> 8) & 0xFF; + unsigned long a = (p >> 0) & 0xFF; + p = (a << 24) | (r << 16) | (g << 8) | (b << 0); + XPutPixel (ximage, x, y, p); + } + } + + } + + XFreePixmap (dpy, pixmap); + + if (! ximage) + fprintf (stderr, "%s: %s failed\n", progname, filename); + return ximage; + } +# endif /* HAVE_COCOA */ + if (filename) { fprintf(stderr, - "%s: no files: not compiled with XPM or Pixbuf support.\n", - progname); - exit (1); + "%s: can't load %s: not compiled with XPM or Pixbuf support.\n", + progname, filename); + return 0; } if (! xpm_data) abort(); ximage = minixpm_to_ximage (dpy, visual, cmap, depth, background_color, (const char * const *) xpm_data, &iw, &ih, &pixels, &npixels, &mask); + if (!ximage) abort(); if (pixels) free (pixels); bpl = ximage->bytes_per_line;