]> Dogcows Code - chaz/tint2/commitdiff
*fix* image rendering in real_transparency mode fixed (imlib_render_image does not...
authorAndreas Fink <andreas.fink85@googlemail.com>
Mon, 4 Jan 2010 16:25:17 +0000 (16:25 +0000)
committerAndreas Fink <andreas.fink85@googlemail.com>
Mon, 4 Jan 2010 16:25:17 +0000 (16:25 +0000)
src/systray/systraybar.c
src/taskbar/task.c
src/util/area.c
src/util/common.c
src/util/common.h

index 61215cbf1aa2af0a3801cd0a92bb18559610620b..dbe2c82e266ea493e565ae0b68c9cc5ec2cb4a38 100644 (file)
@@ -26,7 +26,6 @@
 #include <glib.h>
 #include <Imlib2.h>
 #include <X11/extensions/Xdamage.h>
-#include <X11/extensions/Xrender.h>
 #include <X11/extensions/Xcomposite.h>
 
 #include "systraybar.h"
@@ -507,26 +506,16 @@ void systray_render_icons(TrayWindow* traywin)
        if (systray.alpha != 100 || systray.brightness != 0 || systray.saturation != 0)
                adjust_asb(data, traywin->width, traywin->height, systray.alpha, (float)systray.saturation/100, (float)systray.brightness/100);
        imlib_image_put_back_data(data);
-       imlib_context_set_drawable(panel->main_win);
-       imlib_render_image_on_drawable(traywin->x, traywin->y);
-       imlib_context_set_drawable(systray.area.pix.pmap);
-       imlib_render_image_on_drawable(traywin->x-systray.area.posx, traywin->y-systray.area.posy);
-
-       //TODO: in real_transparency mode imlib_render_image_on_drawable does not the right thing, because
-       // it overlays the pixmap with the background of the systray, which is itself transparent. Therefore
-       // the icons are not opaque, although they should be...
-       // A better solution would be to render them with XRenderComposite and PixtOpOver, but then completely
-       // transparent icons do not appear transparent (i do not know why)
-//     imlib_free_pixmap_and_mask(pix_image);
-//     Picture pict_image = XRenderCreatePicture(server.dsp, test, XRenderFindStandardFormat(server.dsp, PictStandardARGB32), 0, 0);
-//     Picture pict_panel = XRenderCreatePicture(server.dsp, panel->main_win, XRenderFindVisualFormat(server.dsp, server.visual), 0, 0);
-//     Picture pict_systray = XRenderCreatePicture(server.dsp, systray.area.pix.pmap, XRenderFindVisualFormat(server.dsp, server.visual), 0, 0);
-//     XRenderComposite(server.dsp, PictOpOver, pict_image, None, pict_panel, 0, 0, 0, 0, traywin->x, traywin->y, traywin->width, traywin->height);
-//     XRenderComposite(server.dsp, PictOpOver, pict_image, None, pict_systray, 0, 0, 0, 0, traywin->x-systray.area.posx, traywin->y-systray.area.posy, traywin->width, traywin->height);
-//     XFreePixmap(server.dsp, test);
-//     XRenderFreePicture(server.dsp, pict_image);
-//     XRenderFreePicture(server.dsp, pict_panel);
-//     XRenderFreePicture(server.dsp, pict_systray);
+       if ( !real_transparency ) {
+               imlib_context_set_drawable(panel->main_win);
+               imlib_render_image_on_drawable(traywin->x, traywin->y);
+               imlib_context_set_drawable(systray.area.pix.pmap);
+               imlib_render_image_on_drawable(traywin->x-systray.area.posx, traywin->y-systray.area.posy);
+       }
+       else {
+               render_image(panel->main_win, traywin->x, traywin->y, traywin->width, traywin->height);
+               render_image(systray.area.pix.pmap, traywin->x-systray.area.posx, traywin->y-systray.area.posy, traywin->width, traywin->height);
+       }
        imlib_free_image();
 }
 
index 191394ca30da5f4635d27fc38d61b4cb82641f96..98c943aa0ddcdc6f13f606dcaea4f364acc8c2c1 100644 (file)
@@ -313,8 +313,13 @@ void draw_task_icon (Task *tsk, int text_width, int active)
                imlib_context_set_image (tsk->icon_active);
                pmap = &tsk->area.pix_active.pmap;
        }
-       imlib_context_set_drawable (*pmap);
-       imlib_render_image_on_drawable (pos_x, panel->g_task.icon_posy);
+       if (real_transparency) {
+               render_image(*pmap, pos_x, panel->g_task.icon_posy, imlib_image_get_width(), imlib_image_get_height() );
+       }
+       else {
+               imlib_context_set_drawable (*pmap);
+               imlib_render_image_on_drawable (pos_x, panel->g_task.icon_posy);
+       }
 }
 
 
index 3b8a468b6674fa615d7e4dc027e39e2c2e15d596..3fb11168855297bd06c086bd87fac00b51d1a85c 100644 (file)
@@ -20,6 +20,7 @@
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
 #include <X11/Xatom.h>
+#include <X11/extensions/Xrender.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -252,12 +253,7 @@ void draw_rect(cairo_t *c, double x, double y, double w, double h, double r)
 
 void clear_pixmap(Pixmap p, int x, int y, int w, int h)
 {
-       cairo_surface_t *tmp = cairo_xlib_surface_create (server.dsp, p, server.visual, w, h);
-       cairo_t *cr = cairo_create(tmp);
-       cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
-       cairo_rectangle(cr, x, y, w, h);
-       cairo_set_source_rgba(cr, 1, 1, 1, 0);
-       cairo_fill(cr);
-       cairo_destroy(cr);
-       cairo_surface_destroy (tmp);
+       Picture pict = XRenderCreatePicture(server.dsp, p, XRenderFindVisualFormat(server.dsp, server.visual), 0, 0);
+       XRenderColor col = { .red=0, .green=0, .blue=0, .alpha=0 };
+       XRenderFillRectangle(server.dsp, PictOpSrc, pict, &col, x, y, w, h);
 }
index c186d424fc66f42e52bceef06935f430069145d8..9f122d6a3ca9b54b816851dc028b9a7e4888678d 100644 (file)
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
 #include <X11/Xatom.h>
+#include <X11/extensions/Xrender.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
 
 #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);
+}
index 7f8259bbd1b66fb340daaada83d90d6cb5a77781..eb53f4f2a5d71794b5c77a89b4df0bcb73d62abf 100644 (file)
@@ -65,5 +65,7 @@ void get_color (char *hex, double *rgb);
 // alpha from 0 to 100, satur from 0 to 1, bright from 0 to 1.
 void adjust_asb(DATA32 *data, int w, int h, int alpha, float satur, float bright);
 void createHeuristicMask(DATA32* data, int w, int h);
+
+void render_image(Drawable d, int x, int y, int w, int h);
 #endif
 
This page took 0.027149 seconds and 4 git commands to generate.