+
+void createHeuristicMask(DATA32* data, int w, int h)
+{
+ unsigned char* udata = (unsigned char*)data;
+ int b = udata[0];
+ int g = udata[1];
+ int r = udata[2];
+ int i;
+ for (i=0; i<h*w; ++i) {
+ if ( abs(b-*udata)<5 && abs(g-*(udata+1))<5 && abs(r-*(udata+2))<5 ) {
+ *(udata+3) = 0;
+ }
+ 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);
+}