@@ -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