27 : mEnabled( other.enabled() )
28 , mDrawMode( other.drawMode() )
36 mEffectPainter.reset();
56 if ( element.isNull() )
60 QDomElement effectElement = doc.createElement( QStringLiteral(
"effect" ) );
61 effectElement.setAttribute( QStringLiteral(
"type" ),
type() );
63 element.appendChild( effectElement );
69 if ( element.isNull() )
83 mSourceImage = QImage();
91 mPrevPainter = context.
painter();
93 mTempPicture = std::make_unique< QPicture >();
95 mEffectPainter = std::make_unique< QPainter >();
96 mEffectPainter->begin( mTempPicture.get() );
104 if ( !mEffectPainter )
107 mEffectPainter->end();
108 mEffectPainter.reset();
112 mPrevPainter =
nullptr;
116 context.
painter()->setPen( Qt::NoPen );
117 context.
painter()->setBrush( Qt::NoBrush );
120 render( *mTempPicture, context );
123 mTempPicture.reset();
134 painter.drawPicture( 0, 0, mPicture );
141 if ( !mSourceImage.isNull() )
146 if ( mPicture.isNull() )
151 const QRectF bounds = imageBoundingRect( context );
152 mSourceImage = QImage(
static_cast< int >( std::ceil( bounds.width() ) ),
153 static_cast< int >( std::ceil( bounds.height() ) ), QImage::Format_ARGB32 );
154 mSourceImage.fill( Qt::transparent );
155 QPainter imagePainter( &mSourceImage );
156 imagePainter.setRenderHint( QPainter::Antialiasing );
157 imagePainter.translate( -bounds.left(), -bounds.top() );
158 imagePainter.drawPicture( 0, 0, mPicture );
165 return imageBoundingRect( context ).topLeft();
179QRectF QgsPaintEffect::imageBoundingRect(
const QgsRenderContext &context )
const
181 return boundingRect( mPicture.boundingRect(), context );
199 if ( mBlendMode != QPainter::CompositionMode_SourceOver || !
qgsDoubleNear( mOpacity, 1.0 ) )
211 QPainter *painter = context.
painter();
213 if ( mBlendMode == QPainter::CompositionMode_SourceOver &&
qgsDoubleNear( mOpacity, 1.0 ) )
224 painter->setCompositionMode( mBlendMode );
225 painter->drawImage(
imageOffset( context ), image );
237 props.insert( QStringLiteral(
"enabled" ),
mEnabled ?
"1" :
"0" );
238 props.insert( QStringLiteral(
"draw_mode" ), QString::number(
int(
mDrawMode ) ) );
239 props.insert( QStringLiteral(
"blend_mode" ), QString::number(
int( mBlendMode ) ) );
240 props.insert( QStringLiteral(
"opacity" ), QString::number( mOpacity ) );
247 const QPainter::CompositionMode mode =
static_cast< QPainter::CompositionMode
>( props.value( QStringLiteral(
"blend_mode" ) ).toInt( &ok ) );
252 if ( props.contains( QStringLiteral(
"transparency" ) ) )
254 const double transparency = props.value( QStringLiteral(
"transparency" ) ).toDouble( &ok );
257 mOpacity = 1.0 - transparency;
262 const double opacity = props.value( QStringLiteral(
"opacity" ) ).toDouble( &ok );
268 mEnabled = props.value( QStringLiteral(
"enabled" ), QStringLiteral(
"1" ) ).toInt();
278 : mRenderContext( renderContext )
281 mPainter = renderContext.
painter();
286 : mRenderContext( renderContext )
289 mPainter = mRenderContext.
painter();
291 mEffect->
begin( mRenderContext );
296 Q_ASSERT( !mEffect );
299 mEffect->
begin( mRenderContext );
306 mEffect->
end( mRenderContext );
@ RequiresRasterization
The effect requires raster-based rendering.
QFlags< PaintEffectFlag > PaintEffectFlags
Flags which control how paint effects behave.
A paint effect which draws the source picture with minor or no alterations.
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)