QGIS API Documentation  3.4.15-Madeira (e83d02e274)
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.h"
22 #include <QPainter>
23 #include <QDomDocument>
24 #include <QDomElement>
25 
26 class QgsRenderContext;
27 
52 class CORE_EXPORT QgsPaintEffect
53 {
54 
55 #ifdef SIP_RUN
57  if ( sipCpp->type() == "drawSource" && dynamic_cast<QgsDrawSourceEffect *>( sipCpp ) != NULL )
58  {
59  sipType = sipType_QgsDrawSourceEffect;
60  }
61  else if ( sipCpp->type() == "effectStack" && dynamic_cast<QgsEffectStack *>( sipCpp ) != NULL )
62  {
63  sipType = sipType_QgsEffectStack;
64  }
65  else if ( sipCpp->type() == "blur" && dynamic_cast<QgsBlurEffect *>( sipCpp ) != NULL )
66  {
67  sipType = sipType_QgsBlurEffect;
68  }
69  else if ( sipCpp->type() == "dropShadow" && dynamic_cast<QgsDropShadowEffect *>( sipCpp ) != NULL )
70  {
71  sipType = sipType_QgsDropShadowEffect;
72  }
73  else if ( sipCpp->type() == "outerGlow" && dynamic_cast<QgsOuterGlowEffect *>( sipCpp ) != NULL )
74  {
75  sipType = sipType_QgsOuterGlowEffect;
76  }
77  else if ( sipCpp->type() == "innerGlow" && dynamic_cast<QgsInnerGlowEffect *>( sipCpp ) != NULL )
78  {
79  sipType = sipType_QgsInnerGlowEffect;
80  }
81  else if ( sipCpp->type() == "transform" && dynamic_cast<QgsTransformEffect *>( sipCpp ) != NULL )
82  {
83  sipType = sipType_QgsTransformEffect;
84  }
85  else if ( sipCpp->type() == "color" && dynamic_cast<QgsColorEffect *>( sipCpp ) != NULL )
86  {
87  sipType = sipType_QgsColorEffect;
88  }
89  else
90  {
91  sipType = 0;
92  }
93  SIP_END
94 #endif
95 
96  public:
97 
103  enum DrawMode
104  {
107  ModifyAndRender
108  };
109 
113  QgsPaintEffect() = default;
114 
115  QgsPaintEffect( const QgsPaintEffect &other );
116  virtual ~QgsPaintEffect();
117 
122  virtual QString type() const = 0;
123 
128  virtual QgsPaintEffect *clone() const = 0 SIP_FACTORY;
129 
137  virtual QgsStringMap properties() const = 0;
138 
145  virtual void readProperties( const QgsStringMap &props ) = 0;
146 
156  virtual bool saveProperties( QDomDocument &doc, QDomElement &element ) const;
157 
164  virtual bool readProperties( const QDomElement &element );
165 
172  virtual void render( QPicture &picture, QgsRenderContext &context );
173 
182  virtual void begin( QgsRenderContext &context );
183 
190  virtual void end( QgsRenderContext &context );
191 
197  bool enabled() const { return mEnabled; }
198 
204  void setEnabled( bool enabled );
205 
212  DrawMode drawMode() const { return mDrawMode; }
213 
220  void setDrawMode( DrawMode drawMode );
221 
222  protected:
223 
224  bool mEnabled = true;
225  DrawMode mDrawMode = ModifyAndRender;
226  bool requiresQPainterDpiFix = true;
227 
235  virtual void draw( QgsRenderContext &context ) = 0;
236 
244  void drawSource( QPainter &painter );
245 
253  const QPicture *source() const { return mPicture; }
254 
266  QImage *sourceAsImage( QgsRenderContext &context );
267 
275  QPointF imageOffset( const QgsRenderContext &context ) const;
276 
286  virtual QRectF boundingRect( const QRectF &rect, const QgsRenderContext &context ) const;
287 
294  void fixQPictureDpi( QPainter *painter ) const;
295 
296  private:
297 
298  const QPicture *mPicture = nullptr;
299  QImage *mSourceImage = nullptr;
300  bool mOwnsImage = false;
301 
302  QPainter *mPrevPainter = nullptr;
303  QPainter *mEffectPainter = nullptr;
304  QPicture *mTempPicture = nullptr;
305 
306  QRectF imageBoundingRect( const QgsRenderContext &context ) const;
307 
308  friend class QgsEffectStack;
309 
310 };
311 
325 class CORE_EXPORT QgsDrawSourceEffect : public QgsPaintEffect
326 {
327  public:
328 
330  QgsDrawSourceEffect() = default;
331 
337  static QgsPaintEffect *create( const QgsStringMap &map ) SIP_FACTORY;
338 
339  QString type() const override { return QStringLiteral( "drawSource" ); }
340  QgsDrawSourceEffect *clone() const override SIP_FACTORY;
341  QgsStringMap properties() const override;
342  void readProperties( const QgsStringMap &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 
393 class CORE_EXPORT QgsEffectPainter
394 {
395  public:
396 
403  QgsEffectPainter( QgsRenderContext &renderContext );
404 
412  QgsEffectPainter( QgsRenderContext &renderContext, QgsPaintEffect *effect );
413  ~QgsEffectPainter();
414 
420  void setEffect( QgsPaintEffect *effect );
421 
423 
429  QPainter *operator->() { return mPainter; }
431 
432  private:
433  QgsRenderContext &mRenderContext;
434  QPainter *mPainter = nullptr;
435  QgsPaintEffect *mEffect = nullptr;
436 };
437 
438 #endif // QGSPAINTEFFECT_H
439 
void setOpacity(const double opacity)
Sets the opacity for the effect.
virtual QgsStringMap properties() const =0
Returns the properties describing the paint effect encoded in a string format.
The result of the effect is rendered on the destination, but does not affect subsequent effects in th...
DrawMode drawMode() const
Returns the draw mode for the effect.
bool enabled() const
Returns whether the effect is enabled.
Base class for visual effects which can be applied to QPicture drawings.
QMap< QString, QString > QgsStringMap
Definition: qgis.h:577
virtual QgsPaintEffect * clone() const =0
Duplicates an effect by creating a deep copy of the effect.
void setBlendMode(const QPainter::CompositionMode mode)
Sets the blend mode for the effect.
#define SIP_END
Definition: qgis_sip.h:182
A paint effect which consists of a stack of other chained paint effects.
#define SIP_FACTORY
Definition: qgis_sip.h:69
The result of the effect is not rendered, but is passed on to following effects in the stack...
A paint effect which draws an offset and optionally blurred drop shadow.
A paint effect which blurs a source picture, using a number of different blur methods.
Definition: qgsblureffect.h:36
A paint effect which draws a glow outside of a picture.
DrawMode
Drawing modes for effects.
A paint effect which applies transformations (such as move, scale and rotate) to a picture...
double opacity() const
Returns the opacity for the effect.
virtual void readProperties(const QgsStringMap &props)=0
Reads a string map of an effect&#39;s properties and restores the effect to the state described by the pr...
Contains information about the context of a rendering operation.
QString type() const override
Returns the effect type.
A paint effect which alters the colors (e.g., brightness, contrast) in a source picture.
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition: qgis_sip.h:165
const QPicture * source() const
Returns the source QPicture.
virtual void draw(QgsRenderContext &context)=0
Handles drawing of the effect&#39;s result on to the specified render context.
A paint effect which draws a glow within a 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.
A class to manager painter saving and restoring required for effect drawing.