1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtWidgets 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 https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://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 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #ifndef QGRAPHICSEFFECT_H
41 #define QGRAPHICSEFFECT_H
42 
43 #include <QtWidgets/qtwidgetsglobal.h>
44 #include <QtCore/qobject.h>
45 #include <QtCore/qpoint.h>
46 #include <QtCore/qrect.h>
47 #include <QtGui/qcolor.h>
48 #include <QtGui/qbrush.h>
49 
50 QT_REQUIRE_CONFIG(graphicseffect);
51 
52 QT_BEGIN_NAMESPACE
53 
54 class QGraphicsItem;
55 class QStyleOption;
56 class QPainter;
57 class QPixmap;
58 
59 class QGraphicsEffectSource;
60 
61 class QGraphicsEffectPrivate;
62 class Q_WIDGETS_EXPORT QGraphicsEffect : public QObject
63 {
64     Q_OBJECT
65     Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged)
66 public:
67     enum ChangeFlag {
68         SourceAttached = 0x1,
69         SourceDetached = 0x2,
70         SourceBoundingRectChanged = 0x4,
71         SourceInvalidated = 0x8
72     };
73     Q_DECLARE_FLAGS(ChangeFlags, ChangeFlag)
74     Q_FLAG(ChangeFlags)
75 
76     enum PixmapPadMode {
77         NoPad,
78         PadToTransparentBorder,
79         PadToEffectiveBoundingRect
80     };
81 
82     QGraphicsEffect(QObject *parent = nullptr);
83     virtual ~QGraphicsEffect();
84 
85     virtual QRectF boundingRectFor(const QRectF &sourceRect) const;
86     QRectF boundingRect() const;
87 
88     bool isEnabled() const;
89 
90 public Q_SLOTS:
91     void setEnabled(bool enable);
92     void update();
93 
94 Q_SIGNALS:
95     void enabledChanged(bool enabled);
96 
97 protected:
98     QGraphicsEffect(QGraphicsEffectPrivate &d, QObject *parent = nullptr);
99     virtual void draw(QPainter *painter) = 0;
100     virtual void sourceChanged(ChangeFlags flags);
101     void updateBoundingRect();
102 
103     bool sourceIsPixmap() const;
104     QRectF sourceBoundingRect(Qt::CoordinateSystem system = Qt::LogicalCoordinates) const;
105     void drawSource(QPainter *painter);
106     QPixmap sourcePixmap(Qt::CoordinateSystem system = Qt::LogicalCoordinates,
107                          QPoint *offset = nullptr,
108                          PixmapPadMode mode = PadToEffectiveBoundingRect) const;
109 
110 private:
111     Q_DECLARE_PRIVATE(QGraphicsEffect)
112     Q_DISABLE_COPY(QGraphicsEffect)
113     friend class QGraphicsItem;
114     friend class QGraphicsItemPrivate;
115     friend class QGraphicsScenePrivate;
116     friend class QWidget;
117     friend class QWidgetPrivate;
118 
119 public:
120     QGraphicsEffectSource *source() const; // internal
121 
122 };
123 Q_DECLARE_OPERATORS_FOR_FLAGS(QGraphicsEffect::ChangeFlags)
124 
125 class QGraphicsColorizeEffectPrivate;
126 class Q_WIDGETS_EXPORT QGraphicsColorizeEffect: public QGraphicsEffect
127 {
128     Q_OBJECT
129     Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
130     Q_PROPERTY(qreal strength READ strength WRITE setStrength NOTIFY strengthChanged)
131 public:
132     QGraphicsColorizeEffect(QObject *parent = nullptr);
133     ~QGraphicsColorizeEffect();
134 
135     QColor color() const;
136     qreal strength() const;
137 
138 public Q_SLOTS:
139     void setColor(const QColor &c);
140     void setStrength(qreal strength);
141 
142 Q_SIGNALS:
143     void colorChanged(const QColor &color);
144     void strengthChanged(qreal strength);
145 
146 protected:
147     void draw(QPainter *painter) override;
148 
149 private:
150     Q_DECLARE_PRIVATE(QGraphicsColorizeEffect)
151     Q_DISABLE_COPY(QGraphicsColorizeEffect)
152 };
153 
154 class QGraphicsBlurEffectPrivate;
155 class Q_WIDGETS_EXPORT QGraphicsBlurEffect: public QGraphicsEffect
156 {
157     Q_OBJECT
158     Q_PROPERTY(qreal blurRadius READ blurRadius WRITE setBlurRadius NOTIFY blurRadiusChanged)
159     Q_PROPERTY(BlurHints blurHints READ blurHints WRITE setBlurHints NOTIFY blurHintsChanged)
160 public:
161     enum BlurHint {
162         PerformanceHint = 0x00,
163         QualityHint = 0x01,
164         AnimationHint = 0x02
165     };
166     Q_FLAG(BlurHint)
167     Q_DECLARE_FLAGS(BlurHints, BlurHint)
168     Q_FLAG(BlurHints)
169 
170     QGraphicsBlurEffect(QObject *parent = nullptr);
171     ~QGraphicsBlurEffect();
172 
173     QRectF boundingRectFor(const QRectF &rect) const override;
174     qreal blurRadius() const;
175     BlurHints blurHints() const;
176 
177 public Q_SLOTS:
178     void setBlurRadius(qreal blurRadius);
179     void setBlurHints(BlurHints hints);
180 
181 Q_SIGNALS:
182     void blurRadiusChanged(qreal blurRadius);
183     void blurHintsChanged(BlurHints hints);
184 
185 protected:
186     void draw(QPainter *painter) override;
187 
188 private:
189     Q_DECLARE_PRIVATE(QGraphicsBlurEffect)
190     Q_DISABLE_COPY(QGraphicsBlurEffect)
191 };
192 
193 Q_DECLARE_OPERATORS_FOR_FLAGS(QGraphicsBlurEffect::BlurHints)
194 
195 class QGraphicsDropShadowEffectPrivate;
196 class Q_WIDGETS_EXPORT QGraphicsDropShadowEffect: public QGraphicsEffect
197 {
198     Q_OBJECT
199     Q_PROPERTY(QPointF offset READ offset WRITE setOffset NOTIFY offsetChanged)
200     Q_PROPERTY(qreal xOffset READ xOffset WRITE setXOffset NOTIFY offsetChanged)
201     Q_PROPERTY(qreal yOffset READ yOffset WRITE setYOffset NOTIFY offsetChanged)
202     Q_PROPERTY(qreal blurRadius READ blurRadius WRITE setBlurRadius NOTIFY blurRadiusChanged)
203     Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
204 public:
205     QGraphicsDropShadowEffect(QObject *parent = nullptr);
206     ~QGraphicsDropShadowEffect();
207 
208     QRectF boundingRectFor(const QRectF &rect) const override;
209     QPointF offset() const;
210 
xOffset()211     inline qreal xOffset() const
212     { return offset().x(); }
213 
yOffset()214     inline qreal yOffset() const
215     { return offset().y(); }
216 
217     qreal blurRadius() const;
218     QColor color() const;
219 
220 public Q_SLOTS:
221     void setOffset(const QPointF &ofs);
222 
setOffset(qreal dx,qreal dy)223     inline void setOffset(qreal dx, qreal dy)
224     { setOffset(QPointF(dx, dy)); }
225 
setOffset(qreal d)226     inline void setOffset(qreal d)
227     { setOffset(QPointF(d, d)); }
228 
setXOffset(qreal dx)229     inline void setXOffset(qreal dx)
230     { setOffset(QPointF(dx, yOffset())); }
231 
setYOffset(qreal dy)232     inline void setYOffset(qreal dy)
233     { setOffset(QPointF(xOffset(), dy)); }
234 
235     void setBlurRadius(qreal blurRadius);
236     void setColor(const QColor &color);
237 
238 Q_SIGNALS:
239     void offsetChanged(const QPointF &offset);
240     void blurRadiusChanged(qreal blurRadius);
241     void colorChanged(const QColor &color);
242 
243 protected:
244     void draw(QPainter *painter) override;
245 
246 private:
247     Q_DECLARE_PRIVATE(QGraphicsDropShadowEffect)
248     Q_DISABLE_COPY(QGraphicsDropShadowEffect)
249 };
250 
251 class QGraphicsOpacityEffectPrivate;
252 class Q_WIDGETS_EXPORT QGraphicsOpacityEffect: public QGraphicsEffect
253 {
254     Q_OBJECT
255     Q_PROPERTY(qreal opacity READ opacity WRITE setOpacity NOTIFY opacityChanged)
256     Q_PROPERTY(QBrush opacityMask READ opacityMask WRITE setOpacityMask NOTIFY opacityMaskChanged)
257 public:
258     QGraphicsOpacityEffect(QObject *parent = nullptr);
259     ~QGraphicsOpacityEffect();
260 
261     qreal opacity() const;
262     QBrush opacityMask() const;
263 
264 public Q_SLOTS:
265     void setOpacity(qreal opacity);
266     void setOpacityMask(const QBrush &mask);
267 
268 Q_SIGNALS:
269     void opacityChanged(qreal opacity);
270     void opacityMaskChanged(const QBrush &mask);
271 
272 protected:
273     void draw(QPainter *painter) override;
274 
275 private:
276     Q_DECLARE_PRIVATE(QGraphicsOpacityEffect)
277     Q_DISABLE_COPY(QGraphicsOpacityEffect)
278 };
279 
280 QT_END_NAMESPACE
281 
282 #endif // QGRAPHICSEFFECT_H
283 
284