From f0922c9bafce6a565af020851012dd3cbb609888 Mon Sep 17 00:00:00 2001 From: Girish Ramakrishnan Date: Fri, 6 Jul 2012 05:40:57 +0530 Subject: linuxfb: Rework screen code Move the screen code from integration. The design philosophy is that QFbScreen takes care of generic framebuffer composition. QLinuxFbScreen is just an linux framebuffer adaptation layer. Change-Id: I8456c13826f06621037dd77fe0d0bd8873806c96 Reviewed-by: Thomas Senyk Reviewed-by: Girish Ramakrishnan --- src/platformsupport/fbconvenience/qfbscreen.cpp | 69 ++++++++----------------- src/platformsupport/fbconvenience/qfbscreen_p.h | 33 +++++------- 2 files changed, 35 insertions(+), 67 deletions(-) (limited to 'src/platformsupport') diff --git a/src/platformsupport/fbconvenience/qfbscreen.cpp b/src/platformsupport/fbconvenience/qfbscreen.cpp index cd45e5ce08..5d2208a3a1 100644 --- a/src/platformsupport/fbconvenience/qfbscreen.cpp +++ b/src/platformsupport/fbconvenience/qfbscreen.cpp @@ -48,9 +48,20 @@ QT_BEGIN_NAMESPACE -QFbScreen::QFbScreen() : cursor(0), mGeometry(), mDepth(16), mFormat(QImage::Format_RGB16), mScreenImage(0), compositePainter(0), isUpToDate(false) +QFbScreen::QFbScreen() : mCursor(0), mGeometry(), mDepth(16), mFormat(QImage::Format_RGB16), mScreenImage(0), mCompositePainter(0), isUpToDate(false) +{ +} + +QFbScreen::~QFbScreen() +{ + delete mCompositePainter; + delete mScreenImage; +} + +void QFbScreen::initializeCompositor() { mScreenImage = new QImage(mGeometry.size(), mFormat); + redrawTimer.setSingleShot(true); redrawTimer.setInterval(0); connect(&redrawTimer, SIGNAL(timeout()), this, SLOT(doRedraw())); @@ -93,42 +104,6 @@ QWindow *QFbScreen::topLevelAt(const QPoint & p) const return 0; } - -void QFbScreen::setGeometry(QRect rect) -{ - delete mScreenImage; - mGeometry = rect; - mScreenImage = new QImage(mGeometry.size(), mFormat); - delete compositePainter; - compositePainter = 0; - invalidateRectCache(); -} - -void QFbScreen::setDepth(int depth) -{ - mDepth = depth; -} - -void QFbScreen::setPhysicalSize(QSize size) -{ - mPhysicalSize = size; -} - -void QFbScreen::setFormat(QImage::Format format) -{ - mFormat = format; - delete mScreenImage; - mScreenImage = new QImage(mGeometry.size(), mFormat); - delete compositePainter; - compositePainter = 0; -} - -QFbScreen::~QFbScreen() -{ - delete compositePainter; - delete mScreenImage; -} - void QFbScreen::setDirty(const QRect &rect) { QRect intersection = rect.intersected(mGeometry); @@ -171,18 +146,16 @@ void QFbScreen::generateRects() return; } - - QRegion QFbScreen::doRedraw() { QPoint screenOffset = mGeometry.topLeft(); QRegion touchedRegion; - if (cursor && cursor->isDirty() && cursor->isOnScreen()) { - QRect lastCursor = cursor->dirtyRect(); + if (mCursor && mCursor->isDirty() && mCursor->isOnScreen()) { + QRect lastCursor = mCursor->dirtyRect(); repaintRegion += lastCursor; } - if (repaintRegion.isEmpty() && (!cursor || !cursor->isDirty())) { + if (repaintRegion.isEmpty() && (!mCursor || !mCursor->isDirty())) { return touchedRegion; } @@ -191,8 +164,8 @@ QRegion QFbScreen::doRedraw() if (!isUpToDate) generateRects(); - if (!compositePainter) - compositePainter = new QPainter(mScreenImage); + if (!mCompositePainter) + mCompositePainter = new QPainter(mScreenImage); for (int rectIndex = 0; rectIndex < repaintRegion.rectCount(); rectIndex++) { QRegion rectRegion = rects[rectIndex]; @@ -210,7 +183,7 @@ QRegion QFbScreen::doRedraw() foreach (QRect rect, intersect.rects()) { bool firstLayer = true; if (layer == -1) { - compositePainter->fillRect(rect, Qt::black); + mCompositePainter->fillRect(rect, Qt::black); firstLayer = false; layer = windowStack.size() - 1; } @@ -223,7 +196,7 @@ QRegion QFbScreen::doRedraw() QRect windowRect = windowStack[layerIndex]->geometry().translated(-screenOffset); QRect windowIntersect = rect.translated(-windowRect.left(), -windowRect.top()); - compositePainter->drawImage(rect, windowStack[layerIndex]->backingStore()->image(), + mCompositePainter->drawImage(rect, windowStack[layerIndex]->backingStore()->image(), windowIntersect); if (firstLayer) { firstLayer = false; @@ -234,8 +207,8 @@ QRegion QFbScreen::doRedraw() } QRect cursorRect; - if (cursor && (cursor->isDirty() || repaintRegion.intersects(cursor->lastPainted()))) { - cursorRect = cursor->drawCursor(*compositePainter); + if (mCursor && (mCursor->isDirty() || repaintRegion.intersects(mCursor->lastPainted()))) { + cursorRect = mCursor->drawCursor(*mCompositePainter); touchedRegion += cursorRect; } touchedRegion += repaintRegion; diff --git a/src/platformsupport/fbconvenience/qfbscreen_p.h b/src/platformsupport/fbconvenience/qfbscreen_p.h index 71d8d455f6..b37d3ad907 100644 --- a/src/platformsupport/fbconvenience/qfbscreen_p.h +++ b/src/platformsupport/fbconvenience/qfbscreen_p.h @@ -64,32 +64,26 @@ public: virtual QImage::Format format() const { return mFormat; } virtual QSizeF physicalSize() const { return mPhysicalSize; } - virtual void setGeometry(QRect rect); - virtual void setDepth(int depth); - virtual void setFormat(QImage::Format format); - virtual void setPhysicalSize(QSize size); + virtual QWindow *topLevelAt(const QPoint & p) const; + // compositor api + virtual void addWindow(QFbWindow *window); + virtual void removeWindow(QFbWindow *window); + virtual void raise(QPlatformWindow *window); + virtual void lower(QPlatformWindow *window); virtual void setDirty(const QRect &rect); - virtual void removeWindow(QFbWindow * surface); - virtual void addWindow(QFbWindow * surface); - virtual void raise(QPlatformWindow * surface); - virtual void lower(QPlatformWindow * surface); - virtual QWindow *topLevelAt(const QPoint & p) const; - - QImage * image() const { return mScreenImage; } - QPaintDevice * paintDevice() const { return mScreenImage; } +protected slots: + virtual QRegion doRedraw(); protected: + void initializeCompositor(); + QList windowStack; QRegion repaintRegion; - QFbCursor * cursor; QTimer redrawTimer; -protected slots: - virtual QRegion doRedraw(); - -protected: + QFbCursor *mCursor; QRect mGeometry; int mDepth; QImage::Format mFormat; @@ -97,11 +91,12 @@ protected: QImage *mScreenImage; private: - QPainter *compositePainter; + void invalidateRectCache() { isUpToDate = false; } void generateRects(); + + QPainter *mCompositePainter; QList > cachedRects; - void invalidateRectCache() { isUpToDate = false; } friend class QFbWindow; bool isUpToDate; }; -- cgit v1.2.3