28 : mEnabled( other.enabled() )
29 , mDrawMode( other.drawMode() )
40 delete mEffectPainter;
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() )
84 mSourceImage =
nullptr;
92 mPrevPainter = context.
painter();
95 mTempPicture =
new QPicture();
97 delete mEffectPainter;
98 mEffectPainter =
new QPainter();
99 mEffectPainter->begin( mTempPicture );
106 if ( !mEffectPainter )
109 mEffectPainter->end();
110 delete mEffectPainter;
111 mEffectPainter =
nullptr;
115 mPrevPainter =
nullptr;
119 context.
painter()->setPen( Qt::NoPen );
120 context.
painter()->setBrush( Qt::NoBrush );
123 render( *mTempPicture, context );
127 mTempPicture =
nullptr;
138 painter.drawPicture( 0, 0, *mPicture );
155 const QRectF bounds = imageBoundingRect( context );
156 mSourceImage =
new QImage( bounds.width(), bounds.height(), QImage::Format_ARGB32 );
157 mSourceImage->fill( Qt::transparent );
158 QPainter imagePainter( mSourceImage );
159 imagePainter.setRenderHint( QPainter::Antialiasing );
160 imagePainter.translate( -bounds.left(), -bounds.top() );
161 imagePainter.drawPicture( 0, 0, *mPicture );
169 return imageBoundingRect( context ).topLeft();
183QRectF QgsPaintEffect::imageBoundingRect(
const QgsRenderContext &context )
const
185 return boundingRect( mPicture->boundingRect(), context );
205 QPainter *painter = context.
painter();
207 if ( mBlendMode == QPainter::CompositionMode_SourceOver &&
qgsDoubleNear( mOpacity, 1.0 ) )
218 painter->setCompositionMode( mBlendMode );
219 painter->drawImage(
imageOffset( context ), image );
231 props.insert( QStringLiteral(
"enabled" ),
mEnabled ?
"1" :
"0" );
232 props.insert( QStringLiteral(
"draw_mode" ), QString::number(
int(
mDrawMode ) ) );
233 props.insert( QStringLiteral(
"blend_mode" ), QString::number(
int( mBlendMode ) ) );
234 props.insert( QStringLiteral(
"opacity" ), QString::number( mOpacity ) );
241 const QPainter::CompositionMode mode =
static_cast< QPainter::CompositionMode
>( props.value( QStringLiteral(
"blend_mode" ) ).toInt( &ok ) );
246 if ( props.contains( QStringLiteral(
"transparency" ) ) )
248 const double transparency = props.value( QStringLiteral(
"transparency" ) ).toDouble( &ok );
251 mOpacity = 1.0 - transparency;
256 const double opacity = props.value( QStringLiteral(
"opacity" ) ).toDouble( &ok );
262 mEnabled = props.value( QStringLiteral(
"enabled" ), QStringLiteral(
"1" ) ).toInt();
272 : mRenderContext( renderContext )
275 mPainter = renderContext.
painter();
280 : mRenderContext( renderContext )
283 mPainter = mRenderContext.
painter();
285 mEffect->
begin( mRenderContext );
290 Q_ASSERT( !mEffect );
293 mEffect->
begin( mRenderContext );
300 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.
QPointF imageOffset(const QgsRenderContext &context) const
Returns the offset which should be used when drawing the source image on to a destination render cont...
virtual void render(QPicture &picture, QgsRenderContext &context)
Renders a picture using the effect.
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 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.
QImage * sourceAsImage(QgsRenderContext &context)
Returns the source QPicture rendered to a new QImage.
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.
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)