1 /****************************************************************************
2 **
3 ** Copyright (C) 2015 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
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 The Qt Company. For licensing terms
14 ** and conditions see http://www.qt.io/terms-conditions. For further
15 ** information use the contact form at http://www.qt.io/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 or version 3 as published by the Free
20 ** Software Foundation and appearing in the file LICENSE.LGPLv21 and
21 ** LICENSE.LGPLv3 included in the packaging of this file. Please review the
22 ** following information to ensure the GNU Lesser General Public License
23 ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
24 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 **
26 ** As a special exception, The Qt Company gives you certain additional
27 ** rights. These rights are described in The Qt Company LGPL Exception
28 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 **
30 ** GNU General Public License Usage
31 ** Alternatively, this file may be used under the terms of the GNU
32 ** General Public License version 3.0 as published by the Free Software
33 ** Foundation and appearing in the file LICENSE.GPL included in the
34 ** packaging of this file.  Please review the following information to
35 ** ensure the GNU General Public License version 3.0 requirements will be
36 ** met: http://www.gnu.org/copyleft/gpl.html.
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
swap(QBrush & other)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;
setPixmap(const QPixmap & pixmap)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;
data_ptr()152     inline DataPtr &data_ptr() { return d; }
153 };
154 
setColor(Qt::GlobalColor acolor)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 
style()182 inline Qt::BrushStyle QBrush::style() const { return d->style; }
color()183 inline const QColor &QBrush::color() const { return d->color; }
matrix()184 inline const QMatrix &QBrush::matrix() const { return d->transform.toAffine(); }
transform()185 inline QTransform QBrush::transform() const { return d->transform; }
isDetached()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 
type()232     Type type() const { return m_type; }
233 
234     inline void setSpread(Spread 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 
setSpread(Spread aspread)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);
setStart(qreal x,qreal y)289     inline void setStart(qreal x, qreal y) { setStart(QPointF(x, y)); }
290 
291     QPointF finalStop() const;
292     void setFinalStop(const QPointF &stop);
setFinalStop(qreal x,qreal y)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 &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);
setCenter(qreal x,qreal y)312     inline void setCenter(qreal x, qreal y) { setCenter(QPointF(x, y)); }
313 
314     QPointF focalPoint() const;
315     void setFocalPoint(const QPointF &focalPoint);
setFocalPoint(qreal x,qreal y)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 &center, qreal startAngle);
334     QConicalGradient(qreal cx, qreal cy, qreal startAngle);
335 
336     QPointF center() const;
337     void setCenter(const QPointF &center);
setCenter(qreal x,qreal y)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