Make bool arguments to QWidgetBackingStore::markDirty enums

This is so we get some typesafty when refactoring, and I think it makes
the code more readable

Change-Id: Ia7531950d5f780dc98f4eb435c1e0050d76cdb5f
Reviewed-by: Paul Olav Tvete <paul.tvete@digia.com>
bb10
Jorgen Lind 2014-02-28 09:39:58 +01:00 committed by The Qt Project
parent 4bf27a24c0
commit d4a4ef9e38
3 changed files with 73 additions and 56 deletions

View File

@ -9888,7 +9888,7 @@ void QWidget::repaint(const QRect &rect)
QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) {
tlwExtra->inRepaint = true;
tlwExtra->backingStoreTracker->markDirty(rect, this, true);
tlwExtra->backingStoreTracker->markDirty(rect, this, QWidgetBackingStore::UpdateNow);
tlwExtra->inRepaint = false;
}
} else {
@ -9917,7 +9917,7 @@ void QWidget::repaint(const QRegion &rgn)
QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) {
tlwExtra->inRepaint = true;
tlwExtra->backingStoreTracker->markDirty(rgn, this, true);
tlwExtra->backingStoreTracker->markDirty(rgn, this, QWidgetBackingStore::UpdateNow);
tlwExtra->inRepaint = false;
}
} else {

View File

@ -443,17 +443,21 @@ QRegion QWidgetBackingStore::staticContents(QWidget *parent, const QRect &within
return region;
}
void QWidgetBackingStore::sendUpdateRequest(QWidget *widget, bool updateImmediately)
void QWidgetBackingStore::sendUpdateRequest(QWidget *widget, UpdateTime updateTime)
{
if (!widget)
return;
if (updateImmediately) {
QEvent event(QEvent::UpdateRequest);
QApplication::sendEvent(widget, &event);
} else {
switch (updateTime) {
case UpdateLater:
updateRequestSent = true;
QApplication::postEvent(widget, new QEvent(QEvent::UpdateRequest), Qt::LowEventPriority);
break;
case UpdateNow: {
QEvent event(QEvent::UpdateRequest);
QApplication::sendEvent(widget, &event);
break;
}
}
}
@ -461,17 +465,17 @@ void QWidgetBackingStore::sendUpdateRequest(QWidget *widget, bool updateImmediat
Marks the region of the widget as dirty (if not already marked as dirty) and
posts an UpdateRequest event to the top-level widget (if not already posted).
If updateImmediately is true, the event is sent immediately instead of posted.
If updateTime is UpdateNow, the event is sent immediately instead of posted.
If invalidateBuffer is true, all widgets intersecting with the region will be dirty.
If bufferState is BufferInvalid, all widgets intersecting with the region will be dirty.
If the widget paints directly on screen, the event is sent to the widget
instead of the top-level widget, and invalidateBuffer is completely ignored.
instead of the top-level widget, and bufferState is completely ignored.
### Qt 4.6: Merge into a template function (after MSVC isn't supported anymore).
*/
void QWidgetBackingStore::markDirty(const QRegion &rgn, QWidget *widget, bool updateImmediately,
bool invalidateBuffer)
void QWidgetBackingStore::markDirty(const QRegion &rgn, QWidget *widget,
UpdateTime updateTime, BufferState bufferState)
{
Q_ASSERT(tlw->d_func()->extra);
Q_ASSERT(tlw->d_func()->extra->topextra);
@ -487,44 +491,44 @@ void QWidgetBackingStore::markDirty(const QRegion &rgn, QWidget *widget, bool up
if (widget->d_func()->paintOnScreen()) {
if (widget->d_func()->dirty.isEmpty()) {
widget->d_func()->dirty = rgn;
sendUpdateRequest(widget, updateImmediately);
sendUpdateRequest(widget, updateTime);
return;
} else if (qt_region_strictContains(widget->d_func()->dirty, widget->rect())) {
if (updateImmediately)
sendUpdateRequest(widget, updateImmediately);
if (updateTime == UpdateNow)
sendUpdateRequest(widget, updateTime);
return; // Already dirty.
}
const bool eventAlreadyPosted = !widget->d_func()->dirty.isEmpty();
widget->d_func()->dirty += rgn;
if (!eventAlreadyPosted || updateImmediately)
sendUpdateRequest(widget, updateImmediately);
if (!eventAlreadyPosted || updateTime == UpdateNow)
sendUpdateRequest(widget, updateTime);
return;
}
//### FIXME fullUpdatePending seems to be always false????
if (fullUpdatePending) {
if (updateImmediately)
sendUpdateRequest(tlw, updateImmediately);
if (updateTime == UpdateNow)
sendUpdateRequest(tlw, updateTime);
return;
}
const QPoint offset = widget->mapTo(tlw, QPoint());
if (QWidgetPrivate::get(widget)->renderToTexture) {
if (!updateRequestSent || updateImmediately)
sendUpdateRequest(tlw, updateImmediately);
if (!updateRequestSent || updateTime == UpdateNow)
sendUpdateRequest(tlw, updateTime);
return;
}
const QRect widgetRect = widget->d_func()->effectiveRectFor(widget->rect());
if (qt_region_strictContains(dirty, widgetRect.translated(offset))) {
if (updateImmediately)
sendUpdateRequest(tlw, updateImmediately);
if (updateTime == UpdateNow)
sendUpdateRequest(tlw, updateTime);
return; // Already dirty.
}
if (invalidateBuffer) {
if (bufferState == BufferInvalid) {
const bool eventAlreadyPosted = !dirty.isEmpty() || updateRequestSent;
#ifndef QT_NO_GRAPHICSEFFECT
if (widget->d_func()->graphicsEffect)
@ -532,14 +536,14 @@ void QWidgetBackingStore::markDirty(const QRegion &rgn, QWidget *widget, bool up
else
#endif //QT_NO_GRAPHICSEFFECT
dirty += rgn.translated(offset);
if (!eventAlreadyPosted || updateImmediately)
sendUpdateRequest(tlw, updateImmediately);
if (!eventAlreadyPosted || updateTime == UpdateNow)
sendUpdateRequest(tlw, updateTime);
return;
}
if (dirtyWidgets.isEmpty()) {
addDirtyWidget(widget, rgn);
sendUpdateRequest(tlw, updateImmediately);
sendUpdateRequest(tlw, updateTime);
return;
}
@ -556,8 +560,8 @@ void QWidgetBackingStore::markDirty(const QRegion &rgn, QWidget *widget, bool up
addDirtyWidget(widget, rgn);
}
if (updateImmediately)
sendUpdateRequest(tlw, updateImmediately);
if (updateTime == UpdateNow)
sendUpdateRequest(tlw, updateTime);
}
/*!
@ -567,8 +571,8 @@ void QWidgetBackingStore::markDirty(const QRegion &rgn, QWidget *widget, bool up
### Qt 4.6: Merge into a template function (after MSVC isn't supported anymore).
*/
void QWidgetBackingStore::markDirty(const QRect &rect, QWidget *widget, bool updateImmediately,
bool invalidateBuffer)
void QWidgetBackingStore::markDirty(const QRect &rect, QWidget *widget,
UpdateTime updateTime, BufferState bufferState)
{
Q_ASSERT(tlw->d_func()->extra);
Q_ASSERT(tlw->d_func()->extra->topextra);
@ -584,30 +588,30 @@ void QWidgetBackingStore::markDirty(const QRect &rect, QWidget *widget, bool upd
if (widget->d_func()->paintOnScreen()) {
if (widget->d_func()->dirty.isEmpty()) {
widget->d_func()->dirty = QRegion(rect);
sendUpdateRequest(widget, updateImmediately);
sendUpdateRequest(widget, updateTime);
return;
} else if (qt_region_strictContains(widget->d_func()->dirty, rect)) {
if (updateImmediately)
sendUpdateRequest(widget, updateImmediately);
if (updateTime == UpdateNow)
sendUpdateRequest(widget, updateTime);
return; // Already dirty.
}
const bool eventAlreadyPosted = !widget->d_func()->dirty.isEmpty();
widget->d_func()->dirty += rect;
if (!eventAlreadyPosted || updateImmediately)
sendUpdateRequest(widget, updateImmediately);
if (!eventAlreadyPosted || updateTime == UpdateNow)
sendUpdateRequest(widget, updateTime);
return;
}
if (fullUpdatePending) {
if (updateImmediately)
sendUpdateRequest(tlw, updateImmediately);
if (updateTime == UpdateNow)
sendUpdateRequest(tlw, updateTime);
return;
}
if (QWidgetPrivate::get(widget)->renderToTexture) {
if (!updateRequestSent || updateImmediately)
sendUpdateRequest(tlw, updateImmediately);
if (!updateRequestSent || updateTime == UpdateNow)
sendUpdateRequest(tlw, updateTime);
return;
}
@ -615,22 +619,22 @@ void QWidgetBackingStore::markDirty(const QRect &rect, QWidget *widget, bool upd
const QRect widgetRect = widget->d_func()->effectiveRectFor(rect);
const QRect translatedRect(widgetRect.translated(widget->mapTo(tlw, QPoint())));
if (qt_region_strictContains(dirty, translatedRect)) {
if (updateImmediately)
sendUpdateRequest(tlw, updateImmediately);
if (updateTime == UpdateNow)
sendUpdateRequest(tlw, updateTime);
return; // Already dirty
}
if (invalidateBuffer) {
if (bufferState == BufferInvalid) {
const bool eventAlreadyPosted = !dirty.isEmpty();
dirty += translatedRect;
if (!eventAlreadyPosted || updateImmediately)
sendUpdateRequest(tlw, updateImmediately);
if (!eventAlreadyPosted || updateTime == UpdateNow)
sendUpdateRequest(tlw, updateTime);
return;
}
if (dirtyWidgets.isEmpty()) {
addDirtyWidget(widget, rect);
sendUpdateRequest(tlw, updateImmediately);
sendUpdateRequest(tlw, updateTime);
return;
}
@ -641,8 +645,8 @@ void QWidgetBackingStore::markDirty(const QRect &rect, QWidget *widget, bool upd
addDirtyWidget(widget, rect);
}
if (updateImmediately)
sendUpdateRequest(tlw, updateImmediately);
if (updateTime == UpdateNow)
sendUpdateRequest(tlw, updateTime);
}
/*!
@ -1346,7 +1350,8 @@ void QWidgetPrivate::invalidateBuffer(const QRegion &rgn)
if (wrgn.isEmpty())
return;
tlwExtra->backingStoreTracker->markDirty(wrgn, q, false, true);
tlwExtra->backingStoreTracker->markDirty(wrgn, q,
QWidgetBackingStore::UpdateLater, QWidgetBackingStore::BufferInvalid);
}
/*!
@ -1370,7 +1375,8 @@ void QWidgetPrivate::invalidateBuffer(const QRect &rect)
return;
if (graphicsEffect || !extra || !extra->hasMask) {
tlwExtra->backingStoreTracker->markDirty(wRect, q, false, true);
tlwExtra->backingStoreTracker->markDirty(wRect, q,
QWidgetBackingStore::UpdateLater, QWidgetBackingStore::BufferInvalid);
return;
}
@ -1379,7 +1385,8 @@ void QWidgetPrivate::invalidateBuffer(const QRect &rect)
if (wRgn.isEmpty())
return;
tlwExtra->backingStoreTracker->markDirty(wRgn, q, false, true);
tlwExtra->backingStoreTracker->markDirty(wRgn, q,
QWidgetBackingStore::UpdateLater, QWidgetBackingStore::BufferInvalid);
}
void QWidgetPrivate::repaint_sys(const QRegion &rgn)

View File

@ -93,6 +93,16 @@ private:
class Q_AUTOTEST_EXPORT QWidgetBackingStore
{
public:
enum UpdateTime {
UpdateNow,
UpdateLater
};
enum BufferState{
BufferValid,
BufferInvalid
};
QWidgetBackingStore(QWidget *t);
~QWidgetBackingStore();
@ -112,10 +122,10 @@ public:
}
// ### Qt 4.6: Merge into a template function (after MSVC isn't supported anymore).
void markDirty(const QRegion &rgn, QWidget *widget, bool updateImmediately = false,
bool invalidateBuffer = false);
void markDirty(const QRect &rect, QWidget *widget, bool updateImmediately = false,
bool invalidateBuffer = false);
void markDirty(const QRegion &rgn, QWidget *widget, UpdateTime updateTime = UpdateLater,
BufferState bufferState = BufferValid);
void markDirty(const QRect &rect, QWidget *widget, UpdateTime updateTime = UpdateLater,
BufferState bufferState = BufferValid);
private:
QWidget *tlw;
@ -134,7 +144,7 @@ private:
QPlatformTextureListWatcher *textureListWatcher;
void sendUpdateRequest(QWidget *widget, bool updateImmediately);
void sendUpdateRequest(QWidget *widget, UpdateTime updateTime);
static bool flushPaint(QWidget *widget, const QRegion &rgn);
static void unflushPaint(QWidget *widget, const QRegion &rgn);