From 59dabc7d8dc0f93761412075dd00bec96b0c55e5 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Fri, 20 Dec 2019 13:10:18 +0100 Subject: [PATCH] Constrain variable cache limit to zoom or panning --- src/display/drawing-item.cpp | 14 +++++++++----- src/display/drawing.cpp | 1 + src/display/drawing.h | 1 + src/display/sp-canvas.cpp | 10 ++++++++++ 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/display/drawing-item.cpp b/src/display/drawing-item.cpp index f7136de6ee..d8d17032d5 100644 --- a/src/display/drawing-item.cpp +++ b/src/display/drawing-item.cpp @@ -331,11 +331,15 @@ DrawingItem::setStyle(SPStyle *style, SPStyle *context_style) } if (style && style->enable_background.set) { - if (style->enable_background.value == SP_CSS_BACKGROUND_NEW && !_background_new) { + bool update = false; + if (style->enable_background.value == SP_CSS_BACKGROUND_NEW) { + update = _background_new == false; _background_new = true; - _markForUpdate(STATE_BACKGROUND, true); - } else if (style->enable_background.value == SP_CSS_BACKGROUND_ACCUMULATE && _background_new) { + } else if (style->enable_background.value == SP_CSS_BACKGROUND_ACCUMULATE) { + update = _background_new == true; _background_new = false; + } + if (update) { _markForUpdate(STATE_BACKGROUND, true); } } @@ -731,7 +735,7 @@ DrawingItem::render(DrawingContext &dc, Geom::IntRect const &area, unsigned flag _cache->paintFromCache(dc, carea, _filter && render_filters); if (!carea) { dc.setSource(0, 0, 0, 0); - return RENDER_OK; + return RENDER_OK; } } else { // There is no cache. This could be because caching of this item @@ -1185,7 +1189,7 @@ inline void expandByScale(Geom::IntRect &rect, double scale) Geom::OptIntRect DrawingItem::_cacheRect(bool cropped) { Geom::OptIntRect r = _drawbox & _drawing.cacheLimit(); - if (_filter && _drawing.renderFilters() && r && r != _drawbox) { + if (!_drawing.lookCacheLimit && _filter && _drawing.renderFilters() && r && r != _drawbox) { // we check unfiltered item is emought inside the cache area to render properly Geom::OptIntRect canvas = r; expandByScale(*canvas, 0.5); diff --git a/src/display/drawing.cpp b/src/display/drawing.cpp index 4ff7464a21..2eced9f590 100644 --- a/src/display/drawing.cpp +++ b/src/display/drawing.cpp @@ -35,6 +35,7 @@ Drawing::Drawing(SPCanvasArena *arena) : _root(nullptr) , outlinecolor(0x000000ff) , delta(0) + , lookCacheLimit(true) , _exact(false) , _outline_sensitive(true) , _rendermode(RENDERMODE_NORMAL) diff --git a/src/display/drawing.h b/src/display/drawing.h index fb82cdd796..f4e3a84109 100644 --- a/src/display/drawing.h +++ b/src/display/drawing.h @@ -92,6 +92,7 @@ public: // TODO: remove these temporarily public members guint32 outlinecolor; double delta; + bool lookCacheLimit; private: bool _exact; // if true then rendering must be exact RenderMode _rendermode; diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp index 03e4de86e1..753852eea2 100644 --- a/src/display/sp-canvas.cpp +++ b/src/display/sp-canvas.cpp @@ -2580,6 +2580,7 @@ gint SPCanvas::idle_handler(gpointer data) SPDesktop *desktop = SP_ACTIVE_DESKTOP; if (desktop) { SPCanvasArena *arena = SP_CANVAS_ARENA(desktop->drawing); + arena->drawing.lookCacheLimit = true; Inkscape::RenderMode rm = arena->drawing.renderMode(); if (rm == Inkscape::RENDERMODE_OUTLINE) { canvas->_totalelapsed = 0; @@ -2602,6 +2603,11 @@ gint SPCanvas::idle_handler(gpointer data) // Reset idle id canvas->_idle_id = 0; canvas->_scrooling = false; + SPDesktop *desktop = SP_ACTIVE_DESKTOP; + if (desktop) { + SPCanvasArena *arena = SP_CANVAS_ARENA(desktop->drawing); + arena->drawing.lookCacheLimit = true; + } } #endif return !ret; @@ -2670,6 +2676,10 @@ void SPCanvas::scrollTo( Geom::Point const &c, unsigned int clear, bool is_scrol if (desktop && desktop->splitMode()) { split = true; } + if (desktop) { + SPCanvasArena *arena = SP_CANVAS_ARENA(desktop->drawing); + arena->drawing.lookCacheLimit = false; + } if (clear || split || _xray || outsidescrool) { _dx0 = cx; // here the 'd' stands for double, not delta! _dy0 = cy; -- GitLab