@@ -899,30 +899,7 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
899
899
}
900
900
901
901
const QgsPoint *point = static_cast < const QgsPoint * >( segmentizedGeometry.constGet () );
902
- const QPointF pt = _getPoint ( context, *point );
903
-
904
- pointsToRender << pt;
905
-
906
- if ( context.hasRenderedFeatureHandlers () || context.testFlag ( QgsRenderContext::DrawSymbolBounds ) )
907
- {
908
- const QRectF bounds = static_cast <QgsMarkerSymbol *>( this )->bounds ( pt, context, feature );
909
- if ( context.hasRenderedFeatureHandlers () )
910
- {
911
- renderedBoundsGeom = QgsGeometry::fromRect ( QgsRectangle ( bounds ) );
912
- }
913
- if ( context.testFlag ( QgsRenderContext::DrawSymbolBounds ) )
914
- {
915
- // draw debugging rect
916
- context.painter ()->setPen ( Qt::red );
917
- context.painter ()->setBrush ( QColor ( 255 , 0 , 0 , 100 ) );
918
- context.painter ()->drawRect ( bounds );
919
- }
920
- }
921
-
922
- if ( drawVertexMarker && !usingSegmentizedGeometry )
923
- {
924
- markers << pt;
925
- }
902
+ pointsToRender << _getPoint ( context, *point );
926
903
break ;
927
904
}
928
905
@@ -933,17 +910,9 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
933
910
QgsDebugMsg ( QStringLiteral ( " linestring can be drawn only with line symbol!" ) );
934
911
break ;
935
912
}
936
- const QgsCurve &curve = dynamic_cast <const QgsCurve &>( *segmentizedGeometry.constGet () );
937
- const QPolygonF pts = _getLineString ( context, curve, !tileMapRendering && clipFeaturesToExtent () );
938
- linesToRender << pts;
939
-
940
- if ( context.hasRenderedFeatureHandlers () )
941
- renderedBoundsGeom = QgsGeometry::fromQPolygonF ( pts );
942
913
943
- if ( drawVertexMarker && !usingSegmentizedGeometry )
944
- {
945
- markers = pts;
946
- }
914
+ const QgsCurve &curve = dynamic_cast <const QgsCurve &>( *segmentizedGeometry.constGet () );
915
+ linesToRender << _getLineString ( context, curve, !tileMapRendering && clipFeaturesToExtent () );
947
916
break ;
948
917
}
949
918
@@ -963,23 +932,11 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
963
932
QgsDebugMsg ( QStringLiteral ( " cannot render polygon with no exterior ring" ) );
964
933
break ;
965
934
}
935
+
966
936
_getPolygon ( pts, holes, context, polygon, !tileMapRendering && clipFeaturesToExtent (), mForceRHR );
967
937
polygonsToRender << pts;
968
938
polygonRingsToRender << holes;
969
939
970
- if ( context.hasRenderedFeatureHandlers () )
971
- renderedBoundsGeom = QgsGeometry::fromQPolygonF ( pts ); // TODO - consider holes?
972
-
973
- if ( drawVertexMarker && !usingSegmentizedGeometry )
974
- {
975
- markers = pts;
976
-
977
- const auto constHoles = holes;
978
- for ( const QPolygonF &hole : constHoles )
979
- {
980
- markers << hole;
981
- }
982
- }
983
940
break ;
984
941
}
985
942
@@ -997,19 +954,7 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
997
954
for ( int i = 0 ; i < mp.numGeometries (); ++i )
998
955
{
999
956
const QgsPoint &point = static_cast < const QgsPoint & >( *mp.geometryN ( i ) );
1000
- const QPointF pt = _getPoint ( context, point );
1001
- pointsToRender << pt;
1002
-
1003
- if ( context.hasRenderedFeatureHandlers () )
1004
- {
1005
- const QRectF bounds = static_cast <QgsMarkerSymbol *>( this )->bounds ( pt, context, feature );
1006
- renderedBoundsGeom = QgsGeometry::collectGeometry ( QVector< QgsGeometry>() << QgsGeometry::fromRect ( QgsRectangle ( bounds ) ) << renderedBoundsGeom );
1007
- }
1008
-
1009
- if ( drawVertexMarker && !usingSegmentizedGeometry )
1010
- {
1011
- markers.append ( pt );
1012
- }
957
+ pointsToRender << _getPoint ( context, point );
1013
958
}
1014
959
break ;
1015
960
}
@@ -1032,18 +977,7 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
1032
977
break ;
1033
978
1034
979
const QgsCurve &curve = dynamic_cast <const QgsCurve &>( *geomCollection.geometryN ( i ) );
1035
- const QPolygonF pts = _getLineString ( context, curve, !tileMapRendering && clipFeaturesToExtent () );
1036
- linesToRender << pts;
1037
-
1038
- if ( context.hasRenderedFeatureHandlers () )
1039
- {
1040
- renderedBoundsGeom = QgsGeometry::collectGeometry ( QVector< QgsGeometry>() << QgsGeometry::fromQPolygonF ( pts ) << renderedBoundsGeom );
1041
- }
1042
-
1043
- if ( drawVertexMarker && !usingSegmentizedGeometry )
1044
- {
1045
- markers << pts;
1046
- }
980
+ linesToRender << _getLineString ( context, curve, !tileMapRendering && clipFeaturesToExtent () );
1047
981
}
1048
982
break ;
1049
983
}
@@ -1089,22 +1023,6 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
1089
1023
_getPolygon ( pts, holes, context, polygon, !tileMapRendering && clipFeaturesToExtent (), mForceRHR );
1090
1024
polygonsToRender << pts;
1091
1025
polygonRingsToRender << holes;
1092
-
1093
- if ( context.hasRenderedFeatureHandlers () )
1094
- {
1095
- renderedBoundsGeom = QgsGeometry::collectGeometry ( QVector< QgsGeometry>() << QgsGeometry::fromQPolygonF ( pts ) << renderedBoundsGeom ); // TODO: consider holes?
1096
- }
1097
-
1098
- if ( drawVertexMarker && !usingSegmentizedGeometry )
1099
- {
1100
- markers << pts;
1101
-
1102
- const auto constHoles = holes;
1103
- for ( const QPolygonF &hole : constHoles )
1104
- {
1105
- markers << hole;
1106
- }
1107
- }
1108
1026
}
1109
1027
}
1110
1028
break ;
@@ -1162,9 +1080,7 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
1162
1080
case QgsWkbTypes::Point:
1163
1081
{
1164
1082
if ( pointsToRender.empty () )
1165
- {
1166
1083
break ;
1167
- }
1168
1084
1169
1085
static_cast <QgsMarkerSymbol *>( this )->renderPoint ( pointsToRender.at ( 0 ), &feature, context, symbolLayerIndex, selected );
1170
1086
break ;
@@ -1173,9 +1089,7 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
1173
1089
case QgsWkbTypes::LineString:
1174
1090
{
1175
1091
if ( linesToRender.empty () )
1176
- {
1177
1092
break ;
1178
- }
1179
1093
1180
1094
static_cast <QgsLineSymbol *>( this )->renderPolyline ( linesToRender.at ( 0 ), &feature, context, symbolLayerIndex, selected );
1181
1095
break ;
@@ -1185,9 +1099,7 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
1185
1099
case QgsWkbTypes::Triangle:
1186
1100
{
1187
1101
if ( polygonsToRender.empty () )
1188
- {
1189
1102
break ;
1190
- }
1191
1103
1192
1104
static_cast <QgsFillSymbol *>( this )->renderPolygon ( polygonsToRender.at ( 0 ), ( !polygonRingsToRender.at ( 0 ).isEmpty () ? &polygonRingsToRender.at ( 0 ) : nullptr ), &feature, context, symbolLayerIndex, selected );
1193
1105
break ;
@@ -1196,9 +1108,7 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
1196
1108
case QgsWkbTypes::MultiPoint:
1197
1109
{
1198
1110
if ( pointsToRender.empty () )
1199
- {
1200
1111
break ;
1201
- }
1202
1112
1203
1113
const QgsMultiPoint &mp = static_cast < const QgsMultiPoint & >( *segmentizedGeometry.constGet () );
1204
1114
for ( int i = 0 ; i < mp.numGeometries (); ++i )
@@ -1219,9 +1129,7 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
1219
1129
case QgsWkbTypes::MultiLineString:
1220
1130
{
1221
1131
if ( linesToRender.empty () )
1222
- {
1223
1132
break ;
1224
- }
1225
1133
1226
1134
const QgsGeometryCollection &geomCollection = dynamic_cast <const QgsGeometryCollection &>( *segmentizedGeometry.constGet () );
1227
1135
@@ -1277,26 +1185,100 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
1277
1185
break ;
1278
1186
}
1279
1187
1280
- case QgsWkbTypes::GeometryCollection:
1188
+ default :
1189
+ break ;
1190
+
1191
+ }
1192
+
1193
+ symbolLayer->stopFeatureRender ( feature, context );
1194
+ }
1195
+
1196
+ // step 4 - handle post processing steps
1197
+ switch ( QgsWkbTypes::flatType ( segmentizedGeometry.constGet ()->wkbType () ) )
1198
+ {
1199
+ case QgsWkbTypes::Point:
1200
+ case QgsWkbTypes::MultiPoint:
1201
+ {
1202
+ markers.reserve ( pointsToRender.size () );
1203
+ for ( const QPointF pt : qgis::as_const ( pointsToRender ) )
1281
1204
{
1282
- const QgsGeometryCollection &geomCollection = dynamic_cast <const QgsGeometryCollection &>( *segmentizedGeometry.constGet () );
1283
- if ( geomCollection.numGeometries () == 0 )
1205
+ if ( context.hasRenderedFeatureHandlers () || context.testFlag ( QgsRenderContext::DrawSymbolBounds ) )
1284
1206
{
1285
- // skip noise from empty geometry collections from simplification
1286
- break ;
1207
+ const QRectF bounds = static_cast <QgsMarkerSymbol *>( this )->bounds ( pt, context, feature );
1208
+ if ( context.hasRenderedFeatureHandlers () )
1209
+ {
1210
+ renderedBoundsGeom = renderedBoundsGeom.isNull () ? QgsGeometry::fromRect ( bounds )
1211
+ : QgsGeometry::collectGeometry ( QVector< QgsGeometry>() << QgsGeometry::fromRect ( QgsRectangle ( bounds ) ) << renderedBoundsGeom );
1212
+ }
1213
+ if ( context.testFlag ( QgsRenderContext::DrawSymbolBounds ) )
1214
+ {
1215
+ // draw debugging rect
1216
+ context.painter ()->setPen ( Qt::red );
1217
+ context.painter ()->setBrush ( QColor ( 255 , 0 , 0 , 100 ) );
1218
+ context.painter ()->drawRect ( bounds );
1219
+ }
1287
1220
}
1288
1221
1289
- FALLTHROUGH
1222
+ if ( drawVertexMarker && !usingSegmentizedGeometry )
1223
+ {
1224
+ markers.append ( pt );
1225
+ }
1290
1226
}
1227
+ break ;
1228
+ }
1291
1229
1292
- default :
1293
- QgsDebugMsg ( QStringLiteral ( " feature %1: unsupported wkb type %2/%3 for rendering" )
1294
- .arg ( feature.id () )
1295
- .arg ( QgsWkbTypes::displayString ( geom.constGet ()->wkbType () ) )
1296
- .arg ( geom.wkbType (), 0 , 16 ) );
1230
+ case QgsWkbTypes::LineString:
1231
+ case QgsWkbTypes::MultiCurve:
1232
+ case QgsWkbTypes::MultiLineString:
1233
+ {
1234
+ for ( const QPolygonF &pts : qgis::as_const ( linesToRender ) )
1235
+ {
1236
+ if ( context.hasRenderedFeatureHandlers () )
1237
+ {
1238
+ renderedBoundsGeom = renderedBoundsGeom.isNull () ? QgsGeometry::fromQPolygonF ( pts )
1239
+ : QgsGeometry::collectGeometry ( QVector< QgsGeometry>() << QgsGeometry::fromQPolygonF ( pts ) << renderedBoundsGeom );
1240
+ }
1241
+
1242
+ if ( drawVertexMarker && !usingSegmentizedGeometry )
1243
+ {
1244
+ markers << pts;
1245
+ }
1246
+ }
1247
+ break ;
1297
1248
}
1298
1249
1299
- symbolLayer->stopFeatureRender ( feature, context );
1250
+ case QgsWkbTypes::Polygon:
1251
+ case QgsWkbTypes::Triangle:
1252
+ case QgsWkbTypes::MultiSurface:
1253
+ case QgsWkbTypes::MultiPolygon:
1254
+ {
1255
+ int i = 0 ;
1256
+ for ( const QPolygonF &exterior : qgis::as_const ( polygonsToRender ) )
1257
+ {
1258
+ if ( context.hasRenderedFeatureHandlers () )
1259
+ {
1260
+ renderedBoundsGeom = renderedBoundsGeom.isNull () ? QgsGeometry::fromQPolygonF ( exterior )
1261
+ : QgsGeometry::collectGeometry ( QVector< QgsGeometry>() << QgsGeometry::fromQPolygonF ( exterior ) << renderedBoundsGeom );
1262
+ // TODO: consider holes?
1263
+ }
1264
+
1265
+ if ( drawVertexMarker && !usingSegmentizedGeometry )
1266
+ {
1267
+ markers << exterior;
1268
+
1269
+ const auto constHoles = polygonRingsToRender.at ( i );
1270
+ for ( const QPolygonF &hole : constHoles )
1271
+ {
1272
+ markers << hole;
1273
+ }
1274
+ }
1275
+ i++;
1276
+ }
1277
+ break ;
1278
+ }
1279
+
1280
+ default :
1281
+ break ;
1300
1282
}
1301
1283
1302
1284
if ( context.hasRenderedFeatureHandlers () )
0 commit comments