--- rxvt-unicode/src/background.C 2010/09/02 23:40:56 1.56 +++ rxvt-unicode/src/background.C 2010/10/03 20:48:34 1.61 @@ -140,8 +140,7 @@ # ifdef BG_IMAGE_FROM_FILE if (have_image) { - if (h_scale != 0 || v_scale != 0 - || h_align != 0 || v_align != 0) + if (flags & sizeSensitive) return true; } # endif @@ -249,7 +248,7 @@ int src_pos = 0; dst_pos = 0; dst_size = size; - if (pos < 0 && size > target_size) + if (pos < 0) { src_pos = -pos; dst_size += pos; @@ -453,6 +452,35 @@ return (changed > 0); } +void +bgPixmap_t::get_image_geometry (int image_width, int image_height, int &w, int &h, int &x, int &y) +{ + int target_width = target->szHint.width; + int target_height = target->szHint.height; + + w = h_scale * target_width / 100; + h = v_scale * target_height / 100; + + if (h_align == rootAlign || v_align == rootAlign) + { + target->get_window_origin (x, y); + x = -x; + y = -y; + } + + if (h_align != rootAlign) + x = make_align_position (h_align, target_width, w > 0 ? w : image_width); + + if (v_align != rootAlign) + y = make_align_position (v_align, target_height, h > 0 ? h : image_height); + + flags &= ~sizeSensitive; + if (h_scale != 0 || v_scale != 0 + || h_align != 0 || v_align != 0 + || image_width > target_width || image_height > target_height) + flags |= sizeSensitive; +} + # ifdef HAVE_AFTERIMAGE bool bgPixmap_t::render_image (unsigned long background_flags) @@ -506,26 +534,13 @@ int x = 0; int y = 0; - int w = h_scale * target_width / 100; - int h = v_scale * target_height / 100; + int w = 0; + int h = 0; TIMING_TEST_START (asim); if (original_asim) - { - if (h_align == rootAlign || v_align == rootAlign) - { - target->get_window_origin (x, y); - x = -x; - y = -y; - } - - if (h_align != rootAlign) - x = make_align_position (h_align, target_width, w > 0 ? w : (int)original_asim->width); - - if (v_align != rootAlign) - y = make_align_position (v_align, target_height, h > 0 ? h : (int)original_asim->height); - } + get_image_geometry (original_asim->width, original_asim->height, w, h, x, y); if (!original_asim || x >= target_width @@ -567,18 +582,17 @@ if (background == NULL) { - /* if tiling - pixmap has to be sized exactly as the image, - but there is no need to make it bigger than the window! */ - if (h_scale == 0) - new_pmap_width = min (result->width, target_width); - if (v_scale == 0) - new_pmap_height = min (result->height, target_height); - /* we also need to tile our image in one or both directions */ if (h_scale == 0 || v_scale == 0) { + /* if tiling - pixmap has to be sized exactly as the image, + but there is no need to make it bigger than the window! */ + new_pmap_width = min (result->width, target_width); + new_pmap_height = min (result->height, target_height); + + /* we also need to tile our image in both directions */ ASImage *tmp = tile_asimage (target->asv, result, - (h_scale > 0) ? 0 : (int)result->width - x, - (v_scale > 0) ? 0 : (int)result->height - y, + (int)result->width - x, + (int)result->height - y, new_pmap_width, new_pmap_height, TINT_LEAVE_SAME, ASA_XImage, @@ -686,8 +700,11 @@ int dst_width = result->width, dst_height = result->height; if (background == NULL) { - if (h_scale > 0) src_x = make_clip_rectangle (x, result->width , new_pmap_width , dst_x, dst_width ); - if (v_scale > 0) src_y = make_clip_rectangle (y, result->height, new_pmap_height, dst_y, dst_height); + if (!(h_scale == 0 || v_scale == 0)) + { + src_x = make_clip_rectangle (x, result->width , new_pmap_width , dst_x, dst_width ); + src_y = make_clip_rectangle (y, result->height, new_pmap_height, dst_y, dst_height); + } if (dst_x > 0 || dst_y > 0 || dst_x + dst_width < new_pmap_width @@ -741,21 +758,10 @@ int x = 0; int y = 0; - int w = h_scale * target_width / 100; - int h = v_scale * target_height / 100; + int w = 0; + int h = 0; - if (h_align == rootAlign || v_align == rootAlign) - { - target->get_window_origin (x, y); - x = -x; - y = -y; - } - - if (h_align != rootAlign) - x = make_align_position (h_align, target_width, w > 0 ? w : image_width); - - if (v_align != rootAlign) - y = make_align_position (v_align, target_height, h > 0 ? h : image_height); + get_image_geometry (image_width, image_height, w, h, x, y); if (x >= target_width || y >= target_height @@ -784,10 +790,11 @@ image_width = gdk_pixbuf_get_width (result); image_height = gdk_pixbuf_get_height (result); - if (h_scale == 0) - new_pmap_width = min (image_width, target_width); - if (v_scale == 0) - new_pmap_height = min (image_height, target_height); + if (h_scale == 0 || v_scale == 0) + { + new_pmap_width = min (image_width, target_width); + new_pmap_height = min (image_height, target_height); + } if (pixmap) {