X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Futil%2Fcommon.c;h=8e213fcf8b72c5308ca93dcfc99ea9b1e6fe7cd9;hb=462228f2e82c6e5f61baeb49b6358273728baa90;hp=c186d424fc66f42e52bceef06935f430069145d8;hpb=e8ee3c40c5d9f7f66a033e8492c34e282002e51d;p=chaz%2Ftint2 diff --git a/src/util/common.c b/src/util/common.c index c186d42..8e213fc 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" @@ -42,7 +44,9 @@ void copy_file(const char *pathSrc, const char *pathDest) fileDest = fopen(pathDest, "wb"); if (fileDest == NULL) return; - while ((nb = fread(line, 1, 100, fileSrc)) > 0) fwrite(line, 1, nb, fileDest); + while ((nb = fread(line, 1, 100, fileSrc)) > 0) + if ( nb != fwrite(line, 1, nb, fileDest)) + printf("Error while copying file %s to %s\n", pathSrc, pathDest); fclose (fileDest); fclose (fileSrc); @@ -249,3 +253,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); +}