37 mEffectPainter.reset();
57 if ( element.isNull() )
61 QDomElement effectElement = doc.createElement( QStringLiteral(
"effect" ) );
62 effectElement.setAttribute( QStringLiteral(
"type" ),
type() );
64 element.appendChild( effectElement );
70 if ( element.isNull() )
84 mSourceImage = QImage();
92 mPrevPainter = context.
painter();
94 mTempPicture = std::make_unique< QPicture >();
96 mEffectPainter = std::make_unique< QPainter >();
97 mEffectPainter->begin( mTempPicture.get() );
105 if ( !mEffectPainter )
108 mEffectPainter->end();
109 mEffectPainter.reset();
113 mPrevPainter =
nullptr;
117 context.
painter()->setPen( Qt::NoPen );
118 context.
painter()->setBrush( Qt::NoBrush );
121 render( *mTempPicture, context );
124 mTempPicture.reset();
135 painter.drawPicture( 0, 0, mPicture );
142 if ( !mSourceImage.isNull() )
147 if ( mPicture.isNull() )
152 const QRectF bounds = imageBoundingRect( context );
153 mSourceImage = QImage(
static_cast< int >( std::ceil( bounds.width() ) ),
154 static_cast< int >( std::ceil( bounds.height() ) ), QImage::Format_ARGB32 );
155 mSourceImage.fill( Qt::transparent );
156 QPainter imagePainter( &mSourceImage );
157 imagePainter.setRenderHint( QPainter::Antialiasing );
158 imagePainter.translate( -bounds.left(), -bounds.top() );
159 imagePainter.drawPicture( 0, 0, mPicture );
166 return imageBoundingRect( context ).topLeft();
180QRectF QgsPaintEffect::imageBoundingRect(
const QgsRenderContext &context )
const
182 return boundingRect( mPicture.boundingRect(), context );
200 if ( mBlendMode != QPainter::CompositionMode_SourceOver || !
qgsDoubleNear( mOpacity, 1.0 ) )
212 QPainter *painter = context.
painter();
214 if ( mBlendMode == QPainter::CompositionMode_SourceOver &&
qgsDoubleNear( mOpacity, 1.0 ) )
225 painter->setCompositionMode( mBlendMode );
226 painter->drawImage(
imageOffset( context ), image );
238 props.insert( QStringLiteral(
"enabled" ),
mEnabled ?
"1" :
"0" );
239 props.insert( QStringLiteral(
"draw_mode" ), QString::number(
int(
mDrawMode ) ) );
240 props.insert( QStringLiteral(
"blend_mode" ), QString::number(
int( mBlendMode ) ) );
241 props.insert( QStringLiteral(
"opacity" ), QString::number( mOpacity ) );
248 const QPainter::CompositionMode mode =
static_cast< QPainter::CompositionMode
>( props.value( QStringLiteral(
"blend_mode" ) ).toInt( &ok ) );
253 if ( props.contains( QStringLiteral(
"transparency" ) ) )
255 const double transparency = props.value( QStringLiteral(
"transparency" ) ).toDouble( &ok );
258 mOpacity = 1.0 - transparency;
263 const double opacity = props.value( QStringLiteral(
"opacity" ) ).toDouble( &ok );
269 mEnabled = props.value( QStringLiteral(
"enabled" ), QStringLiteral(
"1" ) ).toInt();
279 : mRenderContext( renderContext )
282 mPainter = renderContext.
painter();
287 : mRenderContext( renderContext )
290 mPainter = mRenderContext.painter();
292 mEffect->begin( mRenderContext );
297 Q_ASSERT( !mEffect );
300 mEffect->
begin( mRenderContext );
307 mEffect->end( mRenderContext );
@ RequiresRasterization
The effect requires raster-based rendering.
QFlags< PaintEffectFlag > PaintEffectFlags
Flags which control how paint effects behave.
QVariantMap properties() const override
Returns the properties describing the paint effect encoded in a string format.
QgsDrawSourceEffect()=default
double opacity() const
Returns the opacity for the effect.
void draw(QgsRenderContext &context) override
Handles drawing of the effect's result on to the specified render context.
QgsDrawSourceEffect * clone() const override
Duplicates an effect by creating a deep copy of the effect.
static QgsPaintEffect * create(const QVariantMap &map)
Creates a new QgsDrawSource effect from a properties string map.
void readProperties(const QVariantMap &props) override
Reads a string map of an effect's properties and restores the effect to the state described by the pr...
Qgis::PaintEffectFlags flags() const override
Returns flags which specify how the paint effect behaves.
QgsEffectPainter(QgsRenderContext &renderContext)
QgsEffectPainter constructor.
void setEffect(QgsPaintEffect *effect)
Sets the effect to be painted.
static void multiplyOpacity(QImage &image, double factor, QgsFeedback *feedback=nullptr)
Multiplies opacity of image pixel values by a factor.
Base class for visual effects which can be applied to QPicture drawings.
bool requiresQPainterDpiFix
void setDrawMode(DrawMode drawMode)
Sets the draw mode for the effect.
void setEnabled(bool enabled)
Sets whether the effect is enabled.
virtual bool saveProperties(QDomDocument &doc, QDomElement &element) const
Saves the current state of the effect to a DOM element.
void drawSource(QPainter &painter)
Draws the source QPicture onto the specified painter.
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...
virtual void begin(QgsRenderContext &context)
Begins intercepting paint operations to a render context.
QImage sourceAsImage(QgsRenderContext &context)
Returns the source QPicture rendered to a new QImage.
QPointF imageOffset(const QgsRenderContext &context) const
Returns the offset which should be used when drawing the source image on to a destination render cont...
DrawMode drawMode() const
Returns the draw mode for the effect.
virtual ~QgsPaintEffect()
virtual void end(QgsRenderContext &context)
Ends interception of paint operations to a render context, and draws the result to the render context...
bool enabled() const
Returns whether the effect is enabled.
virtual Qgis::PaintEffectFlags flags() const
Returns flags which specify how the paint effect behaves.
virtual void render(const QPicture &picture, QgsRenderContext &context)
Renders a picture using the effect.
virtual QRectF boundingRect(const QRectF &rect, const QgsRenderContext &context) const
Returns the bounding rect required for drawing the effect.
virtual QVariantMap properties() const =0
Returns the properties describing the paint effect encoded in a string format.
Q_DECL_DEPRECATED void fixQPictureDpi(QPainter *painter) const
Applies a workaround to a QPainter to avoid an issue with incorrect scaling when drawing QPictures.
DrawMode
Drawing modes for effects.
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.
static void applyScaleFixForQPictureDpi(QPainter *painter)
Applies a workaround to a painter to avoid an issue with incorrect scaling when drawing QPictures.
static void drawPicture(QPainter *painter, const QPointF &point, const QPicture &picture)
Draws a picture onto a painter, correctly applying workarounds to avoid issues with incorrect scaling...
Contains information about the context of a rendering operation.
QPainter * painter()
Returns the destination QPainter for the render operation.
void setPainterFlagsUsingContext(QPainter *painter=nullptr) const
Sets relevant flags on a destination painter, using the flags and settings currently defined for the ...
QgsFeedback * feedback() const
Returns the feedback object that can be queried regularly during rendering to check if rendering shou...
void setPainter(QPainter *p)
Sets the destination QPainter for the render operation.
Scoped object for saving and restoring a QPainter object's state.
static void saveProperties(QVariantMap props, QDomDocument &doc, QDomElement &element)
Saves the map of properties to XML.
static QVariantMap parseProperties(const QDomElement &element)
Parses the properties from XML and returns a map.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).