Skip to content

Commit a28c8ed

Browse files
committedMay 20, 2020
Ensure bounds are always rendered over features
1 parent 1d33ddf commit a28c8ed

File tree

1 file changed

+92
-110
lines changed

1 file changed

+92
-110
lines changed
 

‎src/core/symbology/qgssymbol.cpp

Lines changed: 92 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -899,30 +899,7 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
899899
}
900900

901901
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 );
926903
break;
927904
}
928905

@@ -933,17 +910,9 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
933910
QgsDebugMsg( QStringLiteral( "linestring can be drawn only with line symbol!" ) );
934911
break;
935912
}
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 );
942913

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() );
947916
break;
948917
}
949918

@@ -963,23 +932,11 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
963932
QgsDebugMsg( QStringLiteral( "cannot render polygon with no exterior ring" ) );
964933
break;
965934
}
935+
966936
_getPolygon( pts, holes, context, polygon, !tileMapRendering && clipFeaturesToExtent(), mForceRHR );
967937
polygonsToRender << pts;
968938
polygonRingsToRender << holes;
969939

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-
}
983940
break;
984941
}
985942

@@ -997,19 +954,7 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
997954
for ( int i = 0; i < mp.numGeometries(); ++i )
998955
{
999956
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 );
1013958
}
1014959
break;
1015960
}
@@ -1032,18 +977,7 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
1032977
break;
1033978

1034979
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() );
1047981
}
1048982
break;
1049983
}
@@ -1089,22 +1023,6 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
10891023
_getPolygon( pts, holes, context, polygon, !tileMapRendering && clipFeaturesToExtent(), mForceRHR );
10901024
polygonsToRender << pts;
10911025
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-
}
11081026
}
11091027
}
11101028
break;
@@ -1162,9 +1080,7 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
11621080
case QgsWkbTypes::Point:
11631081
{
11641082
if ( pointsToRender.empty() )
1165-
{
11661083
break;
1167-
}
11681084

11691085
static_cast<QgsMarkerSymbol *>( this )->renderPoint( pointsToRender.at( 0 ), &feature, context, symbolLayerIndex, selected );
11701086
break;
@@ -1173,9 +1089,7 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
11731089
case QgsWkbTypes::LineString:
11741090
{
11751091
if ( linesToRender.empty() )
1176-
{
11771092
break;
1178-
}
11791093

11801094
static_cast<QgsLineSymbol *>( this )->renderPolyline( linesToRender.at( 0 ), &feature, context, symbolLayerIndex, selected );
11811095
break;
@@ -1185,9 +1099,7 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
11851099
case QgsWkbTypes::Triangle:
11861100
{
11871101
if ( polygonsToRender.empty() )
1188-
{
11891102
break;
1190-
}
11911103

11921104
static_cast<QgsFillSymbol *>( this )->renderPolygon( polygonsToRender.at( 0 ), ( !polygonRingsToRender.at( 0 ).isEmpty() ? &polygonRingsToRender.at( 0 ) : nullptr ), &feature, context, symbolLayerIndex, selected );
11931105
break;
@@ -1196,9 +1108,7 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
11961108
case QgsWkbTypes::MultiPoint:
11971109
{
11981110
if ( pointsToRender.empty() )
1199-
{
12001111
break;
1201-
}
12021112

12031113
const QgsMultiPoint &mp = static_cast< const QgsMultiPoint & >( *segmentizedGeometry.constGet() );
12041114
for ( int i = 0; i < mp.numGeometries(); ++i )
@@ -1219,9 +1129,7 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
12191129
case QgsWkbTypes::MultiLineString:
12201130
{
12211131
if ( linesToRender.empty() )
1222-
{
12231132
break;
1224-
}
12251133

12261134
const QgsGeometryCollection &geomCollection = dynamic_cast<const QgsGeometryCollection &>( *segmentizedGeometry.constGet() );
12271135

@@ -1277,26 +1185,100 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont
12771185
break;
12781186
}
12791187

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 ) )
12811204
{
1282-
const QgsGeometryCollection &geomCollection = dynamic_cast<const QgsGeometryCollection &>( *segmentizedGeometry.constGet() );
1283-
if ( geomCollection.numGeometries() == 0 )
1205+
if ( context.hasRenderedFeatureHandlers() || context.testFlag( QgsRenderContext::DrawSymbolBounds ) )
12841206
{
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+
}
12871220
}
12881221

1289-
FALLTHROUGH
1222+
if ( drawVertexMarker && !usingSegmentizedGeometry )
1223+
{
1224+
markers.append( pt );
1225+
}
12901226
}
1227+
break;
1228+
}
12911229

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;
12971248
}
12981249

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;
13001282
}
13011283

13021284
if ( context.hasRenderedFeatureHandlers() )

0 commit comments

Comments
 (0)
Please sign in to comment.