gamescope/src/loadargbcursor.c
Pierre-Loup A. Griffais 9f4bc871d2 Import Debian version 1.34
steamos-compositor (1.34) brewmaster; urgency=medium

  * Small tweak to loadargb_cursor to better handle non-premult cursors
2020-01-01 15:26:44 +09:00

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);
}