diff --git a/libs/ui/canvas/kis_canvas2.cpp b/libs/ui/canvas/kis_canvas2.cpp
index 416d73e..f3131b8 100644
--- a/libs/ui/canvas/kis_canvas2.cpp
+++ b/libs/ui/canvas/kis_canvas2.cpp
@@ -140,6 +140,8 @@ public:
QPointer<KoShapeManager> currentlyActiveShapeManager;
KisInputActionGroupsMask inputActionGroupsMask = AllActionGroup;
+ KisSignalCompressor frameStartCompressor;
+
KisSignalCompressor regionOfInterestUpdateCompressor;
QRect regionOfInterest;
@@ -195,6 +197,9 @@ KisCanvas2::KisCanvas2(KisCoordinatesConverter *coordConverter, KoCanvasResource
m_d->updateSignalCompressor.setDelay(1000 / config.fpsLimit());
m_d->updateSignalCompressor.setMode(KisSignalCompressor::FIRST_ACTIVE);
+
+ m_d->frameStartCompressor.setDelay(1000 / config.fpsLimit());
+ m_d->frameStartCompressor.setMode(KisSignalCompressor::FIRST_ACTIVE);
}
void KisCanvas2::setup()
@@ -235,6 +240,11 @@ void KisCanvas2::setup()
globalShapeManager()->selection(), SIGNAL(currentLayerChanged(const KoShapeLayer*)));
connect(&m_d->updateSignalCompressor, SIGNAL(timeout()), SLOT(slotDoCanvasUpdate()));
+
+ connect(this, SIGNAL(sigCanvasCacheUpdated()), &m_d->frameStartCompressor, SLOT(start()));
+ connect(&m_d->frameStartCompressor, SIGNAL(timeout()), SLOT(updateCanvasProjection()));
+
+
connect(&m_d->regionOfInterestUpdateCompressor, SIGNAL(timeout()), SLOT(slotUpdateRegionOfInterest()));
initializeFpsDecoration();
@@ -542,7 +552,7 @@ void KisCanvas2::initializeImage()
m_d->toolProxy.initializeImage(image);
connect(image, SIGNAL(sigImageUpdated(QRect)), SLOT(startUpdateCanvasProjection(QRect)), Qt::DirectConnection);
- connect(this, SIGNAL(sigCanvasCacheUpdated()), SLOT(updateCanvasProjection()));
+ //connect(this, SIGNAL(sigCanvasCacheUpdated()), SLOT(updateCanvasProjection()));
connect(image, SIGNAL(sigProofingConfigChanged()), SLOT(slotChangeProofingConfig()));
connect(image, SIGNAL(sigSizeChanged(const QPointF&, const QPointF&)), SLOT(startResizingImage()), Qt::DirectConnection);
connect(this, SIGNAL(sigContinueResizeImage(qint32,qint32)), SLOT(finishResizingImage(qint32,qint32)));
@@ -736,17 +746,25 @@ void KisCanvas2::startUpdateCanvasProjection(const QRect & rc)
void KisCanvas2::updateCanvasProjection()
{
+ KisOpenGLCanvas2 *canvas = dynamic_cast<KisOpenGLCanvas2*>(m_d->canvasWidget);
+
+ canvas->makeCurrent();
+
while (KisUpdateInfoSP info = m_d->projectionUpdatesCompressor.takeUpdateInfo()) {
QRect vRect = m_d->canvasWidget->updateCanvasProjection(info);
if (!vRect.isEmpty()) {
- updateCanvasWidgetImpl(m_d->coordinatesConverter->viewportToWidget(vRect).toAlignedRect());
+ //updateCanvasWidgetImpl(m_d->coordinatesConverter->viewportToWidget(vRect).toAlignedRect());
}
}
// TODO: Implement info->dirtyViewportRect() for KisOpenGLCanvas2 to avoid updating whole canvas
if (m_d->currentCanvasIsOpenGL) {
- updateCanvasWidgetImpl();
+ //updateCanvasWidgetImpl();
+ m_d->savedUpdateRect = QRect();
+ slotDoCanvasUpdate();
}
+
+ canvas->doneCurrent();
}
void KisCanvas2::slotDoCanvasUpdate()
diff --git a/libs/ui/opengl/kis_opengl_canvas2.cpp b/libs/ui/opengl/kis_opengl_canvas2.cpp
index eba77f3..48ff815 100644
--- a/libs/ui/opengl/kis_opengl_canvas2.cpp
+++ b/libs/ui/opengl/kis_opengl_canvas2.cpp
@@ -918,7 +918,7 @@ QRect KisOpenGLCanvas2::updateCanvasProjection(KisUpdateInfoSP info)
* transparent.
*/
- glFinish();
+ //glFinish();
#endif
return QRect(); // FIXME: Implement dirty rect for OpenGL