diff options
author | Girish Ramakrishnan <girish.1.ramakrishnan@nokia.com> | 2012-07-06 05:40:57 +0530 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-07-11 12:44:05 +0200 |
commit | f0922c9bafce6a565af020851012dd3cbb609888 (patch) | |
tree | 73db8e1a9632118dbd8140998550a9b7655b6f6b /src/platformsupport/fbconvenience | |
parent | 0be40737081110238f326e3644287b3dca18a824 (diff) |
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 <thomas.senyk@nokia.com>
Reviewed-by: Girish Ramakrishnan <girish.1.ramakrishnan@nokia.com>
Diffstat (limited to 'src/platformsupport/fbconvenience')
-rw-r--r-- | src/platformsupport/fbconvenience/qfbscreen.cpp | 69 | ||||
-rw-r--r-- | src/platformsupport/fbconvenience/qfbscreen_p.h | 33 |
2 files changed, 35 insertions, 67 deletions
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<QFbWindow *> 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<QPair<QRect, int> > cachedRects; - void invalidateRectCache() { isUpToDate = false; } friend class QFbWindow; bool isUpToDate; }; |