diff --git a/src/launcher/launcher.c b/src/launcher/launcher.c index 4637bbc..317cd3b 100644 --- a/src/launcher/launcher.c +++ b/src/launcher/launcher.c @@ -356,10 +356,14 @@ void draw_launcher_icon(void *obj, cairo_t *c) Imlib_Image icon_scaled = launcherIcon->icon_scaled; // Render - imlib_context_set_image (icon_scaled); - imlib_context_set_blend(1); - imlib_context_set_drawable(launcherIcon->area.pix); - imlib_render_image_on_drawable(0, 0); + imlib_context_set_image(icon_scaled); + if (server.real_transparency) { + render_image(launcherIcon->area.pix, 0, 0); + } else { + imlib_context_set_blend(1); + imlib_context_set_drawable(launcherIcon->area.pix); + imlib_render_image_on_drawable(0, 0); + } } Imlib_Image scale_icon(Imlib_Image original, int icon_size) @@ -368,11 +372,14 @@ Imlib_Image scale_icon(Imlib_Image original, int icon_size) if (original) { imlib_context_set_image (original); icon_scaled = imlib_create_cropped_scaled_image(0, 0, imlib_image_get_width(), imlib_image_get_height(), icon_size, icon_size); + imlib_context_set_image (icon_scaled); imlib_image_set_has_alpha(1); DATA32* data = imlib_image_get_data(); adjust_asb(data, icon_size, icon_size, launcher_alpha, (float)launcher_saturation/100, (float)launcher_brightness/100); imlib_image_put_back_data(data); + + imlib_context_set_image (icon_scaled); } else { icon_scaled = imlib_create_image(icon_size, icon_size); imlib_context_set_image (icon_scaled); diff --git a/src/systray/systraybar.c b/src/systray/systraybar.c index 7034670..01bf443 100644 --- a/src/systray/systraybar.c +++ b/src/systray/systraybar.c @@ -601,7 +601,7 @@ void systray_render_icon_now(void* t) adjust_asb(data, traywin->width, traywin->height, systray.alpha, (float)systray.saturation/100, (float)systray.brightness/100); imlib_image_put_back_data(data); XCopyArea(server.dsp, render_background, systray.area.pix, server.gc, traywin->x-systray.area.posx, traywin->y-systray.area.posy, traywin->width, traywin->height, traywin->x-systray.area.posx, traywin->y-systray.area.posy); - render_image(systray.area.pix, traywin->x-systray.area.posx, traywin->y-systray.area.posy, traywin->width, traywin->height); + render_image(systray.area.pix, traywin->x-systray.area.posx, traywin->y-systray.area.posy); XCopyArea(server.dsp, systray.area.pix, panel->main_win, server.gc, traywin->x-systray.area.posx, traywin->y-systray.area.posy, traywin->width, traywin->height, traywin->x, traywin->y); imlib_free_image_and_decache(); XFreePixmap(server.dsp, tmp_pmap); diff --git a/src/taskbar/task.c b/src/taskbar/task.c index 9336948..1bb4138 100644 --- a/src/taskbar/task.c +++ b/src/taskbar/task.c @@ -348,9 +348,13 @@ void draw_task_icon (Task *tsk, int text_width) // Render imlib_context_set_image (tsk->icon[tsk->current_state]); - imlib_context_set_blend(1); - imlib_context_set_drawable(tsk->area.pix); - imlib_render_image_on_drawable(pos_x, panel->g_task.icon_posy); + if (server.real_transparency) { + render_image(tsk->area.pix, pos_x, panel->g_task.icon_posy); + } else { + imlib_context_set_blend(1); + imlib_context_set_drawable(tsk->area.pix); + imlib_render_image_on_drawable(pos_x, panel->g_task.icon_posy); + } } diff --git a/src/util/common.c b/src/util/common.c index 7f4a156..5040ae6 100644 --- a/src/util/common.c +++ b/src/util/common.c @@ -363,24 +363,30 @@ void createHeuristicMask(DATA32* data, int w, int h) } -void render_image(Drawable d, int x, int y, int w, int h) +void render_image(Drawable d, int x, int y) { - // 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); + int w = imlib_image_get_width(), h = imlib_image_get_height(); + + Pixmap pixmap = XCreatePixmap(server.dsp, server.root_win, w, h, 32); + imlib_context_set_drawable(pixmap); 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); + + Pixmap mask = XCreatePixmap(server.dsp, server.root_win, w, h, 32); + imlib_context_set_drawable(mask); + imlib_context_set_blend(0); + imlib_render_image_on_drawable(0, 0); + + Picture pict = XRenderCreatePicture(server.dsp, pixmap, 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); - imlib_context_set_blend(1); - XFreePixmap(server.dsp, pmap_tmp); - XRenderFreePicture(server.dsp, pict_image); + Picture pict_mask = XRenderCreatePicture(server.dsp, mask, XRenderFindStandardFormat(server.dsp, PictStandardARGB32), 0, 0); + XRenderComposite(server.dsp, PictOpOver, pict, pict_mask, pict_drawable, 0, 0, 0, 0, x, y, w, h); + + XRenderFreePicture(server.dsp, pict_mask); XRenderFreePicture(server.dsp, pict_drawable); + XRenderFreePicture(server.dsp, pict); + XFreePixmap(server.dsp, mask); + XFreePixmap(server.dsp, pixmap); } void draw_text(PangoLayout *layout, cairo_t *c, int posx, int posy, Color *color, int font_shadow) diff --git a/src/util/common.h b/src/util/common.h index 77be4f0..1bf6934 100644 --- a/src/util/common.h +++ b/src/util/common.h @@ -6,7 +6,6 @@ #ifndef COMMON_H #define COMMON_H - #define WM_CLASS_TINT "panel" #include @@ -64,7 +63,7 @@ void extract_values (const char *value, char **value1, char **value2, char **val 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); +void render_image(Drawable d, int x, int y); void draw_text(PangoLayout *layout, cairo_t *c, int posx, int posy, Color *color, int font_shadow);