diff options
author | Fabien Freling <fabien.freling@nokia.com> | 2011-02-14 15:23:00 (GMT) |
---|---|---|
committer | Fabien Freling <fabien.freling@nokia.com> | 2011-02-15 12:49:38 (GMT) |
commit | 78c5c1cae5f9e100bfb7388f68208406f0db4b42 (patch) | |
tree | 3dc89f26963c084ead61ec0ccefac9981e94866c /src | |
parent | 7da16ed9888133039c6d7a261fc7c4b61d9b6114 (diff) | |
download | Qt-78c5c1cae5f9e100bfb7388f68208406f0db4b42.zip Qt-78c5c1cae5f9e100bfb7388f68208406f0db4b42.tar.gz Qt-78c5c1cae5f9e100bfb7388f68208406f0db4b42.tar.bz2 |
Optimize the rendering path for the unified toolbar.
The over flushing of the toolbar had a huge
performance impact so now we only flush the toolbar
when necessary and moved the rendering out of the
flushing process.
Reviewed-by: Richard Moe Gustavsen
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/kernel/qcocoaview_mac.mm | 10 | ||||
-rw-r--r-- | src/gui/kernel/qwidget.cpp | 17 | ||||
-rw-r--r-- | src/gui/kernel/qwidget_p.h | 4 | ||||
-rw-r--r-- | src/gui/painting/qunifiedtoolbarsurface_mac.cpp | 31 | ||||
-rw-r--r-- | src/gui/painting/qunifiedtoolbarsurface_mac_p.h | 3 |
5 files changed, 47 insertions, 18 deletions
diff --git a/src/gui/kernel/qcocoaview_mac.mm b/src/gui/kernel/qcocoaview_mac.mm index e50c401..1fe96f8 100644 --- a/src/gui/kernel/qcocoaview_mac.mm +++ b/src/gui/kernel/qcocoaview_mac.mm @@ -581,20 +581,12 @@ static int qCocoaViewCount = 0; } else { - QUnifiedToolbarSurface *unifiedSurface = dynamic_cast<QUnifiedToolbarSurface *>(qwidgetprivate->unifiedSurface); + QUnifiedToolbarSurface *unifiedSurface = qwidgetprivate->unifiedSurface; if (!unifiedSurface || !qwidgetprivate->flushRequested) { qt_mac_release_graphics_context(context); return; } - // We render the content of the toolbar in the surface. - unifiedSurface->updateToolbarOffset(qwidget); - QRect beginPaintRect(qwidgetprivate->toolbar_offset.x(), qwidgetprivate->toolbar_offset.y(), qwidget->geometry().width(), qwidget->geometry().height()); - QRegion beginPaintRegion(beginPaintRect); - - unifiedSurface->beginPaint(beginPaintRegion); - qwidget->render(unifiedSurface->paintDevice(), qwidgetprivate->toolbar_offset, QRegion(), QWidget::DrawChildren); - int areaX = qwidgetprivate->toolbar_offset.x(); int areaY = qwidgetprivate->toolbar_offset.y(); int areaWidth = qwidget->geometry().width(); diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp index 04bc2fb..84a839f 100644 --- a/src/gui/kernel/qwidget.cpp +++ b/src/gui/kernel/qwidget.cpp @@ -324,6 +324,7 @@ QWidgetPrivate::QWidgetPrivate(int version) hasOwnContext = false; isInUnifiedToolbar = false; unifiedSurface = 0; + toolbar_ancestor = 0; flushRequested = false; #endif // QT_MAC_USE_COCOA #ifdef QWIDGET_EXTRA_DEBUG @@ -10360,6 +10361,10 @@ void QWidget::repaint(const QRect &rect) return; if (hasBackingStoreSupport()) { + if (qt_widget_private(this)->isInUnifiedToolbar) { + qt_widget_private(this)->unifiedSurface->renderToolbar(this, true); + return; + } QTLWExtra *tlwExtra = window()->d_func()->maybeTopData(); if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) { tlwExtra->inRepaint = true; @@ -10389,6 +10394,10 @@ void QWidget::repaint(const QRegion &rgn) return; if (hasBackingStoreSupport()) { + if (qt_widget_private(this)->isInUnifiedToolbar) { + qt_widget_private(this)->unifiedSurface->renderToolbar(this, true); + return; + } QTLWExtra *tlwExtra = window()->d_func()->maybeTopData(); if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) { tlwExtra->inRepaint = true; @@ -10446,6 +10455,10 @@ void QWidget::update(const QRect &rect) } if (hasBackingStoreSupport()) { + if (qt_widget_private(this)->isInUnifiedToolbar) { + qt_widget_private(this)->unifiedSurface->renderToolbar(this); + return; + } QTLWExtra *tlwExtra = window()->d_func()->maybeTopData(); if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) tlwExtra->backingStore->markDirty(rect, this); @@ -10470,6 +10483,10 @@ void QWidget::update(const QRegion &rgn) } if (hasBackingStoreSupport()) { + if (qt_widget_private(this)->isInUnifiedToolbar) { + qt_widget_private(this)->unifiedSurface->renderToolbar(this); + return; + } QTLWExtra *tlwExtra = window()->d_func()->maybeTopData(); if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) tlwExtra->backingStore->markDirty(rgn, this); diff --git a/src/gui/kernel/qwidget_p.h b/src/gui/kernel/qwidget_p.h index 921cf03..59cb737 100644 --- a/src/gui/kernel/qwidget_p.h +++ b/src/gui/kernel/qwidget_p.h @@ -79,6 +79,7 @@ #ifdef Q_WS_MAC #include <private/qt_mac_p.h> +#include <private/qunifiedtoolbarsurface_mac_p.h> #endif #if defined(Q_WS_QWS) @@ -855,8 +856,9 @@ public: // Unified toolbar variables bool isInUnifiedToolbar; - QWindowSurface *unifiedSurface; + QUnifiedToolbarSurface *unifiedSurface; QPoint toolbar_offset; + QWidget *toolbar_ancestor; bool flushRequested; #endif // QT_MAC_USE_COCOA void determineWindowClass(); diff --git a/src/gui/painting/qunifiedtoolbarsurface_mac.cpp b/src/gui/painting/qunifiedtoolbarsurface_mac.cpp index 36b3e6a..6abcf2c 100644 --- a/src/gui/painting/qunifiedtoolbarsurface_mac.cpp +++ b/src/gui/painting/qunifiedtoolbarsurface_mac.cpp @@ -71,7 +71,7 @@ QPaintDevice *QUnifiedToolbarSurface::paintDevice() return &d_ptr->image->image; } -void QUnifiedToolbarSurface::recursiveRedirect(QObject *object, const QPoint &offset) +void QUnifiedToolbarSurface::recursiveRedirect(QObject *object, QWidget *parent_toolbar, const QPoint &offset) { if (object != 0) { if (object->isWidgetType()) { @@ -83,9 +83,10 @@ void QUnifiedToolbarSurface::recursiveRedirect(QObject *object, const QPoint &of widget->d_func()->unifiedSurface = this; widget->d_func()->isInUnifiedToolbar = true; widget->d_func()->toolbar_offset = offset; + widget->d_func()->toolbar_ancestor = parent_toolbar; for (int i = 0; i < object->children().size(); ++i) { - recursiveRedirect(object->children().at(i), offset); + recursiveRedirect(object->children().at(i), parent_toolbar, offset); } } } @@ -95,7 +96,7 @@ void QUnifiedToolbarSurface::recursiveRedirect(QObject *object, const QPoint &of void QUnifiedToolbarSurface::insertToolbar(QWidget *toolbar, const QPoint &offset) { setGeometry(QRect(QPoint(0, 0), QSize(offset.x() + toolbar->width(), 100))); // FIXME - recursiveRedirect(toolbar, offset); + recursiveRedirect(toolbar, toolbar, offset); } void QUnifiedToolbarSurface::setGeometry(const QRect &rect) @@ -135,10 +136,10 @@ void QUnifiedToolbarSurface::flush(QWidget *widget, const QRegion &rgn, const QP if (!d->image || rgn.rectCount() == 0) return; - widget->d_func()->flushRequested = true; - - // We call display: directly to avoid flickering in the toolbar. - qt_mac_display(widget); + if (widget->d_func()->flushRequested) { + // We call display: directly to avoid flickering in the toolbar. + qt_mac_display(widget); + } } void QUnifiedToolbarSurface::prepareBuffer(QImage::Format format, QWidget *widget) @@ -208,6 +209,22 @@ CGContextRef QUnifiedToolbarSurface::imageContext() return d->image->cg; } +void QUnifiedToolbarSurface::renderToolbar(QWidget *widget, bool forceFlush) +{ + QWidget *toolbar = widget->d_func()->toolbar_ancestor; + + updateToolbarOffset(toolbar); + QRect beginPaintRect(toolbar->d_func()->toolbar_offset.x(), toolbar->d_func()->toolbar_offset.y(), toolbar->geometry().width(), toolbar->geometry().height()); + QRegion beginPaintRegion(beginPaintRect); + + beginPaint(beginPaintRegion); + toolbar->render(paintDevice(), toolbar->d_func()->toolbar_offset, QRegion(), QWidget::DrawChildren); + toolbar->d_func()->flushRequested = true; + + if (forceFlush) + flush(toolbar, beginPaintRegion, toolbar->d_func()->toolbar_offset); +} + QT_END_NAMESPACE #endif // QT_MAC_USE_COCOA diff --git a/src/gui/painting/qunifiedtoolbarsurface_mac_p.h b/src/gui/painting/qunifiedtoolbarsurface_mac_p.h index 54f0f8e..f7ad02e 100644 --- a/src/gui/painting/qunifiedtoolbarsurface_mac_p.h +++ b/src/gui/painting/qunifiedtoolbarsurface_mac_p.h @@ -86,10 +86,11 @@ public: QPaintDevice *paintDevice(); CGContextRef imageContext(); + void renderToolbar(QWidget *widget, bool forceFlush = false); private: void prepareBuffer(QImage::Format format, QWidget *widget); - void recursiveRedirect(QObject *widget, const QPoint &offset); + void recursiveRedirect(QObject *widget, QWidget *parent_toolbar, const QPoint &offset); Q_DECLARE_PRIVATE(QUnifiedToolbarSurface) QScopedPointer<QUnifiedToolbarSurfacePrivate> d_ptr; |