diff --git a/src/DrawingProgram/DrawingProgramCache.cpp b/src/DrawingProgram/DrawingProgramCache.cpp index b3e4f04..285d42c 100644 --- a/src/DrawingProgram/DrawingProgramCache.cpp +++ b/src/DrawingProgram/DrawingProgramCache.cpp @@ -371,49 +371,38 @@ void DrawingProgramCache::draw_components_to_canvas(SkCanvas* canvas, const Draw size_t nextCacheToRender = 0; for(auto& c : uncachedCompsToDraw) { for(;;) { - if(nextCacheToRender >= cachedNodesToDraw.size() || c->pos < cachedNodesToDraw[nextCacheToRender]->drawCache.value().lastDrawnComponentPlacement) + if(nextCacheToRender >= cachedNodesToDraw.size() || c->pos <= cachedNodesToDraw[nextCacheToRender]->drawCache.value().lastDrawnComponentPlacement) break; - auto& bvhNode = cachedNodesToDraw[nextCacheToRender]; - auto& drawCache = bvhNode->drawCache.value(); - canvas->save(); - bvhNode->coords.transform_sk_canvas(canvas, drawData); - drawCache.lastRenderTime = std::chrono::steady_clock::now(); - - lastComponentDrawn = std::max(lastComponentDrawn, drawCache.lastDrawnComponentPlacement); - - SkPaint srcPaint; - srcPaint.setBlendMode(SkBlendMode::kSrc); - - canvas->drawImage(drawCache.img, 0, 0, {SkFilterMode::kLinear, SkMipmapMode::kLinear}, &srcPaint); - - canvas->restore(); + lastComponentDrawn = std::max(lastComponentDrawn, draw_cache_image_to_canvas(canvas, drawData, cachedNodesToDraw[nextCacheToRender])); nextCacheToRender++; } c->obj->draw(canvas, drawData); c->obj->drawSetupData.shouldDraw = false; lastComponentDrawn = std::max(lastComponentDrawn, c->pos); } - for(;nextCacheToRender < cachedNodesToDraw.size(); nextCacheToRender++) { - auto& bvhNode = cachedNodesToDraw[nextCacheToRender]; - auto& drawCache = bvhNode->drawCache.value(); - canvas->save(); - bvhNode->coords.transform_sk_canvas(canvas, drawData); - drawCache.lastRenderTime = std::chrono::steady_clock::now(); - - lastComponentDrawn = std::max(lastComponentDrawn, drawCache.lastDrawnComponentPlacement); - - SkPaint srcPaint; - srcPaint.setBlendMode(SkBlendMode::kSrc); - - canvas->drawImage(drawCache.img, 0, 0, {SkFilterMode::kLinear, SkMipmapMode::kLinear}, &srcPaint); - - canvas->restore(); - } + for(;nextCacheToRender < cachedNodesToDraw.size(); nextCacheToRender++) + lastComponentDrawn = std::max(lastComponentDrawn, draw_cache_image_to_canvas(canvas, drawData, cachedNodesToDraw[nextCacheToRender])); if(lastDrawnComponentPlacement) *lastDrawnComponentPlacement = lastComponentDrawn; } +uint64_t DrawingProgramCache::draw_cache_image_to_canvas(SkCanvas* canvas, const DrawData& drawData, const std::shared_ptr& bvhNode) { + auto& drawCache = bvhNode->drawCache.value(); + canvas->save(); + bvhNode->coords.transform_sk_canvas(canvas, drawData); + drawCache.lastRenderTime = std::chrono::steady_clock::now(); + + SkPaint srcPaint; + srcPaint.setBlendMode(SkBlendMode::kSrc); + + canvas->drawImage(drawCache.img, 0, 0, {SkFilterMode::kLinear, SkMipmapMode::kLinear}, &srcPaint); + + canvas->restore(); + + return drawCache.lastDrawnComponentPlacement; +} + DrawingProgramCache::~DrawingProgramCache() { clear_own_cached_surfaces(); } diff --git a/src/DrawingProgram/DrawingProgramCache.hpp b/src/DrawingProgram/DrawingProgramCache.hpp index 217551d..44932b9 100644 --- a/src/DrawingProgram/DrawingProgramCache.hpp +++ b/src/DrawingProgram/DrawingProgramCache.hpp @@ -62,6 +62,8 @@ class DrawingProgramCache { const std::chrono::steady_clock::time_point& get_last_bvh_build_time() const; void clear_own_cached_surfaces(); private: + uint64_t draw_cache_image_to_canvas(SkCanvas* canvas, const DrawData& drawData, const std::shared_ptr& bvhNode); + void force_rebuild_dont_include_objs(std::vector componentsToBuild, const std::unordered_set& objsToNotInclude); void force_rebuild(const std::vector& componentsToBuild);