summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools/qrect.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/tools/qrect.cpp')
-rw-r--r--src/corelib/tools/qrect.cpp318
1 files changed, 155 insertions, 163 deletions
diff --git a/src/corelib/tools/qrect.cpp b/src/corelib/tools/qrect.cpp
index 4aa9897b5d..6d345ce543 100644
--- a/src/corelib/tools/qrect.cpp
+++ b/src/corelib/tools/qrect.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qrect.h"
#include "qdatastream.h"
@@ -81,7 +45,7 @@ QT_BEGIN_NAMESPACE
position, and the translated() function returns a translated copy
of this rectangle.
- The size() function returns the rectange's dimensions as a
+ The size() function returns the rectangle's dimensions as a
QSize. The dimensions can also be retrieved separately using the
width() and height() functions. To manipulate the dimensions use
the setSize(), setWidth() or setHeight() functions. Alternatively,
@@ -223,9 +187,14 @@ QT_BEGIN_NAMESPACE
/*!
\fn QRect::QRect(const QPoint &topLeft, const QPoint &bottomRight)
- Constructs a rectangle with the given \a topLeft and \a bottomRight corners.
+ Constructs a rectangle with the given \a topLeft and \a bottomRight corners, both included.
- \sa setTopLeft(), setBottomRight()
+ If \a bottomRight is to higher and to the left of \a topLeft, the rectangle defined
+ is instead non-inclusive of the corners.
+
+ \note To ensure both points are included regardless of relative order, use span().
+
+ \sa setTopLeft(), setBottomRight(), span()
*/
@@ -295,27 +264,22 @@ QT_BEGIN_NAMESPACE
non-negative width and height.
If width() < 0 the function swaps the left and right corners, and
- it swaps the top and bottom corners if height() < 0.
+ it swaps the top and bottom corners if height() < 0. The corners
+ are at the same time changed from being non-inclusive to inclusive.
\sa isValid(), isEmpty()
*/
QRect QRect::normalized() const noexcept
{
- QRect r;
- if (x2 < x1 - 1) { // swap bad x values
- r.x1 = x2;
- r.x2 = x1;
- } else {
- r.x1 = x1;
- r.x2 = x2;
+ QRect r(*this);
+ if (x2 < x1) { // swap bad x values
+ r.x1 = x2 + 1;
+ r.x2 = x1 - 1;
}
- if (y2 < y1 - 1) { // swap bad y values
- r.y1 = y2;
- r.y2 = y1;
- } else {
- r.y1 = y1;
- r.y2 = y2;
+ if (y2 < y1) { // swap bad y values
+ r.y1 = y2 + 1;
+ r.y2 = y1 - 1;
}
return r;
}
@@ -824,8 +788,8 @@ bool QRect::contains(const QPoint &p, bool proper) const noexcept
{
int l, r;
if (x2 < x1 - 1) {
- l = x2;
- r = x1;
+ l = x2 + 1;
+ r = x1 - 1;
} else {
l = x1;
r = x2;
@@ -839,8 +803,8 @@ bool QRect::contains(const QPoint &p, bool proper) const noexcept
}
int t, b;
if (y2 < y1 - 1) {
- t = y2;
- b = y1;
+ t = y2 + 1;
+ b = y1 - 1;
} else {
t = y1;
b = y2;
@@ -890,16 +854,16 @@ bool QRect::contains(const QRect &r, bool proper) const noexcept
return false;
int l1 = x1;
- int r1 = x1;
- if (x2 - x1 + 1 < 0)
- l1 = x2;
+ int r1 = x1 - 1;
+ if (x2 < x1 - 1)
+ l1 = x2 + 1;
else
r1 = x2;
int l2 = r.x1;
- int r2 = r.x1;
- if (r.x2 - r.x1 + 1 < 0)
- l2 = r.x2;
+ int r2 = r.x1 - 1;
+ if (r.x2 < r.x1 - 1)
+ l2 = r.x2 + 1;
else
r2 = r.x2;
@@ -912,16 +876,16 @@ bool QRect::contains(const QRect &r, bool proper) const noexcept
}
int t1 = y1;
- int b1 = y1;
- if (y2 - y1 + 1 < 0)
- t1 = y2;
+ int b1 = y1 - 1;
+ if (y2 < y1 - 1)
+ t1 = y2 + 1;
else
b1 = y2;
int t2 = r.y1;
- int b2 = r.y1;
- if (r.y2 - r.y1 + 1 < 0)
- t2 = r.y2;
+ int b2 = r.y1 - 1;
+ if (r.y2 < r.y1 - 1)
+ t2 = r.y2 + 1;
else
b2 = r.y2;
@@ -970,30 +934,30 @@ QRect QRect::operator|(const QRect &r) const noexcept
return *this;
int l1 = x1;
- int r1 = x1;
- if (x2 - x1 + 1 < 0)
- l1 = x2;
+ int r1 = x1 - 1;
+ if (x2 < x1 - 1)
+ l1 = x2 + 1;
else
r1 = x2;
int l2 = r.x1;
- int r2 = r.x1;
- if (r.x2 - r.x1 + 1 < 0)
- l2 = r.x2;
+ int r2 = r.x1 - 1;
+ if (r.x2 < r.x1 - 1)
+ l2 = r.x2 + 1;
else
r2 = r.x2;
int t1 = y1;
- int b1 = y1;
- if (y2 - y1 + 1 < 0)
- t1 = y2;
+ int b1 = y1 - 1;
+ if (y2 < y1 - 1)
+ t1 = y2 + 1;
else
b1 = y2;
int t2 = r.y1;
- int b2 = r.y1;
- if (r.y2 - r.y1 + 1 < 0)
- t2 = r.y2;
+ int b2 = r.y1 - 1;
+ if (r.y2 < r.y1 - 1)
+ t2 = r.y2 + 1;
else
b2 = r.y2;
@@ -1032,35 +996,35 @@ QRect QRect::operator&(const QRect &r) const noexcept
return QRect();
int l1 = x1;
- int r1 = x1;
- if (x2 - x1 + 1 < 0)
- l1 = x2;
- else
- r1 = x2;
+ int r1 = x2;
+ if (x2 < x1 - 1) {
+ l1 = x2 + 1;
+ r1 = x1 - 1;
+ }
int l2 = r.x1;
- int r2 = r.x1;
- if (r.x2 - r.x1 + 1 < 0)
- l2 = r.x2;
- else
- r2 = r.x2;
+ int r2 = r.x2;
+ if (r.x2 < r.x1 - 1) {
+ l2 = r.x2 + 1;
+ r2 = r.x1 - 1;
+ }
if (l1 > r2 || l2 > r1)
return QRect();
int t1 = y1;
- int b1 = y1;
- if (y2 - y1 + 1 < 0)
- t1 = y2;
- else
- b1 = y2;
+ int b1 = y2;
+ if (y2 < y1 - 1) {
+ t1 = y2 + 1;
+ b1 = y1 - 1;
+ }
int t2 = r.y1;
- int b2 = r.y1;
- if (r.y2 - r.y1 + 1 < 0)
- t2 = r.y2;
- else
- b2 = r.y2;
+ int b2 = r.y2;
+ if (r.y2 < r.y1 - 1) {
+ t2 = r.y2 + 1;
+ b2 = r.y1 - 1;
+ }
if (t1 > b2 || t2 > b1)
return QRect();
@@ -1104,35 +1068,35 @@ bool QRect::intersects(const QRect &r) const noexcept
return false;
int l1 = x1;
- int r1 = x1;
- if (x2 - x1 + 1 < 0)
- l1 = x2;
- else
- r1 = x2;
+ int r1 = x2;
+ if (x2 < x1 - 1) {
+ l1 = x2 + 1;
+ r1 = x1 - 1;
+ }
int l2 = r.x1;
- int r2 = r.x1;
- if (r.x2 - r.x1 + 1 < 0)
- l2 = r.x2;
- else
- r2 = r.x2;
+ int r2 = r.x2;
+ if (r.x2 < r.x1 - 1) {
+ l2 = r.x2 + 1;
+ r2 = r.x1 - 1;
+ }
if (l1 > r2 || l2 > r1)
return false;
int t1 = y1;
- int b1 = y1;
- if (y2 - y1 + 1 < 0)
- t1 = y2;
- else
- b1 = y2;
+ int b1 = y2;
+ if (y2 < y1 - 1) {
+ t1 = y2 + 1;
+ b1 = y1 - 1;
+ }
int t2 = r.y1;
- int b2 = r.y1;
- if (r.y2 - r.y1 + 1 < 0)
- t2 = r.y2;
- else
- b2 = r.y2;
+ int b2 = r.y2;
+ if (r.y2 < r.y1 - 1) {
+ t2 = r.y2 + 1;
+ b2 = r.y1 - 1;
+ }
if (t1 > b2 || t2 > b1)
return false;
@@ -1141,8 +1105,7 @@ bool QRect::intersects(const QRect &r) const noexcept
}
/*!
- \fn bool operator==(const QRect &r1, const QRect &r2)
- \relates QRect
+ \fn bool QRect::operator==(const QRect &r1, const QRect &r2)
Returns \c true if the rectangles \a r1 and \a r2 are equal,
otherwise returns \c false.
@@ -1150,8 +1113,7 @@ bool QRect::intersects(const QRect &r) const noexcept
/*!
- \fn bool operator!=(const QRect &r1, const QRect &r2)
- \relates QRect
+ \fn bool QRect::operator!=(const QRect &r1, const QRect &r2)
Returns \c true if the rectangles \a r1 and \a r2 are different, otherwise
returns \c false.
@@ -1225,6 +1187,26 @@ bool QRect::intersects(const QRect &r) const noexcept
\since 5.1
*/
+/*!
+ \fn static QRect QRect::span(const QPoint &p1, const QPoint &p2)
+
+ Returns a rectangle spanning the two points \a p1 and \a p2, including both and
+ everything in between.
+
+ \since 6.0
+*/
+
+/*!
+ \fn QRect::toRectF() const
+ \since 6.4
+
+ Returns this rectangle as a rectangle with floating point accuracy.
+
+ \note This function, like the QRectF(QRect) constructor, preserves the
+ size() of the rectangle, not its bottomRight() corner.
+
+ \sa QRectF::toRect()
+*/
/*****************************************************************************
QRect stream functions
@@ -1297,8 +1279,8 @@ QDebug operator<<(QDebug dbg, const QRect &r)
\ingroup painting
\reentrant
- \brief The QRectF class defines a rectangle in the plane using floating
- point precision.
+ \brief The QRectF class defines a finite rectangle in the plane using
+ floating point precision.
A rectangle is normally expressed as a top-left corner and a
size. The size (width and height) of a QRectF is always equivalent
@@ -1326,7 +1308,7 @@ QDebug operator<<(QDebug dbg, const QRect &r)
current position, and the translated() function returns a
translated copy of this rectangle.
- The size() function returns the rectange's dimensions as a
+ The size() function returns the rectangle's dimensions as a
QSizeF. The dimensions can also be retrieved separately using the
width() and height() functions. To manipulate the dimensions use
the setSize(), setWidth() or setHeight() functions. Alternatively,
@@ -1463,8 +1445,8 @@ QDebug operator<<(QDebug dbg, const QRect &r)
/*!
\fn QRectF::QRectF(qreal x, qreal y, qreal width, qreal height)
- Constructs a rectangle with (\a x, \a y) as its top-left corner
- and the given \a width and \a height.
+ Constructs a rectangle with (\a x, \a y) as its top-left corner and the
+ given \a width and \a height. All parameters must be finite.
\sa setRect()
*/
@@ -1474,7 +1456,10 @@ QDebug operator<<(QDebug dbg, const QRect &r)
Constructs a QRectF rectangle from the given QRect \a rectangle.
- \sa toRect()
+ \note This function, like QRect::toRectF(), preserves the size() of
+ \a rectangle, not its bottomRight() corner.
+
+ \sa toRect(), QRect::toRectF()
*/
/*!
@@ -1563,7 +1548,7 @@ QRectF QRectF::normalized() const noexcept
/*!
\fn void QRectF::setLeft(qreal x)
- Sets the left edge of the rectangle to the given \a x
+ Sets the left edge of the rectangle to the given finite \a x
coordinate. May change the width, but will never change the right
edge of the rectangle.
@@ -1575,7 +1560,7 @@ QRectF QRectF::normalized() const noexcept
/*!
\fn void QRectF::setTop(qreal y)
- Sets the top edge of the rectangle to the given \a y coordinate. May
+ Sets the top edge of the rectangle to the given finite \a y coordinate. May
change the height, but will never change the bottom edge of the
rectangle.
@@ -1587,7 +1572,7 @@ QRectF QRectF::normalized() const noexcept
/*!
\fn void QRectF::setRight(qreal x)
- Sets the right edge of the rectangle to the given \a x
+ Sets the right edge of the rectangle to the given finite \a x
coordinate. May change the width, but will never change the left
edge of the rectangle.
@@ -1597,7 +1582,7 @@ QRectF QRectF::normalized() const noexcept
/*!
\fn void QRectF::setBottom(qreal y)
- Sets the bottom edge of the rectangle to the given \a y
+ Sets the bottom edge of the rectangle to the given finite \a y
coordinate. May change the height, but will never change the top
edge of the rectangle.
@@ -1607,7 +1592,7 @@ QRectF QRectF::normalized() const noexcept
/*!
\fn void QRectF::setX(qreal x)
- Sets the left edge of the rectangle to the given \a x
+ Sets the left edge of the rectangle to the given finite \a x
coordinate. May change the width, but will never change the right
edge of the rectangle.
@@ -1619,7 +1604,7 @@ QRectF QRectF::normalized() const noexcept
/*!
\fn void QRectF::setY(qreal y)
- Sets the top edge of the rectangle to the given \a y
+ Sets the top edge of the rectangle to the given finite \a y
coordinate. May change the height, but will never change the
bottom edge of the rectangle.
@@ -1701,7 +1686,7 @@ QRectF QRectF::normalized() const noexcept
\fn void QRectF::moveLeft(qreal x)
Moves the rectangle horizontally, leaving the rectangle's left
- edge at the given \a x coordinate. The rectangle's size is
+ edge at the given finite \a x coordinate. The rectangle's size is
unchanged.
\sa left(), setLeft(), moveRight()
@@ -1711,7 +1696,7 @@ QRectF QRectF::normalized() const noexcept
\fn void QRectF::moveTop(qreal y)
Moves the rectangle vertically, leaving the rectangle's top line
- at the given \a y coordinate. The rectangle's size is unchanged.
+ at the given finite \a y coordinate. The rectangle's size is unchanged.
\sa top(), setTop(), moveBottom()
*/
@@ -1721,7 +1706,7 @@ QRectF QRectF::normalized() const noexcept
\fn void QRectF::moveRight(qreal x)
Moves the rectangle horizontally, leaving the rectangle's right
- edge at the given \a x coordinate. The rectangle's size is
+ edge at the given finite \a x coordinate. The rectangle's size is
unchanged.
\sa right(), setRight(), moveLeft()
@@ -1732,7 +1717,7 @@ QRectF QRectF::normalized() const noexcept
\fn void QRectF::moveBottom(qreal y)
Moves the rectangle vertically, leaving the rectangle's bottom
- edge at the given \a y coordinate. The rectangle's size is
+ edge at the given finite \a y coordinate. The rectangle's size is
unchanged.
\sa bottom(), setBottom(), moveTop()
@@ -1782,8 +1767,8 @@ QRectF QRectF::normalized() const noexcept
/*!
\fn void QRectF::moveTo(qreal x, qreal y)
- Moves the rectangle, leaving the top-left corner at the given
- position (\a x, \a y). The rectangle's size is unchanged.
+ Moves the rectangle, leaving the top-left corner at the given position (\a
+ x, \a y). The rectangle's size is unchanged. Both parameters must be finite.
\sa translate(), moveTopLeft()
*/
@@ -1801,7 +1786,7 @@ QRectF QRectF::normalized() const noexcept
Moves the rectangle \a dx along the x-axis and \a dy along the y-axis,
relative to the current position. Positive values move the rectangle to the
- right and downwards.
+ right and downwards. Both parameters must be finite.
\sa moveTopLeft(), moveTo(), translated()
*/
@@ -1823,7 +1808,7 @@ QRectF QRectF::normalized() const noexcept
Returns a copy of the rectangle that is translated \a dx along the
x axis and \a dy along the y axis, relative to the current
position. Positive values move the rectangle to the right and
- down.
+ down. Both parameters must be finite.
\sa translate()
*/
@@ -1854,8 +1839,8 @@ QRectF QRectF::normalized() const noexcept
/*!
\fn void QRectF::setRect(qreal x, qreal y, qreal width, qreal height)
- Sets the coordinates of the rectangle's top-left corner to (\a x,
- \a y), and its size to the given \a width and \a height.
+ Sets the coordinates of the rectangle's top-left corner to (\a x, \a y), and
+ its size to the given \a width and \a height. All parameters must be finite.
\sa getRect(), setCoords()
*/
@@ -1866,7 +1851,7 @@ QRectF QRectF::normalized() const noexcept
Sets the coordinates of the rectangle's top-left corner to (\a x1,
\a y1), and the coordinates of its bottom-right corner to (\a x2,
- \a y2).
+ \a y2). All parameters must be finite.
\sa getCoords(), setRect()
*/
@@ -1876,6 +1861,7 @@ QRectF QRectF::normalized() const noexcept
Returns a new rectangle with \a dx1, \a dy1, \a dx2 and \a dy2
added respectively to the existing coordinates of this rectangle.
+ All parameters must be finite.
\sa adjust()
*/
@@ -1883,7 +1869,7 @@ QRectF QRectF::normalized() const noexcept
/*! \fn void QRectF::adjust(qreal dx1, qreal dy1, qreal dx2, qreal dy2)
Adds \a dx1, \a dy1, \a dx2 and \a dy2 respectively to the
- existing coordinates of the rectangle.
+ existing coordinates of the rectangle. All parameters must be finite.
\sa adjusted(), setRect()
*/
@@ -1914,7 +1900,7 @@ QRectF QRectF::normalized() const noexcept
/*!
\fn void QRectF::setWidth(qreal width)
- Sets the width of the rectangle to the given \a width. The right
+ Sets the width of the rectangle to the given finite \a width. The right
edge is changed, but not the left one.
\sa width(), setSize()
@@ -1924,7 +1910,7 @@ QRectF QRectF::normalized() const noexcept
/*!
\fn void QRectF::setHeight(qreal height)
- Sets the height of the rectangle to the given \a height. The bottom
+ Sets the height of the rectangle to the given finite \a height. The bottom
edge is changed, but not the top one.
\sa height(), setSize()
@@ -1934,7 +1920,7 @@ QRectF QRectF::normalized() const noexcept
/*!
\fn void QRectF::setSize(const QSizeF &size)
- Sets the size of the rectangle to the given \a size. The top-left
+ Sets the size of the rectangle to the given finite \a size. The top-left
corner is not moved.
\sa size(), setWidth(), setHeight()
@@ -2122,7 +2108,7 @@ bool QRectF::contains(const QRectF &r) const noexcept
Intersects this rectangle with the given \a rectangle.
- \sa intersected(), operator|=()
+ \sa intersected(), operator&()
*/
@@ -2327,7 +2313,7 @@ bool QRectF::intersects(const QRectF &r) const noexcept
Returns a QRect based on the values of this rectangle. Note that the
coordinates in the returned rectangle are rounded to the nearest integer.
- \sa QRectF(), toAlignedRect()
+ \sa QRectF(), toAlignedRect(), QRect::toRectF()
*/
/*!
@@ -2360,20 +2346,26 @@ QRect QRectF::toAlignedRect() const noexcept
*/
/*!
- \fn bool operator==(const QRectF &r1, const QRectF &r2)
- \relates QRectF
+ \fn bool QRectF::operator==(const QRectF &r1, const QRectF &r2)
- Returns \c true if the rectangles \a r1 and \a r2 are equal,
+ Returns \c true if the rectangles \a r1 and \a r2 are \b approximately equal,
otherwise returns \c false.
+
+ \warning This function does not check for strict equality; instead,
+ it uses a fuzzy comparison to compare the rectangles' coordinates.
+
+ \sa qFuzzyCompare
*/
/*!
- \fn bool operator!=(const QRectF &r1, const QRectF &r2)
- \relates QRectF
+ \fn bool QRectF::operator!=(const QRectF &r1, const QRectF &r2)
- Returns \c true if the rectangles \a r1 and \a r2 are different, otherwise
- returns \c false.
+ Returns \c true if the rectangles \a r1 and \a r2 are sufficiently
+ different, otherwise returns \c false.
+
+ \warning This function does not check for strict inequality; instead,
+ it uses a fuzzy comparison to compare the rectangles' coordinates.
*/
/*!