diff options
Diffstat (limited to 'src/gui/painting/qregion.cpp')
-rw-r--r-- | src/gui/painting/qregion.cpp | 75 |
1 files changed, 62 insertions, 13 deletions
diff --git a/src/gui/painting/qregion.cpp b/src/gui/painting/qregion.cpp index 7d912b29e5..f9089d7bba 100644 --- a/src/gui/painting/qregion.cpp +++ b/src/gui/painting/qregion.cpp @@ -51,7 +51,7 @@ QT_BEGIN_NAMESPACE contains() a QPoint or QRect. The bounding rectangle can be found with boundingRect(). - Iteration over the region (with begin(), end(), or C++11 + Iteration over the region (with begin(), end(), or ranged-for loops) gives a decomposition of the region into rectangles. @@ -636,7 +636,7 @@ bool QRegion::intersects(const QRegion ®ion) const */ -#if !defined (Q_OS_UNIX) && !defined (Q_OS_WIN) || defined(Q_CLANG_QDOC) +#if !defined (Q_OS_UNIX) && !defined (Q_OS_WIN) || defined(Q_QDOC) /* \overload \since 4.4 @@ -876,9 +876,15 @@ QRegion QRegion::intersect(const QRect &r) const /*! \fn void QRegion::setRects(const QRect *rects, int number) + \overload + \obsolete Use the QSpan overload instead. +*/ + +/*! + \fn void QRegion::setRects(QSpan<const QRect> rects) + \since 6.8 - Sets the region using the array of rectangles specified by \a rects and - \a number. + Sets the region using the array of rectangles specified by \a rects. The rectangles \e must be optimally Y-X sorted and follow these restrictions: \list @@ -892,6 +898,11 @@ QRegion QRegion::intersect(const QRect &r) const \omit Only some platforms have these restrictions (Qt for Embedded Linux, X11 and \macos). \endomit + + \note For historical reasons, \c{rects.size()} must be less than \c{INT_MAX} + (see rectCount()). + + \sa rects() */ namespace { @@ -3191,8 +3202,7 @@ static void CreateETandAET(int count, const QPoint *pts, int iSLLBlock = 0; int dy; - if (count < 2) - return; + Q_ASSERT(count > 1); /* * initialize the Active Edge Table @@ -3538,7 +3548,7 @@ static QRegionPrivate *PolygonRegion(const QPoint *Pts, int Count, int rule) POINTBLOCK *tmpPtBlock; int numFullPtBlocks = 0; - Q_ASSUME(Count > 1); + Q_ASSERT(Count > 1); region = new QRegionPrivate; @@ -3818,7 +3828,7 @@ QRegion::QRegion(const QRect &r, RegionType t) QRegion::QRegion(const QPolygon &a, Qt::FillRule fillRule) { - if (a.count() > 2) { + if (a.size() > 2) { QRegionPrivate *qt_rgn = PolygonRegion(a.constData(), a.size(), fillRule == Qt::WindingFill ? WindingRule : EvenOddRule); if (qt_rgn) { @@ -4215,18 +4225,39 @@ QRegion::const_iterator QRegion::end() const noexcept return d->qt_rgn ? d->qt_rgn->end() : nullptr; } -void QRegion::setRects(const QRect *rects, int num) +static Q_DECL_COLD_FUNCTION +void set_rects_warn(const char *what) +{ + qWarning("QRegion::setRects(): %s", what); +} + +void QRegion::setRects(const QRect *r, int n) +{ + if (!r && n) { // old setRects() allowed this, but QSpan doesn't + set_rects_warn("passing num != 0 when rects == nullptr is deprecated."); + n = 0; + } + setRects(QSpan<const QRect>(r, n)); +} + +void QRegion::setRects(QSpan<const QRect> rects) { + const auto num = int(rects.size()); + if (num != rects.size()) { + set_rects_warn("span size exceeds INT_MAX, ignoring"); + return; + } + *this = QRegion(); - if (!rects || num == 0 || (num == 1 && rects->isEmpty())) + if (!rects.data() || num == 0 || (num == 1 && rects.front().isEmpty())) return; detach(); d->qt_rgn->numRects = num; if (num == 1) { - d->qt_rgn->extents = *rects; - d->qt_rgn->innerRect = *rects; + d->qt_rgn->extents = rects.front(); + d->qt_rgn->innerRect = rects.front(); } else { d->qt_rgn->rects.resize(num); @@ -4247,12 +4278,30 @@ void QRegion::setRects(const QRect *rects, int num) } } +/*! + \since 6.8 + + Returns a span of non-overlapping rectangles that make up the region. The + span remains valid until the next call of a mutating (non-const) method on + this region. + + The union of all the rectangles is equal to the original region. + + \note This functions existed in Qt 5, too, but returned QVector<QRect> + instead. + + \sa setRects() +*/ +QSpan<const QRect> QRegion::rects() const noexcept +{ + return {begin(), end()}; +}; + int QRegion::rectCount() const noexcept { return (d->qt_rgn ? d->qt_rgn->numRects : 0); } - bool QRegion::operator==(const QRegion &r) const { if (!d->qt_rgn) |