diff --git a/src/display/drawing-item.cpp b/src/display/drawing-item.cpp index f7136de6eec8659abcbb21ad90a6e251b0fee1bd..d8d17032d5d53c864c4110e8f7a391b83170af19 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 4ff7464a21529c0fac288c2352f464c2cb513c94..2eced9f590f0952c0bf1e9cd67d310e7bc37a022 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 fb82cdd7968d0d8f46fae594764ed3725effc523..f4e3a841095a3f7df56895c242789db17d78da30 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 03e4de86e18b97205555bf6975ce97209a48d6e0..753852eea242bcf1af94c05cb38044c8a75dbeb7 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;