qwidgetbackingstore.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/widgets/kernel/qwidgetbackingstore.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 QtWidgets module 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-
35#include "qplatformdefs.h"-
36-
37#include "qwidgetbackingstore_p.h"-
38-
39#include <QtCore/qglobal.h>-
40#include <QtCore/qdebug.h>-
41#include <QtCore/qvarlengtharray.h>-
42#include <QtGui/qevent.h>-
43#include <QtWidgets/qapplication.h>-
44#include <QtGui/qpaintengine.h>-
45#include <QtWidgets/qgraphicsproxywidget.h>-
46-
47#include <private/qwidget_p.h>-
48#include <private/qapplication_p.h>-
49#include <private/qpaintengine_raster_p.h>-
50#include <private/qgraphicseffect_p.h>-
51#include <QtGui/private/qwindow_p.h>-
52-
53#include <qpa/qplatformbackingstore.h>-
54-
55#if defined(Q_OS_WIN) && !defined(QT_NO_PAINT_DEBUG)-
56# include <QtCore/qt_windows.h>-
57# include <qpa/qplatformnativeinterface.h>-
58#endif-
59-
60QT_BEGIN_NAMESPACE-
61-
62extern QRegion qt_dirtyRegion(QWidget *);-
63-
64#ifndef QT_NO_OPENGL-
65Q_GLOBAL_STATIC(QPlatformTextureList, qt_dummy_platformTextureList)
never executed: end of block
never executed: guard.store(QtGlobalStatic::Destroyed);
never executed: return &holder.value;
guard.load() =...c::InitializedDescription
TRUEnever evaluated
FALSEnever evaluated
0
66#endif-
67-
68/**-
69 * Flushes the contents of the \a backingStore into the screen area of \a widget.-
70 * \a tlwOffset is the position of the top level widget relative to the window surface.-
71 * \a region is the region to be updated in \a widget coordinates.-
72 */-
73void QWidgetBackingStore::qt_flush(QWidget *widget, const QRegion &region, QBackingStore *backingStore,-
74 QWidget *tlw, const QPoint &tlwOffset, QPlatformTextureList *widgetTextures,-
75 QWidgetBackingStore *widgetBackingStore)-
76{-
77#ifdef QT_NO_OPENGL-
78 Q_UNUSED(widgetTextures);-
79 Q_ASSERT(!region.isEmpty());-
80#else-
81 Q_ASSERT(!region.isEmpty() || widgetTextures);-
82#endif-
83 Q_ASSERT(widget);-
84 Q_ASSERT(backingStore);-
85 Q_ASSERT(tlw);-
86#if !defined(QT_NO_PAINT_DEBUG)-
87 static int flushUpdate = qEnvironmentVariableIntValue("QT_FLUSH_UPDATE");-
88 if (flushUpdate > 0)
flushUpdate > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
89 QWidgetBackingStore::showYellowThing(widget, region, flushUpdate * 10, false);
never executed: QWidgetBackingStore::showYellowThing(widget, region, flushUpdate * 10, false);
0
90#endif-
91-
92 if (tlw->testAttribute(Qt::WA_DontShowOnScreen) || widget->testAttribute(Qt::WA_DontShowOnScreen))
tlw->testAttri...tShowOnScreen)Description
TRUEnever evaluated
FALSEnever evaluated
widget->testAt...tShowOnScreen)Description
TRUEnever evaluated
FALSEnever evaluated
0
93 return;
never executed: return;
0
94 static bool fpsDebug = qEnvironmentVariableIntValue("QT_DEBUG_FPS");-
95 if (fpsDebug) {
fpsDebugDescription
TRUEnever evaluated
FALSEnever evaluated
0
96 if (!widgetBackingStore->perfFrames++)
!widgetBacking...->perfFrames++Description
TRUEnever evaluated
FALSEnever evaluated
0
97 widgetBackingStore->perfTime.start();
never executed: widgetBackingStore->perfTime.start();
0
98 if (widgetBackingStore->perfTime.elapsed() > 5000) {
widgetBackingS...apsed() > 5000Description
TRUEnever evaluated
FALSEnever evaluated
0
99 double fps = double(widgetBackingStore->perfFrames * 1000) / widgetBackingStore->perfTime.restart();-
100 qDebug("FPS: %.1f\n", fps);-
101 widgetBackingStore->perfFrames = 0;-
102 }
never executed: end of block
0
103 }
never executed: end of block
0
104-
105 QPoint offset = tlwOffset;-
106 if (widget != tlw)
widget != tlwDescription
TRUEnever evaluated
FALSEnever evaluated
0
107 offset += widget->mapTo(tlw, QPoint());
never executed: offset += widget->mapTo(tlw, QPoint());
0
108-
109 QRegion effectiveRegion = region;-
110#ifndef QT_NO_OPENGL-
111 const bool compositionWasActive = widget->d_func()->renderToTextureComposeActive;-
112 if (!widgetTextures) {
!widgetTexturesDescription
TRUEnever evaluated
FALSEnever evaluated
0
113 widget->d_func()->renderToTextureComposeActive = false;-
114 // Detect the case of falling back to the normal flush path when no-
115 // render-to-texture widgets are visible anymore. We will force one-
116 // last flush to go through the OpenGL-based composition to prevent-
117 // artifacts. The next flush after this one will use the normal path.-
118 if (compositionWasActive)
compositionWasActiveDescription
TRUEnever evaluated
FALSEnever evaluated
0
119 widgetTextures = qt_dummy_platformTextureList;
never executed: widgetTextures = qt_dummy_platformTextureList;
0
120 } else {
never executed: end of block
0
121 widget->d_func()->renderToTextureComposeActive = true;-
122 }
never executed: end of block
0
123 // When changing the composition status, make sure the dirty region covers-
124 // the entire widget. Just having e.g. the shown/hidden render-to-texture-
125 // widget's area marked as dirty is incorrect when changing flush paths.-
126 if (compositionWasActive != widget->d_func()->renderToTextureComposeActive)
compositionWas...eComposeActiveDescription
TRUEnever evaluated
FALSEnever evaluated
0
127 effectiveRegion = widget->rect();
never executed: effectiveRegion = widget->rect();
0
128-
129 // re-test since we may have been forced to this path via the dummy texture list above-
130 if (widgetTextures) {
widgetTexturesDescription
TRUEnever evaluated
FALSEnever evaluated
0
131 qt_window_private(tlw->windowHandle())->compositing = true;-
132 widget->window()->d_func()->sendComposeStatus(widget->window(), false);-
133 // A window may have alpha even when the app did not request-
134 // WA_TranslucentBackground. Therefore the compositor needs to know whether the app intends-
135 // to rely on translucency, in order to decide if it should clear to transparent or opaque.-
136 const bool translucentBackground = widget->testAttribute(Qt::WA_TranslucentBackground);-
137 // Use the tlw's context, not widget's. The difference is important with native child-
138 // widgets where tlw != widget.-
139 backingStore->handle()->composeAndFlush(widget->windowHandle(), effectiveRegion, offset, widgetTextures,-
140 tlw->d_func()->shareContext(), translucentBackground);-
141 widget->window()->d_func()->sendComposeStatus(widget->window(), true);-
142 } else
never executed: end of block
0
143#endif-
144 backingStore->flush(effectiveRegion, widget->windowHandle(), offset);
never executed: backingStore->flush(effectiveRegion, widget->windowHandle(), offset);
0
145}-
146-
147#ifndef QT_NO_PAINT_DEBUG-
148#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)-
149-
150static void showYellowThing_win(QWidget *widget, const QRegion &region, int msec)-
151{-
152 // We expect to be passed a native parent.-
153 QWindow *nativeWindow = widget->windowHandle();-
154 if (!nativeWindow)-
155 return;-
156 void *hdcV = QGuiApplication::platformNativeInterface()->nativeResourceForWindow(QByteArrayLiteral("getDC"), nativeWindow);-
157 if (!hdcV)-
158 return;-
159 const HDC hdc = reinterpret_cast<HDC>(hdcV);-
160-
161 HBRUSH brush;-
162 static int i = 0;-
163 switch (i) {-
164 case 0:-
165 brush = CreateSolidBrush(RGB(255, 255, 0));-
166 break;-
167 case 1:-
168 brush = CreateSolidBrush(RGB(255, 200, 55));-
169 break;-
170 case 2:-
171 brush = CreateSolidBrush(RGB(200, 255, 55));-
172 break;-
173 case 3:-
174 brush = CreateSolidBrush(RGB(200, 200, 0));-
175 break;-
176 }-
177 i = (i + 1) & 3;-
178-
179 foreach (const QRect &rect, region.rects()) {-
180 RECT winRect;-
181 SetRect(&winRect, rect.left(), rect.top(), rect.right(), rect.bottom());-
182 FillRect(hdc, &winRect, brush);-
183 }-
184 DeleteObject(brush);-
185 QGuiApplication::platformNativeInterface()->nativeResourceForWindow(QByteArrayLiteral("releaseDC"), nativeWindow);-
186 ::Sleep(msec);-
187}-
188#endif // defined(Q_OS_WIN) && !defined(Q_OS_WINRT)-
189-
190void QWidgetBackingStore::showYellowThing(QWidget *widget, const QRegion &toBePainted, int msec, bool unclipped)-
191{-
192#ifdef Q_OS_WINRT-
193 Q_UNUSED(msec)-
194#endif-
195 QRegion paintRegion = toBePainted;-
196 QRect widgetRect = widget->rect();-
197-
198 if (!widget->internalWinId()) {
!widget->internalWinId()Description
TRUEnever evaluated
FALSEnever evaluated
0
199 QWidget *nativeParent = widget->nativeParentWidget();-
200 const QPoint offset = widget->mapTo(nativeParent, QPoint(0, 0));-
201 paintRegion.translate(offset);-
202 widgetRect.translate(offset);-
203 widget = nativeParent;-
204 }
never executed: end of block
0
205-
206#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)-
207 Q_UNUSED(unclipped);-
208 showYellowThing_win(widget, paintRegion, msec);-
209#else-
210 //flags to fool painter-
211 bool paintUnclipped = widget->testAttribute(Qt::WA_PaintUnclipped);-
212 if (unclipped && !widget->d_func()->paintOnScreen())
unclippedDescription
TRUEnever evaluated
FALSEnever evaluated
!widget->d_fun...aintOnScreen()Description
TRUEnever evaluated
FALSEnever evaluated
0
213 widget->setAttribute(Qt::WA_PaintUnclipped);
never executed: widget->setAttribute(Qt::WA_PaintUnclipped);
0
214-
215 const bool setFlag = !widget->testAttribute(Qt::WA_WState_InPaintEvent);-
216 if (setFlag)
setFlagDescription
TRUEnever evaluated
FALSEnever evaluated
0
217 widget->setAttribute(Qt::WA_WState_InPaintEvent);
never executed: widget->setAttribute(Qt::WA_WState_InPaintEvent);
0
218-
219 //setup the engine-
220 QPaintEngine *pe = widget->paintEngine();-
221 if (pe) {
peDescription
TRUEnever evaluated
FALSEnever evaluated
0
222 pe->setSystemClip(paintRegion);-
223 {-
224 QPainter p(widget);-
225 p.setClipRegion(paintRegion);-
226 static int i = 0;-
227 switch (i) {-
228 case 0:
never executed: case 0:
0
229 p.fillRect(widgetRect, QColor(255,255,0));-
230 break;
never executed: break;
0
231 case 1:
never executed: case 1:
0
232 p.fillRect(widgetRect, QColor(255,200,55));-
233 break;
never executed: break;
0
234 case 2:
never executed: case 2:
0
235 p.fillRect(widgetRect, QColor(200,255,55));-
236 break;
never executed: break;
0
237 case 3:
never executed: case 3:
0
238 p.fillRect(widgetRect, QColor(200,200,0));-
239 break;
never executed: break;
0
240 }-
241 i = (i+1) & 3;-
242 p.end();-
243 }-
244 }
never executed: end of block
0
245-
246 if (setFlag)
setFlagDescription
TRUEnever evaluated
FALSEnever evaluated
0
247 widget->setAttribute(Qt::WA_WState_InPaintEvent, false);
never executed: widget->setAttribute(Qt::WA_WState_InPaintEvent, false);
0
248-
249 //restore-
250 widget->setAttribute(Qt::WA_PaintUnclipped, paintUnclipped);-
251-
252 if (pe)
peDescription
TRUEnever evaluated
FALSEnever evaluated
0
253 pe->setSystemClip(QRegion());
never executed: pe->setSystemClip(QRegion());
0
254-
255#if defined(Q_OS_UNIX)-
256 ::usleep(1000 * msec);-
257#endif-
258#endif // !Q_OS_WIN-
259}
never executed: end of block
0
260-
261bool QWidgetBackingStore::flushPaint(QWidget *widget, const QRegion &rgn)-
262{-
263 if (!widget)
!widgetDescription
TRUEnever evaluated
FALSEnever evaluated
0
264 return false;
never executed: return false;
0
265-
266 int delay = 0;-
267 if (widget->testAttribute(Qt::WA_WState_InPaintEvent)) {
widget->testAt..._InPaintEvent)Description
TRUEnever evaluated
FALSEnever evaluated
0
268 static int flushPaintEvent = qEnvironmentVariableIntValue("QT_FLUSH_PAINT_EVENT");-
269 if (!flushPaintEvent)
!flushPaintEventDescription
TRUEnever evaluated
FALSEnever evaluated
0
270 return false;
never executed: return false;
0
271 delay = flushPaintEvent;-
272 } else {
never executed: end of block
0
273 static int flushPaint = qEnvironmentVariableIntValue("QT_FLUSH_PAINT");-
274 if (!flushPaint)
!flushPaintDescription
TRUEnever evaluated
FALSEnever evaluated
0
275 return false;
never executed: return false;
0
276 delay = flushPaint;-
277 }
never executed: end of block
0
278-
279 QWidgetBackingStore::showYellowThing(widget, rgn, delay * 10, true);-
280 return true;
never executed: return true;
0
281}-
282-
283void QWidgetBackingStore::unflushPaint(QWidget *widget, const QRegion &rgn)-
284{-
285 if (widget->d_func()->paintOnScreen() || rgn.isEmpty())
widget->d_func...aintOnScreen()Description
TRUEnever evaluated
FALSEnever evaluated
rgn.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
286 return;
never executed: return;
0
287-
288 QWidget *tlw = widget->window();-
289 QTLWExtra *tlwExtra = tlw->d_func()->maybeTopData();-
290 if (!tlwExtra)
!tlwExtraDescription
TRUEnever evaluated
FALSEnever evaluated
0
291 return;
never executed: return;
0
292-
293 const QPoint offset = widget->mapTo(tlw, QPoint());-
294 qt_flush(widget, rgn, tlwExtra->backingStoreTracker->store, tlw, offset, 0, tlw->d_func()->maybeBackingStore());-
295}
never executed: end of block
0
296#endif // QT_NO_PAINT_DEBUG-
297-
298/*-
299 Moves the whole rect by (dx, dy) in widget's coordinate system.-
300 Doesn't generate any updates.-
301*/-
302bool QWidgetBackingStore::bltRect(const QRect &rect, int dx, int dy, QWidget *widget)-
303{-
304 const QPoint pos(tlwOffset + widget->mapTo(tlw, rect.topLeft()));-
305 const QRect tlwRect(QRect(pos, rect.size()));-
306 if (fullUpdatePending || dirty.intersects(tlwRect))
fullUpdatePendingDescription
TRUEnever evaluated
FALSEnever evaluated
dirty.intersects(tlwRect)Description
TRUEnever evaluated
FALSEnever evaluated
0
307 return false; // We don't want to scroll junk.
never executed: return false;
0
308 return store->scroll(tlwRect, dx, dy);
never executed: return store->scroll(tlwRect, dx, dy);
0
309}-
310-
311void QWidgetBackingStore::releaseBuffer()-
312{-
313 if (store)
storeDescription
TRUEnever evaluated
FALSEnever evaluated
0
314 store->resize(QSize());
never executed: store->resize(QSize());
0
315}
never executed: end of block
0
316-
317/*!-
318 Prepares the window surface to paint a\ toClean region of the \a widget and-
319 updates the BeginPaintInfo struct accordingly.-
320-
321 The \a toClean region might be clipped by the window surface.-
322*/-
323void QWidgetBackingStore::beginPaint(QRegion &toClean, QWidget *widget, QBackingStore *backingStore,-
324 BeginPaintInfo *returnInfo, bool toCleanIsInTopLevelCoordinates)-
325{-
326 Q_UNUSED(widget);-
327 Q_UNUSED(toCleanIsInTopLevelCoordinates);-
328-
329 // Always flush repainted areas.-
330 dirtyOnScreen += toClean;-
331-
332#ifdef QT_NO_PAINT_DEBUG-
333 backingStore->beginPaint(toClean);-
334#else-
335 returnInfo->wasFlushed = QWidgetBackingStore::flushPaint(tlw, toClean);-
336 // Avoid deadlock with QT_FLUSH_PAINT: the server will wait for-
337 // the BackingStore lock, so if we hold that, the server will-
338 // never release the Communication lock that we are waiting for in-
339 // sendSynchronousCommand-
340 if (!returnInfo->wasFlushed)
!returnInfo->wasFlushedDescription
TRUEnever evaluated
FALSEnever evaluated
0
341 backingStore->beginPaint(toClean);
never executed: backingStore->beginPaint(toClean);
0
342#endif-
343-
344 Q_UNUSED(returnInfo);-
345}
never executed: end of block
0
346-
347void QWidgetBackingStore::endPaint(const QRegion &cleaned, QBackingStore *backingStore,-
348 BeginPaintInfo *beginPaintInfo)-
349{-
350#ifndef QT_NO_PAINT_DEBUG-
351 if (!beginPaintInfo->wasFlushed)
!beginPaintInfo->wasFlushedDescription
TRUEnever evaluated
FALSEnever evaluated
0
352 backingStore->endPaint();
never executed: backingStore->endPaint();
0
353 else-
354 QWidgetBackingStore::unflushPaint(tlw, cleaned);
never executed: QWidgetBackingStore::unflushPaint(tlw, cleaned);
0
355#else-
356 Q_UNUSED(beginPaintInfo);-
357 Q_UNUSED(cleaned);-
358 backingStore->endPaint();-
359#endif-
360-
361 flush();-
362}
never executed: end of block
0
363-
364/*!-
365 Returns the region (in top-level coordinates) that needs repaint and/or flush.-
366-
367 If the widget is non-zero, only the dirty region for the widget is returned-
368 and the region will be in widget coordinates.-
369*/-
370QRegion QWidgetBackingStore::dirtyRegion(QWidget *widget) const-
371{-
372 const bool widgetDirty = widget && widget != tlw;
widgetDescription
TRUEnever evaluated
FALSEnever evaluated
widget != tlwDescription
TRUEnever evaluated
FALSEnever evaluated
0
373 const QRect tlwRect(topLevelRect());-
374 const QRect surfaceGeometry(tlwRect.topLeft(), store->size());-
375 if (fullUpdatePending || (surfaceGeometry != tlwRect && surfaceGeometry.size() != tlwRect.size())) {
fullUpdatePendingDescription
TRUEnever evaluated
FALSEnever evaluated
surfaceGeometry != tlwRectDescription
TRUEnever evaluated
FALSEnever evaluated
surfaceGeometr...tlwRect.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
376 if (widgetDirty) {
widgetDirtyDescription
TRUEnever evaluated
FALSEnever evaluated
0
377 const QRect dirtyTlwRect = QRect(QPoint(), tlwRect.size());-
378 const QPoint offset(widget->mapTo(tlw, QPoint()));-
379 const QRect dirtyWidgetRect(dirtyTlwRect & widget->rect().translated(offset));-
380 return dirtyWidgetRect.translated(-offset);
never executed: return dirtyWidgetRect.translated(-offset);
0
381 }-
382 return QRect(QPoint(), tlwRect.size());
never executed: return QRect(QPoint(), tlwRect.size());
0
383 }-
384-
385 // Calculate the region that needs repaint.-
386 QRegion r(dirty);-
387 for (int i = 0; i < dirtyWidgets.size(); ++i) {
i < dirtyWidgets.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
388 QWidget *w = dirtyWidgets.at(i);-
389 if (widgetDirty && w != widget && !widget->isAncestorOf(w))
widgetDirtyDescription
TRUEnever evaluated
FALSEnever evaluated
w != widgetDescription
TRUEnever evaluated
FALSEnever evaluated
!widget->isAncestorOf(w)Description
TRUEnever evaluated
FALSEnever evaluated
0
390 continue;
never executed: continue;
0
391 r += w->d_func()->dirty.translated(w->mapTo(tlw, QPoint()));-
392 }
never executed: end of block
0
393-
394 // Append the region that needs flush.-
395 r += dirtyOnScreen;-
396-
397 if (dirtyOnScreenWidgets) { // Only in use with native child widgets.
dirtyOnScreenWidgetsDescription
TRUEnever evaluated
FALSEnever evaluated
0
398 for (int i = 0; i < dirtyOnScreenWidgets->size(); ++i) {
i < dirtyOnScr...idgets->size()Description
TRUEnever evaluated
FALSEnever evaluated
0
399 QWidget *w = dirtyOnScreenWidgets->at(i);-
400 if (widgetDirty && w != widget && !widget->isAncestorOf(w))
widgetDirtyDescription
TRUEnever evaluated
FALSEnever evaluated
w != widgetDescription
TRUEnever evaluated
FALSEnever evaluated
!widget->isAncestorOf(w)Description
TRUEnever evaluated
FALSEnever evaluated
0
401 continue;
never executed: continue;
0
402 QWidgetPrivate *wd = w->d_func();-
403 Q_ASSERT(wd->needsFlush);-
404 r += wd->needsFlush->translated(w->mapTo(tlw, QPoint()));-
405 }
never executed: end of block
0
406 }
never executed: end of block
0
407-
408 if (widgetDirty) {
widgetDirtyDescription
TRUEnever evaluated
FALSEnever evaluated
0
409 // Intersect with the widget geometry and translate to its coordinates.-
410 const QPoint offset(widget->mapTo(tlw, QPoint()));-
411 r &= widget->rect().translated(offset);-
412 r.translate(-offset);-
413 }
never executed: end of block
0
414 return r;
never executed: return r;
0
415}-
416-
417/*!-
418 Returns the static content inside the \a parent if non-zero; otherwise the static content-
419 for the entire backing store is returned. The content will be clipped to \a withinClipRect-
420 if non-empty.-
421*/-
422QRegion QWidgetBackingStore::staticContents(QWidget *parent, const QRect &withinClipRect) const-
423{-
424 if (!parent && tlw->testAttribute(Qt::WA_StaticContents)) {
!parentDescription
TRUEnever evaluated
FALSEnever evaluated
tlw->testAttri...taticContents)Description
TRUEnever evaluated
FALSEnever evaluated
0
425 const QSize surfaceGeometry(store->size());-
426 QRect surfaceRect(0, 0, surfaceGeometry.width(), surfaceGeometry.height());-
427 if (!withinClipRect.isEmpty())
!withinClipRect.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
428 surfaceRect &= withinClipRect;
never executed: surfaceRect &= withinClipRect;
0
429 return QRegion(surfaceRect);
never executed: return QRegion(surfaceRect);
0
430 }-
431-
432 QRegion region;-
433 if (parent && parent->d_func()->children.isEmpty())
parentDescription
TRUEnever evaluated
FALSEnever evaluated
parent->d_func...dren.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
434 return region;
never executed: return region;
0
435-
436 const bool clipToRect = !withinClipRect.isEmpty();-
437 const int count = staticWidgets.count();-
438 for (int i = 0; i < count; ++i) {
i < countDescription
TRUEnever evaluated
FALSEnever evaluated
0
439 QWidget *w = staticWidgets.at(i);-
440 QWidgetPrivate *wd = w->d_func();-
441 if (!wd->isOpaque || !wd->extra || wd->extra->staticContentsSize.isEmpty()
!wd->isOpaqueDescription
TRUEnever evaluated
FALSEnever evaluated
!wd->extraDescription
TRUEnever evaluated
FALSEnever evaluated
wd->extra->sta...Size.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
442 || !w->isVisible() || (parent && !parent->isAncestorOf(w))) {
!w->isVisible()Description
TRUEnever evaluated
FALSEnever evaluated
parentDescription
TRUEnever evaluated
FALSEnever evaluated
!parent->isAncestorOf(w)Description
TRUEnever evaluated
FALSEnever evaluated
0
443 continue;
never executed: continue;
0
444 }-
445-
446 QRect rect(0, 0, wd->extra->staticContentsSize.width(), wd->extra->staticContentsSize.height());-
447 const QPoint offset = w->mapTo(parent ? parent : tlw, QPoint());-
448 if (clipToRect)
clipToRectDescription
TRUEnever evaluated
FALSEnever evaluated
0
449 rect &= withinClipRect.translated(-offset);
never executed: rect &= withinClipRect.translated(-offset);
0
450 if (rect.isEmpty())
rect.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
451 continue;
never executed: continue;
0
452-
453 rect &= wd->clipRect();-
454 if (rect.isEmpty())
rect.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
455 continue;
never executed: continue;
0
456-
457 QRegion visible(rect);-
458 wd->clipToEffectiveMask(visible);-
459 if (visible.isEmpty())
visible.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
460 continue;
never executed: continue;
0
461 wd->subtractOpaqueSiblings(visible, 0, /*alsoNonOpaque=*/true);-
462-
463 visible.translate(offset);-
464 region += visible;-
465 }
never executed: end of block
0
466-
467 return region;
never executed: return region;
0
468}-
469-
470void QWidgetBackingStore::sendUpdateRequest(QWidget *widget, UpdateTime updateTime)-
471{-
472 if (!widget)
!widgetDescription
TRUEnever evaluated
FALSEnever evaluated
0
473 return;
never executed: return;
0
474-
475#ifndef QT_NO_OPENGL-
476 // Having every repaint() leading to a sync/flush is bad as it causes-
477 // compositing and waiting for vsync each and every time. Change to-
478 // UpdateLater, except for approx. once per frame to prevent starvation in-
479 // case the control does not get back to the event loop.-
480 QWidget *w = widget->window();-
481 if (updateTime == UpdateNow && w && w->windowHandle() && QWindowPrivate::get(w->windowHandle())->compositing) {
updateTime == UpdateNowDescription
TRUEnever evaluated
FALSEnever evaluated
wDescription
TRUEnever evaluated
FALSEnever evaluated
w->windowHandle()Description
TRUEnever evaluated
FALSEnever evaluated
QWindowPrivate...)->compositingDescription
TRUEnever evaluated
FALSEnever evaluated
0
482 int refresh = 60;-
483 QScreen *ws = w->windowHandle()->screen();-
484 if (ws)
wsDescription
TRUEnever evaluated
FALSEnever evaluated
0
485 refresh = ws->refreshRate();
never executed: refresh = ws->refreshRate();
0
486 QWindowPrivate *wd = QWindowPrivate::get(w->windowHandle());-
487 if (wd->lastComposeTime.isValid()) {
wd->lastComposeTime.isValid()Description
TRUEnever evaluated
FALSEnever evaluated
0
488 const qint64 elapsed = wd->lastComposeTime.elapsed();-
489 if (elapsed <= qint64(1000.0f / refresh))
elapsed <= qin....0f / refresh)Description
TRUEnever evaluated
FALSEnever evaluated
0
490 updateTime = UpdateLater;
never executed: updateTime = UpdateLater;
0
491 }
never executed: end of block
0
492 }
never executed: end of block
0
493#endif-
494-
495 switch (updateTime) {-
496 case UpdateLater:
never executed: case UpdateLater:
0
497 updateRequestSent = true;-
498 QApplication::postEvent(widget, new QEvent(QEvent::UpdateRequest), Qt::LowEventPriority);-
499 break;
never executed: break;
0
500 case UpdateNow: {
never executed: case UpdateNow:
0
501 QEvent event(QEvent::UpdateRequest);-
502 QApplication::sendEvent(widget, &event);-
503 break;
never executed: break;
0
504 }-
505 }-
506}
never executed: end of block
0
507-
508/*!-
509 Marks the region of the widget as dirty (if not already marked as dirty) and-
510 posts an UpdateRequest event to the top-level widget (if not already posted).-
511-
512 If updateTime is UpdateNow, the event is sent immediately instead of posted.-
513-
514 If bufferState is BufferInvalid, all widgets intersecting with the region will be dirty.-
515-
516 If the widget paints directly on screen, the event is sent to the widget-
517 instead of the top-level widget, and bufferState is completely ignored.-
518-
519 ### Qt 4.6: Merge into a template function (after MSVC isn't supported anymore).-
520*/-
521void QWidgetBackingStore::markDirty(const QRegion &rgn, QWidget *widget,-
522 UpdateTime updateTime, BufferState bufferState)-
523{-
524 Q_ASSERT(tlw->d_func()->extra);-
525 Q_ASSERT(tlw->d_func()->extra->topextra);-
526 Q_ASSERT(!tlw->d_func()->extra->topextra->inTopLevelResize);-
527 Q_ASSERT(widget->isVisible() && widget->updatesEnabled());-
528 Q_ASSERT(widget->window() == tlw);-
529 Q_ASSERT(!rgn.isEmpty());-
530-
531#ifndef QT_NO_GRAPHICSEFFECT-
532 widget->d_func()->invalidateGraphicsEffectsRecursively();-
533#endif //QT_NO_GRAPHICSEFFECT-
534-
535 if (widget->d_func()->paintOnScreen()) {
widget->d_func...aintOnScreen()Description
TRUEnever evaluated
FALSEnever evaluated
0
536 if (widget->d_func()->dirty.isEmpty()) {
widget->d_func...irty.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
537 widget->d_func()->dirty = rgn;-
538 sendUpdateRequest(widget, updateTime);-
539 return;
never executed: return;
0
540 } else if (qt_region_strictContains(widget->d_func()->dirty, widget->rect())) {
qt_region_stri...idget->rect())Description
TRUEnever evaluated
FALSEnever evaluated
0
541 if (updateTime == UpdateNow)
updateTime == UpdateNowDescription
TRUEnever evaluated
FALSEnever evaluated
0
542 sendUpdateRequest(widget, updateTime);
never executed: sendUpdateRequest(widget, updateTime);
0
543 return; // Already dirty.
never executed: return;
0
544 }-
545-
546 const bool eventAlreadyPosted = !widget->d_func()->dirty.isEmpty();-
547 widget->d_func()->dirty += rgn;-
548 if (!eventAlreadyPosted || updateTime == UpdateNow)
!eventAlreadyPostedDescription
TRUEnever evaluated
FALSEnever evaluated
updateTime == UpdateNowDescription
TRUEnever evaluated
FALSEnever evaluated
0
549 sendUpdateRequest(widget, updateTime);
never executed: sendUpdateRequest(widget, updateTime);
0
550 return;
never executed: return;
0
551 }-
552-
553 //### FIXME fullUpdatePending seems to be always false????-
554 if (fullUpdatePending) {
fullUpdatePendingDescription
TRUEnever evaluated
FALSEnever evaluated
0
555 if (updateTime == UpdateNow)
updateTime == UpdateNowDescription
TRUEnever evaluated
FALSEnever evaluated
0
556 sendUpdateRequest(tlw, updateTime);
never executed: sendUpdateRequest(tlw, updateTime);
0
557 return;
never executed: return;
0
558 }-
559-
560 const QPoint offset = widget->mapTo(tlw, QPoint());-
561-
562 if (QWidgetPrivate::get(widget)->renderToTexture) {
QWidgetPrivate...enderToTextureDescription
TRUEnever evaluated
FALSEnever evaluated
0
563 if (!widget->d_func()->inDirtyList)
!widget->d_func()->inDirtyListDescription
TRUEnever evaluated
FALSEnever evaluated
0
564 addDirtyRenderToTextureWidget(widget);
never executed: addDirtyRenderToTextureWidget(widget);
0
565 if (!updateRequestSent || updateTime == UpdateNow)
!updateRequestSentDescription
TRUEnever evaluated
FALSEnever evaluated
updateTime == UpdateNowDescription
TRUEnever evaluated
FALSEnever evaluated
0
566 sendUpdateRequest(tlw, updateTime);
never executed: sendUpdateRequest(tlw, updateTime);
0
567 return;
never executed: return;
0
568 }-
569-
570 const QRect widgetRect = widget->d_func()->effectiveRectFor(widget->rect());-
571 if (qt_region_strictContains(dirty, widgetRect.translated(offset))) {
qt_region_stri...lated(offset))Description
TRUEnever evaluated
FALSEnever evaluated
0
572 if (updateTime == UpdateNow)
updateTime == UpdateNowDescription
TRUEnever evaluated
FALSEnever evaluated
0
573 sendUpdateRequest(tlw, updateTime);
never executed: sendUpdateRequest(tlw, updateTime);
0
574 return; // Already dirty.
never executed: return;
0
575 }-
576-
577 if (bufferState == BufferInvalid) {
bufferState == BufferInvalidDescription
TRUEnever evaluated
FALSEnever evaluated
0
578 const bool eventAlreadyPosted = !dirty.isEmpty() || updateRequestSent;
!dirty.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
updateRequestSentDescription
TRUEnever evaluated
FALSEnever evaluated
0
579#ifndef QT_NO_GRAPHICSEFFECT-
580 if (widget->d_func()->graphicsEffect)
widget->d_func...graphicsEffectDescription
TRUEnever evaluated
FALSEnever evaluated
0
581 dirty += widget->d_func()->effectiveRectFor(rgn.boundingRect()).translated(offset);
never executed: dirty += widget->d_func()->effectiveRectFor(rgn.boundingRect()).translated(offset);
0
582 else-
583#endif //QT_NO_GRAPHICSEFFECT-
584 dirty += rgn.translated(offset);
never executed: dirty += rgn.translated(offset);
0
585 if (!eventAlreadyPosted || updateTime == UpdateNow)
!eventAlreadyPostedDescription
TRUEnever evaluated
FALSEnever evaluated
updateTime == UpdateNowDescription
TRUEnever evaluated
FALSEnever evaluated
0
586 sendUpdateRequest(tlw, updateTime);
never executed: sendUpdateRequest(tlw, updateTime);
0
587 return;
never executed: return;
0
588 }-
589-
590 if (dirtyWidgets.isEmpty()) {
dirtyWidgets.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
591 addDirtyWidget(widget, rgn);-
592 sendUpdateRequest(tlw, updateTime);-
593 return;
never executed: return;
0
594 }-
595-
596 if (widget->d_func()->inDirtyList) {
widget->d_func()->inDirtyListDescription
TRUEnever evaluated
FALSEnever evaluated
0
597 if (!qt_region_strictContains(widget->d_func()->dirty, widgetRect)) {
!qt_region_str...y, widgetRect)Description
TRUEnever evaluated
FALSEnever evaluated
0
598#ifndef QT_NO_GRAPHICSEFFECT-
599 if (widget->d_func()->graphicsEffect)
widget->d_func...graphicsEffectDescription
TRUEnever evaluated
FALSEnever evaluated
0
600 widget->d_func()->dirty += widget->d_func()->effectiveRectFor(rgn.boundingRect());
never executed: widget->d_func()->dirty += widget->d_func()->effectiveRectFor(rgn.boundingRect());
0
601 else-
602#endif //QT_NO_GRAPHICSEFFECT-
603 widget->d_func()->dirty += rgn;
never executed: widget->d_func()->dirty += rgn;
0
604 }-
605 } else {
never executed: end of block
0
606 addDirtyWidget(widget, rgn);-
607 }
never executed: end of block
0
608-
609 if (updateTime == UpdateNow)
updateTime == UpdateNowDescription
TRUEnever evaluated
FALSEnever evaluated
0
610 sendUpdateRequest(tlw, updateTime);
never executed: sendUpdateRequest(tlw, updateTime);
0
611}
never executed: end of block
0
612-
613/*!-
614 This function is equivalent to calling markDirty(QRegion(rect), ...), but-
615 is more efficient as it eliminates QRegion operations/allocations and can-
616 use the rect more precisely for additional cut-offs.-
617-
618 ### Qt 4.6: Merge into a template function (after MSVC isn't supported anymore).-
619*/-
620void QWidgetBackingStore::markDirty(const QRect &rect, QWidget *widget,-
621 UpdateTime updateTime, BufferState bufferState)-
622{-
623 Q_ASSERT(tlw->d_func()->extra);-
624 Q_ASSERT(tlw->d_func()->extra->topextra);-
625 Q_ASSERT(!tlw->d_func()->extra->topextra->inTopLevelResize);-
626 Q_ASSERT(widget->isVisible() && widget->updatesEnabled());-
627 Q_ASSERT(widget->window() == tlw);-
628 Q_ASSERT(!rect.isEmpty());-
629-
630#ifndef QT_NO_GRAPHICSEFFECT-
631 widget->d_func()->invalidateGraphicsEffectsRecursively();-
632#endif //QT_NO_GRAPHICSEFFECT-
633-
634 if (widget->d_func()->paintOnScreen()) {
widget->d_func...aintOnScreen()Description
TRUEnever evaluated
FALSEnever evaluated
0
635 if (widget->d_func()->dirty.isEmpty()) {
widget->d_func...irty.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
636 widget->d_func()->dirty = QRegion(rect);-
637 sendUpdateRequest(widget, updateTime);-
638 return;
never executed: return;
0
639 } else if (qt_region_strictContains(widget->d_func()->dirty, rect)) {
qt_region_stri...->dirty, rect)Description
TRUEnever evaluated
FALSEnever evaluated
0
640 if (updateTime == UpdateNow)
updateTime == UpdateNowDescription
TRUEnever evaluated
FALSEnever evaluated
0
641 sendUpdateRequest(widget, updateTime);
never executed: sendUpdateRequest(widget, updateTime);
0
642 return; // Already dirty.
never executed: return;
0
643 }-
644-
645 const bool eventAlreadyPosted = !widget->d_func()->dirty.isEmpty();-
646 widget->d_func()->dirty += rect;-
647 if (!eventAlreadyPosted || updateTime == UpdateNow)
!eventAlreadyPostedDescription
TRUEnever evaluated
FALSEnever evaluated
updateTime == UpdateNowDescription
TRUEnever evaluated
FALSEnever evaluated
0
648 sendUpdateRequest(widget, updateTime);
never executed: sendUpdateRequest(widget, updateTime);
0
649 return;
never executed: return;
0
650 }-
651-
652 if (fullUpdatePending) {
fullUpdatePendingDescription
TRUEnever evaluated
FALSEnever evaluated
0
653 if (updateTime == UpdateNow)
updateTime == UpdateNowDescription
TRUEnever evaluated
FALSEnever evaluated
0
654 sendUpdateRequest(tlw, updateTime);
never executed: sendUpdateRequest(tlw, updateTime);
0
655 return;
never executed: return;
0
656 }-
657-
658 if (QWidgetPrivate::get(widget)->renderToTexture) {
QWidgetPrivate...enderToTextureDescription
TRUEnever evaluated
FALSEnever evaluated
0
659 if (!widget->d_func()->inDirtyList)
!widget->d_func()->inDirtyListDescription
TRUEnever evaluated
FALSEnever evaluated
0
660 addDirtyRenderToTextureWidget(widget);
never executed: addDirtyRenderToTextureWidget(widget);
0
661 if (!updateRequestSent || updateTime == UpdateNow)
!updateRequestSentDescription
TRUEnever evaluated
FALSEnever evaluated
updateTime == UpdateNowDescription
TRUEnever evaluated
FALSEnever evaluated
0
662 sendUpdateRequest(tlw, updateTime);
never executed: sendUpdateRequest(tlw, updateTime);
0
663 return;
never executed: return;
0
664 }-
665-
666-
667 const QRect widgetRect = widget->d_func()->effectiveRectFor(rect);-
668 QRect translatedRect = widgetRect;-
669 if (widget != tlw)
widget != tlwDescription
TRUEnever evaluated
FALSEnever evaluated
0
670 translatedRect.translate(widget->mapTo(tlw, QPoint()));
never executed: translatedRect.translate(widget->mapTo(tlw, QPoint()));
0
671 // Graphics effects may exceed window size, clamp.-
672 translatedRect = translatedRect.intersected(QRect(QPoint(), tlw->size()));-
673 if (qt_region_strictContains(dirty, translatedRect)) {
qt_region_stri...ranslatedRect)Description
TRUEnever evaluated
FALSEnever evaluated
0
674 if (updateTime == UpdateNow)
updateTime == UpdateNowDescription
TRUEnever evaluated
FALSEnever evaluated
0
675 sendUpdateRequest(tlw, updateTime);
never executed: sendUpdateRequest(tlw, updateTime);
0
676 return; // Already dirty
never executed: return;
0
677 }-
678-
679 if (bufferState == BufferInvalid) {
bufferState == BufferInvalidDescription
TRUEnever evaluated
FALSEnever evaluated
0
680 const bool eventAlreadyPosted = !dirty.isEmpty();-
681 dirty += translatedRect;-
682 if (!eventAlreadyPosted || updateTime == UpdateNow)
!eventAlreadyPostedDescription
TRUEnever evaluated
FALSEnever evaluated
updateTime == UpdateNowDescription
TRUEnever evaluated
FALSEnever evaluated
0
683 sendUpdateRequest(tlw, updateTime);
never executed: sendUpdateRequest(tlw, updateTime);
0
684 return;
never executed: return;
0
685 }-
686-
687 if (dirtyWidgets.isEmpty()) {
dirtyWidgets.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
688 addDirtyWidget(widget, rect);-
689 sendUpdateRequest(tlw, updateTime);-
690 return;
never executed: return;
0
691 }-
692-
693 if (widget->d_func()->inDirtyList) {
widget->d_func()->inDirtyListDescription
TRUEnever evaluated
FALSEnever evaluated
0
694 if (!qt_region_strictContains(widget->d_func()->dirty, widgetRect))
!qt_region_str...y, widgetRect)Description
TRUEnever evaluated
FALSEnever evaluated
0
695 widget->d_func()->dirty += widgetRect;
never executed: widget->d_func()->dirty += widgetRect;
0
696 } else {
never executed: end of block
0
697 addDirtyWidget(widget, rect);-
698 }
never executed: end of block
0
699-
700 if (updateTime == UpdateNow)
updateTime == UpdateNowDescription
TRUEnever evaluated
FALSEnever evaluated
0
701 sendUpdateRequest(tlw, updateTime);
never executed: sendUpdateRequest(tlw, updateTime);
0
702}
never executed: end of block
0
703-
704/*!-
705 Marks the \a region of the \a widget as dirty on screen. The \a region will be copied from-
706 the backing store to the \a widget's native parent next time flush() is called.-
707-
708 Paint on screen widgets are ignored.-
709*/-
710void QWidgetBackingStore::markDirtyOnScreen(const QRegion &region, QWidget *widget, const QPoint &topLevelOffset)-
711{-
712 if (!widget || widget->d_func()->paintOnScreen() || region.isEmpty())
!widgetDescription
TRUEnever evaluated
FALSEnever evaluated
widget->d_func...aintOnScreen()Description
TRUEnever evaluated
FALSEnever evaluated
region.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
713 return;
never executed: return;
0
714-
715#if defined(Q_DEAD_CODE_FROM_QT4_MAC)-
716 if (!widget->testAttribute(Qt::WA_WState_InPaintEvent))-
717 dirtyOnScreen += region.translated(topLevelOffset);-
718 return;-
719#endif-
720-
721 // Top-level.-
722 if (widget == tlw) {
widget == tlwDescription
TRUEnever evaluated
FALSEnever evaluated
0
723 if (!widget->testAttribute(Qt::WA_WState_InPaintEvent))
!widget->testA..._InPaintEvent)Description
TRUEnever evaluated
FALSEnever evaluated
0
724 dirtyOnScreen += region;
never executed: dirtyOnScreen += region;
0
725 return;
never executed: return;
0
726 }-
727-
728 // Alien widgets.-
729 if (!widget->internalWinId() && !widget->isWindow()) {
!widget->internalWinId()Description
TRUEnever evaluated
FALSEnever evaluated
!widget->isWindow()Description
TRUEnever evaluated
FALSEnever evaluated
0
730 QWidget *nativeParent = widget->nativeParentWidget(); // Alien widgets with the top-level as the native parent (common case).-
731 if (nativeParent == tlw) {
nativeParent == tlwDescription
TRUEnever evaluated
FALSEnever evaluated
0
732 if (!widget->testAttribute(Qt::WA_WState_InPaintEvent))
!widget->testA..._InPaintEvent)Description
TRUEnever evaluated
FALSEnever evaluated
0
733 dirtyOnScreen += region.translated(topLevelOffset);
never executed: dirtyOnScreen += region.translated(topLevelOffset);
0
734 return;
never executed: return;
0
735 }-
736-
737 // Alien widgets with native parent != tlw.-
738 QWidgetPrivate *nativeParentPrivate = nativeParent->d_func();-
739 if (!nativeParentPrivate->needsFlush)
!nativeParentP...te->needsFlushDescription
TRUEnever evaluated
FALSEnever evaluated
0
740 nativeParentPrivate->needsFlush = new QRegion;
never executed: nativeParentPrivate->needsFlush = new QRegion;
0
741 const QPoint nativeParentOffset = widget->mapTo(nativeParent, QPoint());-
742 *nativeParentPrivate->needsFlush += region.translated(nativeParentOffset);-
743 appendDirtyOnScreenWidget(nativeParent);-
744 return;
never executed: return;
0
745 }-
746-
747 // Native child widgets.-
748 QWidgetPrivate *widgetPrivate = widget->d_func();-
749 if (!widgetPrivate->needsFlush)
!widgetPrivate->needsFlushDescription
TRUEnever evaluated
FALSEnever evaluated
0
750 widgetPrivate->needsFlush = new QRegion;
never executed: widgetPrivate->needsFlush = new QRegion;
0
751 *widgetPrivate->needsFlush += region;-
752 appendDirtyOnScreenWidget(widget);-
753}
never executed: end of block
0
754-
755void QWidgetBackingStore::removeDirtyWidget(QWidget *w)-
756{-
757 if (!w)
!wDescription
TRUEnever evaluated
FALSEnever evaluated
0
758 return;
never executed: return;
0
759-
760 dirtyWidgetsRemoveAll(w);-
761 dirtyOnScreenWidgetsRemoveAll(w);-
762 dirtyRenderToTextureWidgets.removeAll(w);-
763 resetWidget(w);-
764-
765 QWidgetPrivate *wd = w->d_func();-
766 const int n = wd->children.count();-
767 for (int i = 0; i < n; ++i) {
i < nDescription
TRUEnever evaluated
FALSEnever evaluated
0
768 if (QWidget *child = qobject_cast<QWidget*>(wd->children.at(i)))
QWidget *child...hildren.at(i))Description
TRUEnever evaluated
FALSEnever evaluated
0
769 removeDirtyWidget(child);
never executed: removeDirtyWidget(child);
0
770 }
never executed: end of block
0
771}
never executed: end of block
0
772-
773void QWidgetBackingStore::updateLists(QWidget *cur)-
774{-
775 if (!cur)
!curDescription
TRUEnever evaluated
FALSEnever evaluated
0
776 return;
never executed: return;
0
777-
778 QList<QObject*> children = cur->children();-
779 for (int i = 0; i < children.size(); ++i) {
i < children.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
780 QWidget *child = qobject_cast<QWidget*>(children.at(i));-
781 if (!child)
!childDescription
TRUEnever evaluated
FALSEnever evaluated
0
782 continue;
never executed: continue;
0
783-
784 updateLists(child);-
785 }
never executed: end of block
0
786-
787 if (cur->testAttribute(Qt::WA_StaticContents))
cur->testAttri...taticContents)Description
TRUEnever evaluated
FALSEnever evaluated
0
788 addStaticWidget(cur);
never executed: addStaticWidget(cur);
0
789}
never executed: end of block
0
790-
791QWidgetBackingStore::QWidgetBackingStore(QWidget *topLevel)-
792 : tlw(topLevel),-
793 dirtyOnScreenWidgets(0),-
794 fullUpdatePending(0),-
795 updateRequestSent(0),-
796 textureListWatcher(0),-
797 perfFrames(0)-
798{-
799 store = tlw->backingStore();-
800 Q_ASSERT(store);-
801-
802 // Ensure all existing subsurfaces and static widgets are added to their respective lists.-
803 updateLists(topLevel);-
804}
never executed: end of block
0
805-
806QWidgetBackingStore::~QWidgetBackingStore()-
807{-
808 for (int c = 0; c < dirtyWidgets.size(); ++c)
c < dirtyWidgets.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
809 resetWidget(dirtyWidgets.at(c));
never executed: resetWidget(dirtyWidgets.at(c));
0
810 for (int c = 0; c < dirtyRenderToTextureWidgets.size(); ++c)
c < dirtyRende...Widgets.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
811 resetWidget(dirtyRenderToTextureWidgets.at(c));
never executed: resetWidget(dirtyRenderToTextureWidgets.at(c));
0
812-
813 delete dirtyOnScreenWidgets;-
814}
never executed: end of block
0
815-
816//parent's coordinates; move whole rect; update parent and widget-
817//assume the screen blt has already been done, so we don't need to refresh that part-
818void QWidgetPrivate::moveRect(const QRect &rect, int dx, int dy)-
819{-
820 Q_Q(QWidget);-
821 if (!q->isVisible() || (dx == 0 && dy == 0))
!q->isVisible()Description
TRUEnever evaluated
FALSEnever evaluated
dx == 0Description
TRUEnever evaluated
FALSEnever evaluated
dy == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
822 return;
never executed: return;
0
823-
824 QWidget *tlw = q->window();-
825 QTLWExtra* x = tlw->d_func()->topData();-
826 if (x->inTopLevelResize)
x->inTopLevelResizeDescription
TRUEnever evaluated
FALSEnever evaluated
0
827 return;
never executed: return;
0
828-
829 static const bool accelEnv = qEnvironmentVariableIntValue("QT_NO_FAST_MOVE") == 0;-
830-
831 QWidget *pw = q->parentWidget();-
832 QPoint toplevelOffset = pw->mapTo(tlw, QPoint());-
833 QWidgetPrivate *pd = pw->d_func();-
834 QRect clipR(pd->clipRect());-
835 const QRect newRect(rect.translated(dx, dy));-
836 QRect destRect = rect.intersected(clipR);-
837 if (destRect.isValid())
destRect.isValid()Description
TRUEnever evaluated
FALSEnever evaluated
0
838 destRect = destRect.translated(dx, dy).intersected(clipR);
never executed: destRect = destRect.translated(dx, dy).intersected(clipR);
0
839 const QRect sourceRect(destRect.translated(-dx, -dy));-
840 const QRect parentRect(rect & clipR);-
841 const bool nativeWithTextureChild = textureChildSeen && q->internalWinId();
textureChildSeenDescription
TRUEnever evaluated
FALSEnever evaluated
q->internalWinId()Description
TRUEnever evaluated
FALSEnever evaluated
0
842-
843 bool accelerateMove = accelEnv && isOpaque && !nativeWithTextureChild
accelEnvDescription
TRUEnever evaluated
FALSEnever evaluated
isOpaqueDescription
TRUEnever evaluated
FALSEnever evaluated
!nativeWithTextureChildDescription
TRUEnever evaluated
FALSEnever evaluated
0
844#ifndef QT_NO_GRAPHICSVIEW-
845 // No accelerate move for proxy widgets.-
846 && !tlw->d_func()->extra->proxyWidget
!tlw->d_func()...a->proxyWidgetDescription
TRUEnever evaluated
FALSEnever evaluated
0
847#endif-
848 && !isOverlapped(sourceRect) && !isOverlapped(destRect);
!isOverlapped(sourceRect)Description
TRUEnever evaluated
FALSEnever evaluated
!isOverlapped(destRect)Description
TRUEnever evaluated
FALSEnever evaluated
0
849-
850 if (!accelerateMove) {
!accelerateMoveDescription
TRUEnever evaluated
FALSEnever evaluated
0
851 QRegion parentR(effectiveRectFor(parentRect));-
852 if (!extra || !extra->hasMask) {
!extraDescription
TRUEnever evaluated
FALSEnever evaluated
!extra->hasMaskDescription
TRUEnever evaluated
FALSEnever evaluated
0
853 parentR -= newRect;-
854 } else {
never executed: end of block
0
855 // invalidateBuffer() excludes anything outside the mask-
856 parentR += newRect & clipR;-
857 }
never executed: end of block
0
858 pd->invalidateBuffer(parentR);-
859 invalidateBuffer((newRect & clipR).translated(-data.crect.topLeft()));-
860 } else {
never executed: end of block
0
861-
862 QWidgetBackingStore *wbs = x->backingStoreTracker.data();-
863 QRegion childExpose(newRect & clipR);-
864-
865 if (sourceRect.isValid() && wbs->bltRect(sourceRect, dx, dy, pw))
sourceRect.isValid()Description
TRUEnever evaluated
FALSEnever evaluated
wbs->bltRect(s...t, dx, dy, pw)Description
TRUEnever evaluated
FALSEnever evaluated
0
866 childExpose -= destRect;
never executed: childExpose -= destRect;
0
867-
868 if (!pw->updatesEnabled())
!pw->updatesEnabled()Description
TRUEnever evaluated
FALSEnever evaluated
0
869 return;
never executed: return;
0
870-
871 const bool childUpdatesEnabled = q->updatesEnabled();-
872 if (childUpdatesEnabled && !childExpose.isEmpty()) {
childUpdatesEnabledDescription
TRUEnever evaluated
FALSEnever evaluated
!childExpose.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
873 childExpose.translate(-data.crect.topLeft());-
874 wbs->markDirty(childExpose, q);-
875 isMoved = true;-
876 }
never executed: end of block
0
877-
878 QRegion parentExpose(parentRect);-
879 parentExpose -= newRect;-
880 if (extra && extra->hasMask)
extraDescription
TRUEnever evaluated
FALSEnever evaluated
extra->hasMaskDescription
TRUEnever evaluated
FALSEnever evaluated
0
881 parentExpose += QRegion(newRect) - extra->mask.translated(data.crect.topLeft());
never executed: parentExpose += QRegion(newRect) - extra->mask.translated(data.crect.topLeft());
0
882-
883 if (!parentExpose.isEmpty()) {
!parentExpose.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
884 wbs->markDirty(parentExpose, pw);-
885 pd->isMoved = true;-
886 }
never executed: end of block
0
887-
888 if (childUpdatesEnabled) {
childUpdatesEnabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
889 QRegion needsFlush(sourceRect);-
890 needsFlush += destRect;-
891 wbs->markDirtyOnScreen(needsFlush, pw, toplevelOffset);-
892 }
never executed: end of block
0
893 }
never executed: end of block
0
894}-
895-
896//widget's coordinates; scroll within rect; only update widget-
897void QWidgetPrivate::scrollRect(const QRect &rect, int dx, int dy)-
898{-
899 Q_Q(QWidget);-
900 QWidget *tlw = q->window();-
901 QTLWExtra* x = tlw->d_func()->topData();-
902 if (x->inTopLevelResize)
x->inTopLevelResizeDescription
TRUEnever evaluated
FALSEnever evaluated
0
903 return;
never executed: return;
0
904-
905 QWidgetBackingStore *wbs = x->backingStoreTracker.data();-
906 if (!wbs)
!wbsDescription
TRUEnever evaluated
FALSEnever evaluated
0
907 return;
never executed: return;
0
908-
909 static const bool accelEnv = qEnvironmentVariableIntValue("QT_NO_FAST_SCROLL") == 0;-
910-
911 QRect scrollRect = rect & clipRect();-
912 bool overlapped = false;-
913 bool accelerateScroll = accelEnv && isOpaque && !q_func()->testAttribute(Qt::WA_WState_InPaintEvent)
accelEnvDescription
TRUEnever evaluated
FALSEnever evaluated
isOpaqueDescription
TRUEnever evaluated
FALSEnever evaluated
!q_func()->tes..._InPaintEvent)Description
TRUEnever evaluated
FALSEnever evaluated
0
914 && !(overlapped = isOverlapped(scrollRect.translated(data.crect.topLeft())));
!(overlapped =...t.topLeft())))Description
TRUEnever evaluated
FALSEnever evaluated
0
915-
916 if (!accelerateScroll) {
!accelerateScrollDescription
TRUEnever evaluated
FALSEnever evaluated
0
917 if (overlapped) {
overlappedDescription
TRUEnever evaluated
FALSEnever evaluated
0
918 QRegion region(scrollRect);-
919 subtractOpaqueSiblings(region);-
920 invalidateBuffer(region);-
921 }else {
never executed: end of block
0
922 invalidateBuffer(scrollRect);-
923 }
never executed: end of block
0
924 } else {-
925 const QPoint toplevelOffset = q->mapTo(tlw, QPoint());-
926 const QRect destRect = scrollRect.translated(dx, dy) & scrollRect;-
927 const QRect sourceRect = destRect.translated(-dx, -dy);-
928-
929 QRegion childExpose(scrollRect);-
930 if (sourceRect.isValid()) {
sourceRect.isValid()Description
TRUEnever evaluated
FALSEnever evaluated
0
931 if (wbs->bltRect(sourceRect, dx, dy, q))
wbs->bltRect(s...ct, dx, dy, q)Description
TRUEnever evaluated
FALSEnever evaluated
0
932 childExpose -= destRect;
never executed: childExpose -= destRect;
0
933 }
never executed: end of block
0
934-
935 if (inDirtyList) {
inDirtyListDescription
TRUEnever evaluated
FALSEnever evaluated
0
936 if (rect == q->rect()) {
rect == q->rect()Description
TRUEnever evaluated
FALSEnever evaluated
0
937 dirty.translate(dx, dy);-
938 } else {
never executed: end of block
0
939 QRegion dirtyScrollRegion = dirty.intersected(scrollRect);-
940 if (!dirtyScrollRegion.isEmpty()) {
!dirtyScrollRegion.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
941 dirty -= dirtyScrollRegion;-
942 dirtyScrollRegion.translate(dx, dy);-
943 dirty += dirtyScrollRegion;-
944 }
never executed: end of block
0
945 }
never executed: end of block
0
946 }-
947-
948 if (!q->updatesEnabled())
!q->updatesEnabled()Description
TRUEnever evaluated
FALSEnever evaluated
0
949 return;
never executed: return;
0
950-
951 if (!childExpose.isEmpty()) {
!childExpose.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
952 wbs->markDirty(childExpose, q);-
953 isScrolled = true;-
954 }
never executed: end of block
0
955-
956 // Instead of using native scroll-on-screen, we copy from-
957 // backingstore, giving only one screen update for each-
958 // scroll, and a solid appearance-
959 wbs->markDirtyOnScreen(destRect, q, toplevelOffset);-
960 }
never executed: end of block
0
961}-
962-
963#ifndef QT_NO_OPENGL-
964static void findTextureWidgetsRecursively(QWidget *tlw, QWidget *widget, QPlatformTextureList *widgetTextures, QVector<QWidget *> *nativeChildren)-
965{-
966 QWidgetPrivate *wd = QWidgetPrivate::get(widget);-
967 if (wd->renderToTexture) {
wd->renderToTextureDescription
TRUEnever evaluated
FALSEnever evaluated
0
968 QPlatformTextureList::Flags flags = 0;-
969 if (widget->testAttribute(Qt::WA_AlwaysStackOnTop))
widget->testAt...aysStackOnTop)Description
TRUEnever evaluated
FALSEnever evaluated
0
970 flags |= QPlatformTextureList::StacksOnTop;
never executed: flags |= QPlatformTextureList::StacksOnTop;
0
971 const QRect rect(widget->mapTo(tlw, QPoint()), widget->size());-
972 widgetTextures->appendTexture(widget, wd->textureId(), rect, wd->clipRect(), flags);-
973 }
never executed: end of block
0
974-
975 for (int i = 0; i < wd->children.size(); ++i) {
i < wd->children.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
976 QWidget *w = qobject_cast<QWidget *>(wd->children.at(i));-
977 // Stop at native widgets but store them. Stop at hidden widgets too.-
978 if (w && !w->isWindow() && w->internalWinId())
wDescription
TRUEnever evaluated
FALSEnever evaluated
!w->isWindow()Description
TRUEnever evaluated
FALSEnever evaluated
w->internalWinId()Description
TRUEnever evaluated
FALSEnever evaluated
0
979 nativeChildren->append(w);
never executed: nativeChildren->append(w);
0
980 if (w && !w->isWindow() && !w->internalWinId() && !w->isHidden() && QWidgetPrivate::get(w)->textureChildSeen)
wDescription
TRUEnever evaluated
FALSEnever evaluated
!w->isWindow()Description
TRUEnever evaluated
FALSEnever evaluated
!w->internalWinId()Description
TRUEnever evaluated
FALSEnever evaluated
!w->isHidden()Description
TRUEnever evaluated
FALSEnever evaluated
QWidgetPrivate...xtureChildSeenDescription
TRUEnever evaluated
FALSEnever evaluated
0
981 findTextureWidgetsRecursively(tlw, w, widgetTextures, nativeChildren);
never executed: findTextureWidgetsRecursively(tlw, w, widgetTextures, nativeChildren);
0
982 }
never executed: end of block
0
983}
never executed: end of block
0
984-
985static void findAllTextureWidgetsRecursively(QWidget *tlw, QWidget *widget)-
986{-
987 // textureChildSeen does not take native child widgets into account and that's good.-
988 if (QWidgetPrivate::get(widget)->textureChildSeen) {
QWidgetPrivate...xtureChildSeenDescription
TRUEnever evaluated
FALSEnever evaluated
0
989 QVector<QWidget *> nativeChildren;-
990 QScopedPointer<QPlatformTextureList> tl(new QPlatformTextureList);-
991 // Look for texture widgets (incl. widget itself) from 'widget' down,-
992 // but skip subtrees with a parent of a native child widget.-
993 findTextureWidgetsRecursively(tlw, widget, tl.data(), &nativeChildren);-
994 // tl may be empty regardless of textureChildSeen if we have native or hidden children.-
995 if (!tl->isEmpty())
!tl->isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
996 QWidgetPrivate::get(tlw)->topData()->widgetTextures.append(tl.take());
never executed: QWidgetPrivate::get(tlw)->topData()->widgetTextures.append(tl.take());
0
997 // Native child widgets, if there was any, get their own separate QPlatformTextureList.-
998 foreach (QWidget *ncw, nativeChildren) {-
999 if (QWidgetPrivate::get(ncw)->textureChildSeen)
QWidgetPrivate...xtureChildSeenDescription
TRUEnever evaluated
FALSEnever evaluated
0
1000 findAllTextureWidgetsRecursively(tlw, ncw);
never executed: findAllTextureWidgetsRecursively(tlw, ncw);
0
1001 }
never executed: end of block
0
1002 }
never executed: end of block
0
1003}
never executed: end of block
0
1004-
1005static QPlatformTextureList *widgetTexturesFor(QWidget *tlw, QWidget *widget)-
1006{-
1007 foreach (QPlatformTextureList *tl, QWidgetPrivate::get(tlw)->topData()->widgetTextures) {-
1008 Q_ASSERT(!tl->isEmpty());-
1009 for (int i = 0; i < tl->count(); ++i) {
i < tl->count()Description
TRUEnever evaluated
FALSEnever evaluated
0
1010 QWidget *w = static_cast<QWidget *>(tl->source(i));-
1011 if ((w->internalWinId() && w == widget) || (!w->internalWinId() && w->nativeParentWidget() == widget))
w->internalWinId()Description
TRUEnever evaluated
FALSEnever evaluated
w == widgetDescription
TRUEnever evaluated
FALSEnever evaluated
!w->internalWinId()Description
TRUEnever evaluated
FALSEnever evaluated
w->nativeParen...et() == widgetDescription
TRUEnever evaluated
FALSEnever evaluated
0
1012 return tl;
never executed: return tl;
0
1013 }
never executed: end of block
0
1014 }
never executed: end of block
0
1015-
1016 if (QWidgetPrivate::get(tlw)->textureChildSeen) {
QWidgetPrivate...xtureChildSeenDescription
TRUEnever evaluated
FALSEnever evaluated
0
1017 // No render-to-texture widgets in the (sub-)tree due to hidden or native-
1018 // children. Returning null results in using the normal backingstore flush path-
1019 // without OpenGL-based compositing. This is very desirable normally. However,-
1020 // some platforms cannot handle switching between the non-GL and GL paths for-
1021 // their windows so it has to be opt-in.-
1022 static bool switchableWidgetComposition =-
1023 QGuiApplicationPrivate::instance()->platformIntegration()-
1024 ->hasCapability(QPlatformIntegration::SwitchableWidgetComposition);-
1025 if (!switchableWidgetComposition
!switchableWidgetCompositionDescription
TRUEnever evaluated
FALSEnever evaluated
0
1026// The Windows compositor handles fullscreen OpenGL window specially. Besides-
1027// having trouble with popups, it also has issues with flip-flopping between-
1028// OpenGL-based and normal flushing. Therefore, stick with GL for fullscreen-
1029// windows (QTBUG-53515). Similary, translucent windows should not switch to-
1030// layered native windows (QTBUG-54734).-
1031#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) && !defined(Q_OS_WINCE)-
1032 || tlw->windowState().testFlag(Qt::WindowFullScreen)-
1033 || tlw->testAttribute(Qt::WA_TranslucentBackground)-
1034#endif-
1035 )-
1036 {-
1037 return qt_dummy_platformTextureList();
never executed: return qt_dummy_platformTextureList();
0
1038 }-
1039 }
never executed: end of block
0
1040-
1041 return 0;
never executed: return 0;
0
1042}-
1043-
1044// Watches one or more QPlatformTextureLists for changes in the lock state and-
1045// triggers a backingstore sync when all the registered lists turn into-
1046// unlocked state. This is essential when a custom composeAndFlush()-
1047// implementation in a platform plugin is not synchronous and keeps-
1048// holding on to the textures for some time even after returning from there.-
1049QPlatformTextureListWatcher::QPlatformTextureListWatcher(QWidgetBackingStore *backingStore)-
1050 : m_backingStore(backingStore)-
1051{-
1052}
never executed: end of block
0
1053-
1054void QPlatformTextureListWatcher::watch(QPlatformTextureList *textureList)-
1055{-
1056 connect(textureList, SIGNAL(locked(bool)), SLOT(onLockStatusChanged(bool)));-
1057 m_locked[textureList] = textureList->isLocked();-
1058}
never executed: end of block
0
1059-
1060bool QPlatformTextureListWatcher::isLocked() const-
1061{-
1062 foreach (bool v, m_locked) {-
1063 if (v)
vDescription
TRUEnever evaluated
FALSEnever evaluated
0
1064 return true;
never executed: return true;
0
1065 }
never executed: end of block
0
1066 return false;
never executed: return false;
0
1067}-
1068-
1069void QPlatformTextureListWatcher::onLockStatusChanged(bool locked)-
1070{-
1071 QPlatformTextureList *tl = static_cast<QPlatformTextureList *>(sender());-
1072 m_locked[tl] = locked;-
1073 if (!isLocked())
!isLocked()Description
TRUEnever evaluated
FALSEnever evaluated
0
1074 m_backingStore->sync();
never executed: m_backingStore->sync();
0
1075}
never executed: end of block
0
1076-
1077#else-
1078-
1079static QPlatformTextureList *widgetTexturesFor(QWidget *tlw, QWidget *widget)-
1080{-
1081 Q_UNUSED(tlw);-
1082 Q_UNUSED(widget);-
1083 return Q_NULLPTR;-
1084}-
1085-
1086#endif // QT_NO_OPENGL-
1087-
1088static inline bool discardSyncRequest(QWidget *tlw, QTLWExtra *tlwExtra)-
1089{-
1090 if (!tlw || !tlwExtra || !tlw->testAttribute(Qt::WA_Mapped) || !tlw->isVisible())
!tlwDescription
TRUEnever evaluated
FALSEnever evaluated
!tlwExtraDescription
TRUEnever evaluated
FALSEnever evaluated
!tlw->testAttr...Qt::WA_Mapped)Description
TRUEnever evaluated
FALSEnever evaluated
!tlw->isVisible()Description
TRUEnever evaluated
FALSEnever evaluated
0
1091 return true;
never executed: return true;
0
1092-
1093 return false;
never executed: return false;
0
1094}-
1095-
1096bool QWidgetBackingStore::syncAllowed()-
1097{-
1098#ifndef QT_NO_OPENGL-
1099 QTLWExtra *tlwExtra = tlw->d_func()->maybeTopData();-
1100 if (textureListWatcher && !textureListWatcher->isLocked()) {
textureListWatcherDescription
TRUEnever evaluated
FALSEnever evaluated
!textureListWa...er->isLocked()Description
TRUEnever evaluated
FALSEnever evaluated
0
1101 textureListWatcher->deleteLater();-
1102 textureListWatcher = 0;-
1103 } else if (!tlwExtra->widgetTextures.isEmpty()) {
never executed: end of block
!tlwExtra->wid...ures.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
1104 bool skipSync = false;-
1105 foreach (QPlatformTextureList *tl, tlwExtra->widgetTextures) {-
1106 if (tl->isLocked()) {
tl->isLocked()Description
TRUEnever evaluated
FALSEnever evaluated
0
1107 if (!textureListWatcher)
!textureListWatcherDescription
TRUEnever evaluated
FALSEnever evaluated
0
1108 textureListWatcher = new QPlatformTextureListWatcher(this);
never executed: textureListWatcher = new QPlatformTextureListWatcher(this);
0
1109 if (!textureListWatcher->isLocked())
!textureListWa...er->isLocked()Description
TRUEnever evaluated
FALSEnever evaluated
0
1110 textureListWatcher->watch(tl);
never executed: textureListWatcher->watch(tl);
0
1111 skipSync = true;-
1112 }
never executed: end of block
0
1113 }
never executed: end of block
0
1114 if (skipSync) // cannot compose due to widget textures being in use
skipSyncDescription
TRUEnever evaluated
FALSEnever evaluated
0
1115 return false;
never executed: return false;
0
1116 }
never executed: end of block
0
1117#endif-
1118 return true;
never executed: return true;
0
1119}-
1120-
1121/*!-
1122 Synchronizes the \a exposedRegion of the \a exposedWidget with the backing store.-
1123-
1124 If there's nothing to repaint, the area is flushed and painting does not occur;-
1125 otherwise the area is marked as dirty on screen and will be flushed right after-
1126 we are done with all painting.-
1127*/-
1128void QWidgetBackingStore::sync(QWidget *exposedWidget, const QRegion &exposedRegion)-
1129{-
1130 QTLWExtra *tlwExtra = tlw->d_func()->maybeTopData();-
1131 if (!tlw->isVisible() || !tlwExtra || tlwExtra->inTopLevelResize)
!tlw->isVisible()Description
TRUEnever evaluated
FALSEnever evaluated
!tlwExtraDescription
TRUEnever evaluated
FALSEnever evaluated
tlwExtra->inTopLevelResizeDescription
TRUEnever evaluated
FALSEnever evaluated
0
1132 return;
never executed: return;
0
1133-
1134 if (!exposedWidget || !exposedWidget->internalWinId() || !exposedWidget->isVisible() || !exposedWidget->testAttribute(Qt::WA_Mapped)
!exposedWidgetDescription
TRUEnever evaluated
FALSEnever evaluated
!exposedWidget...nternalWinId()Description
TRUEnever evaluated
FALSEnever evaluated
!exposedWidget->isVisible()Description
TRUEnever evaluated
FALSEnever evaluated
!exposedWidget...Qt::WA_Mapped)Description
TRUEnever evaluated
FALSEnever evaluated
0
1135 || !exposedWidget->updatesEnabled() || exposedRegion.isEmpty()) {
!exposedWidget...datesEnabled()Description
TRUEnever evaluated
FALSEnever evaluated
exposedRegion.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
1136 return;
never executed: return;
0
1137 }-
1138-
1139 // Nothing to repaint.-
1140 if (!isDirty() && store->size().isValid()) {
!isDirty()Description
TRUEnever evaluated
FALSEnever evaluated
store->size().isValid()Description
TRUEnever evaluated
FALSEnever evaluated
0
1141 QPlatformTextureList *tl = widgetTexturesFor(tlw, exposedWidget);-
1142 qt_flush(exposedWidget, tl ? QRegion() : exposedRegion, store, tlw, tlwOffset, tl, this);-
1143 return;
never executed: return;
0
1144 }-
1145-
1146 if (exposedWidget != tlw)
exposedWidget != tlwDescription
TRUEnever evaluated
FALSEnever evaluated
0
1147 markDirtyOnScreen(exposedRegion, exposedWidget, exposedWidget->mapTo(tlw, QPoint()));
never executed: markDirtyOnScreen(exposedRegion, exposedWidget, exposedWidget->mapTo(tlw, QPoint()));
0
1148 else-
1149 markDirtyOnScreen(exposedRegion, exposedWidget, QPoint());
never executed: markDirtyOnScreen(exposedRegion, exposedWidget, QPoint());
0
1150-
1151 if (syncAllowed())
syncAllowed()Description
TRUEnever evaluated
FALSEnever evaluated
0
1152 doSync();
never executed: doSync();
0
1153}
never executed: end of block
0
1154-
1155/*!-
1156 Synchronizes the backing store, i.e. dirty areas are repainted and flushed.-
1157*/-
1158void QWidgetBackingStore::sync()-
1159{-
1160 updateRequestSent = false;-
1161 QTLWExtra *tlwExtra = tlw->d_func()->maybeTopData();-
1162 if (discardSyncRequest(tlw, tlwExtra)) {
discardSyncReq...tlw, tlwExtra)Description
TRUEnever evaluated
FALSEnever evaluated
0
1163 // If the top-level is minimized, it's not visible on the screen so we can delay the-
1164 // update until it's shown again. In order to do that we must keep the dirty states.-
1165 // These will be cleared when we receive the first expose after showNormal().-
1166 // However, if the widget is not visible (isVisible() returns false), everything will-
1167 // be invalidated once the widget is shown again, so clear all dirty states.-
1168 if (!tlw->isVisible()) {
!tlw->isVisible()Description
TRUEnever evaluated
FALSEnever evaluated
0
1169 dirty = QRegion();-
1170 for (int i = 0; i < dirtyWidgets.size(); ++i)
i < dirtyWidgets.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
1171 resetWidget(dirtyWidgets.at(i));
never executed: resetWidget(dirtyWidgets.at(i));
0
1172 dirtyWidgets.clear();-
1173 fullUpdatePending = false;-
1174 }
never executed: end of block
0
1175 return;
never executed: return;
0
1176 }-
1177-
1178 if (syncAllowed())
syncAllowed()Description
TRUEnever evaluated
FALSEnever evaluated
0
1179 doSync();
never executed: doSync();
0
1180}
never executed: end of block
0
1181-
1182void QWidgetBackingStore::doSync()-
1183{-
1184 const bool updatesDisabled = !tlw->updatesEnabled();-
1185 bool repaintAllWidgets = false;-
1186-
1187 const bool inTopLevelResize = tlw->d_func()->maybeTopData()->inTopLevelResize;-
1188 const QRect tlwRect(topLevelRect());-
1189 const QRect surfaceGeometry(tlwRect.topLeft(), store->size());-
1190 if ((fullUpdatePending || inTopLevelResize || surfaceGeometry.size() != tlwRect.size()) && !updatesDisabled) {
fullUpdatePendingDescription
TRUEnever evaluated
FALSEnever evaluated
inTopLevelResizeDescription
TRUEnever evaluated
FALSEnever evaluated
surfaceGeometr...tlwRect.size()Description
TRUEnever evaluated
FALSEnever evaluated
!updatesDisabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
1191 if (hasStaticContents() && !store->size().isEmpty() ) {
hasStaticContents()Description
TRUEnever evaluated
FALSEnever evaluated
!store->size().isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
1192 // Repaint existing dirty area and newly visible area.-
1193 const QRect clipRect(0, 0, surfaceGeometry.width(), surfaceGeometry.height());-
1194 const QRegion staticRegion(staticContents(0, clipRect));-
1195 QRegion newVisible(0, 0, tlwRect.width(), tlwRect.height());-
1196 newVisible -= staticRegion;-
1197 dirty += newVisible;-
1198 store->setStaticContents(staticRegion);-
1199 } else {
never executed: end of block
0
1200 // Repaint everything.-
1201 dirty = QRegion(0, 0, tlwRect.width(), tlwRect.height());-
1202 for (int i = 0; i < dirtyWidgets.size(); ++i)
i < dirtyWidgets.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
1203 resetWidget(dirtyWidgets.at(i));
never executed: resetWidget(dirtyWidgets.at(i));
0
1204 dirtyWidgets.clear();-
1205 repaintAllWidgets = true;-
1206 }
never executed: end of block
0
1207 }-
1208-
1209 if (inTopLevelResize || surfaceGeometry.size() != tlwRect.size())
inTopLevelResizeDescription
TRUEnever evaluated
FALSEnever evaluated
surfaceGeometr...tlwRect.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
1210 store->resize(tlwRect.size());
never executed: store->resize(tlwRect.size());
0
1211-
1212 if (updatesDisabled)
updatesDisabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
1213 return;
never executed: return;
0
1214-
1215 // Contains everything that needs repaint.-
1216 QRegion toClean(dirty);-
1217-
1218 // Loop through all update() widgets and remove them from the list before they are-
1219 // painted (in case someone calls update() in paintEvent). If the widget is opaque-
1220 // and does not have transparent overlapping siblings, append it to the-
1221 // opaqueNonOverlappedWidgets list and paint it directly without composition.-
1222 QVarLengthArray<QWidget *, 32> opaqueNonOverlappedWidgets;-
1223 for (int i = 0; i < dirtyWidgets.size(); ++i) {
i < dirtyWidgets.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
1224 QWidget *w = dirtyWidgets.at(i);-
1225 QWidgetPrivate *wd = w->d_func();-
1226 if (wd->data.in_destructor)
wd->data.in_destructorDescription
TRUEnever evaluated
FALSEnever evaluated
0
1227 continue;
never executed: continue;
0
1228-
1229 // Clip with mask() and clipRect().-
1230 wd->dirty &= wd->clipRect();-
1231 wd->clipToEffectiveMask(wd->dirty);-
1232-
1233 // Subtract opaque siblings and children.-
1234 bool hasDirtySiblingsAbove = false;-
1235 // We know for sure that the widget isn't overlapped if 'isMoved' is true.-
1236 if (!wd->isMoved)
!wd->isMovedDescription
TRUEnever evaluated
FALSEnever evaluated
0
1237 wd->subtractOpaqueSiblings(wd->dirty, &hasDirtySiblingsAbove);
never executed: wd->subtractOpaqueSiblings(wd->dirty, &hasDirtySiblingsAbove);
0
1238-
1239 // Make a copy of the widget's dirty region, to restore it in case there is an opaque-
1240 // render-to-texture child that completely covers the widget, because otherwise the-
1241 // render-to-texture child won't be visible, due to its parent widget not being redrawn-
1242 // with a proper blending mask.-
1243 const QRegion dirtyBeforeSubtractedOpaqueChildren = wd->dirty;-
1244-
1245 // Scrolled and moved widgets must draw all children.-
1246 if (!wd->isScrolled && !wd->isMoved)
!wd->isScrolledDescription
TRUEnever evaluated
FALSEnever evaluated
!wd->isMovedDescription
TRUEnever evaluated
FALSEnever evaluated
0
1247 wd->subtractOpaqueChildren(wd->dirty, w->rect());
never executed: wd->subtractOpaqueChildren(wd->dirty, w->rect());
0
1248-
1249 if (wd->dirty.isEmpty() && wd->textureChildSeen)
wd->dirty.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
wd->textureChildSeenDescription
TRUEnever evaluated
FALSEnever evaluated
0
1250 wd->dirty = dirtyBeforeSubtractedOpaqueChildren;
never executed: wd->dirty = dirtyBeforeSubtractedOpaqueChildren;
0
1251-
1252 if (wd->dirty.isEmpty()) {
wd->dirty.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
1253 resetWidget(w);-
1254 continue;
never executed: continue;
0
1255 }-
1256-
1257 const QRegion widgetDirty(w != tlw ? wd->dirty.translated(w->mapTo(tlw, QPoint()))-
1258 : wd->dirty);-
1259 toClean += widgetDirty;-
1260-
1261#ifndef QT_NO_GRAPHICSVIEW-
1262 if (tlw->d_func()->extra->proxyWidget) {
tlw->d_func()-...a->proxyWidgetDescription
TRUEnever evaluated
FALSEnever evaluated
0
1263 resetWidget(w);-
1264 continue;
never executed: continue;
0
1265 }-
1266#endif-
1267-
1268 if (!hasDirtySiblingsAbove && wd->isOpaque && !dirty.intersects(widgetDirty.boundingRect())) {
!hasDirtySiblingsAboveDescription
TRUEnever evaluated
FALSEnever evaluated
wd->isOpaqueDescription
TRUEnever evaluated
FALSEnever evaluated
!dirty.interse...oundingRect())Description
TRUEnever evaluated
FALSEnever evaluated
0
1269 opaqueNonOverlappedWidgets.append(w);-
1270 } else {
never executed: end of block
0
1271 resetWidget(w);-
1272 dirty += widgetDirty;-
1273 }
never executed: end of block
0
1274 }-
1275 dirtyWidgets.clear();-
1276-
1277#ifndef QT_NO_OPENGL-
1278 // Find all render-to-texture child widgets (including self).-
1279 // The search is cut at native widget boundaries, meaning that each native child widget-
1280 // has its own list for the subtree below it.-
1281 QTLWExtra *tlwExtra = tlw->d_func()->topData();-
1282 qDeleteAll(tlwExtra->widgetTextures);-
1283 tlwExtra->widgetTextures.clear();-
1284 findAllTextureWidgetsRecursively(tlw, tlw);-
1285 qt_window_private(tlw->windowHandle())->compositing = false; // will get updated in qt_flush()-
1286 fullUpdatePending = false;-
1287#endif-
1288-
1289 if (toClean.isEmpty()) {
toClean.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
1290 // Nothing to repaint. However renderToTexture widgets are handled-
1291 // specially, they are not in the regular dirty list, in order to-
1292 // prevent triggering unnecessary backingstore painting when only the-
1293 // OpenGL content changes. Check if we have such widgets in the special-
1294 // dirty list.-
1295 QVarLengthArray<QWidget *, 16> paintPending;-
1296 const int numPaintPending = dirtyRenderToTextureWidgets.count();-
1297 paintPending.reserve(numPaintPending);-
1298 for (int i = 0; i < numPaintPending; ++i) {
i < numPaintPendingDescription
TRUEnever evaluated
FALSEnever evaluated
0
1299 QWidget *w = dirtyRenderToTextureWidgets.at(i);-
1300 paintPending << w;-
1301 resetWidget(w);-
1302 }
never executed: end of block
0
1303 dirtyRenderToTextureWidgets.clear();-
1304 for (int i = 0; i < numPaintPending; ++i) {
i < numPaintPendingDescription
TRUEnever evaluated
FALSEnever evaluated
0
1305 QWidget *w = paintPending[i];-
1306 w->d_func()->sendPaintEvent(w->rect());-
1307 if (w != tlw) {
w != tlwDescription
TRUEnever evaluated
FALSEnever evaluated
0
1308 QWidget *npw = w->nativeParentWidget();-
1309 if (w->internalWinId() || (npw && npw != tlw)) {
w->internalWinId()Description
TRUEnever evaluated
FALSEnever evaluated
npwDescription
TRUEnever evaluated
FALSEnever evaluated
npw != tlwDescription
TRUEnever evaluated
FALSEnever evaluated
0
1310 if (!w->internalWinId())
!w->internalWinId()Description
TRUEnever evaluated
FALSEnever evaluated
0
1311 w = npw;
never executed: w = npw;
0
1312 QWidgetPrivate *wPrivate = w->d_func();-
1313 if (!wPrivate->needsFlush)
!wPrivate->needsFlushDescription
TRUEnever evaluated
FALSEnever evaluated
0
1314 wPrivate->needsFlush = new QRegion;
never executed: wPrivate->needsFlush = new QRegion;
0
1315 appendDirtyOnScreenWidget(w);-
1316 }
never executed: end of block
0
1317 }
never executed: end of block
0
1318 }
never executed: end of block
0
1319-
1320 // We might have newly exposed areas on the screen if this function was-
1321 // called from sync(QWidget *, QRegion)), so we have to make sure those-
1322 // are flushed. We also need to composite the renderToTexture widgets.-
1323 flush();-
1324-
1325 return;
never executed: return;
0
1326 }-
1327-
1328#ifndef QT_NO_OPENGL-
1329 foreach (QPlatformTextureList *tl, tlwExtra->widgetTextures) {-
1330 for (int i = 0; i < tl->count(); ++i) {
i < tl->count()Description
TRUEnever evaluated
FALSEnever evaluated
0
1331 QWidget *w = static_cast<QWidget *>(tl->source(i));-
1332 if (dirtyRenderToTextureWidgets.contains(w)) {
dirtyRenderToT...ts.contains(w)Description
TRUEnever evaluated
FALSEnever evaluated
0
1333 const QRect rect = tl->geometry(i); // mapped to the tlw already-
1334 // Set a flag to indicate that the paint event for this-
1335 // render-to-texture widget must not to be optimized away.-
1336 w->d_func()->renderToTextureReallyDirty = 1;-
1337 dirty += rect;-
1338 toClean += rect;-
1339 }
never executed: end of block
0
1340 }
never executed: end of block
0
1341 }
never executed: end of block
0
1342 for (int i = 0; i < dirtyRenderToTextureWidgets.count(); ++i)
i < dirtyRende...idgets.count()Description
TRUEnever evaluated
FALSEnever evaluated
0
1343 resetWidget(dirtyRenderToTextureWidgets.at(i));
never executed: resetWidget(dirtyRenderToTextureWidgets.at(i));
0
1344 dirtyRenderToTextureWidgets.clear();-
1345#endif-
1346-
1347#ifndef QT_NO_GRAPHICSVIEW-
1348 if (tlw->d_func()->extra->proxyWidget) {
tlw->d_func()-...a->proxyWidgetDescription
TRUEnever evaluated
FALSEnever evaluated
0
1349 updateStaticContentsSize();-
1350 dirty = QRegion();-
1351 updateRequestSent = false;-
1352 const QVector<QRect> rects(toClean.rects());-
1353 for (int i = 0; i < rects.size(); ++i)
i < rects.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
1354 tlw->d_func()->extra->proxyWidget->update(rects.at(i));
never executed: tlw->d_func()->extra->proxyWidget->update(rects.at(i));
0
1355 return;
never executed: return;
0
1356 }-
1357#endif-
1358-
1359 BeginPaintInfo beginPaintInfo;-
1360 beginPaint(toClean, tlw, store, &beginPaintInfo);-
1361 if (beginPaintInfo.nothingToPaint) {
beginPaintInfo.nothingToPaintDescription
TRUEnever evaluated
FALSEnever evaluated
0
1362 for (int i = 0; i < opaqueNonOverlappedWidgets.size(); ++i)
i < opaqueNonO...Widgets.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
1363 resetWidget(opaqueNonOverlappedWidgets[i]);
never executed: resetWidget(opaqueNonOverlappedWidgets[i]);
0
1364 dirty = QRegion();-
1365 updateRequestSent = false;-
1366 return;
never executed: return;
0
1367 }-
1368-
1369 // Must do this before sending any paint events because-
1370 // the size may change in the paint event.-
1371 updateStaticContentsSize();-
1372 const QRegion dirtyCopy(dirty);-
1373 dirty = QRegion();-
1374 updateRequestSent = false;-
1375-
1376 // Paint opaque non overlapped widgets.-
1377 for (int i = 0; i < opaqueNonOverlappedWidgets.size(); ++i) {
i < opaqueNonO...Widgets.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
1378 QWidget *w = opaqueNonOverlappedWidgets[i];-
1379 QWidgetPrivate *wd = w->d_func();-
1380-
1381 int flags = QWidgetPrivate::DrawRecursive;-
1382 // Scrolled and moved widgets must draw all children.-
1383 if (!wd->isScrolled && !wd->isMoved)
!wd->isScrolledDescription
TRUEnever evaluated
FALSEnever evaluated
!wd->isMovedDescription
TRUEnever evaluated
FALSEnever evaluated
0
1384 flags |= QWidgetPrivate::DontDrawOpaqueChildren;
never executed: flags |= QWidgetPrivate::DontDrawOpaqueChildren;
0
1385 if (w == tlw)
w == tlwDescription
TRUEnever evaluated
FALSEnever evaluated
0
1386 flags |= QWidgetPrivate::DrawAsRoot;
never executed: flags |= QWidgetPrivate::DrawAsRoot;
0
1387-
1388 QRegion toBePainted(wd->dirty);-
1389 resetWidget(w);-
1390-
1391 QPoint offset(tlwOffset);-
1392 if (w != tlw)
w != tlwDescription
TRUEnever evaluated
FALSEnever evaluated
0
1393 offset += w->mapTo(tlw, QPoint());
never executed: offset += w->mapTo(tlw, QPoint());
0
1394 wd->drawWidget(store->paintDevice(), toBePainted, offset, flags, 0, this);-
1395 }
never executed: end of block
0
1396-
1397 // Paint the rest with composition.-
1398 if (repaintAllWidgets || !dirtyCopy.isEmpty()) {
repaintAllWidgetsDescription
TRUEnever evaluated
FALSEnever evaluated
!dirtyCopy.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
1399 const int flags = QWidgetPrivate::DrawAsRoot | QWidgetPrivate::DrawRecursive;-
1400 tlw->d_func()->drawWidget(store->paintDevice(), dirtyCopy, tlwOffset, flags, 0, this);-
1401 }
never executed: end of block
0
1402-
1403 endPaint(toClean, store, &beginPaintInfo);-
1404}
never executed: end of block
0
1405-
1406/*!-
1407 Flushes the contents of the backing store into the top-level widget.-
1408 If the \a widget is non-zero, the content is flushed to the \a widget.-
1409 If the \a surface is non-zero, the content of the \a surface is flushed.-
1410*/-
1411void QWidgetBackingStore::flush(QWidget *widget)-
1412{-
1413 const bool hasDirtyOnScreenWidgets = dirtyOnScreenWidgets && !dirtyOnScreenWidgets->isEmpty();
dirtyOnScreenWidgetsDescription
TRUEnever evaluated
FALSEnever evaluated
!dirtyOnScreen...ets->isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
1414 bool flushed = false;-
1415-
1416 // Flush the region in dirtyOnScreen.-
1417 if (!dirtyOnScreen.isEmpty()) {
!dirtyOnScreen.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
1418 QWidget *target = widget ? widget : tlw;
widgetDescription
TRUEnever evaluated
FALSEnever evaluated
0
1419 qt_flush(target, dirtyOnScreen, store, tlw, tlwOffset, widgetTexturesFor(tlw, tlw), this);-
1420 dirtyOnScreen = QRegion();-
1421 flushed = true;-
1422 }
never executed: end of block
0
1423-
1424 // Render-to-texture widgets are not in dirtyOnScreen so flush if we have not done it above.-
1425 if (!flushed && !hasDirtyOnScreenWidgets) {
!flushedDescription
TRUEnever evaluated
FALSEnever evaluated
!hasDirtyOnScreenWidgetsDescription
TRUEnever evaluated
FALSEnever evaluated
0
1426#ifndef QT_NO_OPENGL-
1427 if (!tlw->d_func()->topData()->widgetTextures.isEmpty()) {
!tlw->d_func()...ures.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
1428 QPlatformTextureList *tl = widgetTexturesFor(tlw, tlw);-
1429 if (tl) {
tlDescription
TRUEnever evaluated
FALSEnever evaluated
0
1430 QWidget *target = widget ? widget : tlw;
widgetDescription
TRUEnever evaluated
FALSEnever evaluated
0
1431 qt_flush(target, QRegion(), store, tlw, tlwOffset, tl, this);-
1432 }
never executed: end of block
0
1433 }
never executed: end of block
0
1434#endif-
1435 }
never executed: end of block
0
1436-
1437 if (!hasDirtyOnScreenWidgets)
!hasDirtyOnScreenWidgetsDescription
TRUEnever evaluated
FALSEnever evaluated
0
1438 return;
never executed: return;
0
1439-
1440 for (int i = 0; i < dirtyOnScreenWidgets->size(); ++i) {
i < dirtyOnScr...idgets->size()Description
TRUEnever evaluated
FALSEnever evaluated
0
1441 QWidget *w = dirtyOnScreenWidgets->at(i);-
1442 QWidgetPrivate *wd = w->d_func();-
1443 Q_ASSERT(wd->needsFlush);-
1444 QPlatformTextureList *widgetTexturesForNative = wd->textureChildSeen ? widgetTexturesFor(tlw, w) : 0;
wd->textureChildSeenDescription
TRUEnever evaluated
FALSEnever evaluated
0
1445 qt_flush(w, *wd->needsFlush, store, tlw, tlwOffset, widgetTexturesForNative, this);-
1446 *wd->needsFlush = QRegion();-
1447 }
never executed: end of block
0
1448 dirtyOnScreenWidgets->clear();-
1449}
never executed: end of block
0
1450-
1451static inline bool discardInvalidateBufferRequest(QWidget *widget, QTLWExtra *tlwExtra)-
1452{-
1453 Q_ASSERT(widget);-
1454 if (QApplication::closingDown())
QApplication::closingDown()Description
TRUEnever evaluated
FALSEnever evaluated
0
1455 return true;
never executed: return true;
0
1456-
1457 if (!tlwExtra || tlwExtra->inTopLevelResize || !tlwExtra->backingStore)
!tlwExtraDescription
TRUEnever evaluated
FALSEnever evaluated
tlwExtra->inTopLevelResizeDescription
TRUEnever evaluated
FALSEnever evaluated
!tlwExtra->backingStoreDescription
TRUEnever evaluated
FALSEnever evaluated
0
1458 return true;
never executed: return true;
0
1459-
1460 if (!widget->isVisible() || !widget->updatesEnabled())
!widget->isVisible()Description
TRUEnever evaluated
FALSEnever evaluated
!widget->updatesEnabled()Description
TRUEnever evaluated
FALSEnever evaluated
0
1461 return true;
never executed: return true;
0
1462-
1463 return false;
never executed: return false;
0
1464}-
1465-
1466/*!-
1467 Invalidates the buffer when the widget is resized.-
1468 Static areas are never invalidated unless absolutely needed.-
1469*/-
1470void QWidgetPrivate::invalidateBuffer_resizeHelper(const QPoint &oldPos, const QSize &oldSize)-
1471{-
1472 Q_Q(QWidget);-
1473 Q_ASSERT(!q->isWindow());-
1474 Q_ASSERT(q->parentWidget());-
1475-
1476 const bool staticContents = q->testAttribute(Qt::WA_StaticContents);-
1477 const bool sizeDecreased = (data.crect.width() < oldSize.width())
(data.crect.wi...dSize.width())Description
TRUEnever evaluated
FALSEnever evaluated
0
1478 || (data.crect.height() < oldSize.height());
(data.crect.he...Size.height())Description
TRUEnever evaluated
FALSEnever evaluated
0
1479-
1480 const QPoint offset(data.crect.x() - oldPos.x(), data.crect.y() - oldPos.y());-
1481 const bool parentAreaExposed = !offset.isNull() || sizeDecreased;
!offset.isNull()Description
TRUEnever evaluated
FALSEnever evaluated
sizeDecreasedDescription
TRUEnever evaluated
FALSEnever evaluated
0
1482 const QRect newWidgetRect(q->rect());-
1483 const QRect oldWidgetRect(0, 0, oldSize.width(), oldSize.height());-
1484-
1485 if (!staticContents || graphicsEffect) {
!staticContentsDescription
TRUEnever evaluated
FALSEnever evaluated
graphicsEffectDescription
TRUEnever evaluated
FALSEnever evaluated
0
1486 QRegion staticChildren;-
1487 QWidgetBackingStore *bs = 0;-
1488 if (offset.isNull() && (bs = maybeBackingStore()))
offset.isNull()Description
TRUEnever evaluated
FALSEnever evaluated
(bs = maybeBackingStore())Description
TRUEnever evaluated
FALSEnever evaluated
0
1489 staticChildren = bs->staticContents(q, oldWidgetRect);
never executed: staticChildren = bs->staticContents(q, oldWidgetRect);
0
1490 const bool hasStaticChildren = !staticChildren.isEmpty();-
1491-
1492 if (hasStaticChildren) {
hasStaticChildrenDescription
TRUEnever evaluated
FALSEnever evaluated
0
1493 QRegion dirty(newWidgetRect);-
1494 dirty -= staticChildren;-
1495 invalidateBuffer(dirty);-
1496 } else {
never executed: end of block
0
1497 // Entire widget needs repaint.-
1498 invalidateBuffer(newWidgetRect);-
1499 }
never executed: end of block
0
1500-
1501 if (!parentAreaExposed)
!parentAreaExposedDescription
TRUEnever evaluated
FALSEnever evaluated
0
1502 return;
never executed: return;
0
1503-
1504 // Invalidate newly exposed area of the parent.-
1505 if (!graphicsEffect && extra && extra->hasMask) {
!graphicsEffectDescription
TRUEnever evaluated
FALSEnever evaluated
extraDescription
TRUEnever evaluated
FALSEnever evaluated
extra->hasMaskDescription
TRUEnever evaluated
FALSEnever evaluated
0
1506 QRegion parentExpose(extra->mask.translated(oldPos));-
1507 parentExpose &= QRect(oldPos, oldSize);-
1508 if (hasStaticChildren)
hasStaticChildrenDescription
TRUEnever evaluated
FALSEnever evaluated
0
1509 parentExpose -= data.crect; // Offset is unchanged, safe to do this.
never executed: parentExpose -= data.crect;
0
1510 q->parentWidget()->d_func()->invalidateBuffer(parentExpose);-
1511 } else {
never executed: end of block
0
1512 if (hasStaticChildren && !graphicsEffect) {
hasStaticChildrenDescription
TRUEnever evaluated
FALSEnever evaluated
!graphicsEffectDescription
TRUEnever evaluated
FALSEnever evaluated
0
1513 QRegion parentExpose(QRect(oldPos, oldSize));-
1514 parentExpose -= data.crect; // Offset is unchanged, safe to do this.-
1515 q->parentWidget()->d_func()->invalidateBuffer(parentExpose);-
1516 } else {
never executed: end of block
0
1517 q->parentWidget()->d_func()->invalidateBuffer(effectiveRectFor(QRect(oldPos, oldSize)));-
1518 }
never executed: end of block
0
1519 }-
1520 return;
never executed: return;
0
1521 }-
1522-
1523 // Move static content to its new position.-
1524 if (!offset.isNull()) {
!offset.isNull()Description
TRUEnever evaluated
FALSEnever evaluated
0
1525 if (sizeDecreased) {
sizeDecreasedDescription
TRUEnever evaluated
FALSEnever evaluated
0
1526 const QSize minSize(qMin(oldSize.width(), data.crect.width()),-
1527 qMin(oldSize.height(), data.crect.height()));-
1528 moveRect(QRect(oldPos, minSize), offset.x(), offset.y());-
1529 } else {
never executed: end of block
0
1530 moveRect(QRect(oldPos, oldSize), offset.x(), offset.y());-
1531 }
never executed: end of block
0
1532 }-
1533-
1534 // Invalidate newly visible area of the widget.-
1535 if (!sizeDecreased || !oldWidgetRect.contains(newWidgetRect)) {
!sizeDecreasedDescription
TRUEnever evaluated
FALSEnever evaluated
!oldWidgetRect...newWidgetRect)Description
TRUEnever evaluated
FALSEnever evaluated
0
1536 QRegion newVisible(newWidgetRect);-
1537 newVisible -= oldWidgetRect;-
1538 invalidateBuffer(newVisible);-
1539 }
never executed: end of block
0
1540-
1541 if (!parentAreaExposed)
!parentAreaExposedDescription
TRUEnever evaluated
FALSEnever evaluated
0
1542 return;
never executed: return;
0
1543-
1544 // Invalidate newly exposed area of the parent.-
1545 const QRect oldRect(oldPos, oldSize);-
1546 if (extra && extra->hasMask) {
extraDescription
TRUEnever evaluated
FALSEnever evaluated
extra->hasMaskDescription
TRUEnever evaluated
FALSEnever evaluated
0
1547 QRegion parentExpose(oldRect);-
1548 parentExpose &= extra->mask.translated(oldPos);-
1549 parentExpose -= (extra->mask.translated(data.crect.topLeft()) & data.crect);-
1550 q->parentWidget()->d_func()->invalidateBuffer(parentExpose);-
1551 } else {
never executed: end of block
0
1552 QRegion parentExpose(oldRect);-
1553 parentExpose -= data.crect;-
1554 q->parentWidget()->d_func()->invalidateBuffer(parentExpose);-
1555 }
never executed: end of block
0
1556}-
1557-
1558/*!-
1559 Invalidates the \a rgn (in widget's coordinates) of the backing store, i.e.-
1560 all widgets intersecting with the region will be repainted when the backing store-
1561 is synced.-
1562-
1563 ### Qt 4.6: Merge into a template function (after MSVC isn't supported anymore).-
1564*/-
1565void QWidgetPrivate::invalidateBuffer(const QRegion &rgn)-
1566{-
1567 Q_Q(QWidget);-
1568-
1569 QTLWExtra *tlwExtra = q->window()->d_func()->maybeTopData();-
1570 if (discardInvalidateBufferRequest(q, tlwExtra) || rgn.isEmpty())
discardInvalid...t(q, tlwExtra)Description
TRUEnever evaluated
FALSEnever evaluated
rgn.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
1571 return;
never executed: return;
0
1572-
1573 QRegion wrgn(rgn);-
1574 wrgn &= clipRect();-
1575 if (!graphicsEffect && extra && extra->hasMask)
!graphicsEffectDescription
TRUEnever evaluated
FALSEnever evaluated
extraDescription
TRUEnever evaluated
FALSEnever evaluated
extra->hasMaskDescription
TRUEnever evaluated
FALSEnever evaluated
0
1576 wrgn &= extra->mask;
never executed: wrgn &= extra->mask;
0
1577 if (wrgn.isEmpty())
wrgn.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
1578 return;
never executed: return;
0
1579-
1580 tlwExtra->backingStoreTracker->markDirty(wrgn, q,-
1581 QWidgetBackingStore::UpdateLater, QWidgetBackingStore::BufferInvalid);-
1582}
never executed: end of block
0
1583-
1584/*!-
1585 This function is equivalent to calling invalidateBuffer(QRegion(rect), ...), but-
1586 is more efficient as it eliminates QRegion operations/allocations and can-
1587 use the rect more precisely for additional cut-offs.-
1588-
1589 ### Qt 4.6: Merge into a template function (after MSVC isn't supported anymore).-
1590*/-
1591void QWidgetPrivate::invalidateBuffer(const QRect &rect)-
1592{-
1593 Q_Q(QWidget);-
1594-
1595 QTLWExtra *tlwExtra = q->window()->d_func()->maybeTopData();-
1596 if (discardInvalidateBufferRequest(q, tlwExtra) || rect.isEmpty())
discardInvalid...t(q, tlwExtra)Description
TRUEnever evaluated
FALSEnever evaluated
rect.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
1597 return;
never executed: return;
0
1598-
1599 QRect wRect(rect);-
1600 wRect &= clipRect();-
1601 if (wRect.isEmpty())
wRect.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
1602 return;
never executed: return;
0
1603-
1604 if (graphicsEffect || !extra || !extra->hasMask) {
graphicsEffectDescription
TRUEnever evaluated
FALSEnever evaluated
!extraDescription
TRUEnever evaluated
FALSEnever evaluated
!extra->hasMaskDescription
TRUEnever evaluated
FALSEnever evaluated
0
1605 tlwExtra->backingStoreTracker->markDirty(wRect, q,-
1606 QWidgetBackingStore::UpdateLater, QWidgetBackingStore::BufferInvalid);-
1607 return;
never executed: return;
0
1608 }-
1609-
1610 QRegion wRgn(extra->mask);-
1611 wRgn &= wRect;-
1612 if (wRgn.isEmpty())
wRgn.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
1613 return;
never executed: return;
0
1614-
1615 tlwExtra->backingStoreTracker->markDirty(wRgn, q,-
1616 QWidgetBackingStore::UpdateLater, QWidgetBackingStore::BufferInvalid);-
1617}
never executed: end of block
0
1618-
1619void QWidgetPrivate::repaint_sys(const QRegion &rgn)-
1620{-
1621 if (data.in_destructor)
data.in_destructorDescription
TRUEnever evaluated
FALSEnever evaluated
0
1622 return;
never executed: return;
0
1623-
1624 Q_Q(QWidget);-
1625 if (discardSyncRequest(q, maybeTopData()))
discardSyncReq...aybeTopData())Description
TRUEnever evaluated
FALSEnever evaluated
0
1626 return;
never executed: return;
0
1627-
1628 if (q->testAttribute(Qt::WA_StaticContents)) {
q->testAttribu...taticContents)Description
TRUEnever evaluated
FALSEnever evaluated
0
1629 if (!extra)
!extraDescription
TRUEnever evaluated
FALSEnever evaluated
0
1630 createExtra();
never executed: createExtra();
0
1631 extra->staticContentsSize = data.crect.size();-
1632 }
never executed: end of block
0
1633-
1634 QPaintEngine *engine = q->paintEngine();-
1635-
1636 // QGLWidget does not support partial updates if:-
1637 // 1) The context is double buffered-
1638 // 2) The context is single buffered and auto-fill background is enabled.-
1639 const bool noPartialUpdateSupport = (engine && (engine->type() == QPaintEngine::OpenGL
engineDescription
TRUEnever evaluated
FALSEnever evaluated
engine->type()...Engine::OpenGLDescription
TRUEnever evaluated
FALSEnever evaluated
0
1640 || engine->type() == QPaintEngine::OpenGL2))
engine->type()...ngine::OpenGL2Description
TRUEnever evaluated
FALSEnever evaluated
0
1641 && (usesDoubleBufferedGLContext || q->autoFillBackground());
usesDoubleBufferedGLContextDescription
TRUEnever evaluated
FALSEnever evaluated
q->autoFillBackground()Description
TRUEnever evaluated
FALSEnever evaluated
0
1642 QRegion toBePainted(noPartialUpdateSupport ? q->rect() : rgn);-
1643-
1644#ifdef Q_DEAD_CODE_FROM_QT4_MAC-
1645 // No difference between update() and repaint() on the Mac.-
1646 update_sys(toBePainted);-
1647 return;-
1648#endif-
1649-
1650 toBePainted &= clipRect();-
1651 clipToEffectiveMask(toBePainted);-
1652 if (toBePainted.isEmpty())
toBePainted.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
1653 return; // Nothing to repaint.
never executed: return;
0
1654-
1655#ifndef QT_NO_PAINT_DEBUG-
1656 bool flushed = QWidgetBackingStore::flushPaint(q, toBePainted);-
1657#endif-
1658-
1659 drawWidget(q, toBePainted, QPoint(), QWidgetPrivate::DrawAsRoot | QWidgetPrivate::DrawPaintOnScreen, 0);-
1660-
1661#ifndef QT_NO_PAINT_DEBUG-
1662 if (flushed)
flushedDescription
TRUEnever evaluated
FALSEnever evaluated
0
1663 QWidgetBackingStore::unflushPaint(q, toBePainted);
never executed: QWidgetBackingStore::unflushPaint(q, toBePainted);
0
1664#endif-
1665-
1666 if (q->paintingActive())
q->paintingActive()Description
TRUEnever evaluated
FALSEnever evaluated
0
1667 qWarning("QWidget::repaint: It is dangerous to leave painters active on a widget outside of the PaintEvent");
never executed: QMessageLogger(__FILE__, 1667, __PRETTY_FUNCTION__).warning("QWidget::repaint: It is dangerous to leave painters active on a widget outside of the PaintEvent");
0
1668}
never executed: end of block
0
1669-
1670-
1671QT_END_NAMESPACE-
1672-
1673#include "moc_qwidgetbackingstore_p.cpp"-
Source codeSwitch to Preprocessed file

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