summaryrefslogtreecommitdiffstats
path: root/src/display
diff options
context:
space:
mode:
authorJohn Bintz <me@johnbintz.com>2006-09-06 12:31:16 +0000
committerjohncoswell <johncoswell@users.sourceforge.net>2006-09-06 12:31:16 +0000
commit3c343a508843b038770ecd721126ce41b5c80e5f (patch)
tree8ff77b82bf62599663a75f5328aa656dda648666 /src/display
parentmove rounding spinbutton (diff)
downloadinkscape-3c343a508843b038770ecd721126ce41b5c80e5f.tar.gz
inkscape-3c343a508843b038770ecd721126ce41b5c80e5f.zip
Initial reworking of forced redraw to work better with interruptible display
(bzr r1696)
Diffstat (limited to 'src/display')
-rw-r--r--src/display/sp-canvas.cpp42
-rw-r--r--src/display/sp-canvas.h7
2 files changed, 26 insertions, 23 deletions
diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp
index 6cb3990dd..1f89e8bae 100644
--- a/src/display/sp-canvas.cpp
+++ b/src/display/sp-canvas.cpp
@@ -978,7 +978,8 @@ sp_canvas_init (SPCanvas *canvas)
canvas->redraw_count = 0;
- canvas->forced_full_redraw_count = 0;
+ canvas->forced_redraw_count = 0;
+ canvas->forced_redraw_limit = 0;
canvas->slowest_buffer = 0;
}
@@ -1694,8 +1695,12 @@ sp_canvas_paint_rect (SPCanvas *canvas, int xx0, int yy0, int xx1, int yy1)
// Process events that may have arrived while we were busy drawing;
// only if we're drawing multiple buffers, and only if this one was not very fast,
// and only if we're allowed to interrupt this redraw
- if (multiple_buffers && this_buffer > 25000 && !canvas->forced_full_redraw_count) {
+ bool ok_to_interrupt = (multiple_buffers && this_buffer > 25000);
+ if (ok_to_interrupt && canvas->forced_redraw_limit) {
+ ok_to_interrupt = (canvas->forced_redraw_count < canvas->forced_redraw_limit);
+ }
+ if (ok_to_interrupt) {
// Run at most max_iterations of the main loop; we cannot process ALL events
// here because some things (e.g. rubberband) flood with dirtying events but will
// not redraw themselves
@@ -1714,6 +1719,9 @@ sp_canvas_paint_rect (SPCanvas *canvas, int xx0, int yy0, int xx1, int yy1)
// if so, force update and abort
if (canvas->need_redraw || canvas->need_update) {
canvas->slowest_buffer = slowest_buffer;
+ if (canvas->forced_redraw_limit) {
+ canvas->forced_redraw_count++;
+ }
do_update (canvas);
return;
}
@@ -1721,36 +1729,30 @@ sp_canvas_paint_rect (SPCanvas *canvas, int xx0, int yy0, int xx1, int yy1)
}
}
- // We've finished a redraw; decrement the full redraw counter
- if (canvas->forced_full_redraw_count > 0) {
- canvas->forced_full_redraw_count--;
- }
-
// Remember the slowest buffer of this paint in canvas
canvas->slowest_buffer = slowest_buffer;
+
+ // we've had a full redraw, reset the full redraw counter
+ if (canvas->forced_redraw_limit) {
+ canvas->forced_redraw_count = 0;
+ }
}
/**
- * Force the next several screen redraws to not be interruptible.
- * Used when having an accurate representation of the drawing canvas
- * is more important than speed.
- *
- * In the future, this should be a toggle switch to be enabled/disabled
- * when precise object drawing is necessary.
+ * Force a full redraw after a specified number of interrupted redraws
*/
void
-sp_canvas_force_full_redraws(SPCanvas *canvas, unsigned int count) {
- canvas->forced_full_redraw_count += count;
+sp_canvas_force_full_redraw_after_interruptions(SPCanvas *canvas, unsigned int count) {
+ canvas->forced_redraw_limit = count;
+ canvas->forced_redraw_count = 0;
}
/**
- * Flush all forced full redraw requests.
- * Used when accurate representation of the drawing canvas is no
- * longer needed.
+ * End forced full redraw requests
*/
void
-sp_canvas_clear_forced_full_redraws(SPCanvas *canvas) {
- canvas->forced_full_redraw_count = 0;
+sp_canvas_end_forced_full_redraws(SPCanvas *canvas) {
+ canvas->forced_redraw_limit = 0;
}
/**
diff --git a/src/display/sp-canvas.h b/src/display/sp-canvas.h
index f9f4330fc..ebc9845f3 100644
--- a/src/display/sp-canvas.h
+++ b/src/display/sp-canvas.h
@@ -161,7 +161,8 @@ struct SPCanvas {
long redraw_count;
glong slowest_buffer;
- unsigned int forced_full_redraw_count;
+ unsigned int forced_redraw_count;
+ unsigned int forced_redraw_limit;
/* For use by internal pick_current_item() function */
unsigned int left_grabbed_item : 1;
@@ -189,8 +190,8 @@ void sp_canvas_scroll_to(SPCanvas *canvas, double cx, double cy, unsigned int cl
void sp_canvas_update_now(SPCanvas *canvas);
void sp_canvas_request_redraw(SPCanvas *canvas, int x1, int y1, int x2, int y2);
-void sp_canvas_force_full_redraws(SPCanvas *canvas, unsigned int count);
-void sp_canvas_clear_forced_full_redraws(SPCanvas *canvas);
+void sp_canvas_force_full_redraw_after_interruptions(SPCanvas *canvas, unsigned int count);
+void sp_canvas_end_forced_full_redraws(SPCanvas *canvas);
void sp_canvas_window_to_world(SPCanvas const *canvas, double winx, double winy, double *worldx, double *worldy);
void sp_canvas_world_to_window(SPCanvas const *canvas, double worldx, double worldy, double *winx, double *winy);