summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools/qsize.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/tools/qsize.cpp')
-rw-r--r--src/corelib/tools/qsize.cpp828
1 files changed, 828 insertions, 0 deletions
diff --git a/src/corelib/tools/qsize.cpp b/src/corelib/tools/qsize.cpp
new file mode 100644
index 0000000000..6e2768f59a
--- /dev/null
+++ b/src/corelib/tools/qsize.cpp
@@ -0,0 +1,828 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsize.h"
+#include "qdatastream.h"
+#include "qdebug.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QSize
+ \ingroup painting
+
+ \brief The QSize class defines the size of a two-dimensional
+ object using integer point precision.
+
+ A size is specified by a width() and a height(). It can be set in
+ the constructor and changed using the setWidth(), setHeight(), or
+ scale() functions, or using arithmetic operators. A size can also
+ be manipulated directly by retrieving references to the width and
+ height using the rwidth() and rheight() functions. Finally, the
+ width and height can be swapped using the transpose() function.
+
+ The isValid() function determines if a size is valid (a valid size
+ has both width and height greater than zero). The isEmpty()
+ function returns true if either of the width and height is less
+ than, or equal to, zero, while the isNull() function returns true
+ only if both the width and the height is zero.
+
+ Use the expandedTo() function to retrieve a size which holds the
+ maximum height and width of \e this size and a given
+ size. Similarly, the boundedTo() function returns a size which
+ holds the minimum height and width of \e this size and a given
+ size.
+
+ QSize objects can be streamed as well as compared.
+
+ \sa QSizeF, QPoint, QRect
+*/
+
+
+/*****************************************************************************
+ QSize member functions
+ *****************************************************************************/
+
+/*!
+ \fn QSize::QSize()
+
+ Constructs a size with an invalid width and height (i.e., isValid()
+ returns false).
+
+ \sa isValid()
+*/
+
+/*!
+ \fn QSize::QSize(int width, int height)
+
+ Constructs a size with the given \a width and \a height.
+
+ \sa setWidth(), setHeight()
+*/
+
+/*!
+ \fn bool QSize::isNull() const
+
+ Returns true if both the width and height is 0; otherwise returns
+ false.
+
+ \sa isValid(), isEmpty()
+*/
+
+/*!
+ \fn bool QSize::isEmpty() const
+
+ Returns true if either of the width and height is less than or
+ equal to 0; otherwise returns false.
+
+ \sa isNull(), isValid()
+*/
+
+/*!
+ \fn bool QSize::isValid() const
+
+ Returns true if both the width and height is equal to or greater
+ than 0; otherwise returns false.
+
+ \sa isNull(), isEmpty()
+*/
+
+/*!
+ \fn int QSize::width() const
+
+ Returns the width.
+
+ \sa height(), setWidth()
+*/
+
+/*!
+ \fn int QSize::height() const
+
+ Returns the height.
+
+ \sa width(), setHeight()
+*/
+
+/*!
+ \fn void QSize::setWidth(int width)
+
+ Sets the width to the given \a width.
+
+ \sa rwidth(), width(), setHeight()
+*/
+
+/*!
+ \fn void QSize::setHeight(int height)
+
+ Sets the height to the given \a height.
+
+ \sa rheight(), height(), setWidth()
+*/
+
+/*!
+ Swaps the width and height values.
+
+ \sa setWidth(), setHeight()
+*/
+
+void QSize::transpose()
+{
+ int tmp = wd;
+ wd = ht;
+ ht = tmp;
+}
+
+/*!
+ \fn void QSize::scale(int width, int height, Qt::AspectRatioMode mode)
+
+ Scales the size to a rectangle with the given \a width and \a
+ height, according to the specified \a mode:
+
+ \list
+ \i If \a mode is Qt::IgnoreAspectRatio, the size is set to (\a width, \a height).
+ \i If \a mode is Qt::KeepAspectRatio, the current size is scaled to a rectangle
+ as large as possible inside (\a width, \a height), preserving the aspect ratio.
+ \i If \a mode is Qt::KeepAspectRatioByExpanding, the current size is scaled to a rectangle
+ as small as possible outside (\a width, \a height), preserving the aspect ratio.
+ \endlist
+
+ Example:
+ \snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 0
+
+ \sa setWidth(), setHeight()
+*/
+
+/*!
+ \fn void QSize::scale(const QSize &size, Qt::AspectRatioMode mode)
+ \overload
+
+ Scales the size to a rectangle with the given \a size, according to
+ the specified \a mode.
+*/
+void QSize::scale(const QSize &s, Qt::AspectRatioMode mode)
+{
+ if (mode == Qt::IgnoreAspectRatio || wd == 0 || ht == 0) {
+ wd = s.wd;
+ ht = s.ht;
+ } else {
+ bool useHeight;
+ qint64 rw = qint64(s.ht) * qint64(wd) / qint64(ht);
+
+ if (mode == Qt::KeepAspectRatio) {
+ useHeight = (rw <= s.wd);
+ } else { // mode == Qt::KeepAspectRatioByExpanding
+ useHeight = (rw >= s.wd);
+ }
+
+ if (useHeight) {
+ wd = rw;
+ ht = s.ht;
+ } else {
+ ht = qint32(qint64(s.wd) * qint64(ht) / qint64(wd));
+ wd = s.wd;
+ }
+ }
+}
+
+/*!
+ \fn int &QSize::rwidth()
+
+ Returns a reference to the width.
+
+ Using a reference makes it possible to manipulate the width
+ directly. For example:
+
+ \snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 1
+
+ \sa rheight(), setWidth()
+*/
+
+/*!
+ \fn int &QSize::rheight()
+
+ Returns a reference to the height.
+
+ Using a reference makes it possible to manipulate the height
+ directly. For example:
+
+ \snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 2
+
+ \sa rwidth(), setHeight()
+*/
+
+/*!
+ \fn QSize &QSize::operator+=(const QSize &size)
+
+ Adds the given \a size to \e this size, and returns a reference to
+ this size. For example:
+
+ \snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 3
+*/
+
+/*!
+ \fn QSize &QSize::operator-=(const QSize &size)
+
+ Subtracts the given \a size from \e this size, and returns a
+ reference to this size. For example:
+
+ \snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 4
+*/
+
+/*!
+ \fn QSize &QSize::operator*=(qreal factor)
+ \overload
+
+ Multiplies both the width and height by the given \a factor, and
+ returns a reference to the size.
+
+ Note that the result is rounded to the nearest integer.
+
+ \sa scale()
+*/
+
+/*!
+ \fn bool operator==(const QSize &s1, const QSize &s2)
+ \relates QSize
+
+ Returns true if \a s1 and \a s2 are equal; otherwise returns false.
+*/
+
+/*!
+ \fn bool operator!=(const QSize &s1, const QSize &s2)
+ \relates QSize
+
+ Returns true if \a s1 and \a s2 are different; otherwise returns false.
+*/
+
+/*!
+ \fn const QSize operator+(const QSize &s1, const QSize &s2)
+ \relates QSize
+
+ Returns the sum of \a s1 and \a s2; each component is added separately.
+*/
+
+/*!
+ \fn const QSize operator-(const QSize &s1, const QSize &s2)
+ \relates QSize
+
+ Returns \a s2 subtracted from \a s1; each component is subtracted
+ separately.
+*/
+
+/*!
+ \fn const QSize operator*(const QSize &size, qreal factor)
+ \relates QSize
+
+ Multiplies the given \a size by the given \a factor, and returns
+ the result rounded to the nearest integer.
+
+ \sa QSize::scale()
+*/
+
+/*!
+ \fn const QSize operator*(qreal factor, const QSize &size)
+ \overload
+ \relates QSize
+
+ Multiplies the given \a size by the given \a factor, and returns
+ the result rounded to the nearest integer.
+*/
+
+/*!
+ \fn QSize &QSize::operator/=(qreal divisor)
+ \overload
+
+ Divides both the width and height by the given \a divisor, and
+ returns a reference to the size.
+
+ Note that the result is rounded to the nearest integer.
+
+ \sa QSize::scale()
+*/
+
+/*!
+ \fn const QSize operator/(const QSize &size, qreal divisor)
+ \relates QSize
+ \overload
+
+ Divides the given \a size by the given \a divisor, and returns the
+ result rounded to the nearest integer.
+
+ \sa QSize::scale()
+*/
+
+/*!
+ \fn QSize QSize::expandedTo(const QSize & otherSize) const
+
+ Returns a size holding the maximum width and height of this size
+ and the given \a otherSize.
+
+ \sa boundedTo(), scale()
+*/
+
+/*!
+ \fn QSize QSize::boundedTo(const QSize & otherSize) const
+
+ Returns a size holding the minimum width and height of this size
+ and the given \a otherSize.
+
+ \sa expandedTo(), scale()
+*/
+
+
+
+/*****************************************************************************
+ QSize stream functions
+ *****************************************************************************/
+#ifndef QT_NO_DATASTREAM
+/*!
+ \fn QDataStream &operator<<(QDataStream &stream, const QSize &size)
+ \relates QSize
+
+ Writes the given \a size to the given \a stream, and returns a
+ reference to the stream.
+
+ \sa {Serializing Qt Data Types}
+*/
+
+QDataStream &operator<<(QDataStream &s, const QSize &sz)
+{
+ if (s.version() == 1)
+ s << (qint16)sz.width() << (qint16)sz.height();
+ else
+ s << (qint32)sz.width() << (qint32)sz.height();
+ return s;
+}
+
+/*!
+ \fn QDataStream &operator>>(QDataStream &stream, QSize &size)
+ \relates QSize
+
+ Reads a size from the given \a stream into the given \a size, and
+ returns a reference to the stream.
+
+ \sa {Serializing Qt Data Types}
+*/
+
+QDataStream &operator>>(QDataStream &s, QSize &sz)
+{
+ if (s.version() == 1) {
+ qint16 w, h;
+ s >> w; sz.rwidth() = w;
+ s >> h; sz.rheight() = h;
+ }
+ else {
+ qint32 w, h;
+ s >> w; sz.rwidth() = w;
+ s >> h; sz.rheight() = h;
+ }
+ return s;
+}
+#endif // QT_NO_DATASTREAM
+
+#ifndef QT_NO_DEBUG_STREAM
+QDebug operator<<(QDebug dbg, const QSize &s) {
+ dbg.nospace() << "QSize(" << s.width() << ", " << s.height() << ')';
+ return dbg.space();
+}
+#endif
+
+
+
+/*!
+ \class QSizeF
+ \brief The QSizeF class defines the size of a two-dimensional object
+ using floating point precision.
+
+ \ingroup painting
+
+ A size is specified by a width() and a height(). It can be set in
+ the constructor and changed using the setWidth(), setHeight(), or
+ scale() functions, or using arithmetic operators. A size can also
+ be manipulated directly by retrieving references to the width and
+ height using the rwidth() and rheight() functions. Finally, the
+ width and height can be swapped using the transpose() function.
+
+ The isValid() function determines if a size is valid. A valid size
+ has both width and height greater than or equal to zero. The
+ isEmpty() function returns true if either of the width and height
+ is \e less than (or equal to) zero, while the isNull() function
+ returns true only if both the width and the height is zero.
+
+ Use the expandedTo() function to retrieve a size which holds the
+ maximum height and width of this size and a given
+ size. Similarly, the boundedTo() function returns a size which
+ holds the minimum height and width of this size and a given size.
+
+ The QSizeF class also provides the toSize() function returning a
+ QSize copy of this size, constructed by rounding the width and
+ height to the nearest integers.
+
+ QSizeF objects can be streamed as well as compared.
+
+ \sa QSize, QPointF, QRectF
+*/
+
+
+/*****************************************************************************
+ QSizeF member functions
+ *****************************************************************************/
+
+/*!
+ \fn QSizeF::QSizeF()
+
+ Constructs an invalid size.
+
+ \sa isValid()
+*/
+
+/*!
+ \fn QSizeF::QSizeF(const QSize &size)
+
+ Constructs a size with floating point accuracy from the given \a
+ size.
+
+ \sa toSize()
+*/
+
+/*!
+ \fn QSizeF::QSizeF(qreal width, qreal height)
+
+ Constructs a size with the given \a width and \a height.
+*/
+
+/*!
+ \fn bool QSizeF::isNull() const
+
+ Returns true if both the width and height are +0.0; otherwise returns
+ false.
+
+ \note Since this function treats +0.0 and -0.0 differently, sizes with
+ zero width and height where either or both values have a negative
+ sign are not defined to be null sizes.
+
+ \sa isValid(), isEmpty()
+*/
+
+/*!
+ \fn bool QSizeF::isEmpty() const
+
+ Returns true if either of the width and height is less than or
+ equal to 0; otherwise returns false.
+
+ \sa isNull(), isValid()
+*/
+
+/*!
+ \fn bool QSizeF::isValid() const
+
+ Returns true if both the width and height is equal to or greater
+ than 0; otherwise returns false.
+
+ \sa isNull(), isEmpty()
+*/
+
+/*!
+ \fn int QSizeF::width() const
+
+ Returns the width.
+
+ \sa height(), setWidth()
+*/
+
+/*!
+ \fn int QSizeF::height() const
+
+ Returns the height.
+
+ \sa width(), setHeight()
+*/
+
+/*!
+ \fn void QSizeF::setWidth(qreal width)
+
+ Sets the width to the given \a width.
+
+ \sa width(), rwidth(), setHeight()
+*/
+
+/*!
+ \fn void QSizeF::setHeight(qreal height)
+
+ Sets the height to the given \a height.
+
+ \sa height(), rheight(), setWidth()
+*/
+
+/*!
+ \fn QSize QSizeF::toSize() const
+
+ Returns an integer based copy of this size.
+
+ Note that the coordinates in the returned size will be rounded to
+ the nearest integer.
+
+ \sa QSizeF()
+*/
+
+/*!
+ Swaps the width and height values.
+
+ \sa setWidth(), setHeight()
+*/
+
+void QSizeF::transpose()
+{
+ qreal tmp = wd;
+ wd = ht;
+ ht = tmp;
+}
+
+/*!
+ \fn void QSizeF::scale(qreal width, qreal height, Qt::AspectRatioMode mode)
+
+ Scales the size to a rectangle with the given \a width and \a
+ height, according to the specified \a mode.
+
+ \list
+ \i If \a mode is Qt::IgnoreAspectRatio, the size is set to (\a width, \a height).
+ \i If \a mode is Qt::KeepAspectRatio, the current size is scaled to a rectangle
+ as large as possible inside (\a width, \a height), preserving the aspect ratio.
+ \i If \a mode is Qt::KeepAspectRatioByExpanding, the current size is scaled to a rectangle
+ as small as possible outside (\a width, \a height), preserving the aspect ratio.
+ \endlist
+
+ Example:
+ \snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 5
+
+ \sa setWidth(), setHeight()
+*/
+
+/*!
+ \fn void QSizeF::scale(const QSizeF &size, Qt::AspectRatioMode mode)
+ \overload
+
+ Scales the size to a rectangle with the given \a size, according to
+ the specified \a mode.
+*/
+void QSizeF::scale(const QSizeF &s, Qt::AspectRatioMode mode)
+{
+ if (mode == Qt::IgnoreAspectRatio || qIsNull(wd) || qIsNull(ht)) {
+ wd = s.wd;
+ ht = s.ht;
+ } else {
+ bool useHeight;
+ qreal rw = s.ht * wd / ht;
+
+ if (mode == Qt::KeepAspectRatio) {
+ useHeight = (rw <= s.wd);
+ } else { // mode == Qt::KeepAspectRatioByExpanding
+ useHeight = (rw >= s.wd);
+ }
+
+ if (useHeight) {
+ wd = rw;
+ ht = s.ht;
+ } else {
+ ht = s.wd * ht / wd;
+ wd = s.wd;
+ }
+ }
+}
+
+/*!
+ \fn int &QSizeF::rwidth()
+
+ Returns a reference to the width.
+
+ Using a reference makes it possible to manipulate the width
+ directly. For example:
+
+ \snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 6
+
+ \sa rheight(), setWidth()
+*/
+
+/*!
+ \fn int &QSizeF::rheight()
+
+ Returns a reference to the height.
+
+ Using a reference makes it possible to manipulate the height
+ directly. For example:
+
+ \snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 7
+
+ \sa rwidth(), setHeight()
+*/
+
+/*!
+ \fn QSizeF &QSizeF::operator+=(const QSizeF &size)
+
+ Adds the given \a size to this size and returns a reference to
+ this size. For example:
+
+ \snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 8
+*/
+
+/*!
+ \fn QSizeF &QSizeF::operator-=(const QSizeF &size)
+
+ Subtracts the given \a size from this size and returns a reference
+ to this size. For example:
+
+ \snippet doc/src/snippets/code/src_corelib_tools_qsize.cpp 9
+*/
+
+/*!
+ \fn QSizeF &QSizeF::operator*=(qreal factor)
+ \overload
+
+ Multiplies both the width and height by the given \a factor and
+ returns a reference to the size.
+
+ \sa scale()
+*/
+
+/*!
+ \fn bool operator==(const QSizeF &s1, const QSizeF &s2)
+ \relates QSizeF
+
+ Returns true if \a s1 and \a s2 are equal; otherwise returns
+ false.
+*/
+
+/*!
+ \fn bool operator!=(const QSizeF &s1, const QSizeF &s2)
+ \relates QSizeF
+
+ Returns true if \a s1 and \a s2 are different; otherwise returns false.
+*/
+
+/*!
+ \fn const QSizeF operator+(const QSizeF &s1, const QSizeF &s2)
+ \relates QSizeF
+
+ Returns the sum of \a s1 and \a s2; each component is added separately.
+*/
+
+/*!
+ \fn const QSizeF operator-(const QSizeF &s1, const QSizeF &s2)
+ \relates QSizeF
+
+ Returns \a s2 subtracted from \a s1; each component is subtracted
+ separately.
+*/
+
+/*!
+ \fn const QSizeF operator*(const QSizeF &size, qreal factor)
+
+ \overload
+ \relates QSizeF
+
+ Multiplies the given \a size by the given \a factor and returns
+ the result.
+
+ \sa QSizeF::scale()
+*/
+
+/*!
+ \fn const QSizeF operator*(qreal factor, const QSizeF &size)
+
+ \overload
+ \relates QSizeF
+
+ Multiplies the given \a size by the given \a factor and returns
+ the result.
+*/
+
+/*!
+ \fn QSizeF &QSizeF::operator/=(qreal divisor)
+
+ \overload
+
+ Divides both the width and height by the given \a divisor and
+ returns a reference to the size.
+
+ \sa scale()
+*/
+
+/*!
+ \fn const QSizeF operator/(const QSizeF &size, qreal divisor)
+
+ \relates QSizeF
+ \overload
+
+ Divides the given \a size by the given \a divisor and returns the
+ result.
+
+ \sa QSizeF::scale()
+*/
+
+/*!
+ \fn QSizeF QSizeF::expandedTo(const QSizeF & otherSize) const
+
+ Returns a size holding the maximum width and height of this size
+ and the given \a otherSize.
+
+ \sa boundedTo(), scale()
+*/
+
+/*!
+ \fn QSizeF QSizeF::boundedTo(const QSizeF & otherSize) const
+
+ Returns a size holding the minimum width and height of this size
+ and the given \a otherSize.
+
+ \sa expandedTo(), scale()
+*/
+
+
+
+/*****************************************************************************
+ QSizeF stream functions
+ *****************************************************************************/
+#ifndef QT_NO_DATASTREAM
+/*!
+ \fn QDataStream &operator<<(QDataStream &stream, const QSizeF &size)
+ \relates QSizeF
+
+ Writes the given \a size to the given \a stream and returns a
+ reference to the stream.
+
+ \sa {Serializing Qt Data Types}
+*/
+
+QDataStream &operator<<(QDataStream &s, const QSizeF &sz)
+{
+ s << double(sz.width()) << double(sz.height());
+ return s;
+}
+
+/*!
+ \fn QDataStream &operator>>(QDataStream &stream, QSizeF &size)
+ \relates QSizeF
+
+ Reads a size from the given \a stream into the given \a size and
+ returns a reference to the stream.
+
+ \sa {Serializing Qt Data Types}
+*/
+
+QDataStream &operator>>(QDataStream &s, QSizeF &sz)
+{
+ double w, h;
+ s >> w;
+ s >> h;
+ sz.setWidth(qreal(w));
+ sz.setHeight(qreal(h));
+ return s;
+}
+#endif // QT_NO_DATASTREAM
+
+#ifndef QT_NO_DEBUG_STREAM
+QDebug operator<<(QDebug dbg, const QSizeF &s) {
+ dbg.nospace() << "QSizeF(" << s.width() << ", " << s.height() << ')';
+ return dbg.space();
+}
+#endif
+
+QT_END_NAMESPACE