QWidgetBackingStore: clean up around dirtyOnScreenWidgets

The QVector dirtyOnScreenWidgets was aggregated by pointer, which
makes no sense, as a QVector is just as large as a pointer (and even
in Qt 6, when it will be larger, it's not going to be horrible). But
this complicated the code quite a bit.

Aggregate by value instead (it's just one of three such vectors now).

Drive-by fixes:

- use QVector::removeAll() instead of rolling your own

- port two indexed loops to ranged ones. In the first case, it's safe,
  as the loop body clearly doesn't touch the iteratee (it's just a
  std::accumulate). In the second, the question no longer applies, as
  we're now using a consume loop.

Change-Id: Icd4ac13bb4a6f9a783f0adf2fb6a5bdfacd1f91a
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
Marc Mutz 2019-08-15 14:42:12 +02:00
parent 3e79151fa2
commit cb3e1e551f
2 changed files with 13 additions and 50 deletions

View File

@ -397,15 +397,12 @@ 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()));
}
for (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) {
@ -686,8 +683,8 @@ void QWidgetBackingStore::removeDirtyWidget(QWidget *w)
if (!w)
return;
dirtyWidgetsRemoveAll(w);
dirtyOnScreenWidgetsRemoveAll(w);
dirtyWidgets.removeAll(w);
dirtyOnScreenWidgets.removeAll(w);
dirtyRenderToTextureWidgets.removeAll(w);
resetWidget(w);
@ -719,7 +716,6 @@ void QWidgetBackingStore::updateLists(QWidget *cur)
QWidgetBackingStore::QWidgetBackingStore(QWidget *topLevel)
: tlw(topLevel),
dirtyOnScreenWidgets(0),
updateRequestSent(0),
textureListWatcher(0),
perfFrames(0)
@ -737,8 +733,6 @@ QWidgetBackingStore::~QWidgetBackingStore()
resetWidget(dirtyWidgets.at(c));
for (int c = 0; c < dirtyRenderToTextureWidgets.size(); ++c)
resetWidget(dirtyRenderToTextureWidgets.at(c));
delete dirtyOnScreenWidgets;
}
static QVector<QRect> getSortedRectsToScroll(const QRegion &region, int dx, int dy)
@ -1373,7 +1367,7 @@ void QWidgetBackingStore::doSync()
*/
void QWidgetBackingStore::flush(QWidget *widget)
{
const bool hasDirtyOnScreenWidgets = dirtyOnScreenWidgets && !dirtyOnScreenWidgets->isEmpty();
const bool hasDirtyOnScreenWidgets = !dirtyOnScreenWidgets.isEmpty();
bool flushed = false;
// Flush the region in dirtyOnScreen.
@ -1400,15 +1394,13 @@ void QWidgetBackingStore::flush(QWidget *widget)
if (!hasDirtyOnScreenWidgets)
return;
for (int i = 0; i < dirtyOnScreenWidgets->size(); ++i) {
QWidget *w = dirtyOnScreenWidgets->at(i);
for (QWidget *w : qExchange(dirtyOnScreenWidgets, {})) {
QWidgetPrivate *wd = w->d_func();
Q_ASSERT(wd->needsFlush);
QPlatformTextureList *widgetTexturesForNative = wd->textureChildSeen ? widgetTexturesFor(tlw, w) : 0;
qt_flush(w, *wd->needsFlush, store, tlw, widgetTexturesForNative, this);
*wd->needsFlush = QRegion();
}
dirtyOnScreenWidgets->clear();
}
/*!

View File

@ -129,7 +129,7 @@ private:
QRegion dirtyFromPreviousSync;
QVector<QWidget *> dirtyWidgets;
QVector<QWidget *> dirtyRenderToTextureWidgets;
QVector<QWidget *> *dirtyOnScreenWidgets;
QVector<QWidget *> dirtyOnScreenWidgets;
QList<QWidget *> staticWidgets;
QBackingStore *store;
uint updateRequestSent : 1;
@ -190,17 +190,6 @@ private:
}
}
inline void dirtyWidgetsRemoveAll(QWidget *widget)
{
int i = 0;
while (i < dirtyWidgets.size()) {
if (dirtyWidgets.at(i) == widget)
dirtyWidgets.remove(i);
else
++i;
}
}
inline void addStaticWidget(QWidget *widget)
{
if (!widget)
@ -246,26 +235,8 @@ private:
if (!widget)
return;
if (!dirtyOnScreenWidgets) {
dirtyOnScreenWidgets = new QVector<QWidget *>;
dirtyOnScreenWidgets->append(widget);
} else if (!dirtyOnScreenWidgets->contains(widget)) {
dirtyOnScreenWidgets->append(widget);
}
}
inline void dirtyOnScreenWidgetsRemoveAll(QWidget *widget)
{
if (!widget || !dirtyOnScreenWidgets)
return;
int i = 0;
while (i < dirtyOnScreenWidgets->size()) {
if (dirtyOnScreenWidgets->at(i) == widget)
dirtyOnScreenWidgets->remove(i);
else
++i;
}
if (!dirtyOnScreenWidgets.contains(widget))
dirtyOnScreenWidgets.append(widget);
}
inline void resetWidget(QWidget *widget)