From 618c94f2228561f74ca75b2c5bcc17ee5d9a107d Mon Sep 17 00:00:00 2001 From: Heikkinen Miikka Date: Mon, 13 May 2013 11:24:30 +0300 Subject: Fix quick2 support with multithreaded scenegraph rendering. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ia9bf896e1fb2684e4272547704924e5035f78268 Reviewed-by: Tomi Korpipää --- plugins/declarative/declarativechart.cpp | 46 +++++++++++++++++++++++++++++--- plugins/declarative/declarativechart.h | 6 +++++ 2 files changed, 49 insertions(+), 3 deletions(-) (limited to 'plugins') diff --git a/plugins/declarative/declarativechart.cpp b/plugins/declarative/declarativechart.cpp index 2d2c9528..e692ad43 100644 --- a/plugins/declarative/declarativechart.cpp +++ b/plugins/declarative/declarativechart.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #endif QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -263,6 +264,8 @@ DeclarativeChart::DeclarativeChart(QChart::ChartType type, QDECLARATIVE_ITEM *pa void DeclarativeChart::initChart(QChart::ChartType type) { #ifdef CHARTS_FOR_QUICK2 + m_currentSceneImage = 0; + if (type == QChart::ChartTypePolar) m_chart = new QPolarChart(); else @@ -272,7 +275,7 @@ void DeclarativeChart::initChart(QChart::ChartType type) m_scene->addItem(m_chart); setAntialiasing(QQuickItem::antialiasing()); - connect(m_scene, SIGNAL(changed(QList)), this, SLOT(update())); + connect(m_scene, SIGNAL(changed(QList)), this, SLOT(sceneChanged(QList))); connect(this, SIGNAL(antialiasingChanged(bool)), this, SLOT(handleAntialiasingChanged(bool))); setAcceptedMouseButtons(Qt::AllButtons); @@ -314,6 +317,12 @@ void DeclarativeChart::changeMinimumMargins(int top, int bottom, int left, int r DeclarativeChart::~DeclarativeChart() { delete m_chart; +#ifdef CHARTS_FOR_QUICK2 + m_sceneImageLock.lock(); + delete m_currentSceneImage; + m_currentSceneImage = 0; + m_sceneImageLock.unlock(); +#endif } void DeclarativeChart::childEvent(QChildEvent *event) @@ -416,10 +425,41 @@ void DeclarativeChart::geometryChanged(const QRectF &newGeometry, const QRectF & } #ifdef CHARTS_FOR_QUICK2 +void DeclarativeChart::sceneChanged(QList region) +{ + Q_UNUSED(region); + + if (!m_updatePending) { + m_updatePending = true; + // Do async render to avoid some unnecessary renders. + QTimer::singleShot(0, this, SLOT(renderScene())); + } +} + +void DeclarativeChart::renderScene() +{ + m_updatePending = false; + m_sceneImageLock.lock(); + delete m_currentSceneImage; + m_currentSceneImage = new QImage(m_chart->size().toSize(), QImage::Format_ARGB32); + m_currentSceneImage->fill(Qt::transparent); + QPainter painter(m_currentSceneImage); + QRect renderRect(QPoint(0, 0), m_chart->size().toSize()); + m_scene->render(&painter, renderRect, renderRect); + m_sceneImageLock.unlock(); + + update(); +} + void DeclarativeChart::paint(QPainter *painter) { - QRectF renderRect(QPointF(0, 0), m_chart->size()); - m_scene->render(painter, renderRect, renderRect); + m_sceneImageLock.lock(); + if (m_currentSceneImage) { + QRect imageRect(QPoint(0, 0), m_currentSceneImage->size()); + QRect itemRect(QPoint(0, 0), QSize(width(), height())); + painter->drawImage(itemRect, *m_currentSceneImage, imageRect); + } + m_sceneImageLock.unlock(); } void DeclarativeChart::mousePressEvent(QMouseEvent *event) diff --git a/plugins/declarative/declarativechart.h b/plugins/declarative/declarativechart.h index f0e24cb7..139e6290 100644 --- a/plugins/declarative/declarativechart.h +++ b/plugins/declarative/declarativechart.h @@ -28,6 +28,7 @@ #include #include #include +#include #else #include #endif @@ -118,6 +119,8 @@ protected: void hoverMoveEvent(QHoverEvent *event); private Q_SLOTS: void handleAntialiasingChanged(bool enable); + void sceneChanged(QList region); + void renderScene(); #endif public: @@ -212,6 +215,9 @@ private: QPoint m_lastMouseMoveScreenPoint; Qt::MouseButton m_mousePressButton; Qt::MouseButtons m_mousePressButtons; + QMutex m_sceneImageLock; + QImage *m_currentSceneImage; + bool m_updatePending; #endif DeclarativeMargins *m_margins; }; -- cgit v1.2.3