QGIS API Documentation  3.37.0-Master (a5b4d9743e8)
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 
26 class QgsRenderContext;
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  }
92  SIP_END
93 #endif
94 
95  public:
96 
102  enum DrawMode
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 
330  QgsDrawSourceEffect() = default;
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 
392 class CORE_EXPORT QgsEffectPainter
393 {
394  public:
395 
401  QgsEffectPainter( QgsRenderContext &renderContext );
402 
409  QgsEffectPainter( QgsRenderContext &renderContext, QgsPaintEffect *effect );
410  ~QgsEffectPainter();
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...
const QPicture * source() const
Returns the source QPicture.
virtual QgsPaintEffect * clone() const =0
Duplicates an effect by creating a deep copy of the effect.
DrawMode drawMode() const
Returns the draw mode for the effect.
bool enabled() const
Returns whether the effect is enabled.
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