summaryrefslogtreecommitdiffstats
path: root/src/platformsupport/fbconvenience
diff options
context:
space:
mode:
authorGirish Ramakrishnan <girish.1.ramakrishnan@nokia.com>2012-07-06 05:40:57 +0530
committerQt by Nokia <qt-info@nokia.com>2012-07-11 12:44:05 +0200
commitf0922c9bafce6a565af020851012dd3cbb609888 (patch)
tree73db8e1a9632118dbd8140998550a9b7655b6f6b /src/platformsupport/fbconvenience
parent0be40737081110238f326e3644287b3dca18a824 (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.cpp69
-rw-r--r--src/platformsupport/fbconvenience/qfbscreen_p.h33
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;
};