From 4457a36cfba4e9ce8efba82bad7f4c62abf117fc Mon Sep 17 00:00:00 2001 From: Rafael Roquetto Date: Mon, 29 Oct 2012 18:09:18 -0200 Subject: Blackberry: Fixes QWindowSurface::grabWidget We are reading from the back buffer instead of the front buffer when grabWidget is called. This adds an override so that we query the front buffer (the last rendered frame). This change is not needed in Qt5 - the api there is different and grabWidget() no longer exists. Change-Id: I691ee589d56b60eab339de536b52fd90cee5ff85 Reviewed-by: Thomas McGuire Reviewed-by: Sean Harmer --- .../blackberry/qbbrasterwindowsurface.cpp | 21 ++++++++++++-- .../platforms/blackberry/qbbrasterwindowsurface.h | 4 +++ src/plugins/platforms/blackberry/qbbwindow.cpp | 32 ++++++++++++++++++++++ src/plugins/platforms/blackberry/qbbwindow.h | 14 ++++++++-- 4 files changed, 66 insertions(+), 5 deletions(-) diff --git a/src/plugins/platforms/blackberry/qbbrasterwindowsurface.cpp b/src/plugins/platforms/blackberry/qbbrasterwindowsurface.cpp index bab2aca..005cca7 100644 --- a/src/plugins/platforms/blackberry/qbbrasterwindowsurface.cpp +++ b/src/plugins/platforms/blackberry/qbbrasterwindowsurface.cpp @@ -53,7 +53,8 @@ QT_BEGIN_NAMESPACE QBBRasterWindowSurface::QBBRasterWindowSurface(QWidget *window) - : QWindowSurface(window) + : QWindowSurface(window), + mUseFrontBuffer(false) { #if defined(QBBRASTERWINDOWSURFACE_DEBUG) qDebug() << "QBBRasterWindowSurface::QBBRasterWindowSurface - w=" << window; @@ -73,7 +74,8 @@ QBBRasterWindowSurface::~QBBRasterWindowSurface() QPaintDevice *QBBRasterWindowSurface::paintDevice() { if (mPlatformWindow->hasBuffers()) - return mPlatformWindow->renderBuffer().image(); + return (mUseFrontBuffer) ? mPlatformWindow->frontBuffer().image() + : mPlatformWindow->renderBuffer().image(); return 0; } @@ -171,4 +173,19 @@ void QBBRasterWindowSurface::endPaint(const QRegion ®ion) #endif } +QPixmap QBBRasterWindowSurface::grabWidget(const QWidget *widget, const QRect &rectangle) const +{ + // mUseFrontBuffer is used as a workaround to tell + // QBBRasterWindowSurface::paintDevice() to return the + // front buffer instead of the renderBuffer. grabWidget() + // is the only use case. + mUseFrontBuffer = true; + + QPixmap pixmap = QWindowSurface::grabWidget(widget, rectangle); + + mUseFrontBuffer = false; + + return pixmap; +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/blackberry/qbbrasterwindowsurface.h b/src/plugins/platforms/blackberry/qbbrasterwindowsurface.h index 65de3ea..6077113 100644 --- a/src/plugins/platforms/blackberry/qbbrasterwindowsurface.h +++ b/src/plugins/platforms/blackberry/qbbrasterwindowsurface.h @@ -63,6 +63,8 @@ public: virtual void beginPaint(const QRegion ®ion); virtual void endPaint(const QRegion ®ion); + virtual QPixmap grabWidget(const QWidget *widget, const QRect &rectangle) const; + private: class ScrollOp { public: @@ -72,6 +74,8 @@ private: int dy; }; + mutable bool mUseFrontBuffer; + QBBWindow *mPlatformWindow; QList mScrollOpList; }; diff --git a/src/plugins/platforms/blackberry/qbbwindow.cpp b/src/plugins/platforms/blackberry/qbbwindow.cpp index 650601d..284aabf 100644 --- a/src/plugins/platforms/blackberry/qbbwindow.cpp +++ b/src/plugins/platforms/blackberry/qbbwindow.cpp @@ -336,6 +336,24 @@ QBBBuffer &QBBWindow::renderBuffer() qDebug() << "QBBWindow::renderBuffer - w=" << widget(); #endif + return buffer(BACK_BUFFER); +} + +QBBBuffer &QBBWindow::frontBuffer() +{ +#if defined(QBBWINDOW_DEBUG) + qDebug() << "QBBWindow::frontBuffer - w=" << widget(); +#endif + + return buffer(FRONT_BUFFER); +} + +QBBBuffer &QBBWindow::buffer(QBBWindow::Buffer bufferIndex) +{ +#if defined(QBBWINDOW_DEBUG) + qDebug() << "QBBWindow::buffer - w=" << widget(); +#endif + // check if render buffer is invalid if (mCurrentBufferIndex == -1) { // check if there are any buffers available @@ -368,6 +386,20 @@ QBBBuffer &QBBWindow::renderBuffer() mPreviousBufferIndex = -1; } + if (bufferIndex == BACK_BUFFER) { + return mBuffers[mCurrentBufferIndex]; + } else if (bufferIndex == FRONT_BUFFER) { + int buf = mCurrentBufferIndex - 1; + + if (buf < 0) + buf = MAX_BUFFER_COUNT - 1; + + return mBuffers[buf]; + } + + qFatal("QBBWindow::buffer() - invalid buffer index. Aborting"); + + // never happens return mBuffers[mCurrentBufferIndex]; } diff --git a/src/plugins/platforms/blackberry/qbbwindow.h b/src/plugins/platforms/blackberry/qbbwindow.h index cdd3e67..8d5f58f 100644 --- a/src/plugins/platforms/blackberry/qbbwindow.h +++ b/src/plugins/platforms/blackberry/qbbwindow.h @@ -52,9 +52,6 @@ QT_BEGIN_NAMESPACE -// all surfaces double buffered -#define MAX_BUFFER_COUNT 2 - class QPlatformWindowFormat; class QBBGLContext; class QBBScreen; @@ -77,6 +74,8 @@ public: bool hasBuffers() const { return !mBufferSize.isEmpty(); } QBBBuffer &renderBuffer(); + QBBBuffer &frontBuffer(); + void scroll(const QRegion ®ion, int dx, int dy, bool flush=false); void post(const QRegion &dirty); @@ -97,6 +96,15 @@ public: QBBWindow *findWindow(screen_window_t windowHandle); private: + + enum Buffer { + BACK_BUFFER, + FRONT_BUFFER, + MAX_BUFFER_COUNT + }; + + QBBBuffer &buffer(QBBWindow::Buffer bufferIndex); + screen_context_t mContext; screen_window_t mWindow; QSize mBufferSize; -- cgit v0.12