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
64QT_BEGIN_HEADER
65
66QT_BEGIN_NAMESPACE
67
68QT_MODULE(Gui)
69
70struct QBrushData;
71class QPixmap;
72class QGradient;
73class QVariant;
74struct QBrushDataPointerDeleter;
75
76class Q_GUI_EXPORT QBrush
77{
78public:
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
135private:
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
149public:
150 inline bool isDetached() const;
151 typedef QScopedPointer<QBrushData, QBrushDataPointerDeleter> DataPtr;
152 inline DataPtr &data_ptr() { return d; }
153};
154
155inline void QBrush::setColor(Qt::GlobalColor acolor)
156{ setColor(QColor(acolor)); }
157
158Q_DECLARE_TYPEINFO(QBrush, Q_MOVABLE_TYPE);
159Q_DECLARE_SHARED(QBrush)
160
161/*****************************************************************************
162 QBrush stream functions
163 *****************************************************************************/
164
165#ifndef QT_NO_DATASTREAM
166Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QBrush &);
167Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QBrush &);
168#endif
169
170#ifndef QT_NO_DEBUG_STREAM
171Q_GUI_EXPORT QDebug operator<<(QDebug, const QBrush &);
172#endif
173
174struct QBrushData
175{
176 QAtomicInt ref;
177 Qt::BrushStyle style;
178 QColor color;
179 QTransform transform;
180};
181
182inline Qt::BrushStyle QBrush::style() const { return d->style; }
183inline const QColor &QBrush::color() const { return d->color; }
184inline const QMatrix &QBrush::matrix() const { return d->transform.toAffine(); }
185inline QTransform QBrush::transform() const { return d->transform; }
186inline bool QBrush::isDetached() const { return d->ref == 1; }
187
188#ifdef QT3_SUPPORT
189inline QBrush::operator const QColor&() const { return d->color; }
190#endif
191
192
193/*******************************************************************************
194 * QGradients
195 */
196class QGradientPrivate;
197
198typedef QPair<qreal, QColor> QGradientStop;
199typedef QVector<QGradientStop> QGradientStops;
200
201class Q_GUI_EXPORT QGradient
202{
203 Q_GADGET
204 Q_ENUMS(Type Spread CoordinateMode)
205public:
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
254private:
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
277inline void QGradient::setSpread(Spread aspread)
278{ m_spread = aspread; }
279
280class Q_GUI_EXPORT QLinearGradient : public QGradient
281{
282public:
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
297class Q_GUI_EXPORT QRadialGradient : public QGradient
298{
299public:
300 QRadialGradient();
301 QRadialGradient(const QPointF &center, qreal radius, const QPointF &focalPoint);
302 QRadialGradient(qreal cx, qreal cy, qreal radius, qreal fx, qreal fy);
303
304 QRadialGradient(const QPointF &center, qreal radius);
305 QRadialGradient(qreal cx, qreal cy, qreal radius);
306
307 QRadialGradient(const QPointF &center, 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 &center);
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
329class Q_GUI_EXPORT QConicalGradient : public QGradient
330{
331public:
332 QConicalGradient();
333 QConicalGradient(const QPointF &center, qreal startAngle);
334 QConicalGradient(qreal cx, qreal cy, qreal startAngle);
335
336 QPointF center() const;
337 void setCenter(const QPointF &center);
338 inline void setCenter(qreal x, qreal y) { setCenter(QPointF(x, y)); }
339
340 qreal angle() const;
341 void setAngle(qreal angle);
342};
343
344QT_END_NAMESPACE
345
346QT_END_HEADER
347
348#endif // QBRUSH_H
349