1/****************************************************************************
2**
3** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
4** Contact: http://www.qt-project.org/legal
5**
6** This file is part of the QtCore module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and Digia. For licensing terms and
14** conditions see http://qt.digia.com/licensing. For further information
15** use the contact form at http://qt.digia.com/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 2.1 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 2.1 requirements
23** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24**
25** In addition, as a special exception, Digia gives you certain additional
26** rights. These rights are described in the Digia Qt LGPL Exception
27** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28**
29** GNU General Public License Usage
30** Alternatively, this file may be used under the terms of the GNU
31** General Public License version 3.0 as published by the Free Software
32** Foundation and appearing in the file LICENSE.GPL included in the
33** packaging of this file. Please review the following information to
34** ensure the GNU General Public License version 3.0 requirements will be
35** met: http://www.gnu.org/copyleft/gpl.html.
36**
37**
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#ifndef QSIZE_H
43#define QSIZE_H
44
45#include <QtCore/qnamespace.h>
46
47QT_BEGIN_HEADER
48
49QT_BEGIN_NAMESPACE
50
51QT_MODULE(Core)
52
53class Q_CORE_EXPORT QSize
54{
55public:
56 QSize();
57 QSize(int w, int h);
58
59 bool isNull() const;
60 bool isEmpty() const;
61 bool isValid() const;
62
63 int width() const;
64 int height() const;
65 void setWidth(int w);
66 void setHeight(int h);
67 void transpose();
68
69 void scale(int w, int h, Qt::AspectRatioMode mode);
70 void scale(const QSize &s, Qt::AspectRatioMode mode);
71
72 QSize expandedTo(const QSize &) const;
73 QSize boundedTo(const QSize &) const;
74
75 int &rwidth();
76 int &rheight();
77
78 QSize &operator+=(const QSize &);
79 QSize &operator-=(const QSize &);
80 QSize &operator*=(qreal c);
81 QSize &operator/=(qreal c);
82
83 friend inline bool operator==(const QSize &, const QSize &);
84 friend inline bool operator!=(const QSize &, const QSize &);
85 friend inline const QSize operator+(const QSize &, const QSize &);
86 friend inline const QSize operator-(const QSize &, const QSize &);
87 friend inline const QSize operator*(const QSize &, qreal);
88 friend inline const QSize operator*(qreal, const QSize &);
89 friend inline const QSize operator/(const QSize &, qreal);
90
91private:
92 int wd;
93 int ht;
94};
95Q_DECLARE_TYPEINFO(QSize, Q_MOVABLE_TYPE);
96
97/*****************************************************************************
98 QSize stream functions
99 *****************************************************************************/
100
101#ifndef QT_NO_DATASTREAM
102Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QSize &);
103Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QSize &);
104#endif
105
106
107/*****************************************************************************
108 QSize inline functions
109 *****************************************************************************/
110
111inline QSize::QSize()
112{ wd = ht = -1; }
113
114inline QSize::QSize(int w, int h)
115{ wd = w; ht = h; }
116
117inline bool QSize::isNull() const
118{ return wd==0 && ht==0; }
119
120inline bool QSize::isEmpty() const
121{ return wd<1 || ht<1; }
122
123inline bool QSize::isValid() const
124{ return wd>=0 && ht>=0; }
125
126inline int QSize::width() const
127{ return wd; }
128
129inline int QSize::height() const
130{ return ht; }
131
132inline void QSize::setWidth(int w)
133{ wd = w; }
134
135inline void QSize::setHeight(int h)
136{ ht = h; }
137
138inline void QSize::scale(int w, int h, Qt::AspectRatioMode mode)
139{ scale(QSize(w, h), mode); }
140
141inline int &QSize::rwidth()
142{ return wd; }
143
144inline int &QSize::rheight()
145{ return ht; }
146
147inline QSize &QSize::operator+=(const QSize &s)
148{ wd+=s.wd; ht+=s.ht; return *this; }
149
150inline QSize &QSize::operator-=(const QSize &s)
151{ wd-=s.wd; ht-=s.ht; return *this; }
152
153inline QSize &QSize::operator*=(qreal c)
154{ wd = qRound(wd*c); ht = qRound(ht*c); return *this; }
155
156inline bool operator==(const QSize &s1, const QSize &s2)
157{ return s1.wd == s2.wd && s1.ht == s2.ht; }
158
159inline bool operator!=(const QSize &s1, const QSize &s2)
160{ return s1.wd != s2.wd || s1.ht != s2.ht; }
161
162inline const QSize operator+(const QSize & s1, const QSize & s2)
163{ return QSize(s1.wd+s2.wd, s1.ht+s2.ht); }
164
165inline const QSize operator-(const QSize &s1, const QSize &s2)
166{ return QSize(s1.wd-s2.wd, s1.ht-s2.ht); }
167
168inline const QSize operator*(const QSize &s, qreal c)
169{ return QSize(qRound(s.wd*c), qRound(s.ht*c)); }
170
171inline const QSize operator*(qreal c, const QSize &s)
172{ return QSize(qRound(s.wd*c), qRound(s.ht*c)); }
173
174inline QSize &QSize::operator/=(qreal c)
175{
176 Q_ASSERT(!qFuzzyIsNull(c));
177 wd = qRound(wd/c); ht = qRound(ht/c);
178 return *this;
179}
180
181inline const QSize operator/(const QSize &s, qreal c)
182{
183 Q_ASSERT(!qFuzzyIsNull(c));
184 return QSize(qRound(s.wd/c), qRound(s.ht/c));
185}
186
187inline QSize QSize::expandedTo(const QSize & otherSize) const
188{
189 return QSize(qMax(wd,otherSize.wd), qMax(ht,otherSize.ht));
190}
191
192inline QSize QSize::boundedTo(const QSize & otherSize) const
193{
194 return QSize(qMin(wd,otherSize.wd), qMin(ht,otherSize.ht));
195}
196
197#ifndef QT_NO_DEBUG_STREAM
198Q_CORE_EXPORT QDebug operator<<(QDebug, const QSize &);
199#endif
200
201
202class Q_CORE_EXPORT QSizeF
203{
204public:
205 QSizeF();
206 QSizeF(const QSize &sz);
207 QSizeF(qreal w, qreal h);
208
209 bool isNull() const;
210 bool isEmpty() const;
211 bool isValid() const;
212
213 qreal width() const;
214 qreal height() const;
215 void setWidth(qreal w);
216 void setHeight(qreal h);
217 void transpose();
218
219 void scale(qreal w, qreal h, Qt::AspectRatioMode mode);
220 void scale(const QSizeF &s, Qt::AspectRatioMode mode);
221
222 QSizeF expandedTo(const QSizeF &) const;
223 QSizeF boundedTo(const QSizeF &) const;
224
225 qreal &rwidth();
226 qreal &rheight();
227
228 QSizeF &operator+=(const QSizeF &);
229 QSizeF &operator-=(const QSizeF &);
230 QSizeF &operator*=(qreal c);
231 QSizeF &operator/=(qreal c);
232
233 friend inline bool operator==(const QSizeF &, const QSizeF &);
234 friend inline bool operator!=(const QSizeF &, const QSizeF &);
235 friend inline const QSizeF operator+(const QSizeF &, const QSizeF &);
236 friend inline const QSizeF operator-(const QSizeF &, const QSizeF &);
237 friend inline const QSizeF operator*(const QSizeF &, qreal);
238 friend inline const QSizeF operator*(qreal, const QSizeF &);
239 friend inline const QSizeF operator/(const QSizeF &, qreal);
240
241 inline QSize toSize() const;
242
243private:
244 qreal wd;
245 qreal ht;
246};
247Q_DECLARE_TYPEINFO(QSizeF, Q_MOVABLE_TYPE);
248
249
250/*****************************************************************************
251 QSizeF stream functions
252 *****************************************************************************/
253
254#ifndef QT_NO_DATASTREAM
255Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QSizeF &);
256Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QSizeF &);
257#endif
258
259
260/*****************************************************************************
261 QSizeF inline functions
262 *****************************************************************************/
263
264inline QSizeF::QSizeF()
265{ wd = ht = -1.; }
266
267inline QSizeF::QSizeF(const QSize &sz)
268 : wd(sz.width()), ht(sz.height())
269{
270}
271
272inline QSizeF::QSizeF(qreal w, qreal h)
273{ wd = w; ht = h; }
274
275inline bool QSizeF::isNull() const
276{ return qIsNull(wd) && qIsNull(ht); }
277
278inline bool QSizeF::isEmpty() const
279{ return wd <= 0. || ht <= 0.; }
280
281inline bool QSizeF::isValid() const
282{ return wd >= 0. && ht >= 0.; }
283
284inline qreal QSizeF::width() const
285{ return wd; }
286
287inline qreal QSizeF::height() const
288{ return ht; }
289
290inline void QSizeF::setWidth(qreal w)
291{ wd = w; }
292
293inline void QSizeF::setHeight(qreal h)
294{ ht = h; }
295
296inline void QSizeF::scale(qreal w, qreal h, Qt::AspectRatioMode mode)
297{ scale(QSizeF(w, h), mode); }
298
299inline qreal &QSizeF::rwidth()
300{ return wd; }
301
302inline qreal &QSizeF::rheight()
303{ return ht; }
304
305inline QSizeF &QSizeF::operator+=(const QSizeF &s)
306{ wd += s.wd; ht += s.ht; return *this; }
307
308inline QSizeF &QSizeF::operator-=(const QSizeF &s)
309{ wd -= s.wd; ht -= s.ht; return *this; }
310
311inline QSizeF &QSizeF::operator*=(qreal c)
312{ wd *= c; ht *= c; return *this; }
313
314inline bool operator==(const QSizeF &s1, const QSizeF &s2)
315{ return qFuzzyCompare(s1.wd, s2.wd) && qFuzzyCompare(s1.ht, s2.ht); }
316
317inline bool operator!=(const QSizeF &s1, const QSizeF &s2)
318{ return !qFuzzyCompare(s1.wd, s2.wd) || !qFuzzyCompare(s1.ht, s2.ht); }
319
320inline const QSizeF operator+(const QSizeF & s1, const QSizeF & s2)
321{ return QSizeF(s1.wd+s2.wd, s1.ht+s2.ht); }
322
323inline const QSizeF operator-(const QSizeF &s1, const QSizeF &s2)
324{ return QSizeF(s1.wd-s2.wd, s1.ht-s2.ht); }
325
326inline const QSizeF operator*(const QSizeF &s, qreal c)
327{ return QSizeF(s.wd*c, s.ht*c); }
328
329inline const QSizeF operator*(qreal c, const QSizeF &s)
330{ return QSizeF(s.wd*c, s.ht*c); }
331
332inline QSizeF &QSizeF::operator/=(qreal c)
333{
334 Q_ASSERT(!qFuzzyIsNull(c));
335 wd = wd/c; ht = ht/c;
336 return *this;
337}
338
339inline const QSizeF operator/(const QSizeF &s, qreal c)
340{
341 Q_ASSERT(!qFuzzyIsNull(c));
342 return QSizeF(s.wd/c, s.ht/c);
343}
344
345inline QSizeF QSizeF::expandedTo(const QSizeF & otherSize) const
346{
347 return QSizeF(qMax(wd,otherSize.wd), qMax(ht,otherSize.ht));
348}
349
350inline QSizeF QSizeF::boundedTo(const QSizeF & otherSize) const
351{
352 return QSizeF(qMin(wd,otherSize.wd), qMin(ht,otherSize.ht));
353}
354
355inline QSize QSizeF::toSize() const
356{
357 return QSize(qRound(wd), qRound(ht));
358}
359
360#ifndef QT_NO_DEBUG_STREAM
361Q_CORE_EXPORT QDebug operator<<(QDebug, const QSizeF &);
362#endif
363
364QT_END_NAMESPACE
365
366QT_END_HEADER
367
368#endif // QSIZE_H
369