1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QREGION_H
5#define QREGION_H
6
7#include <QtGui/qtguiglobal.h>
8#include <QtCore/qatomic.h>
9#include <QtCore/qrect.h>
10#include <QtGui/qwindowdefs.h>
11
12#ifndef QT_NO_DATASTREAM
13#include <QtCore/qdatastream.h>
14#endif
15#include <QtCore/qspan.h>
16
17QT_BEGIN_NAMESPACE
18
19
20class QVariant;
21
22struct QRegionPrivate;
23
24class QBitmap;
25
26class Q_GUI_EXPORT QRegion
27{
28public:
29 enum RegionType { Rectangle, Ellipse };
30
31 QRegion();
32 QRegion(int x, int y, int w, int h, RegionType t = Rectangle);
33 QRegion(const QRect &r, RegionType t = Rectangle);
34 QRegion(const QPolygon &pa, Qt::FillRule fillRule = Qt::OddEvenFill);
35 QRegion(const QRegion &region);
36 QRegion(QRegion &&other) noexcept
37 : d(std::exchange(obj&: other.d, new_val: const_cast<QRegionData*>(&shared_empty))) {}
38 QRegion(const QBitmap &bitmap);
39 ~QRegion();
40 QRegion &operator=(const QRegion &);
41 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QRegion)
42 void swap(QRegion &other) noexcept { qt_ptr_swap(lhs&: d, rhs&: other.d); }
43 bool isEmpty() const;
44 bool isNull() const;
45
46 typedef const QRect *const_iterator;
47 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
48
49 const_iterator begin() const noexcept;
50 const_iterator cbegin() const noexcept { return begin(); }
51 const_iterator end() const noexcept;
52 const_iterator cend() const noexcept { return end(); }
53 const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
54 const_reverse_iterator crbegin() const noexcept { return rbegin(); }
55 const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
56 const_reverse_iterator crend() const noexcept { return rend(); }
57
58 bool contains(const QPoint &p) const;
59 bool contains(const QRect &r) const;
60
61 void translate(int dx, int dy);
62 inline void translate(const QPoint &p) { translate(dx: p.x(), dy: p.y()); }
63 [[nodiscard]] QRegion translated(int dx, int dy) const;
64 [[nodiscard]] inline QRegion translated(const QPoint &p) const { return translated(dx: p.x(), dy: p.y()); }
65
66 [[nodiscard]] QRegion united(const QRegion &r) const;
67 [[nodiscard]] QRegion united(const QRect &r) const;
68 [[nodiscard]] QRegion intersected(const QRegion &r) const;
69 [[nodiscard]] QRegion intersected(const QRect &r) const;
70 [[nodiscard]] QRegion subtracted(const QRegion &r) const;
71 [[nodiscard]] QRegion xored(const QRegion &r) const;
72
73 bool intersects(const QRegion &r) const;
74 bool intersects(const QRect &r) const;
75
76 QRect boundingRect() const noexcept;
77 void setRects(const QRect *rect, int num);
78 void setRects(QSpan<const QRect> r);
79 QSpan<const QRect> rects() const noexcept;
80 int rectCount() const noexcept;
81
82 QRegion operator|(const QRegion &r) const;
83 QRegion operator+(const QRegion &r) const;
84 QRegion operator+(const QRect &r) const;
85 QRegion operator&(const QRegion &r) const;
86 QRegion operator&(const QRect &r) const;
87 QRegion operator-(const QRegion &r) const;
88 QRegion operator^(const QRegion &r) const;
89
90 QRegion& operator|=(const QRegion &r);
91 QRegion& operator+=(const QRegion &r);
92 QRegion& operator+=(const QRect &r);
93 QRegion& operator&=(const QRegion &r);
94 QRegion& operator&=(const QRect &r);
95 QRegion& operator-=(const QRegion &r);
96 QRegion& operator^=(const QRegion &r);
97
98 bool operator==(const QRegion &r) const;
99 inline bool operator!=(const QRegion &r) const { return !(operator==(r)); }
100 operator QVariant() const;
101
102 // Platform specific conversion functions
103#if defined(Q_OS_WIN) || defined(Q_QDOC)
104 HRGN toHRGN() const;
105 static QRegion fromHRGN(HRGN hrgn);
106#endif
107
108#ifndef QT_NO_DATASTREAM
109 friend Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QRegion &);
110 friend Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QRegion &);
111#endif
112private:
113 QRegion copy() const; // helper of detach.
114 void detach();
115Q_GUI_EXPORT
116 friend bool qt_region_strictContains(const QRegion &region,
117 const QRect &rect);
118 friend struct QRegionPrivate;
119
120#ifndef QT_NO_DATASTREAM
121 void exec(const QByteArray &ba, int ver = 0, QDataStream::ByteOrder byteOrder = QDataStream::BigEndian);
122#endif
123 struct QRegionData {
124 QtPrivate::RefCount ref;
125 QRegionPrivate *qt_rgn;
126 };
127 struct QRegionData *d;
128 static const struct QRegionData shared_empty;
129 static void cleanUp(QRegionData *x);
130};
131Q_DECLARE_SHARED(QRegion)
132
133/*****************************************************************************
134 QRegion stream functions
135 *****************************************************************************/
136
137#ifndef QT_NO_DATASTREAM
138Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QRegion &);
139Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QRegion &);
140#endif
141
142#ifndef QT_NO_DEBUG_STREAM
143Q_GUI_EXPORT QDebug operator<<(QDebug, const QRegion &);
144#endif
145
146QT_END_NAMESPACE
147
148#endif // QREGION_H
149

source code of qtbase/src/gui/painting/qregion.h