QWidgetBackingStore and BeginPaintInfo cleanup

Signed-off-by: Ivailo Monev <xakepa10@laimg.moc>
This commit is contained in:
Ivailo Monev 2019-05-19 22:07:45 +00:00
parent f549af07e3
commit 64fcbb67a6
2 changed files with 27 additions and 44 deletions

View file

@ -311,8 +311,7 @@ QRegion QWidgetBackingStore::dirtyRegion(QWidget *widget) const
// Calculate the region that needs repaint.
QRegion r(dirty);
for (int i = 0; i < dirtyWidgets.size(); ++i) {
QWidget *w = dirtyWidgets.at(i);
foreach (QWidget *w, dirtyWidgets) {
if (widgetDirty && w != widget && !widget->isAncestorOf(w))
continue;
r += w->d_func()->dirty.translated(w->mapTo(tlw, QPoint()));
@ -321,15 +320,13 @@ QRegion QWidgetBackingStore::dirtyRegion(QWidget *widget) const
// Append the region that needs flush.
r += dirtyOnScreen;
if (dirtyOnScreenWidgets) { // Only in use with native child widgets.
for (int i = 0; i < dirtyOnScreenWidgets->size(); ++i) {
QWidget *w = dirtyOnScreenWidgets->at(i);
if (widgetDirty && w != widget && !widget->isAncestorOf(w))
continue;
QWidgetPrivate *wd = w->d_func();
Q_ASSERT(wd->needsFlush);
r += wd->needsFlush->translated(w->mapTo(tlw, QPoint()));
}
// Only in use with native child widgets.
foreach (QWidget *w, dirtyOnScreenWidgets) {
if (widgetDirty && w != widget && !widget->isAncestorOf(w))
continue;
QWidgetPrivate *wd = w->d_func();
Q_ASSERT(wd->needsFlush);
r += wd->needsFlush->translated(w->mapTo(tlw, QPoint()));
}
if (widgetDirty) {
@ -679,8 +676,8 @@ void QWidgetBackingStore::updateLists(QWidget *cur)
}
QWidgetBackingStore::QWidgetBackingStore(QWidget *topLevel)
: tlw(topLevel), dirtyOnScreenWidgets(0), hasDirtyFromPreviousSync(false)
, fullUpdatePending(0)
: tlw(topLevel)
, fullUpdatePending(false)
{
windowSurface = tlw->windowSurface();
if (!windowSurface)
@ -705,8 +702,6 @@ QWidgetBackingStore::~QWidgetBackingStore()
delete windowSurface;
windowSurface = 0;
delete dirtyOnScreenWidgets;
dirtyOnScreenWidgets = 0;
}
//parent's coordinates; move whole rect; update parent and widget
@ -980,9 +975,6 @@ void QWidgetBackingStore::sync()
if (updatesDisabled)
return;
if (hasDirtyFromPreviousSync)
dirty += dirtyFromPreviousSync;
// Contains everything that needs repaint.
QRegion toClean(dirty);
@ -1188,17 +1180,16 @@ void QWidgetBackingStore::flush(QWidget *widget, QWindowSurface *surface)
dirtyOnScreen = QRegion();
}
if (!dirtyOnScreenWidgets || dirtyOnScreenWidgets->isEmpty())
if (dirtyOnScreenWidgets.isEmpty())
return;
for (int i = 0; i < dirtyOnScreenWidgets->size(); ++i) {
QWidget *w = dirtyOnScreenWidgets->at(i);
foreach (QWidget *w, dirtyOnScreenWidgets) {
QWidgetPrivate *wd = w->d_func();
Q_ASSERT(wd->needsFlush);
qt_flush(w, *wd->needsFlush, windowSurface, tlw, tlwOffset);
*wd->needsFlush = QRegion();
}
dirtyOnScreenWidgets->clear();
dirtyOnScreenWidgets.clear();
}
static inline bool discardInvalidateBufferRequest(QWidget *widget, QTLWExtra *tlwExtra)

View file

@ -63,10 +63,10 @@ QT_BEGIN_NAMESPACE
class QWindowSurface;
struct BeginPaintInfo {
inline BeginPaintInfo() : wasFlushed(0), nothingToPaint(0), windowSurfaceRecreated(0) {}
uint wasFlushed : 1;
uint nothingToPaint : 1;
uint windowSurfaceRecreated : 1;
inline BeginPaintInfo() : wasFlushed(false), nothingToPaint(false), windowSurfaceRecreated(false) {}
bool wasFlushed;
bool nothingToPaint;
bool windowSurfaceRecreated;
};
class Q_AUTOTEST_EXPORT QWidgetBackingStore
@ -87,8 +87,7 @@ public:
inline bool isDirty() const
{
return !(dirtyWidgets.isEmpty() && dirty.isEmpty() && !hasDirtyFromPreviousSync
&& !fullUpdatePending);
return !(dirtyWidgets.isEmpty() && dirty.isEmpty() && !fullUpdatePending);
}
// ### Qt 4.6: Merge into a template function (after MSVC isn't supported anymore).
@ -101,16 +100,14 @@ private:
QWidget *tlw;
QRegion dirtyOnScreen; // needsFlush
QRegion dirty; // needsRepaint
QRegion dirtyFromPreviousSync;
QVector<QWidget *> dirtyWidgets;
QVector<QWidget *> *dirtyOnScreenWidgets;
QVector<QWidget *> dirtyOnScreenWidgets;
QList<QWidget *> staticWidgets;
QWindowSurface *windowSurface;
#ifdef Q_BACKINGSTORE_SUBSURFACES
QList<QWindowSurface*> subSurfaces;
#endif
uint hasDirtyFromPreviousSync : 1;
uint fullUpdatePending : 1;
bool fullUpdatePending;
QPoint tlwOffset;
@ -199,25 +196,20 @@ private:
if (!widget)
return;
if (!dirtyOnScreenWidgets) {
dirtyOnScreenWidgets = new QVector<QWidget *>;
dirtyOnScreenWidgets->append(widget);
} else if (!dirtyOnScreenWidgets->contains(widget)) {
dirtyOnScreenWidgets->append(widget);
if (!dirtyOnScreenWidgets.contains(widget)) {
dirtyOnScreenWidgets.append(widget);
}
}
inline void dirtyOnScreenWidgetsRemoveAll(QWidget *widget)
{
if (!widget || !dirtyOnScreenWidgets)
if (!widget)
return;
int i = 0;
while (i < dirtyOnScreenWidgets->size()) {
if (dirtyOnScreenWidgets->at(i) == widget)
dirtyOnScreenWidgets->remove(i);
else
++i;
for (int i = 0; i < dirtyOnScreenWidgets.size(); ++i) {
if (dirtyOnScreenWidgets.at(i) == widget) {
dirtyOnScreenWidgets.remove(i);
}
}
}