Skip to content

Commit 41a2325

Browse files
dterrahejenshannoschwalm
authored andcommitted
don't recalc subset of already available buffer
- when zooming in to multiples of 100% - and then moving around within the region calculated at lower zoom level - when switching on filmstrip or increasing left panel at fixed zoom level - right panel resizing still triggers recalc elsewhere - would allow calculating larger than needed region after move to prevent immediate update after first few pixels move
1 parent dcb2757 commit 41a2325

File tree

3 files changed

+18
-18
lines changed

3 files changed

+18
-18
lines changed

src/develop/develop.c

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2803,17 +2803,10 @@ void dt_dev_zoom_move(dt_dev_viewport_t *port,
28032803
&& old_closeup == port->closeup)
28042804
return;
28052805

2806+
if(port->widget)
2807+
dt_control_queue_redraw_widget(port->widget);
28062808
if(port == &dev->full)
2807-
{
2808-
dt_dev_invalidate(dev); // FIXME not needed? redraw should determines if needs new calculation
2809-
dt_control_queue_redraw_center();
28102809
dt_control_navigation_redraw();
2811-
}
2812-
else if(port == &dev->preview2 && dev->second_wnd)
2813-
{
2814-
dev->preview2.pipe->status = DT_DEV_PIXELPIPE_DIRTY;
2815-
dt_control_queue_redraw_widget(dev->second_wnd);
2816-
}
28172810
}
28182811

28192812
void dt_dev_get_pointer_zoom_pos(dt_dev_viewport_t *port,

src/views/darkroom.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -465,10 +465,6 @@ void expose(
465465
dev->gui_synch = FALSE;
466466
}
467467

468-
if(_full_request(dev)) dt_dev_process_image(dev);
469-
if(_preview_request(dev)) dt_dev_process_preview(dev);
470-
if(_preview2_request(dev)) dt_dev_process_preview2(dev);
471-
472468
float pzx = 0.0f, pzy = 0.0f, zoom_scale = 0.0f;
473469
dt_dev_get_pointer_zoom_pos(port, pointerx, pointery, &pzx, &pzy, &zoom_scale);
474470

@@ -620,6 +616,10 @@ void expose(
620616
g_free(load_txt);
621617
}
622618

619+
if(_full_request(dev)) dt_dev_process_image(dev);
620+
if(_preview_request(dev)) dt_dev_process_preview(dev);
621+
if(_preview2_request(dev)) dt_dev_process_preview2(dev);
622+
623623
/* if we are in full preview mode, we don"t want anything else than the image */
624624
if(dev->full_preview)
625625
return;
@@ -3396,8 +3396,6 @@ static gboolean _second_window_draw_callback(GtkWidget *widget,
33963396
{
33973397
cairo_set_source_rgb(cri, 0.2, 0.2, 0.2);
33983398

3399-
if(_preview2_request(dev)) dt_dev_process_preview2(dev);
3400-
34013399
if(dev->preview2.pipe->backbuf) // do we have an image?
34023400
{
34033401
// draw image
@@ -3408,6 +3406,8 @@ static gboolean _second_window_draw_callback(GtkWidget *widget,
34083406
&dev->preview2, DT_WINDOW_SECOND);
34093407
}
34103408

3409+
if(_preview2_request(dev)) dt_dev_process_preview2(dev);
3410+
34113411
return TRUE;
34123412
}
34133413

src/views/view.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
|| backbuf_scale != buf_scale
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

Comments
 (0)