27 : mEnabled( other.enabled() )
28 , mDrawMode( other.drawMode() )
36 mEffectPainter.reset();
51 if ( element.isNull() )
55 QDomElement effectElement = doc.createElement( QStringLiteral(
"effect" ) );
56 effectElement.setAttribute( QStringLiteral(
"type" ),
type() );
58 element.appendChild( effectElement );
64 if ( element.isNull() )
78 mSourceImage = QImage();
86 mPrevPainter = context.
painter();
88 mTempPicture = std::make_unique< QPicture >();
90 mEffectPainter = std::make_unique< QPainter >();
91 mEffectPainter->begin( mTempPicture.get() );
99 if ( !mEffectPainter )
102 mEffectPainter->end();
103 mEffectPainter.reset();
107 mPrevPainter =
nullptr;
111 context.
painter()->setPen( Qt::NoPen );
112 context.
painter()->setBrush( Qt::NoBrush );
115 render( *mTempPicture, context );
118 mTempPicture.reset();
129 painter.drawPicture( 0, 0, mPicture );
136 if ( !mSourceImage.isNull() )
141 if ( mPicture.isNull() )
146 const QRectF bounds = imageBoundingRect( context );
147 mSourceImage = QImage(
static_cast< int >( std::ceil( bounds.width() ) ),
148 static_cast< int >( std::ceil( bounds.height() ) ), QImage::Format_ARGB32 );
149 mSourceImage.fill( Qt::transparent );
150 QPainter imagePainter( &mSourceImage );
151 imagePainter.setRenderHint( QPainter::Antialiasing );
152 imagePainter.translate( -bounds.left(), -bounds.top() );
153 imagePainter.drawPicture( 0, 0, mPicture );
160 return imageBoundingRect( context ).topLeft();
174QRectF QgsPaintEffect::imageBoundingRect(
const QgsRenderContext &context )
const
176 return boundingRect( mPicture.boundingRect(), context );
196 QPainter *painter = context.
painter();
198 if ( mBlendMode == QPainter::CompositionMode_SourceOver &&
qgsDoubleNear( mOpacity, 1.0 ) )
209 painter->setCompositionMode( mBlendMode );
210 painter->drawImage(
imageOffset( context ), image );
222 props.insert( QStringLiteral(
"enabled" ),
mEnabled ?
"1" :
"0" );
223 props.insert( QStringLiteral(
"draw_mode" ), QString::number(
int(
mDrawMode ) ) );
224 props.insert( QStringLiteral(
"blend_mode" ), QString::number(
int( mBlendMode ) ) );
225 props.insert( QStringLiteral(
"opacity" ), QString::number( mOpacity ) );
232 const QPainter::CompositionMode mode =
static_cast< QPainter::CompositionMode
>( props.value( QStringLiteral(
"blend_mode" ) ).toInt( &ok ) );
237 if ( props.contains( QStringLiteral(
"transparency" ) ) )
239 const double transparency = props.value( QStringLiteral(
"transparency" ) ).toDouble( &ok );
242 mOpacity = 1.0 - transparency;
247 const double opacity = props.value( QStringLiteral(
"opacity" ) ).toDouble( &ok );
253 mEnabled = props.value( QStringLiteral(
"enabled" ), QStringLiteral(
"1" ) ).toInt();
263 : mRenderContext( renderContext )
266 mPainter = renderContext.
painter();
271 : mRenderContext( renderContext )
274 mPainter = mRenderContext.
painter();
276 mEffect->
begin( mRenderContext );
281 Q_ASSERT( !mEffect );
284 mEffect->
begin( mRenderContext );
291 mEffect->
end( mRenderContext );
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...
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 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)