diff --git a/libs/ui/canvas/kis_canvas2.cpp b/libs/ui/canvas/kis_canvas2.cpp --- a/libs/ui/canvas/kis_canvas2.cpp +++ b/libs/ui/canvas/kis_canvas2.cpp @@ -788,7 +788,15 @@ bool shouldExplicitlyIssueUpdates = false; QVector infoObjects; - while (KisUpdateInfoSP info = m_d->projectionUpdatesCompressor.takeUpdateInfo()) { + KisUpdateInfoList originalInfoObjects; + m_d->projectionUpdatesCompressor.takeUpdateInfo(originalInfoObjects); + + for (auto it = originalInfoObjects.constBegin(); + it != originalInfoObjects.constEnd(); + ++it) { + + KisUpdateInfoSP info = *it; + const KisMarkerUpdateInfo *batchInfo = dynamic_cast(info.data()); if (batchInfo) { if (!infoObjects.isEmpty()) { diff --git a/libs/ui/canvas/kis_canvas_updates_compressor.h b/libs/ui/canvas/kis_canvas_updates_compressor.h --- a/libs/ui/canvas/kis_canvas_updates_compressor.h +++ b/libs/ui/canvas/kis_canvas_updates_compressor.h @@ -25,18 +25,17 @@ #include "kis_update_info.h" +typedef QList KisUpdateInfoList; class KisCanvasUpdatesCompressor { - typedef QList UpdateInfoList; - public: bool putUpdateInfo(KisUpdateInfoSP info); - KisUpdateInfoSP takeUpdateInfo(); + void takeUpdateInfo(KisUpdateInfoList &list); private: QMutex m_mutex; - UpdateInfoList m_updatesList; + KisUpdateInfoList m_updatesList; }; #endif /* __KIS_CANVAS_UPDATES_COMPRESSOR_H */ diff --git a/libs/ui/canvas/kis_canvas_updates_compressor.cpp b/libs/ui/canvas/kis_canvas_updates_compressor.cpp --- a/libs/ui/canvas/kis_canvas_updates_compressor.cpp +++ b/libs/ui/canvas/kis_canvas_updates_compressor.cpp @@ -25,7 +25,7 @@ if (newUpdateRect.isEmpty()) return false; QMutexLocker l(&m_mutex); - UpdateInfoList::iterator it = m_updatesList.begin(); + KisUpdateInfoList::iterator it = m_updatesList.begin(); while (it != m_updatesList.end()) { if (levelOfDetail == (*it)->levelOfDetail() && @@ -47,8 +47,10 @@ return m_updatesList.size() <= 1; } -KisUpdateInfoSP KisCanvasUpdatesCompressor::takeUpdateInfo() +void KisCanvasUpdatesCompressor::takeUpdateInfo(KisUpdateInfoList &list) { + KIS_SAFE_ASSERT_RECOVER(list.isEmpty()) { list.clear(); } + QMutexLocker l(&m_mutex); - return !m_updatesList.isEmpty() ? m_updatesList.takeFirst() : 0; + m_updatesList.swap(list); }