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 QtGui 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 QBRUSH_H |
43 | #define QBRUSH_H |
44 | |
45 | #include <QtCore/qpair.h> |
46 | #include <QtCore/qpoint.h> |
47 | #include <QtCore/qvector.h> |
48 | #include <QtCore/qscopedpointer.h> |
49 | #include <QtGui/qcolor.h> |
50 | #include <QtGui/qmatrix.h> |
51 | #include <QtGui/qtransform.h> |
52 | #include <QtGui/qimage.h> |
53 | #include <QtGui/qpixmap.h> |
54 | |
55 | #if defined(Q_OS_VXWORKS) |
56 | # if defined(m_data) |
57 | # undef m_data |
58 | # endif |
59 | # if defined(m_type) |
60 | # undef m_type |
61 | # endif |
62 | #endif |
63 | |
64 | QT_BEGIN_HEADER |
65 | |
66 | QT_BEGIN_NAMESPACE |
67 | |
68 | QT_MODULE(Gui) |
69 | |
70 | struct QBrushData; |
71 | class QPixmap; |
72 | class QGradient; |
73 | class QVariant; |
74 | struct QBrushDataPointerDeleter; |
75 | |
76 | class Q_GUI_EXPORT QBrush |
77 | { |
78 | public: |
79 | QBrush(); |
80 | QBrush(Qt::BrushStyle bs); |
81 | QBrush(const QColor &color, Qt::BrushStyle bs=Qt::SolidPattern); |
82 | QBrush(Qt::GlobalColor color, Qt::BrushStyle bs=Qt::SolidPattern); |
83 | |
84 | QBrush(const QColor &color, const QPixmap &pixmap); |
85 | QBrush(Qt::GlobalColor color, const QPixmap &pixmap); |
86 | QBrush(const QPixmap &pixmap); |
87 | QBrush(const QImage &image); |
88 | |
89 | QBrush(const QBrush &brush); |
90 | |
91 | QBrush(const QGradient &gradient); |
92 | |
93 | ~QBrush(); |
94 | QBrush &operator=(const QBrush &brush); |
95 | #ifdef Q_COMPILER_RVALUE_REFS |
96 | inline QBrush &operator=(QBrush &&other) |
97 | { qSwap(d, other.d); return *this; } |
98 | #endif |
99 | inline void swap(QBrush &other) { qSwap(d, other.d); } |
100 | |
101 | operator QVariant() const; |
102 | |
103 | inline Qt::BrushStyle style() const; |
104 | void setStyle(Qt::BrushStyle); |
105 | |
106 | inline const QMatrix &matrix() const; |
107 | void setMatrix(const QMatrix &mat); |
108 | |
109 | inline QTransform transform() const; |
110 | void setTransform(const QTransform &); |
111 | |
112 | QPixmap texture() const; |
113 | void setTexture(const QPixmap &pixmap); |
114 | |
115 | QImage textureImage() const; |
116 | void setTextureImage(const QImage &image); |
117 | |
118 | inline const QColor &color() const; |
119 | void setColor(const QColor &color); |
120 | inline void setColor(Qt::GlobalColor color); |
121 | |
122 | const QGradient *gradient() const; |
123 | |
124 | bool isOpaque() const; |
125 | |
126 | bool operator==(const QBrush &b) const; |
127 | inline bool operator!=(const QBrush &b) const { return !(operator==(b)); } |
128 | |
129 | #ifdef QT3_SUPPORT |
130 | inline QT3_SUPPORT operator const QColor&() const; |
131 | QT3_SUPPORT QPixmap *pixmap() const; |
132 | inline QT3_SUPPORT void setPixmap(const QPixmap &pixmap) { setTexture(pixmap); } |
133 | #endif |
134 | |
135 | private: |
136 | #if defined(Q_WS_X11) |
137 | friend class QX11PaintEngine; |
138 | #endif |
139 | friend class QRasterPaintEngine; |
140 | friend class QRasterPaintEnginePrivate; |
141 | friend struct QSpanData; |
142 | friend class QPainter; |
143 | friend bool Q_GUI_EXPORT qHasPixmapTexture(const QBrush& brush); |
144 | void detach(Qt::BrushStyle newStyle); |
145 | void init(const QColor &color, Qt::BrushStyle bs); |
146 | QScopedPointer<QBrushData, QBrushDataPointerDeleter> d; |
147 | void cleanUp(QBrushData *x); |
148 | |
149 | public: |
150 | inline bool isDetached() const; |
151 | typedef QScopedPointer<QBrushData, QBrushDataPointerDeleter> DataPtr; |
152 | inline DataPtr &data_ptr() { return d; } |
153 | }; |
154 | |
155 | inline void QBrush::setColor(Qt::GlobalColor acolor) |
156 | { setColor(QColor(acolor)); } |
157 | |
158 | Q_DECLARE_TYPEINFO(QBrush, Q_MOVABLE_TYPE); |
159 | Q_DECLARE_SHARED(QBrush) |
160 | |
161 | /***************************************************************************** |
162 | QBrush stream functions |
163 | *****************************************************************************/ |
164 | |
165 | #ifndef QT_NO_DATASTREAM |
166 | Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QBrush &); |
167 | Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QBrush &); |
168 | #endif |
169 | |
170 | #ifndef QT_NO_DEBUG_STREAM |
171 | Q_GUI_EXPORT QDebug operator<<(QDebug, const QBrush &); |
172 | #endif |
173 | |
174 | struct QBrushData |
175 | { |
176 | QAtomicInt ref; |
177 | Qt::BrushStyle style; |
178 | QColor color; |
179 | QTransform transform; |
180 | }; |
181 | |
182 | inline Qt::BrushStyle QBrush::style() const { return d->style; } |
183 | inline const QColor &QBrush::color() const { return d->color; } |
184 | inline const QMatrix &QBrush::matrix() const { return d->transform.toAffine(); } |
185 | inline QTransform QBrush::transform() const { return d->transform; } |
186 | inline bool QBrush::isDetached() const { return d->ref == 1; } |
187 | |
188 | #ifdef QT3_SUPPORT |
189 | inline QBrush::operator const QColor&() const { return d->color; } |
190 | #endif |
191 | |
192 | |
193 | /******************************************************************************* |
194 | * QGradients |
195 | */ |
196 | class QGradientPrivate; |
197 | |
198 | typedef QPair<qreal, QColor> QGradientStop; |
199 | typedef QVector<QGradientStop> QGradientStops; |
200 | |
201 | class Q_GUI_EXPORT QGradient |
202 | { |
203 | Q_GADGET |
204 | Q_ENUMS(Type Spread CoordinateMode) |
205 | public: |
206 | enum Type { |
207 | LinearGradient, |
208 | RadialGradient, |
209 | ConicalGradient, |
210 | NoGradient |
211 | }; |
212 | |
213 | enum Spread { |
214 | PadSpread, |
215 | ReflectSpread, |
216 | RepeatSpread |
217 | }; |
218 | |
219 | enum CoordinateMode { |
220 | LogicalMode, |
221 | StretchToDeviceMode, |
222 | ObjectBoundingMode |
223 | }; |
224 | |
225 | enum InterpolationMode { |
226 | ColorInterpolation, |
227 | ComponentInterpolation |
228 | }; |
229 | |
230 | QGradient(); |
231 | |
232 | Type type() const { return m_type; } |
233 | |
234 | inline void setSpread(Spread spread); |
235 | Spread spread() const { return m_spread; } |
236 | |
237 | void setColorAt(qreal pos, const QColor &color); |
238 | |
239 | void setStops(const QGradientStops &stops); |
240 | QGradientStops stops() const; |
241 | |
242 | CoordinateMode coordinateMode() const; |
243 | void setCoordinateMode(CoordinateMode mode); |
244 | |
245 | InterpolationMode interpolationMode() const; |
246 | void setInterpolationMode(InterpolationMode mode); |
247 | |
248 | bool operator==(const QGradient &gradient) const; |
249 | inline bool operator!=(const QGradient &other) const |
250 | { return !operator==(other); } |
251 | |
252 | bool operator==(const QGradient &gradient); // ### Qt 5: remove |
253 | |
254 | private: |
255 | friend class QLinearGradient; |
256 | friend class QRadialGradient; |
257 | friend class QConicalGradient; |
258 | friend class QBrush; |
259 | |
260 | Type m_type; |
261 | Spread m_spread; |
262 | QGradientStops m_stops; |
263 | union { |
264 | struct { |
265 | qreal x1, y1, x2, y2; |
266 | } linear; |
267 | struct { |
268 | qreal cx, cy, fx, fy, cradius; |
269 | } radial; |
270 | struct { |
271 | qreal cx, cy, angle; |
272 | } conical; |
273 | } m_data; |
274 | void *dummy; |
275 | }; |
276 | |
277 | inline void QGradient::setSpread(Spread aspread) |
278 | { m_spread = aspread; } |
279 | |
280 | class Q_GUI_EXPORT QLinearGradient : public QGradient |
281 | { |
282 | public: |
283 | QLinearGradient(); |
284 | QLinearGradient(const QPointF &start, const QPointF &finalStop); |
285 | QLinearGradient(qreal xStart, qreal yStart, qreal xFinalStop, qreal yFinalStop); |
286 | |
287 | QPointF start() const; |
288 | void setStart(const QPointF &start); |
289 | inline void setStart(qreal x, qreal y) { setStart(QPointF(x, y)); } |
290 | |
291 | QPointF finalStop() const; |
292 | void setFinalStop(const QPointF &stop); |
293 | inline void setFinalStop(qreal x, qreal y) { setFinalStop(QPointF(x, y)); } |
294 | }; |
295 | |
296 | |
297 | class Q_GUI_EXPORT QRadialGradient : public QGradient |
298 | { |
299 | public: |
300 | QRadialGradient(); |
301 | QRadialGradient(const QPointF ¢er, qreal radius, const QPointF &focalPoint); |
302 | QRadialGradient(qreal cx, qreal cy, qreal radius, qreal fx, qreal fy); |
303 | |
304 | QRadialGradient(const QPointF ¢er, qreal radius); |
305 | QRadialGradient(qreal cx, qreal cy, qreal radius); |
306 | |
307 | QRadialGradient(const QPointF ¢er, qreal centerRadius, const QPointF &focalPoint, qreal focalRadius); |
308 | QRadialGradient(qreal cx, qreal cy, qreal centerRadius, qreal fx, qreal fy, qreal focalRadius); |
309 | |
310 | QPointF center() const; |
311 | void setCenter(const QPointF ¢er); |
312 | inline void setCenter(qreal x, qreal y) { setCenter(QPointF(x, y)); } |
313 | |
314 | QPointF focalPoint() const; |
315 | void setFocalPoint(const QPointF &focalPoint); |
316 | inline void setFocalPoint(qreal x, qreal y) { setFocalPoint(QPointF(x, y)); } |
317 | |
318 | qreal radius() const; |
319 | void setRadius(qreal radius); |
320 | |
321 | qreal centerRadius() const; |
322 | void setCenterRadius(qreal radius); |
323 | |
324 | qreal focalRadius() const; |
325 | void setFocalRadius(qreal radius); |
326 | }; |
327 | |
328 | |
329 | class Q_GUI_EXPORT QConicalGradient : public QGradient |
330 | { |
331 | public: |
332 | QConicalGradient(); |
333 | QConicalGradient(const QPointF ¢er, qreal startAngle); |
334 | QConicalGradient(qreal cx, qreal cy, qreal startAngle); |
335 | |
336 | QPointF center() const; |
337 | void setCenter(const QPointF ¢er); |
338 | inline void setCenter(qreal x, qreal y) { setCenter(QPointF(x, y)); } |
339 | |
340 | qreal angle() const; |
341 | void setAngle(qreal angle); |
342 | }; |
343 | |
344 | QT_END_NAMESPACE |
345 | |
346 | QT_END_HEADER |
347 | |
348 | #endif // QBRUSH_H |
349 | |