9f4bc871d2
steamos-compositor (1.34) brewmaster; urgency=medium * Small tweak to loadargb_cursor to better handle non-premult cursors
128 lines
2.8 KiB
C
128 lines
2.8 KiB
C
#include "X11/Xlib.h"
|
|
#include "X11/extensions/Xrender.h"
|
|
|
|
#include "SDL/SDL.h"
|
|
#include "SDL/SDL_image.h"
|
|
|
|
typedef struct _tmppixel {
|
|
unsigned char r;
|
|
unsigned char g;
|
|
unsigned char b;
|
|
unsigned char a;
|
|
} pixel_t;
|
|
|
|
int main(int ac, char **av)
|
|
{
|
|
int flags = IMG_INIT_JPG|IMG_INIT_PNG;
|
|
int initted = IMG_Init(flags);
|
|
|
|
if (ac != 2) {
|
|
printf("usage: ./loadargbcursor imagefile\n");
|
|
exit(0);
|
|
}
|
|
|
|
if (initted & flags != flags) {
|
|
printf("IMG_Init: Failed to init required jpg and png support!\n");
|
|
printf("IMG_Init: %s\n", IMG_GetError());
|
|
exit(0);
|
|
}
|
|
|
|
SDL_Surface *image;
|
|
image = IMG_Load(av[1]);
|
|
if(!image) {
|
|
printf("IMG_Load: %s\n", IMG_GetError());
|
|
exit(0);
|
|
}
|
|
|
|
SDL_LockSurface(image);
|
|
|
|
Display* dpy;
|
|
|
|
dpy = XOpenDisplay(NULL);
|
|
if (!dpy) {
|
|
printf("Can't open X11 display!\n");
|
|
exit(0);
|
|
}
|
|
|
|
XImage *ximage;
|
|
|
|
char *ptr = image->pixels;
|
|
int i = 0;
|
|
|
|
pixel_t tmppixel;
|
|
pixel_t *pixel;
|
|
|
|
while (i < image->w * image->h) {
|
|
pixel = (pixel_t *)ptr;
|
|
|
|
tmppixel.a = pixel->a;
|
|
|
|
if ( tmppixel.a != 0 )
|
|
{
|
|
tmppixel.r = pixel->b;
|
|
tmppixel.g = pixel->g;
|
|
tmppixel.b = pixel->r;
|
|
}
|
|
else
|
|
{
|
|
tmppixel.r = 0;
|
|
tmppixel.g = 0;
|
|
tmppixel.b = 0;
|
|
}
|
|
|
|
*pixel = tmppixel;
|
|
|
|
i++;
|
|
ptr += 4;
|
|
}
|
|
|
|
ximage = XCreateImage(dpy,
|
|
DefaultVisual(dpy, DefaultScreen(dpy)),
|
|
32,
|
|
ZPixmap,
|
|
0, //offset
|
|
image->pixels,
|
|
image->w,
|
|
image->h,
|
|
32,
|
|
0);
|
|
|
|
if(!ximage) {
|
|
printf("Failed to create XImage from SDL_surface.\n");
|
|
exit(0);
|
|
}
|
|
|
|
Pixmap pixmap;
|
|
|
|
pixmap = XCreatePixmap(dpy, DefaultRootWindow(dpy),
|
|
image->w, image->h, 32);
|
|
|
|
if(!pixmap) {
|
|
printf("Failed to create X pixmap.\n");
|
|
exit(0);
|
|
}
|
|
|
|
GC gc;
|
|
|
|
gc = XCreateGC(dpy, pixmap, 0, NULL);
|
|
|
|
if(!gc) {
|
|
printf("Failed to create X GC.\n");
|
|
exit(0);
|
|
}
|
|
|
|
XPutImage(dpy, pixmap, gc, ximage, 0, 0, 0, 0, image->w, image->h);
|
|
|
|
XRenderPictFormat *pictformat = XRenderFindStandardFormat(dpy, PictStandardARGB32);
|
|
|
|
XRenderPictureAttributes attributes;
|
|
|
|
Picture picture = XRenderCreatePicture(dpy, pixmap, pictformat, 0, NULL);
|
|
|
|
Cursor curs;
|
|
|
|
curs = XRenderCreateCursor(dpy, picture, 0, 0);
|
|
|
|
XDefineCursor(dpy, DefaultRootWindow(dpy), curs);
|
|
XSync(dpy, 0);
|
|
}
|