X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Futil%2Fcommon.c;h=9f122d6a3ca9b54b816851dc028b9a7e4888678d;hb=cbb9b4d7de7e4a439dd586a8c8d4cd5f4e4622ba;hp=c186d424fc66f42e52bceef06935f430069145d8;hpb=f4a5dbba35cc7ae5540481ce29bc272fd0d0a03d;p=chaz%2Ftint2 diff --git a/src/util/common.c b/src/util/common.c index c186d42..9f122d6 100644 --- a/src/util/common.c +++ b/src/util/common.c @@ -21,12 +21,14 @@ #include #include #include +#include #include #include #include #include "common.h" +#include "server.h" @@ -249,3 +251,23 @@ void createHeuristicMask(DATA32* data, int w, int h) udata += 4; } } + + +void render_image(Drawable d, int x, int y, int w, int h) +{ + // in real_transparency mode imlib_render_image_on_drawable does not the right thing, because + // the operation is IMLIB_OP_COPY, but we would need IMLIB_OP_OVER (which does not exist) + // Therefore we have to do it with the XRender extension (i.e. copy what imlib is doing internally) + // But first we need to render the image onto itself with PictOpIn to adjust the colors to the alpha channel + Pixmap pmap_tmp = XCreatePixmap(server.dsp, server.root_win, w, h, 32); + imlib_context_set_drawable(pmap_tmp); + imlib_context_set_blend(0); + imlib_render_image_on_drawable(0, 0); + Picture pict_image = XRenderCreatePicture(server.dsp, pmap_tmp, XRenderFindStandardFormat(server.dsp, PictStandardARGB32), 0, 0); + Picture pict_drawable = XRenderCreatePicture(server.dsp, d, XRenderFindVisualFormat(server.dsp, server.visual), 0, 0); + XRenderComposite(server.dsp, PictOpIn, pict_image, None, pict_image, 0, 0, 0, 0, 0, 0, w, h); + XRenderComposite(server.dsp, PictOpOver, pict_image, None, pict_drawable, 0, 0, 0, 0, x, y, w, h); + XFreePixmap(server.dsp, pmap_tmp); + XRenderFreePicture(server.dsp, pict_image); + XRenderFreePicture(server.dsp, pict_drawable); +}