diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-05-13 13:14:26 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-05-13 13:21:26 +0300 |
commit | 59c477efbea15df5686b77a6cbf0ebe878c9cb63 (patch) | |
tree | c174055bed7096a34a88ffe1d066a4c1485a048c /plugins | |
parent | 618c94f2228561f74ca75b2c5bcc17ee5d9a107d (diff) |
Further fixes to threaded rendering
- Antialiasing should now work with threaded rendering
- Optimize rendering to use old way if single threaded
case is detected.
Change-Id: I6de87cbd04c108eae7ee55c5a0e27dd5fc07db89
Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/declarative/declarativechart.cpp | 47 | ||||
-rw-r--r-- | plugins/declarative/declarativechart.h | 2 |
2 files changed, 39 insertions, 10 deletions
diff --git a/plugins/declarative/declarativechart.cpp b/plugins/declarative/declarativechart.cpp index e692ad43..3caeb39b 100644 --- a/plugins/declarative/declarativechart.cpp +++ b/plugins/declarative/declarativechart.cpp @@ -46,6 +46,7 @@ #include <QGraphicsSceneHoverEvent> #include <QApplication> #include <QTimer> +#include <QThread> #endif QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -265,6 +266,8 @@ void DeclarativeChart::initChart(QChart::ChartType type) { #ifdef CHARTS_FOR_QUICK2 m_currentSceneImage = 0; + m_guiThreadId = QThread::currentThreadId(); + m_paintThreadId = 0; if (type == QChart::ChartTypePolar) m_chart = new QPolarChart(); @@ -429,10 +432,16 @@ void DeclarativeChart::sceneChanged(QList<QRectF> region) { Q_UNUSED(region); - if (!m_updatePending) { - m_updatePending = true; - // Do async render to avoid some unnecessary renders. - QTimer::singleShot(0, this, SLOT(renderScene())); + if (m_guiThreadId == m_paintThreadId) { + // Rendering in gui thread, no need for shenannigans, just update + update(); + } else { + // Multi-threaded rendering, need to ensure scene is actually rendered in gui thread + if (!m_updatePending) { + m_updatePending = true; + // Do async render to avoid some unnecessary renders. + QTimer::singleShot(0, this, SLOT(renderScene())); + } } } @@ -444,6 +453,8 @@ void DeclarativeChart::renderScene() m_currentSceneImage = new QImage(m_chart->size().toSize(), QImage::Format_ARGB32); m_currentSceneImage->fill(Qt::transparent); QPainter painter(m_currentSceneImage); + if (antialiasing()) + painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform); QRect renderRect(QPoint(0, 0), m_chart->size().toSize()); m_scene->render(&painter, renderRect, renderRect); m_sceneImageLock.unlock(); @@ -453,13 +464,29 @@ void DeclarativeChart::renderScene() void DeclarativeChart::paint(QPainter *painter) { - 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); + if (!m_paintThreadId) { + m_paintThreadId = QThread::currentThreadId(); + if (m_guiThreadId == m_paintThreadId) { + // No need for scene image in single threaded rendering, so delete + // the one that got made by default before the rendering type was + // detected. + delete m_currentSceneImage; + m_currentSceneImage = 0; + } + } + + if (m_guiThreadId == m_paintThreadId) { + QRectF renderRect(QPointF(0, 0), m_chart->size()); + m_scene->render(painter, renderRect, renderRect); + } else { + 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(); } - m_sceneImageLock.unlock(); } void DeclarativeChart::mousePressEvent(QMouseEvent *event) diff --git a/plugins/declarative/declarativechart.h b/plugins/declarative/declarativechart.h index 139e6290..ae4c5362 100644 --- a/plugins/declarative/declarativechart.h +++ b/plugins/declarative/declarativechart.h @@ -218,6 +218,8 @@ private: QMutex m_sceneImageLock; QImage *m_currentSceneImage; bool m_updatePending; + Qt::HANDLE m_paintThreadId; + Qt::HANDLE m_guiThreadId; #endif DeclarativeMargins *m_margins; }; |