bool isUnclipped(const QRect &r) { if (m_rb->clip) return false; if (m_rb->clipRect == m_deviceRect) return true; if (!m_rb->clipRect.isEmpty()) { const QRect &r1 = m_rb->clipRect; return (r.left() >= r1.left() && r.right() <= r1.right() && r.top() >= r1.top() && r.bottom() <= r1.bottom()); } else { return qt_region_strictContains(m_rb->clipRegion, r); } }
/*! This function is equivalent to calling markDirty(QRegion(rect), ...), but is more efficient as it eliminates QRegion operations/allocations and can use the rect more precisely for additional cut-offs. ### 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) { Q_ASSERT(tlw->d_func()->extra); Q_ASSERT(tlw->d_func()->extra->topextra); Q_ASSERT(!tlw->d_func()->extra->topextra->inTopLevelResize); Q_ASSERT(widget->isVisible() && widget->updatesEnabled()); Q_ASSERT(widget->window() == tlw); Q_ASSERT(!rect.isEmpty()); #ifndef QT_NO_GRAPHICSEFFECT widget->d_func()->invalidateGraphicsEffectsRecursively(); #endif //QT_NO_GRAPHICSEFFECT if (widget->d_func()->paintOnScreen()) { if (widget->d_func()->dirty.isEmpty()) { widget->d_func()->dirty = QRegion(rect); sendUpdateRequest(widget, updateImmediately); return; } else if (qt_region_strictContains(widget->d_func()->dirty, rect)) { if (updateImmediately) sendUpdateRequest(widget, updateImmediately); return; // Already dirty. } const bool eventAlreadyPosted = !widget->d_func()->dirty.isEmpty(); widget->d_func()->dirty += rect; if (!eventAlreadyPosted || updateImmediately) sendUpdateRequest(widget, updateImmediately); return; } if (fullUpdatePending) { if (updateImmediately) sendUpdateRequest(tlw, updateImmediately); return; } if (!windowSurface->hasFeature(QWindowSurface::PartialUpdates)) { fullUpdatePending = true; sendUpdateRequest(tlw, updateImmediately); return; } 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); return; // Already dirty } if (invalidateBuffer) { const bool eventAlreadyPosted = !dirty.isEmpty(); dirty += translatedRect; if (!eventAlreadyPosted || updateImmediately) sendUpdateRequest(tlw, updateImmediately); return; } if (dirtyWidgets.isEmpty()) { addDirtyWidget(widget, rect); sendUpdateRequest(tlw, updateImmediately); return; } if (widget->d_func()->inDirtyList) { if (!qt_region_strictContains(widget->d_func()->dirty, widgetRect)) widget->d_func()->dirty += widgetRect; } else { addDirtyWidget(widget, rect); } if (updateImmediately) sendUpdateRequest(tlw, updateImmediately); }