QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgspainteffect.h
Go to the documentation of this file.
1/***************************************************************************
2 qgspainteffect.h
3 ----------------
4 begin : December 2014
5 copyright : (C) 2014 Nyall Dawson
6 email : nyall dot dawson at gmail dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17#ifndef QGSPAINTEFFECT_H
18#define QGSPAINTEFFECT_H
19
20#include "qgis_core.h"
21#include "qgis_sip.h"
22#include <QPainter>
23#include <QDomDocument>
24#include <QDomElement>
25
27
52{
53
54#ifdef SIP_RUN
56 if ( sipCpp->type() == "drawSource" && dynamic_cast<QgsDrawSourceEffect *>( sipCpp ) != NULL )
57 {
58 sipType = sipType_QgsDrawSourceEffect;
59 }
60 else if ( sipCpp->type() == "effectStack" && dynamic_cast<QgsEffectStack *>( sipCpp ) != NULL )
61 {
62 sipType = sipType_QgsEffectStack;
63 }
64 else if ( sipCpp->type() == "blur" && dynamic_cast<QgsBlurEffect *>( sipCpp ) != NULL )
65 {
66 sipType = sipType_QgsBlurEffect;
67 }
68 else if ( sipCpp->type() == "dropShadow" && dynamic_cast<QgsDropShadowEffect *>( sipCpp ) != NULL )
69 {
70 sipType = sipType_QgsDropShadowEffect;
71 }
72 else if ( sipCpp->type() == "outerGlow" && dynamic_cast<QgsOuterGlowEffect *>( sipCpp ) != NULL )
73 {
74 sipType = sipType_QgsOuterGlowEffect;
75 }
76 else if ( sipCpp->type() == "innerGlow" && dynamic_cast<QgsInnerGlowEffect *>( sipCpp ) != NULL )
77 {
78 sipType = sipType_QgsInnerGlowEffect;
79 }
80 else if ( sipCpp->type() == "transform" && dynamic_cast<QgsTransformEffect *>( sipCpp ) != NULL )
81 {
82 sipType = sipType_QgsTransformEffect;
83 }
84 else if ( sipCpp->type() == "color" && dynamic_cast<QgsColorEffect *>( sipCpp ) != NULL )
85 {
86 sipType = sipType_QgsColorEffect;
87 }
88 else
89 {
90 sipType = 0;
91 }
93#endif
94
95 public:
96
103 {
106 ModifyAndRender
107 };
108
112 QgsPaintEffect() = default;
113
114 QgsPaintEffect( const QgsPaintEffect &other );
115 virtual ~QgsPaintEffect();
116
121 virtual QString type() const = 0;
122
127 virtual QgsPaintEffect *clone() const = 0 SIP_FACTORY;
128
136 virtual QVariantMap properties() const = 0;
137
144 virtual void readProperties( const QVariantMap &props ) = 0;
145
155 virtual bool saveProperties( QDomDocument &doc, QDomElement &element ) const;
156
163 virtual bool readProperties( const QDomElement &element );
164
171 virtual void render( QPicture &picture, QgsRenderContext &context );
172
181 virtual void begin( QgsRenderContext &context );
182
189 virtual void end( QgsRenderContext &context );
190
196 bool enabled() const { return mEnabled; }
197
203 void setEnabled( bool enabled );
204
211 DrawMode drawMode() const { return mDrawMode; }
212
219 void setDrawMode( DrawMode drawMode );
220
221 protected:
222
223 bool mEnabled = true;
224 DrawMode mDrawMode = ModifyAndRender;
225 bool requiresQPainterDpiFix = true;
226
234 virtual void draw( QgsRenderContext &context ) = 0;
235
243 void drawSource( QPainter &painter );
244
252 const QPicture *source() const { return mPicture; }
253
265 QImage *sourceAsImage( QgsRenderContext &context );
266
274 QPointF imageOffset( const QgsRenderContext &context ) const;
275
285 virtual QRectF boundingRect( const QRectF &rect, const QgsRenderContext &context ) const;
286
293 void fixQPictureDpi( QPainter *painter ) const;
294
295 private:
296
297 const QPicture *mPicture = nullptr;
298 QImage *mSourceImage = nullptr;
299 bool mOwnsImage = false;
300
301 QPainter *mPrevPainter = nullptr;
302 QPainter *mEffectPainter = nullptr;
303 QPicture *mTempPicture = nullptr;
304
305 QRectF imageBoundingRect( const QgsRenderContext &context ) const;
306
307 friend class QgsEffectStack;
308
309 QgsPaintEffect &operator= ( const QgsPaintEffect & ) = delete;
310
311};
312
326{
327 public:
328
331
337 static QgsPaintEffect *create( const QVariantMap &map ) SIP_FACTORY;
338
339 QString type() const override { return QStringLiteral( "drawSource" ); }
340 QgsDrawSourceEffect *clone() const override SIP_FACTORY;
341 QVariantMap properties() const override;
342 void readProperties( const QVariantMap &props ) override;
343
350 void setOpacity( const double opacity ) { mOpacity = opacity; }
351
358 double opacity() const { return mOpacity; }
359
366 void setBlendMode( const QPainter::CompositionMode mode ) { mBlendMode = mode; }
367
374 QPainter::CompositionMode blendMode() const { return mBlendMode; }
375
376 protected:
377
378 void draw( QgsRenderContext &context ) override;
379
380 private:
381
382 double mOpacity = 1.0;
383 QPainter::CompositionMode mBlendMode = QPainter::CompositionMode_SourceOver;
384};
385
392class CORE_EXPORT QgsEffectPainter
393{
394 public:
395
401 QgsEffectPainter( QgsRenderContext &renderContext );
402
409 QgsEffectPainter( QgsRenderContext &renderContext, QgsPaintEffect *effect );
411
417 void setEffect( QgsPaintEffect *effect );
418
420
425 QPainter *operator->() { return mPainter; }
427
428 private:
429#ifdef SIP_RUN
430 const QgsEffectPainter &operator=( const QgsEffectPainter & );
431#endif
432
433 QgsRenderContext &mRenderContext;
434 QPainter *mPainter = nullptr;
435 QgsPaintEffect *mEffect = nullptr;
436};
437
438#endif // QGSPAINTEFFECT_H
439
A paint effect which blurs a source picture, using a number of different blur methods.
Definition: qgsblureffect.h:37
A paint effect which alters the colors (e.g., brightness, contrast) in a source picture.
A paint effect which draws the source picture with minor or no alterations.
QPainter::CompositionMode blendMode() const
Returns the blend mode for the effect.
void setBlendMode(const QPainter::CompositionMode mode)
Sets the blend mode for the effect.
QgsDrawSourceEffect()=default
Constructor for QgsDrawSourceEffect.
double opacity() const
Returns the opacity for the effect.
QString type() const override
Returns the effect type.
A paint effect which draws an offset and optionally blurred drop shadow.
A class to manager painter saving and restoring required for effect drawing.
A paint effect which consists of a stack of other chained paint effects.
QgsEffectStack & operator=(const QgsEffectStack &rhs)
A paint effect which draws a glow within a picture.
A paint effect which draws a glow outside of a picture.
Base class for visual effects which can be applied to QPicture drawings.
QgsPaintEffect()=default
Constructor for QgsPaintEffect.
virtual void readProperties(const QVariantMap &props)=0
Reads a string map of an effect's properties and restores the effect to the state described by the pr...
DrawMode drawMode() const
Returns the draw mode for the effect.
const QPicture * source() const
Returns the source QPicture.
bool enabled() const
Returns whether the effect is enabled.
virtual QgsPaintEffect * clone() const =0
Duplicates an effect by creating a deep copy of the effect.
virtual QVariantMap properties() const =0
Returns the properties describing the paint effect encoded in a string format.
DrawMode
Drawing modes for effects.
@ Render
The result of the effect is rendered on the destination, but does not affect subsequent effects in th...
@ Modifier
The result of the effect is not rendered, but is passed on to following effects in the stack.
virtual void draw(QgsRenderContext &context)=0
Handles drawing of the effect's result on to the specified render context.
virtual QString type() const =0
Returns the effect type.
Contains information about the context of a rendering operation.
A paint effect which applies transformations (such as move, scale and rotate) to a picture.
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition: qgis_sip.h:191
#define SIP_FACTORY
Definition: qgis_sip.h:76
#define SIP_NODEFAULTCTORS
Definition: qgis_sip.h:101
#define SIP_END
Definition: qgis_sip.h:208