@@ -1739,10 +1739,19 @@ void dt_view_paint_surface(cairo_t *cr,
17391739 cairo_scale (cr , zoom_scale , zoom_scale );
17401740
17411741 const double back_scale = (buf_scale == 0 ? 1.0 : backbuf_scale / buf_scale ) * (1 <<closeup ) / ppd ;
1742+ const double trans_x = (offset_x - zoom_x ) * processed_width * buf_scale - 0.5 * buf_width ;
1743+ const double trans_y = (offset_y - zoom_y ) * processed_height * buf_scale - 0.5 * buf_height ;
17421744
17431745 if (dev -> preview_pipe -> output_imgid == dev -> image_storage .id
1746+ && (port -> pipe -> output_imgid != dev -> image_storage .id
1747+ || fabsf (backbuf_scale / buf_scale - 1.0f ) > .09f
1748+ || floor (maxw / 2 / back_scale ) - 1 > MIN (- trans_x , trans_x + buf_width )
1749+ || floor (maxh / 2 / back_scale ) - 1 > MIN (- trans_y , trans_y + buf_height ))
17441750 && (port == & dev -> full || port == & dev -> preview2 ))
17451751 {
1752+ if (port -> pipe -> status == DT_DEV_PIXELPIPE_VALID )
1753+ port -> pipe -> status = DT_DEV_PIXELPIPE_DIRTY ;
1754+
17461755 // draw preview
17471756 float wd = processed_width * dev -> preview_pipe -> processed_width / MAX (1 , dev -> full .pipe -> processed_width );
17481757 float ht = processed_height * dev -> preview_pipe -> processed_width / MAX (1 , dev -> full .pipe -> processed_width );
@@ -1784,9 +1793,7 @@ void dt_view_paint_surface(cairo_t *cr,
17841793 buf_zoom_x , buf_zoom_y ,
17851794 offset_x , offset_y );
17861795 cairo_scale (cr , back_scale / zoom_scale , back_scale / zoom_scale );
1787- cairo_translate (cr , (offset_x - zoom_x ) * processed_width * buf_scale - 0.5 * buf_width ,
1788- (offset_y - zoom_y ) * processed_height * buf_scale - 0.5 * buf_height );
1789-
1796+ cairo_translate (cr , trans_x , trans_y );
17901797 cairo_surface_t * surface = dt_view_create_surface (buf , buf_width , buf_height );
17911798 cairo_set_source_surface (cr , surface , 0 , 0 );
17921799 cairo_pattern_set_filter (cairo_get_source (cr ), CAIRO_FILTER_FAST );
0 commit comments