Skip to content

Commit

Permalink
Don't use a vector renderer to draw QgsHighlight for point cloud points
Browse files Browse the repository at this point in the history
QgsHighlight has severe performance issues with vector layer feature rendering,
so use the heavily optimised point geometry highlight approach instead

Keeps QGIS nice and responsive even when 1000 points are highlighted
  • Loading branch information
nyalldawson committed Jan 18, 2021
1 parent 2964f10 commit c6a4331
Showing 1 changed file with 5 additions and 39 deletions.
44 changes: 5 additions & 39 deletions src/gui/qgshighlight.cpp
Expand Up @@ -116,38 +116,10 @@ std::unique_ptr<QgsFeatureRenderer> QgsHighlight::createRenderer( QgsRenderConte
{
std::unique_ptr<QgsFeatureRenderer> renderer;
QgsVectorLayer *layer = qobject_cast<QgsVectorLayer *>( mLayer );
QgsPointCloudLayer *pcLayer = qobject_cast<QgsPointCloudLayer *>( mLayer );
if ( layer && layer->renderer() )
{
renderer.reset( layer->renderer()->clone() );
}
else if ( pcLayer )
{
QgsPointCloudRenderer *pcRenderer = pcLayer->renderer();
const double pointSizePixels = context.convertToPainterUnits( pcRenderer->pointSize(), pcRenderer->pointSizeUnit(), pcRenderer->pointSizeMapUnitScale() );

QgsSimpleMarkerSymbolLayerBase::Shape shape;
switch ( pcRenderer->pointSymbol() )
{
case QgsPointCloudRenderer::PointSymbol::Circle:
shape = QgsSimpleMarkerSymbolLayerBase::Shape::Circle;
break;
case QgsPointCloudRenderer::PointSymbol::Square:
shape = QgsSimpleMarkerSymbolLayerBase::Shape::Square;
break;
}
QColor color = DEFAULT_SIMPLEMARKER_COLOR;
QColor strokeColor = DEFAULT_SIMPLEMARKER_BORDERCOLOR;
Qt::PenJoinStyle penJoinStyle = DEFAULT_SIMPLEMARKER_JOINSTYLE;
double size = 0.3 * pointSizePixels;
double angle = DEFAULT_SIMPLEMARKER_ANGLE;
QgsSymbol::ScaleMethod scaleMethod = QgsSymbol::ScaleMethod::ScaleDiameter;

QgsSimpleMarkerSymbolLayer *symbolLayer = new QgsSimpleMarkerSymbolLayer( shape, size, angle, scaleMethod, color, strokeColor, penJoinStyle );

QgsSymbol *symbol = new QgsMarkerSymbol( QgsSymbolLayerList() << symbolLayer );
renderer.reset( new QgsSingleSymbolRenderer( symbol ) );
}
if ( renderer )
{
const QgsSymbolList symbols = renderer->symbols( context );
Expand Down Expand Up @@ -326,11 +298,10 @@ void QgsHighlight::updatePosition()

void QgsHighlight::paint( QPainter *p )
{
if ( mFeature.hasGeometry() || qobject_cast< QgsPointCloudLayer *>( mLayer ) )
if ( mFeature.hasGeometry() )
{
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mLayer );
QgsPointCloudLayer *pcLayer = qobject_cast<QgsPointCloudLayer *>( mLayer );
if ( !vlayer && !pcLayer )
if ( !vlayer )
return;

QgsRenderContext context = createRenderContext();
Expand All @@ -352,14 +323,9 @@ void QgsHighlight::paint( QPainter *p )
imagePainter.setRenderHint( QPainter::Antialiasing, true );

context.setPainter( &imagePainter );
QgsFeature feature = mFeature;

if ( pcLayer )
feature.setGeometry( mGeometry );

renderer->startRender( context, feature.fields() );
context.expressionContext().setFeature( feature );
renderer->renderFeature( feature, context );
renderer->startRender( context, mFeature.fields() );
context.expressionContext().setFeature( mFeature );
renderer->renderFeature( mFeature, context );
renderer->stopRender( context );

imagePainter.end();
Expand Down

0 comments on commit c6a4331

Please sign in to comment.