Skip to content

Commit c0f0bd5

Browse files
committed
Draw markers faster
The code takes advantage of points already created to paint the geometries to draw the markers.
1 parent 697a25d commit c0f0bd5

File tree

1 file changed

+64
-20
lines changed

1 file changed

+64
-20
lines changed

src/core/symbology-ng/qgssymbolv2.cpp

+64-20
Original file line numberDiff line numberDiff line change
@@ -738,6 +738,9 @@ void QgsSymbolV2::renderFeature( const QgsFeature& feature, QgsRenderContext& co
738738
mSymbolRenderContext->expressionContextScope()->setVariable( QgsExpressionContext::EXPR_GEOMETRY_PART_NUM, 1 );
739739
}
740740

741+
// Collection of markers to paint
742+
QPolygonF markers;
743+
741744
switch ( QgsWKBTypes::flatType( segmentizedGeometry->geometry()->wkbType() ) )
742745
{
743746
case QgsWKBTypes::Point:
@@ -760,6 +763,11 @@ void QgsSymbolV2::renderFeature( const QgsFeature& feature, QgsRenderContext& co
760763
context.painter()->setBrush( QColor( 255, 0, 0, 100 ) );
761764
context.painter()->drawRect( static_cast<QgsMarkerSymbolV2*>( this )->bounds( pt, context ) );
762765
}
766+
767+
if ( drawVertexMarker )
768+
{
769+
markers << pt;
770+
}
763771
}
764772
break;
765773
case QgsWKBTypes::LineString:
@@ -772,6 +780,11 @@ void QgsSymbolV2::renderFeature( const QgsFeature& feature, QgsRenderContext& co
772780
}
773781
_getLineString( pts, context, QgsConstWkbPtr( segmentizedGeometry->asWkb(), segmentizedGeometry->wkbSize() ), !tileMapRendering && clipFeaturesToExtent() );
774782
static_cast<QgsLineSymbolV2*>( this )->renderPolyline( pts, &feature, context, layer, selected );
783+
784+
if ( drawVertexMarker )
785+
{
786+
markers = pts;
787+
}
775788
}
776789
break;
777790
case QgsWKBTypes::Polygon:
@@ -785,6 +798,16 @@ void QgsSymbolV2::renderFeature( const QgsFeature& feature, QgsRenderContext& co
785798
}
786799
_getPolygon( pts, holes, context, QgsConstWkbPtr( segmentizedGeometry->asWkb(), segmentizedGeometry->wkbSize() ), !tileMapRendering && clipFeaturesToExtent() );
787800
static_cast<QgsFillSymbolV2*>( this )->renderPolygon( pts, ( !holes.isEmpty() ? &holes : nullptr ), &feature, context, layer, selected );
801+
802+
if ( drawVertexMarker )
803+
{
804+
markers = pts;
805+
806+
Q_FOREACH ( const QPolygonF& hole, holes )
807+
{
808+
markers << hole;
809+
}
810+
}
788811
}
789812
break;
790813

@@ -800,13 +823,23 @@ void QgsSymbolV2::renderFeature( const QgsFeature& feature, QgsRenderContext& co
800823

801824
QgsMultiPointV2* mp = static_cast< QgsMultiPointV2* >( segmentizedGeometry->geometry() );
802825

826+
if ( drawVertexMarker )
827+
{
828+
markers.reserve( mp->numGeometries() );
829+
}
830+
803831
for ( int i = 0; i < mp->numGeometries(); ++i )
804832
{
805833
mSymbolRenderContext->expressionContextScope()->setVariable( QgsExpressionContext::EXPR_GEOMETRY_PART_NUM, i + 1 );
806834

807835
const QgsPointV2* point = static_cast< const QgsPointV2* >( mp->geometryN( i ) );
808836
_getPoint( pt, context, point );
809837
static_cast<QgsMarkerSymbolV2*>( this )->renderPoint( pt, &feature, context, layer, selected );
838+
839+
if ( drawVertexMarker )
840+
{
841+
markers.append( pt );
842+
}
810843
}
811844
}
812845
break;
@@ -840,6 +873,18 @@ void QgsSymbolV2::renderFeature( const QgsFeature& feature, QgsRenderContext& co
840873
}
841874
wkbPtr = _getLineString( pts, context, wkbPtr, !tileMapRendering && clipFeaturesToExtent() );
842875
static_cast<QgsLineSymbolV2*>( this )->renderPolyline( pts, &feature, context, layer, selected );
876+
877+
if ( drawVertexMarker )
878+
{
879+
if ( i == 0 )
880+
{
881+
markers = pts;
882+
}
883+
else
884+
{
885+
markers << pts;
886+
}
887+
}
843888
}
844889
}
845890
break;
@@ -875,6 +920,23 @@ void QgsSymbolV2::renderFeature( const QgsFeature& feature, QgsRenderContext& co
875920

876921
wkbPtr = _getPolygon( pts, holes, context, wkbPtr, !tileMapRendering && clipFeaturesToExtent() );
877922
static_cast<QgsFillSymbolV2*>( this )->renderPolygon( pts, ( !holes.isEmpty() ? &holes : nullptr ), &feature, context, layer, selected );
923+
924+
if ( drawVertexMarker )
925+
{
926+
if ( i == 0 )
927+
{
928+
markers = pts;
929+
}
930+
else
931+
{
932+
markers << pts;
933+
}
934+
935+
Q_FOREACH ( const QPolygonF& hole, holes )
936+
{
937+
markers << hole;
938+
}
939+
}
878940
}
879941
break;
880942
}
@@ -903,27 +965,9 @@ void QgsSymbolV2::renderFeature( const QgsFeature& feature, QgsRenderContext& co
903965

904966
if ( drawVertexMarker )
905967
{
906-
const QgsCoordinateTransform* ct = context.coordinateTransform();
907-
const QgsMapToPixel& mtp = context.mapToPixel();
908-
909-
QgsPointV2 vertexPoint;
910-
QgsVertexId vertexId;
911-
double x, y, z;
912-
QPointF mapPoint;
913-
while ( geom->geometry()->nextVertex( vertexId, vertexPoint ) )
968+
Q_FOREACH ( QPointF marker, markers )
914969
{
915-
//transform
916-
x = vertexPoint.x();
917-
y = vertexPoint.y();
918-
z = vertexPoint.z();
919-
if ( ct )
920-
{
921-
ct->transformInPlace( x, y, z );
922-
}
923-
mapPoint.setX( x );
924-
mapPoint.setY( y );
925-
mtp.transformInPlace( mapPoint.rx(), mapPoint.ry() );
926-
QgsVectorLayer::drawVertexMarker( mapPoint.x(), mapPoint.y(), *context.painter(),
970+
QgsVectorLayer::drawVertexMarker( marker.x(), marker.y(), *context.painter(),
927971
static_cast< QgsVectorLayer::VertexMarkerType >( currentVertexMarkerType ),
928972
currentVertexMarkerSize );
929973
}

0 commit comments

Comments
 (0)