From 88e76ee77d7271820dfad4b66ea1ca892e1a1ae0 Mon Sep 17 00:00:00 2001 From: Vadim Ushakov Date: Fri, 3 Aug 2012 22:43:29 +0800 Subject: [PATCH] fix scrolling when scale == 1 --- src/image-view.c | 98 ++++++++---------------------------------------------- 1 files changed, 14 insertions(+), 84 deletions(-) diff --git a/src/image-view.c b/src/image-view.c index cd40e3a..b367f2a 100644 --- a/src/image-view.c +++ b/src/image-view.c @@ -309,65 +309,6 @@ void image_view_paint( ImageView* iv, GdkEventExpose* evt ) { // GdkRectangle& rect = rects[i]; paint( iv, rects + i, GDK_INTERP_NEAREST ); -#if 0 - g_debug("dirty dest: x=%d, y=%d, w=%d, h=%d\nx_off=%d, y_off=%d", - rect.x, rect.y, rect.width, rect.height, iv->img_area.x, iv->img_area.y ); - - if( ! gdk_rectangle_intersect( &rect, &iv->img_area, &rect ) ) - continue; - - int dest_x = rect.x; - int dest_y = rect.y; - - rect.x -= img_area.x; - rect.y -= img_area.y; - - GdkPixbuf* src_pix = NULL; - int src_x, src_y; - if( iv->scale == 1.0 ) // original size - { - src_pix = (GdkPixbuf*)g_object_ref( pix ); - src_x = rect.x; - src_y = rect.y; - } - else // scaling is needed - { - GdkPixbuf* scaled_pix = NULL; - int src_w, src_h; - src_x = (int)floor( gdouble(rect.x) / scale + 0.5 ); - src_y = (int)floor( gdouble(rect.y) / scale + 0.5 ); - src_w = (int)floor( gdouble(rect.width) / scale + 0.5 ); - src_h = (int)floor( gdouble(rect.height) / scale + 0.5 ); - if( src_y > gdk_pixbuf_get_height(pix) ) - src_y = gdk_pixbuf_get_height(pix); - if( src_x + src_w > gdk_pixbuf_get_width(pix) ) - src_w = gdk_pixbuf_get_width(pix) - src_x; - if( src_y + src_h > gdk_pixbuf_get_height(pix) ) - src_h = gdk_pixbuf_get_height(pix) - src_y; - g_debug("orig src: x=%d, y=%d, w=%d, h=%d", - src_x, src_y, src_w, src_h ); - - src_pix = gdk_pixbuf_new_subpixbuf( pix, src_x, src_y, src_w, src_h ); - scaled_pix = gdk_pixbuf_scale_simple( src_pix, rect.width, rect.height, interp_type ); - g_object_unref( src_pix ); - src_pix = scaled_pix; - - src_x = 0; - src_y = 0; - } - - if( G_LIKELY(src_pix) ) - { - gdk_draw_pixbuf( widget->window, - widget->style->fg_gc[GTK_STATE_NORMAL], - src_pix, - src_x, src_y, - dest_x, dest_y, - rect.width, rect.height, - GDK_RGB_DITHER_NORMAL, 0, 0 ); - g_object_unref( src_pix ); - } -#endif } g_free( rects ); @@ -525,28 +466,29 @@ void paint( ImageView* iv, GdkRectangle* invalid_rect, GdkInterpType type ) if( ! gdk_rectangle_intersect( invalid_rect, &iv->img_area, &rect ) ) return; - int dest_x = rect.x; - int dest_y = rect.y; - - rect.x -= iv->img_area.x; - rect.y -= iv->img_area.y; + int dest_x; + int dest_y; GdkPixbuf* src_pix = NULL; - int src_x, src_y; if( iv->scale == 1.0 ) // original size { src_pix = (GdkPixbuf*)g_object_ref( iv->pix ); - src_x = rect.x; - src_y = rect.y; + dest_x = iv->img_area.x; + dest_y = iv->img_area.y; } else // scaling is needed { + dest_x = rect.x; + dest_y = rect.y; + + rect.x -= iv->img_area.x; + rect.y -= iv->img_area.y; + GdkPixbuf* scaled_pix = NULL; - int src_w, src_h; - src_x = (int)floor( ((gdouble)rect.x) / iv->scale + 0.5 ); - src_y = (int)floor( ((gdouble)rect.y) / iv->scale + 0.5 ); - src_w = (int)floor( ((gdouble)rect.width) / iv->scale + 0.5 ); - src_h = (int)floor( ((gdouble)rect.height) / iv->scale + 0.5 ); + int src_x = (int)floor( ((gdouble)rect.x) / iv->scale + 0.5 ); + int src_y = (int)floor( ((gdouble)rect.y) / iv->scale + 0.5 ); + int src_w = (int)floor( ((gdouble)rect.width) / iv->scale + 0.5 ); + int src_h = (int)floor( ((gdouble)rect.height) / iv->scale + 0.5 ); if( src_y > gdk_pixbuf_get_height( iv->pix ) ) src_y = gdk_pixbuf_get_height( iv->pix ); if( src_x + src_w > gdk_pixbuf_get_width( iv->pix ) ) @@ -564,23 +506,11 @@ void paint( ImageView* iv, GdkRectangle* invalid_rect, GdkInterpType type ) src_pix = scaled_pix; } - src_x = 0; - src_y = 0; } if( G_LIKELY(src_pix) ) { GtkWidget* widget = (GtkWidget*)iv; -/* - gdk_draw_pixbuf( widget->window, - widget->style->fg_gc[GTK_STATE_NORMAL], - src_pix, - src_x, src_y, - dest_x, dest_y, - rect.width, rect.height, - GDK_RGB_DITHER_NORMAL, 0, 0 ); -*/ - // New function with cairo cairo_t *cr = gdk_cairo_create (gtk_widget_get_window(widget)); gdk_cairo_set_source_pixbuf (cr, src_pix, dest_x, dest_y); cairo_paint (cr); -- 1.7.4.1