Fix semi-transparent artifacts in w3m-img when used with 32-bit color (e.g. urxvt)

imlib_render_image_on_drawable_at_size() tended to leave nasty
semi-transparent artifacts in 32-bit mode.  Apparently, resizing an
image in 32-bit mode affects the alpha channel even if there is no
transparency in the image.  With this patch, resizing is done in
24-bit mode (or whatever depth the original image has) before
converting the image to 32-bit and rendering it on the display.

Origin: https://gist.github.com/fmthoma/f76a1b44e00d5ca972bb
cf. https://github.com/hut/ranger/issues/86#issuecomment-166027119
This commit is contained in:
Franz Thoma
2015-12-20 16:06:43 +09:00
committed by Tatsuya Kinoshita
parent ffa29b4320
commit 1dd6464be9

View File

@@ -423,6 +423,10 @@ x11_load_image(w3mimg_op * self, W3MImage * img, char *fname, int w, int h)
w = imlib_image_get_width();
if (h <= 0)
h = imlib_image_get_height();
im = imlib_create_cropped_scaled_image(0, 0, imlib_image_get_width(), imlib_image_get_height(), w, h);
imlib_context_set_image(im);
img->pixmap = (void *)XCreatePixmap(xi->display, xi->parent, w, h,
attr.depth);
if (!img->pixmap)
@@ -433,7 +437,7 @@ x11_load_image(w3mimg_op * self, W3MImage * img, char *fname, int w, int h)
imlib_context_set_visual(attr.visual);
imlib_context_set_colormap(attr.colormap);
imlib_context_set_drawable((Drawable) img->pixmap);
imlib_render_image_on_drawable_at_size(0, 0, w, h);
imlib_render_image_on_drawable(0, 0);
imlib_free_image();
#elif defined(USE_GDKPIXBUF)
max_anim = self->max_anim;