30using namespace Qt::StringLiterals;
35 , mLayerName( layer->name() )
36 , mLayerOpacity( layer->opacity() )
37 , mLayerBlendMode( layer->blendMode() )
41 if ( !context.customProperties().value( u
"visible_layer_ids"_s ).toList().contains( linkedLayer->id() ) )
43 mReadyToCompose = true;
53 const QStringList itemsList = layer->queryIndex( context.extent() );
54 QSet< QString > items( itemsList.begin(), itemsList.end() );
61 items.unite( layer->mNonIndexedItems );
63 mItems.reserve( items.size() );
64 std::transform( items.begin(), items.end(), std::back_inserter( mItems ), [layer](
const QString &
id ) -> std::pair< QString, std::unique_ptr< QgsAnnotationItem > > {
65 return std::make_pair( id, std::unique_ptr< QgsAnnotationItem >( layer->item( id )->clone() ) );
68 std::sort( mItems.begin(), mItems.end(), [](
const std::pair< QString, std::unique_ptr< QgsAnnotationItem > > &a,
const std::pair< QString, std::unique_ptr< QgsAnnotationItem > > &b ) {
69 return a.second->zIndex() < b.second->zIndex();
72 if ( layer->paintEffect() && layer->paintEffect()->enabled() )
74 mPaintEffect.reset( layer->paintEffect()->clone() );
82 return mFeedback.get();
93 mPaintEffect->begin( context );
96 bool canceled =
false;
97 for (
const std::pair< QString, std::unique_ptr< QgsAnnotationItem > > &item : std::as_const( mItems ) )
99 if ( mFeedback->isCanceled() )
105 if ( !item.second->enabled() )
108 std::optional< QgsScopedRenderContextReferenceScaleOverride > referenceScaleOverride;
114 const QgsRectangle bounds = item.second->boundingBox( context );
117 item.second->render( context, mFeedback.get() );
118 auto details = std::make_unique< QgsRenderedAnnotationItemDetails >(
mLayerID, item.first );
119 details->setBoundingBox( bounds );
126 mPaintEffect->end( context );
147 if ( mLayerBlendMode != QPainter::CompositionMode_SourceOver )
@ Default
Allow raster-based rendering in situations where it is required for correct rendering or where it wil...
@ PreferVector
Prefer vector-based rendering, when the result will still be visually near-identical to a raster-base...
@ ForceVector
Always force vector-based rendering, even when the result will be visually different to a raster-base...
@ SupportsReferenceScale
Item supports reference scale based rendering.
bool forceRasterRender() const override
Returns true if the renderer must be rendered to a raster paint device (e.g.
~QgsAnnotationLayerRenderer() override
bool render() override
Do the rendering (based on data stored in the class).
QgsFeedback * feedback() const override
Access to feedback object of the layer renderer (may be nullptr).
QgsAnnotationLayerRenderer(QgsAnnotationLayer *layer, QgsRenderContext &context)
Constructor for a QgsAnnotationLayerRenderer, for the specified layer.
Represents a map layer containing a set of georeferenced annotations, e.g.
QgsMapLayer * linkedVisibilityLayer()
Returns a linked layer, where the items in this annotation layer will only be visible when the linked...
Base class for feedback objects to be used for cancellation of something running in a worker thread.
void appendRenderedItemDetails(QgsRenderedItemDetails *details)
Appends the details of a rendered item to the renderer.
QgsRenderContext * renderContext()
Returns the render context associated with the renderer.
QgsMapLayerRenderer(const QString &layerID, QgsRenderContext *context=nullptr)
Constructor for QgsMapLayerRenderer, with the associated layerID and render context.
Base class for all map layer types.
A rectangle specified with double values.
bool intersects(const QgsRectangle &rect) const
Returns true when rectangle intersects with other rectangle.
Contains information about the context of a rendering operation.
double symbologyReferenceScale() const
Returns the symbology reference scale.
const QgsRectangle & extent() const
When rendering a map layer, calling this method returns the "clipping" extent for the layer (in the l...
Scoped object for temporary override of the symbologyReferenceScale property of a QgsRenderContext.
Scoped object for setting the current thread name.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).