Skip to content

Commit ef292e6

Browse files
committed
Draw markers faster
The code takes advantage of points already created to paint the geometries. This point array contains the simplified version of the original geometry.
1 parent 79d6407 commit ef292e6

File tree

1 file changed

+90
-18
lines changed

1 file changed

+90
-18
lines changed

src/core/symbology-ng/qgssymbolv2.cpp

+90-18
Original file line numberDiff line numberDiff line change
@@ -735,6 +735,9 @@ void QgsSymbolV2::renderFeature( const QgsFeature& feature, QgsRenderContext& co
735735
mSymbolRenderContext->expressionContextScope()->setVariable( QgsExpressionContext::EXPR_GEOMETRY_PART_NUM, 1 );
736736
}
737737

738+
// Collection of markers to paint, only used for no curve types.
739+
QPolygonF markers;
740+
738741
switch ( QgsWKBTypes::flatType( segmentizedGeometry->geometry()->wkbType() ) )
739742
{
740743
case QgsWKBTypes::Point:
@@ -757,6 +760,11 @@ void QgsSymbolV2::renderFeature( const QgsFeature& feature, QgsRenderContext& co
757760
context.painter()->setBrush( QColor( 255, 0, 0, 100 ) );
758761
context.painter()->drawRect( static_cast<QgsMarkerSymbolV2*>( this )->bounds( pt, context, feature ) );
759762
}
763+
764+
if ( drawVertexMarker && !deleteSegmentizedGeometry )
765+
{
766+
markers << pt;
767+
}
760768
}
761769
break;
762770
case QgsWKBTypes::LineString:
@@ -770,6 +778,11 @@ void QgsSymbolV2::renderFeature( const QgsFeature& feature, QgsRenderContext& co
770778
QgsConstWkbSimplifierPtr wkbPtr( segmentizedGeometry->asWkb(), segmentizedGeometry->wkbSize(), context.vectorSimplifyMethod() );
771779
_getLineString( pts, context, wkbPtr, !tileMapRendering && clipFeaturesToExtent() );
772780
static_cast<QgsLineSymbolV2*>( this )->renderPolyline( pts, &feature, context, layer, selected );
781+
782+
if ( drawVertexMarker && !deleteSegmentizedGeometry )
783+
{
784+
markers = pts;
785+
}
773786
}
774787
break;
775788
case QgsWKBTypes::Polygon:
@@ -784,6 +797,16 @@ void QgsSymbolV2::renderFeature( const QgsFeature& feature, QgsRenderContext& co
784797
QgsConstWkbSimplifierPtr wkbPtr( segmentizedGeometry->asWkb(), segmentizedGeometry->wkbSize(), context.vectorSimplifyMethod() );
785798
_getPolygon( pts, holes, context, wkbPtr, !tileMapRendering && clipFeaturesToExtent() );
786799
static_cast<QgsFillSymbolV2*>( this )->renderPolygon( pts, ( !holes.isEmpty() ? &holes : nullptr ), &feature, context, layer, selected );
800+
801+
if ( drawVertexMarker && !deleteSegmentizedGeometry )
802+
{
803+
markers = pts;
804+
805+
Q_FOREACH ( const QPolygonF& hole, holes )
806+
{
807+
markers << hole;
808+
}
809+
}
787810
}
788811
break;
789812

@@ -799,6 +822,11 @@ void QgsSymbolV2::renderFeature( const QgsFeature& feature, QgsRenderContext& co
799822

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

825+
if ( drawVertexMarker && !deleteSegmentizedGeometry )
826+
{
827+
markers.reserve( mp->numGeometries() );
828+
}
829+
802830
for ( int i = 0; i < mp->numGeometries(); ++i )
803831
{
804832
mSymbolRenderContext->setGeometryPartNum( i + 1 );
@@ -807,6 +835,11 @@ void QgsSymbolV2::renderFeature( const QgsFeature& feature, QgsRenderContext& co
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 && !deleteSegmentizedGeometry )
840+
{
841+
markers.append( pt );
842+
}
810843
}
811844
}
812845
break;
@@ -844,6 +877,18 @@ void QgsSymbolV2::renderFeature( const QgsFeature& feature, QgsRenderContext& co
844877
break;
845878
}
846879
static_cast<QgsLineSymbolV2*>( this )->renderPolyline( pts, &feature, context, layer, selected );
880+
881+
if ( drawVertexMarker && !deleteSegmentizedGeometry )
882+
{
883+
if ( i == 0 )
884+
{
885+
markers = pts;
886+
}
887+
else
888+
{
889+
markers << pts;
890+
}
891+
}
847892
}
848893
}
849894
break;
@@ -882,6 +927,23 @@ void QgsSymbolV2::renderFeature( const QgsFeature& feature, QgsRenderContext& co
882927
break;
883928
}
884929
static_cast<QgsFillSymbolV2*>( this )->renderPolygon( pts, ( !holes.isEmpty() ? &holes : nullptr ), &feature, context, layer, selected );
930+
931+
if ( drawVertexMarker && !deleteSegmentizedGeometry )
932+
{
933+
if ( i == 0 )
934+
{
935+
markers = pts;
936+
}
937+
else
938+
{
939+
markers << pts;
940+
}
941+
942+
Q_FOREACH ( const QPolygonF& hole, holes )
943+
{
944+
markers << hole;
945+
}
946+
}
885947
}
886948
break;
887949
}
@@ -910,27 +972,37 @@ void QgsSymbolV2::renderFeature( const QgsFeature& feature, QgsRenderContext& co
910972

911973
if ( drawVertexMarker )
912974
{
913-
const QgsCoordinateTransform* ct = context.coordinateTransform();
914-
const QgsMapToPixel& mtp = context.mapToPixel();
915-
916-
QgsPointV2 vertexPoint;
917-
QgsVertexId vertexId;
918-
double x, y, z;
919-
QPointF mapPoint;
920-
while ( geom->geometry()->nextVertex( vertexId, vertexPoint ) )
975+
if ( markers.size() > 0 )
976+
{
977+
Q_FOREACH ( QPointF marker, markers )
978+
{
979+
renderVertexMarker( marker, context, currentVertexMarkerType, currentVertexMarkerSize );
980+
}
981+
}
982+
else
921983
{
922-
//transform
923-
x = vertexPoint.x();
924-
y = vertexPoint.y();
925-
z = vertexPoint.z();
926-
if ( ct )
984+
const QgsCoordinateTransform* ct = context.coordinateTransform();
985+
const QgsMapToPixel& mtp = context.mapToPixel();
986+
987+
QgsPointV2 vertexPoint;
988+
QgsVertexId vertexId;
989+
double x, y, z;
990+
QPointF mapPoint;
991+
while ( geom->geometry()->nextVertex( vertexId, vertexPoint ) )
927992
{
928-
ct->transformInPlace( x, y, z );
993+
//transform
994+
x = vertexPoint.x();
995+
y = vertexPoint.y();
996+
z = vertexPoint.z();
997+
if ( ct )
998+
{
999+
ct->transformInPlace( x, y, z );
1000+
}
1001+
mapPoint.setX( x );
1002+
mapPoint.setY( y );
1003+
mtp.transformInPlace( mapPoint.rx(), mapPoint.ry() );
1004+
renderVertexMarker( mapPoint, context, currentVertexMarkerType, currentVertexMarkerSize );
9291005
}
930-
mapPoint.setX( x );
931-
mapPoint.setY( y );
932-
mtp.transformInPlace( mapPoint.rx(), mapPoint.ry() );
933-
renderVertexMarker( mapPoint, context, currentVertexMarkerType, currentVertexMarkerSize );
9341006
}
9351007
}
9361008

0 commit comments

Comments
 (0)