qwidgetbackingstore.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/widgets/kernel/qwidgetbackingstore.cpp
Switch to Source codePreprocessed file
LineSourceCount
1-
2-
3-
4-
5-
6-
7-
8-
9-
10-
11-
12-
13extern QRegion qt_dirtyRegion(QWidget *);-
14-
15-
16namespace { namespace Q_QGS_qt_dummy_platformTextureList { typedef QPlatformTextureList Type; QBasicAtomicInt guard = { QtGlobalStatic::Uninitialized }; __attribute__((visibility("hidden"))) inline Type *innerFunction() { struct HolderBase { ~HolderBase() noexcept { if (guard.load() == QtGlobalStatic::Initialized) guard.store(QtGlobalStatic::Destroyed); } }; static struct Holder : public HolderBase { Type value; Holder() noexcept(noexcept(Type ())) : value () { guard.store(QtGlobalStatic::Initialized); } } holder; return &holder.value; } } } static QGlobalStatic<QPlatformTextureList, Q_QGS_qt_dummy_platformTextureList::innerFunction, Q_QGS_qt_dummy_platformTextureList::guard> qt_dummy_platformTextureList;-
17-
18-
19-
20-
21-
22-
23-
24void QWidgetBackingStore::qt_flush(QWidget *widget, const QRegion &region, QBackingStore *backingStore,-
25 QWidget *tlw, const QPoint &tlwOffset, QPlatformTextureList *widgetTextures,-
26 QWidgetBackingStore *widgetBackingStore)-
27{-
28-
29-
30-
31-
32 ((!(!region.isEmpty() || widgetTextures)) ? qt_assert("!region.isEmpty() || widgetTextures",__FILE__,8187) : qt_noop());-
33-
34 ((!(widget)) ? qt_assert("widget",__FILE__,8389) : qt_noop());-
35 ((!(backingStore)) ? qt_assert("backingStore",__FILE__,8490) : qt_noop());-
36 ((!(tlw)) ? qt_assert("tlw",__FILE__,8591) : qt_noop());-
37-
38 static int flushUpdate = qEnvironmentVariableIntValue("QT_FLUSH_UPDATE");-
39 if (flushUpdate > 0)-
40 QWidgetBackingStore::showYellowThing(widget, region, flushUpdate * 10, false);-
41-
42-
43 if (tlw->testAttribute(Qt::WA_DontShowOnScreen) || widget->testAttribute(Qt::WA_DontShowOnScreen))-
44 return;-
45 static bool fpsDebug = qEnvironmentVariableIntValue("QT_DEBUG_FPS");-
46 if (fpsDebug) {-
47 if (!widgetBackingStore->perfFrames++)-
48 widgetBackingStore->perfTime.start();-
49 if (widgetBackingStore->perfTime.elapsed() > 5000) {-
50 double fps = double(widgetBackingStore->perfFrames * 1000) / widgetBackingStore->perfTime.restart();-
51 QMessageLogger(__FILE__, 100106, __PRETTY_FUNCTION__).debug("FPS: %.1f\n", fps);-
52 widgetBackingStore->perfFrames = 0;-
53 }-
54 }-
55-
56 QPoint offset = tlwOffset;-
57 if (widget != tlw)-
58 offset += widget->mapTo(tlw, QPoint());-
59-
60 QRegion effectiveRegion = region;-
61-
62 const bool compositionWasActive = widget->d_func()->renderToTextureComposeActive;-
63 if (!widgetTextures) {-
64 widget->d_func()->renderToTextureComposeActive = false;-
65-
66-
67-
68-
69 if (compositionWasActive)-
70 widgetTextures = qt_dummy_platformTextureList;-
71 } else {-
72 widget->d_func()->renderToTextureComposeActive = true;-
73 }-
74-
75-
76-
77 if (compositionWasActive != widget->d_func()->renderToTextureComposeActive)-
78 effectiveRegion = widget->rect();-
79-
80-
81 if (widgetTextures) {-
82 qt_window_private(tlw->windowHandle())->compositing = true;-
83 widget->window()->d_func()->sendComposeStatus(widget->window(), false);-
84-
85-
86-
87 const bool translucentBackground = widget->testAttribute(Qt::WA_TranslucentBackground);-
88-
89-
90 backingStore->handle()->composeAndFlush(widget->windowHandle(), effectiveRegion, offset, widgetTextures,-
91 tlw->d_func()->shareContext(), translucentBackground);-
92 widget->window()->d_func()->sendComposeStatus(widget->window(), true);-
93 } else-
94-
95 backingStore->flush(effectiveRegion, widget->windowHandle(), offset);-
96}-
97void QWidgetBackingStore::showYellowThing(QWidget *widget, const QRegion &toBePainted, int msec, bool unclipped)-
98{-
99-
100-
101-
102 QRegion paintRegion = toBePainted;-
103 QRect widgetRect = widget->rect();-
104-
105 if (!widget->internalWinId()) {-
106 QWidget *nativeParent = widget->nativeParentWidget();-
107 const QPoint offset = widget->mapTo(nativeParent, QPoint(0, 0));-
108 paintRegion.translate(offset);-
109 widgetRect.translate(offset);-
110 widget = nativeParent;-
111 }-
112-
113-
114-
115-
116-
117-
118 bool paintUnclipped = widget->testAttribute(Qt::WA_PaintUnclipped);-
119 if (unclipped && !widget->d_func()->paintOnScreen())-
120 widget->setAttribute(Qt::WA_PaintUnclipped);-
121-
122 const bool setFlag = !widget->testAttribute(Qt::WA_WState_InPaintEvent);-
123 if (setFlag)-
124 widget->setAttribute(Qt::WA_WState_InPaintEvent);-
125-
126-
127 QPaintEngine *pe = widget->paintEngine();-
128 if (pe) {-
129 pe->setSystemClip(paintRegion);-
130 {-
131 QPainter p(widget);-
132 p.setClipRegion(paintRegion);-
133 static int i = 0;-
134 switch (i) {-
135 case 0:-
136 p.fillRect(widgetRect, QColor(255,255,0));-
137 break;-
138 case 1:-
139 p.fillRect(widgetRect, QColor(255,200,55));-
140 break;-
141 case 2:-
142 p.fillRect(widgetRect, QColor(200,255,55));-
143 break;-
144 case 3:-
145 p.fillRect(widgetRect, QColor(200,200,0));-
146 break;-
147 }-
148 i = (i+1) & 3;-
149 p.end();-
150 }-
151 }-
152-
153 if (setFlag)-
154 widget->setAttribute(Qt::WA_WState_InPaintEvent, false);-
155-
156-
157 widget->setAttribute(Qt::WA_PaintUnclipped, paintUnclipped);-
158-
159 if (pe)-
160 pe->setSystemClip(QRegion());-
161-
162-
163 ::usleep(1000 * msec);-
164-
165-
166}-
167-
168bool QWidgetBackingStore::flushPaint(QWidget *widget, const QRegion &rgn)-
169{-
170 if (!widget)-
171 return false;-
172-
173 int delay = 0;-
174 if (widget->testAttribute(Qt::WA_WState_InPaintEvent)) {-
175 static int flushPaintEvent = qEnvironmentVariableIntValue("QT_FLUSH_PAINT_EVENT");-
176 if (!flushPaintEvent)-
177 return false;-
178 delay = flushPaintEvent;-
179 } else {-
180 static int flushPaint = qEnvironmentVariableIntValue("QT_FLUSH_PAINT");-
181 if (!flushPaint)-
182 return false;-
183 delay = flushPaint;-
184 }-
185-
186 QWidgetBackingStore::showYellowThing(widget, rgn, delay * 10, true);-
187 return true;-
188}-
189-
190void QWidgetBackingStore::unflushPaint(QWidget *widget, const QRegion &rgn)-
191{-
192 if (widget->d_func()->paintOnScreen() || rgn.isEmpty())-
193 return;-
194-
195 QWidget *tlw = widget->window();-
196 QTLWExtra *tlwExtra = tlw->d_func()->maybeTopData();-
197 if (!tlwExtra)-
198 return;-
199-
200 const QPoint offset = widget->mapTo(tlw, QPoint());-
201 qt_flush(widget, rgn, tlwExtra->backingStoreTracker->store, tlw, offset, 0, tlw->d_func()->maybeBackingStore());-
202}-
203-
204-
205-
206-
207-
208-
209bool QWidgetBackingStore::bltRect(const QRect &rect, int dx, int dy, QWidget *widget)-
210{-
211 const QPoint pos(tlwOffset + widget->mapTo(tlw, rect.topLeft()));-
212 const QRect tlwRect(QRect(pos, rect.size()));-
213 if (fullUpdatePending || dirty.intersects(tlwRect))-
214 return false;-
215 return store->scroll(tlwRect, dx, dy);-
216}-
217-
218void QWidgetBackingStore::releaseBuffer()-
219{-
220 if (store)-
221 store->resize(QSize());-
222}-
223-
224-
225-
226-
227-
228-
229-
230void QWidgetBackingStore::beginPaint(QRegion &toClean, QWidget *widget, QBackingStore *backingStore,-
231 BeginPaintInfo *returnInfo, bool toCleanIsInTopLevelCoordinates)-
232{-
233 (void)widget;;-
234 (void)toCleanIsInTopLevelCoordinates;;-
235-
236-
237 dirtyOnScreen += toClean;-
238-
239-
240-
241-
242 returnInfo->wasFlushed = QWidgetBackingStore::flushPaint(tlw, toClean);-
243-
244-
245-
246-
247 if (!returnInfo->wasFlushed)-
248 backingStore->beginPaint(toClean);-
249-
250-
251 (void)returnInfo;;-
252}-
253-
254void QWidgetBackingStore::endPaint(const QRegion &cleaned, QBackingStore *backingStore,-
255 BeginPaintInfo *beginPaintInfo)-
256{-
257-
258 if (!beginPaintInfo->wasFlushed)-
259 backingStore->endPaint();-
260 else-
261 QWidgetBackingStore::unflushPaint(tlw, cleaned);-
262-
263-
264-
265-
266-
267-
268 flush();-
269}-
270-
271-
272-
273-
274-
275-
276-
277QRegion QWidgetBackingStore::dirtyRegion(QWidget *widget) const-
278{-
279 const bool widgetDirty = widget && widget != tlw;-
280 const QRect tlwRect(topLevelRect());-
281 const QRect surfaceGeometry(tlwRect.topLeft(), store->size());-
282 if (fullUpdatePending || (surfaceGeometry != tlwRect && surfaceGeometry.size() != tlwRect.size())) {-
283 if (widgetDirty) {-
284 const QRect dirtyTlwRect = QRect(QPoint(), tlwRect.size());-
285 const QPoint offset(widget->mapTo(tlw, QPoint()));-
286 const QRect dirtyWidgetRect(dirtyTlwRect & widget->rect().translated(offset));-
287 return dirtyWidgetRect.translated(-offset);-
288 }-
289 return QRect(QPoint(), tlwRect.size());-
290 }-
291-
292-
293 QRegion r(dirty);-
294 for (int i = 0; i < dirtyWidgets.size(); ++i) {-
295 QWidget *w = dirtyWidgets.at(i);-
296 if (widgetDirty && w != widget && !widget->isAncestorOf(w))-
297 continue;-
298 r += w->d_func()->dirty.translated(w->mapTo(tlw, QPoint()));-
299 }-
300-
301-
302 r += dirtyOnScreen;-
303-
304 if (dirtyOnScreenWidgets) {-
305 for (int i = 0; i < dirtyOnScreenWidgets->size(); ++i) {-
306 QWidget *w = dirtyOnScreenWidgets->at(i);-
307 if (widgetDirty && w != widget && !widget->isAncestorOf(w))-
308 continue;-
309 QWidgetPrivate *wd = w->d_func();-
310 ((!(wd->needsFlush)) ? qt_assert("wd->needsFlush",__FILE__,403409) : qt_noop());-
311 r += wd->needsFlush->translated(w->mapTo(tlw, QPoint()));-
312 }-
313 }-
314-
315 if (widgetDirty) {-
316-
317 const QPoint offset(widget->mapTo(tlw, QPoint()));-
318 r &= widget->rect().translated(offset);-
319 r.translate(-offset);-
320 }-
321 return r;-
322}-
323-
324-
325-
326-
327-
328-
329QRegion QWidgetBackingStore::staticContents(QWidget *parent, const QRect &withinClipRect) const-
330{-
331 if (!parent && tlw->testAttribute(Qt::WA_StaticContents)) {-
332 const QSize surfaceGeometry(store->size());-
333 QRect surfaceRect(0, 0, surfaceGeometry.width(), surfaceGeometry.height());-
334 if (!withinClipRect.isEmpty())-
335 surfaceRect &= withinClipRect;-
336 return QRegion(surfaceRect);-
337 }-
338-
339 QRegion region;-
340 if (parent && parent->d_func()->children.isEmpty())-
341 return region;-
342-
343 const bool clipToRect = !withinClipRect.isEmpty();-
344 const int count = staticWidgets.count();-
345 for (int i = 0; i < count; ++i) {-
346 QWidget *w = staticWidgets.at(i);-
347 QWidgetPrivate *wd = w->d_func();-
348 if (!wd->isOpaque || !wd->extra || wd->extra->staticContentsSize.isEmpty()-
349 || !w->isVisible() || (parent && !parent->isAncestorOf(w))) {-
350 continue;-
351 }-
352-
353 QRect rect(0, 0, wd->extra->staticContentsSize.width(), wd->extra->staticContentsSize.height());-
354 const QPoint offset = w->mapTo(parent ? parent : tlw, QPoint());-
355 if (clipToRect)-
356 rect &= withinClipRect.translated(-offset);-
357 if (rect.isEmpty())-
358 continue;-
359-
360 rect &= wd->clipRect();-
361 if (rect.isEmpty())-
362 continue;-
363-
364 QRegion visible(rect);-
365 wd->clipToEffectiveMask(visible);-
366 if (visible.isEmpty())-
367 continue;-
368 wd->subtractOpaqueSiblings(visible, 0, true);-
369-
370 visible.translate(offset);-
371 region += visible;-
372 }-
373-
374 return region;-
375}-
376-
377void QWidgetBackingStore::sendUpdateRequest(QWidget *widget, UpdateTime updateTime)-
378{-
379 if (!widget)-
380 return;-
381-
382-
383-
384-
385-
386-
387 QWidget *w = widget->window();-
388 if (updateTime == UpdateNow && w && w->windowHandle() && QWindowPrivate::get(w->windowHandle())->compositing) {-
389 int refresh = 60;-
390 QScreen *ws = w->windowHandle()->screen();-
391 if (ws)-
392 refresh = ws->refreshRate();-
393 QWindowPrivate *wd = QWindowPrivate::get(w->windowHandle());-
394 if (wd->lastComposeTime.isValid()) {-
395 const qint64 elapsed = wd->lastComposeTime.elapsed();-
396 if (elapsed <= qint64(1000.0f / refresh))-
397 updateTime = UpdateLater;-
398 }-
399 }-
400-
401-
402 switch (updateTime) {-
403 case UpdateLater:-
404 updateRequestSent = true;-
405 QApplication::postEvent(widget, new QEvent(QEvent::UpdateRequest), Qt::LowEventPriority);-
406 break;-
407 case UpdateNow: {-
408 QEvent event(QEvent::UpdateRequest);-
409 QApplication::sendEvent(widget, &event);-
410 break;-
411 }-
412 }-
413}-
414void QWidgetBackingStore::markDirty(const QRegion &rgn, QWidget *widget,-
415 UpdateTime updateTime, BufferState bufferState)-
416{-
417 ((!(tlw->d_func()->extra)) ? qt_assert("tlw->d_func()->extra",__FILE__,524530) : qt_noop());-
418 ((!(tlw->d_func()->extra->topextra)) ? qt_assert("tlw->d_func()->extra->topextra",__FILE__,525531) : qt_noop());-
419 ((!(!tlw->d_func()->extra->topextra->inTopLevelResize)) ? qt_assert("!tlw->d_func()->extra->topextra->inTopLevelResize",__FILE__,526532) : qt_noop());-
420 ((!(widget->isVisible() && widget->updatesEnabled())) ? qt_assert("widget->isVisible() && widget->updatesEnabled()",__FILE__,527533) : qt_noop());-
421 ((!(widget->window() == tlw)) ? qt_assert("widget->window() == tlw",__FILE__,528534) : qt_noop());-
422 ((!(!rgn.isEmpty())) ? qt_assert("!rgn.isEmpty()",__FILE__,529535) : qt_noop());-
423-
424-
425 widget->d_func()->invalidateGraphicsEffectsRecursively();-
426-
427-
428 if (widget->d_func()->paintOnScreen()) {-
429 if (widget->d_func()->dirty.isEmpty()) {-
430 widget->d_func()->dirty = rgn;-
431 sendUpdateRequest(widget, updateTime);-
432 return;-
433 } else if (qt_region_strictContains(widget->d_func()->dirty, widget->rect())) {-
434 if (updateTime == UpdateNow)-
435 sendUpdateRequest(widget, updateTime);-
436 return;-
437 }-
438-
439 const bool eventAlreadyPosted = !widget->d_func()->dirty.isEmpty();-
440 widget->d_func()->dirty += rgn;-
441 if (!eventAlreadyPosted || updateTime == UpdateNow)-
442 sendUpdateRequest(widget, updateTime);-
443 return;-
444 }-
445-
446-
447 if (fullUpdatePending) {-
448 if (updateTime == UpdateNow)-
449 sendUpdateRequest(tlw, updateTime);-
450 return;-
451 }-
452-
453 const QPoint offset = widget->mapTo(tlw, QPoint());-
454-
455 if (QWidgetPrivate::get(widget)->renderToTexture) {-
456 if (!widget->d_func()->inDirtyList)-
457 addDirtyRenderToTextureWidget(widget);-
458 if (!updateRequestSent || updateTime == UpdateNow)-
459 sendUpdateRequest(tlw, updateTime);-
460 return;-
461 }-
462-
463 const QRect widgetRect = widget->d_func()->effectiveRectFor(widget->rect());-
464 if (qt_region_strictContains(dirty, widgetRect.translated(offset))) {-
465 if (updateTime == UpdateNow)-
466 sendUpdateRequest(tlw, updateTime);-
467 return;-
468 }-
469-
470 if (bufferState == BufferInvalid) {-
471 const bool eventAlreadyPosted = !dirty.isEmpty() || updateRequestSent;-
472-
473 if (widget->d_func()->graphicsEffect)-
474 dirty += widget->d_func()->effectiveRectFor(rgn.boundingRect()).translated(offset);-
475 else-
476-
477 dirty += rgn.translated(offset);-
478 if (!eventAlreadyPosted || updateTime == UpdateNow)-
479 sendUpdateRequest(tlw, updateTime);-
480 return;-
481 }-
482-
483 if (dirtyWidgets.isEmpty()) {-
484 addDirtyWidget(widget, rgn);-
485 sendUpdateRequest(tlw, updateTime);-
486 return;-
487 }-
488-
489 if (widget->d_func()->inDirtyList) {-
490 if (!qt_region_strictContains(widget->d_func()->dirty, widgetRect)) {-
491-
492 if (widget->d_func()->graphicsEffect)-
493 widget->d_func()->dirty += widget->d_func()->effectiveRectFor(rgn.boundingRect());-
494 else-
495-
496 widget->d_func()->dirty += rgn;-
497 }-
498 } else {-
499 addDirtyWidget(widget, rgn);-
500 }-
501-
502 if (updateTime == UpdateNow)-
503 sendUpdateRequest(tlw, updateTime);-
504}-
505void QWidgetBackingStore::markDirty(const QRect &rect, QWidget *widget,-
506 UpdateTime updateTime, BufferState bufferState)-
507{-
508 ((!(tlw->d_func()->extra)) ? qt_assert("tlw->d_func()->extra",__FILE__,623629) : qt_noop());-
509 ((!(tlw->d_func()->extra->topextra)) ? qt_assert("tlw->d_func()->extra->topextra",__FILE__,624630) : qt_noop());-
510 ((!(!tlw->d_func()->extra->topextra->inTopLevelResize)) ? qt_assert("!tlw->d_func()->extra->topextra->inTopLevelResize",__FILE__,625631) : qt_noop());-
511 ((!(widget->isVisible() && widget->updatesEnabled())) ? qt_assert("widget->isVisible() && widget->updatesEnabled()",__FILE__,626632) : qt_noop());-
512 ((!(widget->window() == tlw)) ? qt_assert("widget->window() == tlw",__FILE__,627633) : qt_noop());-
513 ((!(!rect.isEmpty())) ? qt_assert("!rect.isEmpty()",__FILE__,628634) : qt_noop());-
514-
515-
516 widget->d_func()->invalidateGraphicsEffectsRecursively();-
517-
518-
519 if (widget->d_func()->paintOnScreen()) {-
520 if (widget->d_func()->dirty.isEmpty()) {-
521 widget->d_func()->dirty = QRegion(rect);-
522 sendUpdateRequest(widget, updateTime);-
523 return;-
524 } else if (qt_region_strictContains(widget->d_func()->dirty, rect)) {-
525 if (updateTime == UpdateNow)-
526 sendUpdateRequest(widget, updateTime);-
527 return;-
528 }-
529-
530 const bool eventAlreadyPosted = !widget->d_func()->dirty.isEmpty();-
531 widget->d_func()->dirty += rect;-
532 if (!eventAlreadyPosted || updateTime == UpdateNow)-
533 sendUpdateRequest(widget, updateTime);-
534 return;-
535 }-
536-
537 if (fullUpdatePending) {-
538 if (updateTime == UpdateNow)-
539 sendUpdateRequest(tlw, updateTime);-
540 return;-
541 }-
542-
543 if (QWidgetPrivate::get(widget)->renderToTexture) {-
544 if (!widget->d_func()->inDirtyList)-
545 addDirtyRenderToTextureWidget(widget);-
546 if (!updateRequestSent || updateTime == UpdateNow)-
547 sendUpdateRequest(tlw, updateTime);-
548 return;-
549 }-
550-
551-
552 const QRect widgetRect = widget->d_func()->effectiveRectFor(rect);-
553 QRect translatedRect = widgetRect;-
554 if (widget != tlw)-
555 translatedRect.translate(widget->mapTo(tlw, QPoint()));-
556-
557 translatedRect = translatedRect.intersected(QRect(QPoint(), tlw->size()));-
558 if (qt_region_strictContains(dirty, translatedRect)) {-
559 if (updateTime == UpdateNow)-
560 sendUpdateRequest(tlw, updateTime);-
561 return;-
562 }-
563-
564 if (bufferState == BufferInvalid) {-
565 const bool eventAlreadyPosted = !dirty.isEmpty();-
566 dirty += translatedRect;-
567 if (!eventAlreadyPosted || updateTime == UpdateNow)-
568 sendUpdateRequest(tlw, updateTime);-
569 return;-
570 }-
571-
572 if (dirtyWidgets.isEmpty()) {-
573 addDirtyWidget(widget, rect);-
574 sendUpdateRequest(tlw, updateTime);-
575 return;-
576 }-
577-
578 if (widget->d_func()->inDirtyList) {-
579 if (!qt_region_strictContains(widget->d_func()->dirty, widgetRect))-
580 widget->d_func()->dirty += widgetRect;-
581 } else {-
582 addDirtyWidget(widget, rect);-
583 }-
584-
585 if (updateTime == UpdateNow)-
586 sendUpdateRequest(tlw, updateTime);-
587}-
588-
589-
590-
591-
592-
593-
594-
595void QWidgetBackingStore::markDirtyOnScreen(const QRegion &region, QWidget *widget, const QPoint &topLevelOffset)-
596{-
597 if (!widget || widget->d_func()->paintOnScreen() || region.isEmpty())-
598 return;-
599 if (widget == tlw) {-
600 if (!widget->testAttribute(Qt::WA_WState_InPaintEvent))-
601 dirtyOnScreen += region;-
602 return;-
603 }-
604-
605-
606 if (!widget->internalWinId() && !widget->isWindow()) {-
607 QWidget *nativeParent = widget->nativeParentWidget();-
608 if (nativeParent == tlw) {-
609 if (!widget->testAttribute(Qt::WA_WState_InPaintEvent))-
610 dirtyOnScreen += region.translated(topLevelOffset);-
611 return;-
612 }-
613-
614-
615 QWidgetPrivate *nativeParentPrivate = nativeParent->d_func();-
616 if (!nativeParentPrivate->needsFlush)-
617 nativeParentPrivate->needsFlush = new QRegion;-
618 const QPoint nativeParentOffset = widget->mapTo(nativeParent, QPoint());-
619 *nativeParentPrivate->needsFlush += region.translated(nativeParentOffset);-
620 appendDirtyOnScreenWidget(nativeParent);-
621 return;-
622 }-
623-
624-
625 QWidgetPrivate *widgetPrivate = widget->d_func();-
626 if (!widgetPrivate->needsFlush)-
627 widgetPrivate->needsFlush = new QRegion;-
628 *widgetPrivate->needsFlush += region;-
629 appendDirtyOnScreenWidget(widget);-
630}-
631-
632void QWidgetBackingStore::removeDirtyWidget(QWidget *w)-
633{-
634 if (!w)-
635 return;-
636-
637 dirtyWidgetsRemoveAll(w);-
638 dirtyOnScreenWidgetsRemoveAll(w);-
639 dirtyRenderToTextureWidgets.removeAll(w);-
640 resetWidget(w);-
641-
642 QWidgetPrivate *wd = w->d_func();-
643 const int n = wd->children.count();-
644 for (int i = 0; i < n; ++i) {-
645 if (QWidget *child = qobject_cast<QWidget*>(wd->children.at(i)))-
646 removeDirtyWidget(child);-
647 }-
648}-
649-
650void QWidgetBackingStore::updateLists(QWidget *cur)-
651{-
652 if (!cur)-
653 return;-
654-
655 QList<QObject*> children = cur->children();-
656 for (int i = 0; i < children.size(); ++i) {-
657 QWidget *child = qobject_cast<QWidget*>(children.at(i));-
658 if (!child)-
659 continue;-
660-
661 updateLists(child);-
662 }-
663-
664 if (cur->testAttribute(Qt::WA_StaticContents))-
665 addStaticWidget(cur);-
666}-
667-
668QWidgetBackingStore::QWidgetBackingStore(QWidget *topLevel)-
669 : tlw(topLevel),-
670 dirtyOnScreenWidgets(0),-
671 fullUpdatePending(0),-
672 updateRequestSent(0),-
673 textureListWatcher(0),-
674 perfFrames(0)-
675{-
676 store = tlw->backingStore();-
677 ((!(store)) ? qt_assert("store",__FILE__,800806) : qt_noop());-
678-
679-
680 updateLists(topLevel);-
681}-
682-
683QWidgetBackingStore::~QWidgetBackingStore()-
684{-
685 for (int c = 0; c < dirtyWidgets.size(); ++c)-
686 resetWidget(dirtyWidgets.at(c));-
687 for (int c = 0; c < dirtyRenderToTextureWidgets.size(); ++c)-
688 resetWidget(dirtyRenderToTextureWidgets.at(c));-
689-
690 delete dirtyOnScreenWidgets;-
691}-
692-
693-
694-
695void QWidgetPrivate::moveRect(const QRect &rect, int dx, int dy)-
696{-
697 QWidget * const q = q_func();-
698 if (!q->isVisible() || (dx == 0 && dy == 0))-
699 return;-
700-
701 QWidget *tlw = q->window();-
702 QTLWExtra* x = tlw->d_func()->topData();-
703 if (x->inTopLevelResize)-
704 return;-
705-
706 static const bool accelEnv = qEnvironmentVariableIntValue("QT_NO_FAST_MOVE") == 0;-
707-
708 QWidget *pw = q->parentWidget();-
709 QPoint toplevelOffset = pw->mapTo(tlw, QPoint());-
710 QWidgetPrivate *pd = pw->d_func();-
711 QRect clipR(pd->clipRect());-
712 const QRect newRect(rect.translated(dx, dy));-
713 QRect destRect = rect.intersected(clipR);-
714 if (destRect.isValid())-
715 destRect = destRect.translated(dx, dy).intersected(clipR);-
716 const QRect sourceRect(destRect.translated(-dx, -dy));-
717 const QRect parentRect(rect & clipR);-
718 const bool nativeWithTextureChild = textureChildSeen && q->internalWinId();-
719-
720 bool accelerateMove = accelEnv && isOpaque && !nativeWithTextureChild-
721-
722-
723 && !tlw->d_func()->extra->proxyWidget-
724-
725 && !isOverlapped(sourceRect) && !isOverlapped(destRect);-
726-
727 if (!accelerateMove) {-
728 QRegion parentR(effectiveRectFor(parentRect));-
729 if (!extra || !extra->hasMask) {-
730 parentR -= newRect;-
731 } else {-
732-
733 parentR += newRect & clipR;-
734 }-
735 pd->invalidateBuffer(parentR);-
736 invalidateBuffer((newRect & clipR).translated(-data.crect.topLeft()));-
737 } else {-
738-
739 QWidgetBackingStore *wbs = x->backingStoreTracker.data();-
740 QRegion childExpose(newRect & clipR);-
741-
742 if (sourceRect.isValid() && wbs->bltRect(sourceRect, dx, dy, pw))-
743 childExpose -= destRect;-
744-
745 if (!pw->updatesEnabled())-
746 return;-
747-
748 const bool childUpdatesEnabled = q->updatesEnabled();-
749 if (childUpdatesEnabled && !childExpose.isEmpty()) {-
750 childExpose.translate(-data.crect.topLeft());-
751 wbs->markDirty(childExpose, q);-
752 isMoved = true;-
753 }-
754-
755 QRegion parentExpose(parentRect);-
756 parentExpose -= newRect;-
757 if (extra && extra->hasMask)-
758 parentExpose += QRegion(newRect) - extra->mask.translated(data.crect.topLeft());-
759-
760 if (!parentExpose.isEmpty()) {-
761 wbs->markDirty(parentExpose, pw);-
762 pd->isMoved = true;-
763 }-
764-
765 if (childUpdatesEnabled) {-
766 QRegion needsFlush(sourceRect);-
767 needsFlush += destRect;-
768 wbs->markDirtyOnScreen(needsFlush, pw, toplevelOffset);-
769 }-
770 }-
771}-
772-
773-
774void QWidgetPrivate::scrollRect(const QRect &rect, int dx, int dy)-
775{-
776 QWidget * const q = q_func();-
777 QWidget *tlw = q->window();-
778 QTLWExtra* x = tlw->d_func()->topData();-
779 if (x->inTopLevelResize)-
780 return;-
781-
782 QWidgetBackingStore *wbs = x->backingStoreTracker.data();-
783 if (!wbs)-
784 return;-
785-
786 static const bool accelEnv = qEnvironmentVariableIntValue("QT_NO_FAST_SCROLL") == 0;-
787-
788 QRect scrollRect = rect & clipRect();-
789 bool overlapped = false;-
790 bool accelerateScroll = accelEnv && isOpaque && !q_func()->testAttribute(Qt::WA_WState_InPaintEvent)-
791 && !(overlapped = isOverlapped(scrollRect.translated(data.crect.topLeft())));-
792-
793 if (!accelerateScroll) {-
794 if (overlapped) {-
795 QRegion region(scrollRect);-
796 subtractOpaqueSiblings(region);-
797 invalidateBuffer(region);-
798 }else {-
799 invalidateBuffer(scrollRect);-
800 }-
801 } else {-
802 const QPoint toplevelOffset = q->mapTo(tlw, QPoint());-
803 const QRect destRect = scrollRect.translated(dx, dy) & scrollRect;-
804 const QRect sourceRect = destRect.translated(-dx, -dy);-
805-
806 QRegion childExpose(scrollRect);-
807 if (sourceRect.isValid()) {-
808 if (wbs->bltRect(sourceRect, dx, dy, q))-
809 childExpose -= destRect;-
810 }-
811-
812 if (inDirtyList) {-
813 if (rect == q->rect()) {-
814 dirty.translate(dx, dy);-
815 } else {-
816 QRegion dirtyScrollRegion = dirty.intersected(scrollRect);-
817 if (!dirtyScrollRegion.isEmpty()) {-
818 dirty -= dirtyScrollRegion;-
819 dirtyScrollRegion.translate(dx, dy);-
820 dirty += dirtyScrollRegion;-
821 }-
822 }-
823 }-
824-
825 if (!q->updatesEnabled())-
826 return;-
827-
828 if (!childExpose.isEmpty()) {-
829 wbs->markDirty(childExpose, q);-
830 isScrolled = true;-
831 }-
832-
833-
834-
835-
836 wbs->markDirtyOnScreen(destRect, q, toplevelOffset);-
837 }-
838}-
839-
840-
841static void findTextureWidgetsRecursively(QWidget *tlw, QWidget *widget, QPlatformTextureList *widgetTextures, QVector<QWidget *> *nativeChildren)-
842{-
843 QWidgetPrivate *wd = QWidgetPrivate::get(widget);-
844 if (wd->renderToTexture) {-
845 QPlatformTextureList::Flags flags = 0;-
846 if (widget->testAttribute(Qt::WA_AlwaysStackOnTop))-
847 flags |= QPlatformTextureList::StacksOnTop;-
848 const QRect rect(widget->mapTo(tlw, QPoint()), widget->size());-
849 widgetTextures->appendTexture(widget, wd->textureId(), rect, wd->clipRect(), flags);-
850 }-
851-
852 for (int i = 0; i < wd->children.size(); ++i) {-
853 QWidget *w = qobject_cast<QWidget *>(wd->children.at(i));-
854-
855 if (w && !w->isWindow() && w->internalWinId())-
856 nativeChildren->append(w);-
857 if (w && !w->isWindow() && !w->internalWinId() && !w->isHidden() && QWidgetPrivate::get(w)->textureChildSeen)-
858 findTextureWidgetsRecursively(tlw, w, widgetTextures, nativeChildren);-
859 }-
860}-
861-
862static void findAllTextureWidgetsRecursively(QWidget *tlw, QWidget *widget)-
863{-
864-
865 if (QWidgetPrivate::get(widget)->textureChildSeen) {-
866 QVector<QWidget *> nativeChildren;-
867 QScopedPointer<QPlatformTextureList> tl(new QPlatformTextureList);-
868-
869-
870 findTextureWidgetsRecursively(tlw, widget, tl.data(), &nativeChildren);-
871-
872 if (!tl->isEmpty())-
873 QWidgetPrivate::get(tlw)->topData()->widgetTextures.append(tl.take());-
874-
875 for (QForeachContainer<typename QtPrivate::remove_reference<decltype(nativeChildren)>::type> _container_((nativeChildren)); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1) for (QWidget *ncw = *_container_.i; _container_.control; _container_.control = 0) {-
876 if (QWidgetPrivate::get(ncw)->textureChildSeen)-
877 findAllTextureWidgetsRecursively(tlw, ncw);-
878 }-
879 }-
880}-
881-
882static QPlatformTextureList *widgetTexturesFor(QWidget *tlw, QWidget *widget)-
883{-
884 for (QForeachContainer<typename QtPrivate::remove_reference<decltype(QWidgetPrivate::get(tlw)->topData()->widgetTextures)>::type> _container_((QWidgetPrivate::get(tlw)->topData()->widgetTextures)); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1) for (QPlatformTextureList *tl = *_container_.i; _container_.control; _container_.control = 0) {-
885 ((!(!tl->isEmpty())) ? qt_assert("!tl->isEmpty()",__FILE__,10081014) : qt_noop());-
886 for (int i = 0; i < tl->count(); ++i) {-
887 QWidget *w = static_cast<QWidget *>(tl->source(i));-
888 if ((w->internalWinId() && w == widget) || (!w->internalWinId() && w->nativeParentWidget() == widget))-
889 return tl;-
890 }-
891 }-
892-
893 if (QWidgetPrivate::get(tlw)->textureChildSeen) {-
894-
895-
896-
897-
898-
899 static bool switchableWidgetComposition =-
900 QGuiApplicationPrivate::instance()->platformIntegration()-
901 ->hasCapability(QPlatformIntegration::SwitchableWidgetComposition);-
902 if (!switchableWidgetComposition-
903 )-
904 {-
905 return qt_dummy_platformTextureList();-
906 }-
907 }-
908-
909 return 0;-
910}-
911-
912-
913-
914-
915-
916-
917QPlatformTextureListWatcher::QPlatformTextureListWatcher(QWidgetBackingStore *backingStore)-
918 : m_backingStore(backingStore)-
919{-
920}-
921-
922void QPlatformTextureListWatcher::watch(QPlatformTextureList *textureList)-
923{-
924 connect(textureList, qFlagLocation("2""locked(bool)" "\0" __FILE__ ":" "1056""1062"), qFlagLocation("1""onLockStatusChanged(bool)" "\0" __FILE__ ":" "1056""1062"));-
925 m_locked[textureList] = textureList->isLocked();-
926}-
927-
928bool QPlatformTextureListWatcher::isLocked() const-
929{-
930 for (QForeachContainer<typename QtPrivate::remove_reference<decltype(m_locked)>::type> _container_((m_locked)); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1) for (bool v = *_container_.i; _container_.control; _container_.control = 0) {-
931 if (v)-
932 return true;-
933 }-
934 return false;-
935}-
936-
937void QPlatformTextureListWatcher::onLockStatusChanged(bool locked)-
938{-
939 QPlatformTextureList *tl = static_cast<QPlatformTextureList *>(sender());-
940 m_locked[tl] = locked;-
941 if (!isLocked())-
942 m_backingStore->sync();-
943}-
944static inline bool discardSyncRequest(QWidget *tlw, QTLWExtra *tlwExtra)-
945{-
946 if (!tlw || !tlwExtra || !tlw->testAttribute(Qt::WA_Mapped) || !tlw->isVisible())-
947 return true;-
948-
949 return false;-
950}-
951-
952bool QWidgetBackingStore::syncAllowed()-
953{-
954-
955 QTLWExtra *tlwExtra = tlw->d_func()->maybeTopData();-
956 if (textureListWatcher && !textureListWatcher->isLocked()) {-
957 textureListWatcher->deleteLater();-
958 textureListWatcher = 0;-
959 } else if (!tlwExtra->widgetTextures.isEmpty()) {-
960 bool skipSync = false;-
961 for (QForeachContainer<typename QtPrivate::remove_reference<decltype(tlwExtra->widgetTextures)>::type> _container_((tlwExtra->widgetTextures)); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1) for (QPlatformTextureList *tl = *_container_.i; _container_.control; _container_.control = 0) {-
962 if (tl->isLocked()) {-
963 if (!textureListWatcher)-
964 textureListWatcher = new QPlatformTextureListWatcher(this);-
965 if (!textureListWatcher->isLocked())-
966 textureListWatcher->watch(tl);-
967 skipSync = true;-
968 }-
969 }-
970 if (skipSync)-
971 return false;-
972 }-
973-
974 return true;-
975}-
976void QWidgetBackingStore::sync(QWidget *exposedWidget, const QRegion &exposedRegion)-
977{-
978 QTLWExtra *tlwExtra = tlw->d_func()->maybeTopData();-
979 if (!tlw->isVisible() || !tlwExtra || tlwExtra->inTopLevelResize)-
980 return;-
981-
982 if (!exposedWidget || !exposedWidget->internalWinId() || !exposedWidget->isVisible() || !exposedWidget->testAttribute(Qt::WA_Mapped)-
983 || !exposedWidget->updatesEnabled() || exposedRegion.isEmpty()) {-
984 return;-
985 }-
986-
987-
988 if (!isDirty() && store->size().isValid()) {-
989 QPlatformTextureList *tl = widgetTexturesFor(tlw, exposedWidget);-
990 qt_flush(exposedWidget, tl ? QRegion() : exposedRegion, store, tlw, tlwOffset, tl, this);-
991 return;-
992 }-
993-
994 if (exposedWidget != tlw)-
995 markDirtyOnScreen(exposedRegion, exposedWidget, exposedWidget->mapTo(tlw, QPoint()));-
996 else-
997 markDirtyOnScreen(exposedRegion, exposedWidget, QPoint());-
998-
999 if (syncAllowed())-
1000 doSync();-
1001}-
1002-
1003-
1004-
1005-
1006void QWidgetBackingStore::sync()-
1007{-
1008 updateRequestSent = false;-
1009 QTLWExtra *tlwExtra = tlw->d_func()->maybeTopData();-
1010 if (discardSyncRequest(tlw, tlwExtra)) {-
1011-
1012-
1013-
1014-
1015-
1016 if (!tlw->isVisible()) {-
1017 dirty = QRegion();-
1018 for (int i = 0; i < dirtyWidgets.size(); ++i)-
1019 resetWidget(dirtyWidgets.at(i));-
1020 dirtyWidgets.clear();-
1021 fullUpdatePending = false;-
1022 }-
1023 return;-
1024 }-
1025-
1026 if (syncAllowed())-
1027 doSync();-
1028}-
1029-
1030void QWidgetBackingStore::doSync()-
1031{-
1032 const bool updatesDisabled = !tlw->updatesEnabled();-
1033 bool repaintAllWidgets = false;-
1034-
1035 const bool inTopLevelResize = tlw->d_func()->maybeTopData()->inTopLevelResize;-
1036 const QRect tlwRect(topLevelRect());-
1037 const QRect surfaceGeometry(tlwRect.topLeft(), store->size());-
1038 if ((fullUpdatePending || inTopLevelResize || surfaceGeometry.size() != tlwRect.size()) && !updatesDisabled) {-
1039 if (hasStaticContents() && !store->size().isEmpty() ) {-
1040-
1041 const QRect clipRect(0, 0, surfaceGeometry.width(), surfaceGeometry.height());-
1042 const QRegion staticRegion(staticContents(0, clipRect));-
1043 QRegion newVisible(0, 0, tlwRect.width(), tlwRect.height());-
1044 newVisible -= staticRegion;-
1045 dirty += newVisible;-
1046 store->setStaticContents(staticRegion);-
1047 } else {-
1048-
1049 dirty = QRegion(0, 0, tlwRect.width(), tlwRect.height());-
1050 for (int i = 0; i < dirtyWidgets.size(); ++i)-
1051 resetWidget(dirtyWidgets.at(i));-
1052 dirtyWidgets.clear();-
1053 repaintAllWidgets = true;-
1054 }-
1055 }-
1056-
1057 if (inTopLevelResize || surfaceGeometry.size() != tlwRect.size())-
1058 store->resize(tlwRect.size());-
1059-
1060 if (updatesDisabled)-
1061 return;-
1062-
1063-
1064 QRegion toClean(dirty);-
1065-
1066-
1067-
1068-
1069-
1070 QVarLengthArray<QWidget *, 32> opaqueNonOverlappedWidgets;-
1071 for (int i = 0; i < dirtyWidgets.size(); ++i) {-
1072 QWidget *w = dirtyWidgets.at(i);-
1073 QWidgetPrivate *wd = w->d_func();-
1074 if (wd->data.in_destructor)-
1075 continue;-
1076-
1077-
1078 wd->dirty &= wd->clipRect();-
1079 wd->clipToEffectiveMask(wd->dirty);-
1080-
1081-
1082 bool hasDirtySiblingsAbove = false;-
1083-
1084 if (!wd->isMoved)-
1085 wd->subtractOpaqueSiblings(wd->dirty, &hasDirtySiblingsAbove);-
1086-
1087-
1088-
1089-
1090-
1091 const QRegion dirtyBeforeSubtractedOpaqueChildren = wd->dirty;-
1092-
1093-
1094 if (!wd->isScrolled && !wd->isMoved)-
1095 wd->subtractOpaqueChildren(wd->dirty, w->rect());-
1096-
1097 if (wd->dirty.isEmpty() && wd->textureChildSeen)-
1098 wd->dirty = dirtyBeforeSubtractedOpaqueChildren;-
1099-
1100 if (wd->dirty.isEmpty()) {-
1101 resetWidget(w);-
1102 continue;-
1103 }-
1104-
1105 const QRegion widgetDirty(w != tlw ? wd->dirty.translated(w->mapTo(tlw, QPoint()))-
1106 : wd->dirty);-
1107 toClean += widgetDirty;-
1108-
1109-
1110 if (tlw->d_func()->extra->proxyWidget) {-
1111 resetWidget(w);-
1112 continue;-
1113 }-
1114-
1115-
1116 if (!hasDirtySiblingsAbove && wd->isOpaque && !dirty.intersects(widgetDirty.boundingRect())) {-
1117 opaqueNonOverlappedWidgets.append(w);-
1118 } else {-
1119 resetWidget(w);-
1120 dirty += widgetDirty;-
1121 }-
1122 }-
1123 dirtyWidgets.clear();-
1124-
1125-
1126-
1127-
1128-
1129 QTLWExtra *tlwExtra = tlw->d_func()->topData();-
1130 qDeleteAll(tlwExtra->widgetTextures);-
1131 tlwExtra->widgetTextures.clear();-
1132 findAllTextureWidgetsRecursively(tlw, tlw);-
1133 qt_window_private(tlw->windowHandle())->compositing = false;-
1134 fullUpdatePending = false;-
1135-
1136-
1137 if (toClean.isEmpty()) {-
1138-
1139-
1140-
1141-
1142-
1143 QVarLengthArray<QWidget *, 16> paintPending;-
1144 const int numPaintPending = dirtyRenderToTextureWidgets.count();-
1145 paintPending.reserve(numPaintPending);-
1146 for (int i = 0; i < numPaintPending; ++i) {-
1147 QWidget *w = dirtyRenderToTextureWidgets.at(i);-
1148 paintPending << w;-
1149 resetWidget(w);-
1150 }-
1151 dirtyRenderToTextureWidgets.clear();-
1152 for (int i = 0; i < numPaintPending; ++i) {-
1153 QWidget *w = paintPending[i];-
1154 w->d_func()->sendPaintEvent(w->rect());-
1155 if (w != tlw) {-
1156 QWidget *npw = w->nativeParentWidget();-
1157 if (w->internalWinId() || (npw && npw != tlw)) {-
1158 if (!w->internalWinId())-
1159 w = npw;-
1160 QWidgetPrivate *wPrivate = w->d_func();-
1161 if (!wPrivate->needsFlush)-
1162 wPrivate->needsFlush = new QRegion;-
1163 appendDirtyOnScreenWidget(w);-
1164 }-
1165 }-
1166 }-
1167-
1168-
1169-
1170-
1171 flush();-
1172-
1173 return;-
1174 }-
1175-
1176-
1177 for (QForeachContainer<typename QtPrivate::remove_reference<decltype(tlwExtra->widgetTextures)>::type> _container_((tlwExtra->widgetTextures)); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1) for (QPlatformTextureList *tl = *_container_.i; _container_.control; _container_.control = 0) {-
1178 for (int i = 0; i < tl->count(); ++i) {-
1179 QWidget *w = static_cast<QWidget *>(tl->source(i));-
1180 if (dirtyRenderToTextureWidgets.contains(w)) {-
1181 const QRect rect = tl->geometry(i);-
1182-
1183-
1184 w->d_func()->renderToTextureReallyDirty = 1;-
1185 dirty += rect;-
1186 toClean += rect;-
1187 }-
1188 }-
1189 }-
1190 for (int i = 0; i < dirtyRenderToTextureWidgets.count(); ++i)-
1191 resetWidget(dirtyRenderToTextureWidgets.at(i));-
1192 dirtyRenderToTextureWidgets.clear();-
1193-
1194-
1195-
1196 if (tlw->d_func()->extra->proxyWidget) {-
1197 updateStaticContentsSize();-
1198 dirty = QRegion();-
1199 updateRequestSent = false;-
1200 const QVector<QRect> rects(toClean.rects());-
1201 for (int i = 0; i < rects.size(); ++i)-
1202 tlw->d_func()->extra->proxyWidget->update(rects.at(i));-
1203 return;-
1204 }-
1205-
1206-
1207 BeginPaintInfo beginPaintInfo;-
1208 beginPaint(toClean, tlw, store, &beginPaintInfo);-
1209 if (beginPaintInfo.nothingToPaint) {-
1210 for (int i = 0; i < opaqueNonOverlappedWidgets.size(); ++i)-
1211 resetWidget(opaqueNonOverlappedWidgets[i]);-
1212 dirty = QRegion();-
1213 updateRequestSent = false;-
1214 return;-
1215 }-
1216-
1217-
1218-
1219 updateStaticContentsSize();-
1220 const QRegion dirtyCopy(dirty);-
1221 dirty = QRegion();-
1222 updateRequestSent = false;-
1223-
1224-
1225 for (int i = 0; i < opaqueNonOverlappedWidgets.size(); ++i) {-
1226 QWidget *w = opaqueNonOverlappedWidgets[i];-
1227 QWidgetPrivate *wd = w->d_func();-
1228-
1229 int flags = QWidgetPrivate::DrawRecursive;-
1230-
1231 if (!wd->isScrolled && !wd->isMoved)-
1232 flags |= QWidgetPrivate::DontDrawOpaqueChildren;-
1233 if (w == tlw)-
1234 flags |= QWidgetPrivate::DrawAsRoot;-
1235-
1236 QRegion toBePainted(wd->dirty);-
1237 resetWidget(w);-
1238-
1239 QPoint offset(tlwOffset);-
1240 if (w != tlw)-
1241 offset += w->mapTo(tlw, QPoint());-
1242 wd->drawWidget(store->paintDevice(), toBePainted, offset, flags, 0, this);-
1243 }-
1244-
1245-
1246 if (repaintAllWidgets || !dirtyCopy.isEmpty()) {-
1247 const int flags = QWidgetPrivate::DrawAsRoot | QWidgetPrivate::DrawRecursive;-
1248 tlw->d_func()->drawWidget(store->paintDevice(), dirtyCopy, tlwOffset, flags, 0, this);-
1249 }-
1250-
1251 endPaint(toClean, store, &beginPaintInfo);-
1252}-
1253-
1254-
1255-
1256-
1257-
1258-
1259void QWidgetBackingStore::flush(QWidget *widget)-
1260{-
1261 const bool hasDirtyOnScreenWidgets = dirtyOnScreenWidgets && !dirtyOnScreenWidgets->isEmpty();-
1262 bool flushed = false;-
1263-
1264-
1265 if (!dirtyOnScreen.isEmpty()) {-
1266 QWidget *target = widget ? widget : tlw;-
1267 qt_flush(target, dirtyOnScreen, store, tlw, tlwOffset, widgetTexturesFor(tlw, tlw), this);-
1268 dirtyOnScreen = QRegion();-
1269 flushed = true;-
1270 }-
1271-
1272-
1273 if (!flushed && !hasDirtyOnScreenWidgets) {-
1274-
1275 if (!tlw->d_func()->topData()->widgetTextures.isEmpty()) {-
1276 QPlatformTextureList *tl = widgetTexturesFor(tlw, tlw);-
1277 if (tl) {-
1278 QWidget *target = widget ? widget : tlw;-
1279 qt_flush(target, QRegion(), store, tlw, tlwOffset, tl, this);-
1280 }-
1281 }-
1282-
1283 }-
1284-
1285 if (!hasDirtyOnScreenWidgets)-
1286 return;-
1287-
1288 for (int i = 0; i < dirtyOnScreenWidgets->size(); ++i) {-
1289 QWidget *w = dirtyOnScreenWidgets->at(i);-
1290 QWidgetPrivate *wd = w->d_func();-
1291 ((!(wd->needsFlush)) ? qt_assert("wd->needsFlush",__FILE__,14431449) : qt_noop());-
1292 QPlatformTextureList *widgetTexturesForNative = wd->textureChildSeen ? widgetTexturesFor(tlw, w) : 0;-
1293 qt_flush(w, *wd->needsFlush, store, tlw, tlwOffset, widgetTexturesForNative, this);-
1294 *wd->needsFlush = QRegion();-
1295 }-
1296 dirtyOnScreenWidgets->clear();-
1297}-
1298-
1299static inline bool discardInvalidateBufferRequest(QWidget *widget, QTLWExtra *tlwExtra)-
1300{-
1301 ((!(widget)) ? qt_assert("widget",__FILE__,14531459) : qt_noop());-
1302 if (QApplication::closingDown())-
1303 return true;-
1304-
1305 if (!tlwExtra || tlwExtra->inTopLevelResize || !tlwExtra->backingStore)-
1306 return true;-
1307-
1308 if (!widget->isVisible() || !widget->updatesEnabled())-
1309 return true;-
1310-
1311 return false;-
1312}-
1313-
1314-
1315-
1316-
1317-
1318void QWidgetPrivate::invalidateBuffer_resizeHelper(const QPoint &oldPos, const QSize &oldSize)-
1319{-
1320 QWidget * const q = q_func();-
1321 ((!(!q->isWindow())) ? qt_assert("!q->isWindow()",__FILE__,14731479) : qt_noop());-
1322 ((!(q->parentWidget())) ? qt_assert("q->parentWidget()",__FILE__,14741480) : qt_noop());-
1323-
1324 const bool staticContents = q->testAttribute(Qt::WA_StaticContents);-
1325 const bool sizeDecreased = (data.crect.width() < oldSize.width())-
1326 || (data.crect.height() < oldSize.height());-
1327-
1328 const QPoint offset(data.crect.x() - oldPos.x(), data.crect.y() - oldPos.y());-
1329 const bool parentAreaExposed = !offset.isNull() || sizeDecreased;-
1330 const QRect newWidgetRect(q->rect());-
1331 const QRect oldWidgetRect(0, 0, oldSize.width(), oldSize.height());-
1332-
1333 if (!staticContents || graphicsEffect) {-
1334 QRegion staticChildren;-
1335 QWidgetBackingStore *bs = 0;-
1336 if (offset.isNull() && (bs = maybeBackingStore()))-
1337 staticChildren = bs->staticContents(q, oldWidgetRect);-
1338 const bool hasStaticChildren = !staticChildren.isEmpty();-
1339-
1340 if (hasStaticChildren) {-
1341 QRegion dirty(newWidgetRect);-
1342 dirty -= staticChildren;-
1343 invalidateBuffer(dirty);-
1344 } else {-
1345-
1346 invalidateBuffer(newWidgetRect);-
1347 }-
1348-
1349 if (!parentAreaExposed)-
1350 return;-
1351-
1352-
1353 if (!graphicsEffect && extra && extra->hasMask) {-
1354 QRegion parentExpose(extra->mask.translated(oldPos));-
1355 parentExpose &= QRect(oldPos, oldSize);-
1356 if (hasStaticChildren)-
1357 parentExpose -= data.crect;-
1358 q->parentWidget()->d_func()->invalidateBuffer(parentExpose);-
1359 } else {-
1360 if (hasStaticChildren && !graphicsEffect) {-
1361 QRegion parentExpose(QRect(oldPos, oldSize));-
1362 parentExpose -= data.crect;-
1363 q->parentWidget()->d_func()->invalidateBuffer(parentExpose);-
1364 } else {-
1365 q->parentWidget()->d_func()->invalidateBuffer(effectiveRectFor(QRect(oldPos, oldSize)));-
1366 }-
1367 }-
1368 return;-
1369 }-
1370-
1371-
1372 if (!offset.isNull()) {-
1373 if (sizeDecreased) {-
1374 const QSize minSize(qMin(oldSize.width(), data.crect.width()),-
1375 qMin(oldSize.height(), data.crect.height()));-
1376 moveRect(QRect(oldPos, minSize), offset.x(), offset.y());-
1377 } else {-
1378 moveRect(QRect(oldPos, oldSize), offset.x(), offset.y());-
1379 }-
1380 }-
1381-
1382-
1383 if (!sizeDecreased || !oldWidgetRect.contains(newWidgetRect)) {-
1384 QRegion newVisible(newWidgetRect);-
1385 newVisible -= oldWidgetRect;-
1386 invalidateBuffer(newVisible);-
1387 }-
1388-
1389 if (!parentAreaExposed)-
1390 return;-
1391-
1392-
1393 const QRect oldRect(oldPos, oldSize);-
1394 if (extra && extra->hasMask) {-
1395 QRegion parentExpose(oldRect);-
1396 parentExpose &= extra->mask.translated(oldPos);-
1397 parentExpose -= (extra->mask.translated(data.crect.topLeft()) & data.crect);-
1398 q->parentWidget()->d_func()->invalidateBuffer(parentExpose);-
1399 } else {-
1400 QRegion parentExpose(oldRect);-
1401 parentExpose -= data.crect;-
1402 q->parentWidget()->d_func()->invalidateBuffer(parentExpose);-
1403 }-
1404}-
1405void QWidgetPrivate::invalidateBuffer(const QRegion &rgn)-
1406{-
1407 QWidget * const q = q_func();-
1408-
1409 QTLWExtra *tlwExtra = q->window()->d_func()->maybeTopData();-
1410 if (discardInvalidateBufferRequest(q, tlwExtra) || rgn.isEmpty())-
1411 return;-
1412-
1413 QRegion wrgn(rgn);-
1414 wrgn &= clipRect();-
1415 if (!graphicsEffect && extra && extra->hasMask)-
1416 wrgn &= extra->mask;-
1417 if (wrgn.isEmpty())-
1418 return;-
1419-
1420 tlwExtra->backingStoreTracker->markDirty(wrgn, q,-
1421 QWidgetBackingStore::UpdateLater, QWidgetBackingStore::BufferInvalid);-
1422}-
1423void QWidgetPrivate::invalidateBuffer(const QRect &rect)-
1424{-
1425 QWidget * const q = q_func();-
1426-
1427 QTLWExtra *tlwExtra = q->window()->d_func()->maybeTopData();-
1428 if (discardInvalidateBufferRequest(q, tlwExtra) || rect.isEmpty())-
1429 return;-
1430-
1431 QRect wRect(rect);-
1432 wRect &= clipRect();-
1433 if (wRect.isEmpty())-
1434 return;-
1435-
1436 if (graphicsEffect || !extra || !extra->hasMask) {-
1437 tlwExtra->backingStoreTracker->markDirty(wRect, q,-
1438 QWidgetBackingStore::UpdateLater, QWidgetBackingStore::BufferInvalid);-
1439 return;-
1440 }-
1441-
1442 QRegion wRgn(extra->mask);-
1443 wRgn &= wRect;-
1444 if (wRgn.isEmpty())-
1445 return;-
1446-
1447 tlwExtra->backingStoreTracker->markDirty(wRgn, q,-
1448 QWidgetBackingStore::UpdateLater, QWidgetBackingStore::BufferInvalid);-
1449}-
1450-
1451void QWidgetPrivate::repaint_sys(const QRegion &rgn)-
1452{-
1453 if (data.in_destructor
data.in_destructorDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
1454 return;
never executed: return;
0
1455-
1456 QWidget * const q = q_func();-
1457 if (discardSyncRequest(q, maybeTopData())
discardSyncReq...aybeTopData())Description
TRUEnever evaluated
FALSEnever evaluated
)
0
1458 return;
never executed: return;
0
1459-
1460 if (q->testAttribute(Qt::WA_StaticContents)
q->testAttribu...taticContents)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
1461 if (!extra
!extraDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
1462 createExtra();
never executed: createExtra();
0
1463 extra->staticContentsSize = data.crect.size();-
1464 }
never executed: end of block
0
1465-
1466 QPaintEngine *engine = q->paintEngine();-
1467-
1468-
1469-
1470-
1471 const bool noPartialUpdateSupport = (engine
engineDescription
TRUEnever evaluated
FALSEnever evaluated
&& (engine->type() == QPaintEngine::OpenGL
engine->type()...Engine::OpenGLDescription
TRUEnever evaluated
FALSEnever evaluated
0
1472 || engine->type() == QPaintEngine::OpenGL2
engine->type()...ngine::OpenGL2Description
TRUEnever evaluated
FALSEnever evaluated
))
0
1473 && (usesDoubleBufferedGLContext
usesDoubleBufferedGLContextDescription
TRUEnever evaluated
FALSEnever evaluated
|| q->autoFillBackground()
q->autoFillBackground()Description
TRUEnever evaluated
FALSEnever evaluated
);
0
1474 QRegion toBePainted(noPartialUpdateSupport ? q->rect() : rgn);-
1475-
1476-
1477-
1478-
1479-
1480-
1481-
1482 toBePainted &= clipRect();-
1483 clipToEffectiveMask(toBePainted);-
1484 if (toBePainted.isEmpty()
toBePainted.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
1485 return;
never executed: return;
0
1486-
1487-
1488 bool flushed = QWidgetBackingStore::flushPaint(q, toBePainted);-
1489-
1490-
1491 drawWidget(q, toBePainted, QPoint(), QWidgetPrivate::DrawAsRoot | QWidgetPrivate::DrawPaintOnScreen, 0);-
1492-
1493-
1494 if (flushed
flushedDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
1495 QWidgetBackingStore::unflushPaint(q, toBePainted);
never executed: QWidgetBackingStore::unflushPaint(q, toBePainted);
0
1496-
1497-
1498 if (__builtin_expect(!!(
__builtin_expe...ive()), false)Description
TRUEnever evaluated
FALSEnever evaluated
q->paintingActive())()), false)
__builtin_expe...ive()), false)Description
TRUEnever evaluated
FALSEnever evaluated
)
0
1499 QMessageLogger(__FILE__, 16671673, __PRETTY_FUNCTION__).warning("QWidget::repaint: It is dangerous to leave painters active on a widget outside of the PaintEvent");
never executed: QMessageLogger(__FILE__, 1673, __PRETTY_FUNCTION__).warning("QWidget::repaint: It is dangerous to leave painters active on a widget outside of the PaintEvent");
0
1500}
never executed: end of block
0
1501-
1502-
1503-
1504-
Switch to Source codePreprocessed file

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