Skip to content

Commit 9bb2fd1

Browse files
committed
Merge pull request #3155 from ahuarte47/Rendering_DrawingMarkersFaster2
[Improvement] Draw markers faster (2)
2 parents 29170d9 + ef292e6 commit 9bb2fd1

File tree

1 file changed

+90
-18
lines changed

1 file changed

+90
-18
lines changed

src/core/symbology-ng/qgssymbolv2.cpp

Lines changed: 90 additions & 18 deletions
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)