Skip to content

Commit

Permalink
Ensure all layer render subclasses correctly return false if the
Browse files Browse the repository at this point in the history
rendering is aborted early
  • Loading branch information
nyalldawson committed Jan 28, 2021
1 parent 0eaa986 commit a138921
Show file tree
Hide file tree
Showing 7 changed files with 21 additions and 7 deletions.
5 changes: 4 additions & 1 deletion python/core/auto_generated/qgsmaplayerrenderer.sip.in
Expand Up @@ -50,7 +50,10 @@ Constructor for QgsMapLayerRenderer, with the associated ``layerID`` and render

virtual bool render() = 0;
%Docstring
Do the rendering (based on data stored in the class)
Do the rendering (based on data stored in the class).

Returns ``True`` if the layer was completely rendered successfully (i.e. the render
was not canceled early).
%End

virtual bool forceRasterRender() const;
Expand Down
6 changes: 5 additions & 1 deletion src/core/annotations/qgsannotationlayerrenderer.cpp
Expand Up @@ -49,14 +49,18 @@ bool QgsAnnotationLayerRenderer::render()
{
QgsRenderContext &context = *renderContext();

bool canceled = false;
for ( QgsAnnotationItem *item : qgis::as_const( mItems ) )
{
if ( mFeedback->isCanceled() )
{
canceled = true;
break;
}

item->render( context, mFeedback.get() );
}
return true;
return !canceled;
}

bool QgsAnnotationLayerRenderer::forceRasterRender() const
Expand Down
2 changes: 1 addition & 1 deletion src/core/mesh/qgsmeshlayerrenderer.cpp
Expand Up @@ -300,7 +300,7 @@ bool QgsMeshLayerRenderer::render()
renderMesh();
renderVectorDataset();

return true;
return !renderContext()->renderingStopped();
}

bool QgsMeshLayerRenderer::forceRasterRender() const
Expand Down
4 changes: 3 additions & 1 deletion src/core/pointcloud/qgspointcloudlayerrenderer.cpp
Expand Up @@ -159,11 +159,13 @@ bool QgsPointCloudLayerRenderer::render()

// drawing
int nodesDrawn = 0;
bool canceled = false;
for ( const IndexedPointCloudNode &n : nodes )
{
if ( context.renderContext().renderingStopped() )
{
QgsDebugMsgLevel( "canceled", 2 );
canceled = true;
break;
}
std::unique_ptr<QgsPointCloudBlock> block( pc->nodeData( n, request ) );
Expand All @@ -183,7 +185,7 @@ bool QgsPointCloudLayerRenderer::render()

mRenderer->stopRender( context );

return true;
return !canceled;
}

bool QgsPointCloudLayerRenderer::forceRasterRender() const
Expand Down
7 changes: 6 additions & 1 deletion src/core/qgsmaplayerrenderer.h
Expand Up @@ -62,7 +62,12 @@ class CORE_EXPORT QgsMapLayerRenderer

virtual ~QgsMapLayerRenderer() = default;

//! Do the rendering (based on data stored in the class)
/**
* Do the rendering (based on data stored in the class).
*
* Returns TRUE if the layer was completely rendered successfully (i.e. the render
* was not canceled early).
*/
virtual bool render() = 0;

/**
Expand Down
2 changes: 1 addition & 1 deletion src/core/raster/qgsrasterlayerrenderer.cpp
Expand Up @@ -336,7 +336,7 @@ bool QgsRasterLayerRenderer::render()
QgsDebugMsgLevel( QStringLiteral( "total raster draw time (ms): %1" ).arg( time.elapsed(), 5 ), 4 );
mReadyToCompose = true;

return true;
return !mFeedback->isCanceled();
}

QgsFeedback *QgsRasterLayerRenderer::feedback() const
Expand Down
2 changes: 1 addition & 1 deletion src/core/vector/qgsvectorlayerrenderer.cpp
Expand Up @@ -230,7 +230,7 @@ bool QgsVectorLayerRenderer::render()
}

mReadyToCompose = true;
return res;
return res && !renderContext()->renderingStopped();
}

bool QgsVectorLayerRenderer::renderInternal( QgsFeatureRenderer *renderer )
Expand Down

0 comments on commit a138921

Please sign in to comment.