qfbscreen.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/platformsupport/fbconvenience/qfbscreen.cpp
Source codeSwitch to Preprocessed file
LineSourceCount
1/****************************************************************************-
2**-
3** Copyright (C) 2015 The Qt Company Ltd.-
4** Contact: http://www.qt.io/licensing/-
5**-
6** This file is part of the plugins of the Qt Toolkit.-
7**-
8** $QT_BEGIN_LICENSE:LGPL21$-
9** Commercial License Usage-
10** Licensees holding valid commercial Qt licenses may use this file in-
11** accordance with the commercial license agreement provided with the-
12** Software or, alternatively, in accordance with the terms contained in-
13** a written agreement between you and The Qt Company. For licensing terms-
14** and conditions see http://www.qt.io/terms-conditions. For further-
15** information use the contact form at http://www.qt.io/contact-us.-
16**-
17** GNU Lesser General Public License Usage-
18** Alternatively, this file may be used under the terms of the GNU Lesser-
19** General Public License version 2.1 or version 3 as published by the Free-
20** Software Foundation and appearing in the file LICENSE.LGPLv21 and-
21** LICENSE.LGPLv3 included in the packaging of this file. Please review the-
22** following information to ensure the GNU Lesser General Public License-
23** requirements will be met: https://www.gnu.org/licenses/lgpl.html and-
24** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.-
25**-
26** As a special exception, The Qt Company gives you certain additional-
27** rights. These rights are described in The Qt Company LGPL Exception-
28** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.-
29**-
30** $QT_END_LICENSE$-
31**-
32****************************************************************************/-
33-
34#include "qfbscreen_p.h"-
35#include "qfbcursor_p.h"-
36#include "qfbwindow_p.h"-
37#include "qfbbackingstore_p.h"-
38-
39#include <QtGui/QPainter>-
40#include <QtCore/QCoreApplication>-
41#include <qpa/qwindowsysteminterface.h>-
42-
43#include <QtCore/QDebug>-
44#include <QtCore/QElapsedTimer>-
45-
46QT_BEGIN_NAMESPACE-
47-
48QFbScreen::QFbScreen() : mUpdatePending(false), mCursor(0), mGeometry(), mDepth(16), mFormat(QImage::Format_RGB16), mScreenImage(0), mCompositePainter(0), mIsUpToDate(false)-
49{-
50}
never executed: end of block
0
51-
52QFbScreen::~QFbScreen()-
53{-
54 delete mCompositePainter;-
55 delete mScreenImage;-
56}
never executed: end of block
0
57-
58void QFbScreen::initializeCompositor()-
59{-
60 mScreenImage = new QImage(mGeometry.size(), mFormat);-
61 scheduleUpdate();-
62}
never executed: end of block
0
63-
64bool QFbScreen::event(QEvent *event)-
65{-
66 if (event->type() == QEvent::UpdateRequest) {
event->type() ...:UpdateRequestDescription
TRUEnever evaluated
FALSEnever evaluated
0
67 doRedraw();-
68 mUpdatePending = false;-
69 return true;
never executed: return true;
0
70 }-
71 return QObject::event(event);
never executed: return QObject::event(event);
0
72}-
73-
74void QFbScreen::addWindow(QFbWindow *window)-
75{-
76 mWindowStack.prepend(window);-
77 if (!mPendingBackingStores.isEmpty()) {
!mPendingBacki...ores.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
78 //check if we have a backing store for this window-
79 for (int i = 0; i < mPendingBackingStores.size(); ++i) {
i < mPendingBa...gStores.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
80 QFbBackingStore *bs = mPendingBackingStores.at(i);-
81 // this gets called during QWindow::create() at a point where the-
82 // invariant (window->handle()->window() == window) is broken-
83 if (bs->window() == window->window()) {
bs->window() =...ndow->window()Description
TRUEnever evaluated
FALSEnever evaluated
0
84 window->setBackingStore(bs);-
85 mPendingBackingStores.removeAt(i);-
86 break;
never executed: break;
0
87 }-
88 }
never executed: end of block
0
89 }
never executed: end of block
0
90 invalidateRectCache();-
91 setDirty(window->geometry());-
92 QWindow *w = topWindow();-
93 QWindowSystemInterface::handleWindowActivated(w);-
94 topWindowChanged(w);-
95}
never executed: end of block
0
96-
97void QFbScreen::removeWindow(QFbWindow *window)-
98{-
99 mWindowStack.removeOne(window);-
100 invalidateRectCache();-
101 setDirty(window->geometry());-
102 QWindow *w = topWindow();-
103 QWindowSystemInterface::handleWindowActivated(w);-
104 topWindowChanged(w);-
105}
never executed: end of block
0
106-
107void QFbScreen::raise(QFbWindow *window)-
108{-
109 int index = mWindowStack.indexOf(window);-
110 if (index <= 0)
index <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
111 return;
never executed: return;
0
112 mWindowStack.move(index, 0);-
113 invalidateRectCache();-
114 setDirty(window->geometry());-
115 QWindow *w = topWindow();-
116 QWindowSystemInterface::handleWindowActivated(w);-
117 topWindowChanged(w);-
118}
never executed: end of block
0
119-
120void QFbScreen::lower(QFbWindow *window)-
121{-
122 int index = mWindowStack.indexOf(window);-
123 if (index == -1 || index == (mWindowStack.size() - 1))
index == -1Description
TRUEnever evaluated
FALSEnever evaluated
index == (mWin...ck.size() - 1)Description
TRUEnever evaluated
FALSEnever evaluated
0
124 return;
never executed: return;
0
125 mWindowStack.move(index, mWindowStack.size() - 1);-
126 invalidateRectCache();-
127 setDirty(window->geometry());-
128 QWindow *w = topWindow();-
129 QWindowSystemInterface::handleWindowActivated(w);-
130 topWindowChanged(w);-
131}
never executed: end of block
0
132-
133QWindow *QFbScreen::topWindow() const-
134{-
135 foreach (QFbWindow *fbw, mWindowStack)-
136 if (fbw->window()->type() == Qt::Window || fbw->window()->type() == Qt::Dialog)
fbw->window()-... == Qt::WindowDescription
TRUEnever evaluated
FALSEnever evaluated
fbw->window()-... == Qt::DialogDescription
TRUEnever evaluated
FALSEnever evaluated
0
137 return fbw->window();
never executed: return fbw->window();
0
138 return 0;
never executed: return 0;
0
139}-
140-
141QWindow *QFbScreen::topLevelAt(const QPoint & p) const-
142{-
143 foreach (QFbWindow *fbw, mWindowStack) {-
144 if (fbw->geometry().contains(p, false) && fbw->window()->isVisible())
fbw->geometry(...ains(p, false)Description
TRUEnever evaluated
FALSEnever evaluated
fbw->window()->isVisible()Description
TRUEnever evaluated
FALSEnever evaluated
0
145 return fbw->window();
never executed: return fbw->window();
0
146 }
never executed: end of block
0
147 return 0;
never executed: return 0;
0
148}-
149-
150void QFbScreen::setDirty(const QRect &rect)-
151{-
152 QRect intersection = rect.intersected(mGeometry);-
153 QPoint screenOffset = mGeometry.topLeft();-
154 mRepaintRegion += intersection.translated(-screenOffset); // global to local translation-
155 scheduleUpdate();-
156}
never executed: end of block
0
157-
158void QFbScreen::scheduleUpdate()-
159{-
160 if (!mUpdatePending) {
!mUpdatePendingDescription
TRUEnever evaluated
FALSEnever evaluated
0
161 mUpdatePending = true;-
162 QCoreApplication::postEvent(this, new QEvent(QEvent::UpdateRequest));-
163 }
never executed: end of block
0
164}
never executed: end of block
0
165-
166void QFbScreen::setPhysicalSize(const QSize &size)-
167{-
168 mPhysicalSize = size;-
169}
never executed: end of block
0
170-
171void QFbScreen::setGeometry(const QRect &rect)-
172{-
173 delete mCompositePainter;-
174 mCompositePainter = 0;-
175 delete mScreenImage;-
176 mGeometry = rect;-
177 mScreenImage = new QImage(mGeometry.size(), mFormat);-
178 invalidateRectCache();-
179 QWindowSystemInterface::handleScreenGeometryChange(QPlatformScreen::screen(), geometry(), availableGeometry());-
180 resizeMaximizedWindows();-
181}
never executed: end of block
0
182-
183void QFbScreen::generateRects()-
184{-
185 mCachedRects.clear();-
186 QPoint screenOffset = mGeometry.topLeft();-
187 QRegion remainingScreen(mGeometry.translated(-screenOffset)); // global to local translation-
188-
189 for (int i = 0; i < mWindowStack.length(); i++) {
i < mWindowStack.length()Description
TRUEnever evaluated
FALSEnever evaluated
0
190 if (remainingScreen.isEmpty())
remainingScreen.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
191 break;
never executed: break;
0
192#if 0-
193 if (!mWindowStack[i]->isVisible())-
194 continue;-
195 if (mWindowStack[i]->isMinimized())-
196 continue;-
197-
198 if (!mWindowStack[i]->testAttribute(Qt::WA_TranslucentBackground)) {-
199 QRect localGeometry = mWindowStack.at(i)->geometry().translated(-screenOffset); // global to local translation-
200 remainingScreen -= localGeometry;-
201 QRegion windowRegion(localGeometry);-
202 windowRegion -= remainingScreen;-
203 foreach (const QRect &rect, windowRegion.rects()) {-
204 mCachedRects += QPair<QRect, int>(rect, i);-
205 }-
206 }-
207#endif-
208 }
never executed: end of block
0
209 const QVector<QRect> remainingScreenRects = remainingScreen.rects();-
210 mCachedRects.reserve(mCachedRects.count() + remainingScreenRects.count());-
211 foreach (const QRect &rect, remainingScreenRects)-
212 mCachedRects += QPair<QRect, int>(rect, -1);
never executed: mCachedRects += QPair<QRect, int>(rect, -1);
0
213 mIsUpToDate = true;-
214}
never executed: end of block
0
215-
216QRegion QFbScreen::doRedraw()-
217{-
218 QPoint screenOffset = mGeometry.topLeft();-
219-
220 QRegion touchedRegion;-
221 if (mCursor && mCursor->isDirty() && mCursor->isOnScreen()) {
mCursorDescription
TRUEnever evaluated
FALSEnever evaluated
mCursor->isDirty()Description
TRUEnever evaluated
FALSEnever evaluated
mCursor->isOnScreen()Description
TRUEnever evaluated
FALSEnever evaluated
0
222 QRect lastCursor = mCursor->dirtyRect();-
223 mRepaintRegion += lastCursor;-
224 }
never executed: end of block
0
225 if (mRepaintRegion.isEmpty() && (!mCursor || !mCursor->isDirty())) {
mRepaintRegion.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
!mCursorDescription
TRUEnever evaluated
FALSEnever evaluated
!mCursor->isDirty()Description
TRUEnever evaluated
FALSEnever evaluated
0
226 return touchedRegion;
never executed: return touchedRegion;
0
227 }-
228-
229 QVector<QRect> rects = mRepaintRegion.rects();-
230-
231 if (!mIsUpToDate)
!mIsUpToDateDescription
TRUEnever evaluated
FALSEnever evaluated
0
232 generateRects();
never executed: generateRects();
0
233-
234 if (!mCompositePainter)
!mCompositePainterDescription
TRUEnever evaluated
FALSEnever evaluated
0
235 mCompositePainter = new QPainter(mScreenImage);
never executed: mCompositePainter = new QPainter(mScreenImage);
0
236-
237 for (int rectIndex = 0; rectIndex < mRepaintRegion.rectCount(); rectIndex++) {
rectIndex < mR...on.rectCount()Description
TRUEnever evaluated
FALSEnever evaluated
0
238 QRegion rectRegion = rects[rectIndex];-
239-
240 for (int i = 0; i < mCachedRects.length(); i++) {
i < mCachedRects.length()Description
TRUEnever evaluated
FALSEnever evaluated
0
241 QRect screenSubRect = mCachedRects[i].first;-
242 int layer = mCachedRects[i].second;-
243 QRegion intersect = rectRegion.intersected(screenSubRect);-
244-
245 if (intersect.isEmpty())
intersect.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
246 continue;
never executed: continue;
0
247-
248 rectRegion -= intersect;-
249-
250 // we only expect one rectangle, but defensive coding...-
251 foreach (const QRect &rect, intersect.rects()) {-
252 bool firstLayer = true;-
253 if (layer == -1) {
layer == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
254 mCompositePainter->setCompositionMode(QPainter::CompositionMode_Source);-
255 mCompositePainter->fillRect(rect, mScreenImage->hasAlphaChannel() ? Qt::transparent : Qt::black);-
256 firstLayer = false;-
257 layer = mWindowStack.size() - 1;-
258 }
never executed: end of block
0
259-
260 for (int layerIndex = layer; layerIndex != -1; layerIndex--) {
layerIndex != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
261 if (!mWindowStack[layerIndex]->window()->isVisible())
!mWindowStack[...)->isVisible()Description
TRUEnever evaluated
FALSEnever evaluated
0
262 continue;
never executed: continue;
0
263 // if (mWindowStack[layerIndex]->isMinimized())-
264 // continue;-
265-
266 QRect windowRect = mWindowStack[layerIndex]->geometry().translated(-screenOffset);-
267 QRect windowIntersect = rect.translated(-windowRect.left(),-
268 -windowRect.top());-
269-
270-
271 QFbBackingStore *backingStore = mWindowStack[layerIndex]->backingStore();-
272-
273 if (backingStore) {
backingStoreDescription
TRUEnever evaluated
FALSEnever evaluated
0
274 backingStore->lock();-
275 mCompositePainter->drawImage(rect, backingStore->image(), windowIntersect);-
276 backingStore->unlock();-
277 }
never executed: end of block
0
278 if (firstLayer) {
firstLayerDescription
TRUEnever evaluated
FALSEnever evaluated
0
279 firstLayer = false;-
280 }
never executed: end of block
0
281 }
never executed: end of block
0
282 }
never executed: end of block
0
283 }
never executed: end of block
0
284 }
never executed: end of block
0
285-
286 QRect cursorRect;-
287 if (mCursor && (mCursor->isDirty() || mRepaintRegion.intersects(mCursor->lastPainted()))) {
mCursorDescription
TRUEnever evaluated
FALSEnever evaluated
mCursor->isDirty()Description
TRUEnever evaluated
FALSEnever evaluated
mRepaintRegion...lastPainted())Description
TRUEnever evaluated
FALSEnever evaluated
0
288 mCompositePainter->setCompositionMode(QPainter::CompositionMode_SourceOver);-
289 cursorRect = mCursor->drawCursor(*mCompositePainter);-
290 touchedRegion += cursorRect;-
291 }
never executed: end of block
0
292 touchedRegion += mRepaintRegion;-
293 mRepaintRegion = QRegion();-
294-
295-
296-
297// qDebug() << "QFbScreen::doRedraw" << mWindowStack.size() << mScreenImage->size() << touchedRegion;-
298-
299 return touchedRegion;
never executed: return touchedRegion;
0
300}-
301-
302QFbWindow *QFbScreen::windowForId(WId wid) const-
303{-
304 for (int i = 0; i < mWindowStack.count(); ++i)
i < mWindowStack.count()Description
TRUEnever evaluated
FALSEnever evaluated
0
305 if (mWindowStack[i]->winId() == wid)
mWindowStack[i...winId() == widDescription
TRUEnever evaluated
FALSEnever evaluated
0
306 return mWindowStack[i];
never executed: return mWindowStack[i];
0
307-
308 return 0;
never executed: return 0;
0
309}-
310-
311QT_END_NAMESPACE-
312-
Source codeSwitch to Preprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9