Skip to content

Commit 5b97c03

Browse files
committed
Segmentize curved geometries for rendering, but keep the original geometry in the feature. Use the original geometry for drawing vertex markers
1 parent d125e3f commit 5b97c03

File tree

1 file changed

+41
-27
lines changed

1 file changed

+41
-27
lines changed

src/core/symbology-ng/qgsrendererv2.cpp

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "qgseffectstack.h"
3434
#include "qgspainteffectregistry.h"
3535
#include "qgswkbptr.h"
36+
#include "qgspointv2.h"
3637

3738
#include <QDomElement>
3839
#include <QDomDocument>
@@ -278,12 +279,16 @@ void QgsFeatureRendererV2::renderFeatureWithSymbol( QgsFeature& feature, QgsSymb
278279
{
279280
QgsSymbolV2::SymbolType symbolType = symbol->type();
280281

282+
281283
const QgsGeometry* geom = feature.constGeometry();
282284
if ( !geom || !geom->geometry() )
283285
{
284286
return;
285287
}
286288

289+
const QgsGeometry* segmentizedGeometry = geom;
290+
bool deleteSegmentizedGeometry = false;
291+
287292
//convert curve types to normal point/line/polygon ones
288293
switch ( QgsWKBTypes::flatType( geom->geometry()->wkbType() ) )
289294
{
@@ -298,14 +303,14 @@ void QgsFeatureRendererV2::renderFeatureWithSymbol( QgsFeature& feature, QgsSymb
298303
{
299304
return;
300305
}
301-
feature.setGeometry( new QgsGeometry( g ) );
302-
geom = feature.constGeometry();
306+
segmentizedGeometry = new QgsGeometry( g );
307+
deleteSegmentizedGeometry = true;
303308
}
304309
default:
305310
break;
306311
}
307312

308-
switch ( QgsWKBTypes::flatType( geom->geometry()->wkbType() ) )
313+
switch ( QgsWKBTypes::flatType( segmentizedGeometry->geometry()->wkbType() ) )
309314
{
310315
case QgsWKBTypes::Point:
311316
{
@@ -315,11 +320,8 @@ void QgsFeatureRendererV2::renderFeatureWithSymbol( QgsFeature& feature, QgsSymb
315320
break;
316321
}
317322
QPointF pt;
318-
_getPoint( pt, context, geom->asWkb() );
323+
_getPoint( pt, context, segmentizedGeometry->asWkb() );
319324
(( QgsMarkerSymbolV2* )symbol )->renderPoint( pt, &feature, context, layer, selected );
320-
321-
//if ( drawVertexMarker )
322-
// renderVertexMarker( pt, context );
323325
}
324326
break;
325327
case QgsWKBTypes::LineString:
@@ -330,11 +332,8 @@ void QgsFeatureRendererV2::renderFeatureWithSymbol( QgsFeature& feature, QgsSymb
330332
break;
331333
}
332334
QPolygonF pts;
333-
_getLineString( pts, context, geom->asWkb(), symbol->clipFeaturesToExtent() );
335+
_getLineString( pts, context, segmentizedGeometry->asWkb(), symbol->clipFeaturesToExtent() );
334336
(( QgsLineSymbolV2* )symbol )->renderPolyline( pts, &feature, context, layer, selected );
335-
336-
if ( drawVertexMarker )
337-
renderVertexMarkerPolyline( pts, context );
338337
}
339338
break;
340339
case QgsWKBTypes::Polygon:
@@ -346,11 +345,8 @@ void QgsFeatureRendererV2::renderFeatureWithSymbol( QgsFeature& feature, QgsSymb
346345
}
347346
QPolygonF pts;
348347
QList<QPolygonF> holes;
349-
_getPolygon( pts, holes, context, geom->asWkb(), symbol->clipFeaturesToExtent() );
348+
_getPolygon( pts, holes, context, segmentizedGeometry->asWkb(), symbol->clipFeaturesToExtent() );
350349
(( QgsFillSymbolV2* )symbol )->renderPolygon( pts, ( holes.count() ? &holes : NULL ), &feature, context, layer, selected );
351-
352-
if ( drawVertexMarker )
353-
renderVertexMarkerPolygon( pts, ( holes.count() ? &holes : NULL ), context );
354350
}
355351
break;
356352

@@ -362,7 +358,7 @@ void QgsFeatureRendererV2::renderFeatureWithSymbol( QgsFeature& feature, QgsSymb
362358
break;
363359
}
364360

365-
QgsConstWkbPtr wkbPtr( geom->asWkb() + 1 + sizeof( int ) );
361+
QgsConstWkbPtr wkbPtr( segmentizedGeometry->asWkb() + 1 + sizeof( int ) );
366362
unsigned int num;
367363
wkbPtr >> num;
368364
const unsigned char* ptr = wkbPtr;
@@ -372,9 +368,6 @@ void QgsFeatureRendererV2::renderFeatureWithSymbol( QgsFeature& feature, QgsSymb
372368
{
373369
ptr = QgsConstWkbPtr( _getPoint( pt, context, ptr ) );
374370
(( QgsMarkerSymbolV2* )symbol )->renderPoint( pt, &feature, context, layer, selected );
375-
376-
//if ( drawVertexMarker )
377-
// renderVertexMarker( pt, context );
378371
}
379372
}
380373
break;
@@ -388,7 +381,7 @@ void QgsFeatureRendererV2::renderFeatureWithSymbol( QgsFeature& feature, QgsSymb
388381
break;
389382
}
390383

391-
QgsConstWkbPtr wkbPtr( geom->asWkb() + 1 + sizeof( int ) );
384+
QgsConstWkbPtr wkbPtr( segmentizedGeometry->asWkb() + 1 + sizeof( int ) );
392385
unsigned int num;
393386
wkbPtr >> num;
394387
const unsigned char* ptr = wkbPtr;
@@ -398,9 +391,6 @@ void QgsFeatureRendererV2::renderFeatureWithSymbol( QgsFeature& feature, QgsSymb
398391
{
399392
ptr = QgsConstWkbPtr( _getLineString( pts, context, ptr, symbol->clipFeaturesToExtent() ) );
400393
(( QgsLineSymbolV2* )symbol )->renderPolyline( pts, &feature, context, layer, selected );
401-
402-
if ( drawVertexMarker )
403-
renderVertexMarkerPolyline( pts, context );
404394
}
405395
}
406396
break;
@@ -414,7 +404,7 @@ void QgsFeatureRendererV2::renderFeatureWithSymbol( QgsFeature& feature, QgsSymb
414404
break;
415405
}
416406

417-
QgsConstWkbPtr wkbPtr( geom->asWkb() + 1 + sizeof( int ) );
407+
QgsConstWkbPtr wkbPtr( segmentizedGeometry->asWkb() + 1 + sizeof( int ) );
418408
unsigned int num;
419409
wkbPtr >> num;
420410
const unsigned char* ptr = wkbPtr;
@@ -425,15 +415,39 @@ void QgsFeatureRendererV2::renderFeatureWithSymbol( QgsFeature& feature, QgsSymb
425415
{
426416
ptr = _getPolygon( pts, holes, context, ptr, symbol->clipFeaturesToExtent() );
427417
(( QgsFillSymbolV2* )symbol )->renderPolygon( pts, ( holes.count() ? &holes : NULL ), &feature, context, layer, selected );
428-
429-
if ( drawVertexMarker )
430-
renderVertexMarkerPolygon( pts, ( holes.count() ? &holes : NULL ), context );
431418
}
432419
break;
433420
}
434421
default:
435422
QgsDebugMsg( QString( "feature %1: unsupported wkb type 0x%2 for rendering" ).arg( feature.id() ).arg( geom->wkbType(), 0, 16 ) );
436423
}
424+
425+
if ( drawVertexMarker )
426+
{
427+
const QgsCoordinateTransform* ct = context.coordinateTransform();
428+
const QgsMapToPixel& mtp = context.mapToPixel();
429+
430+
QgsPointV2 vertexPoint;
431+
QgsVertexId vertexId;
432+
double z;
433+
QPointF mapPoint;
434+
while ( geom->geometry()->nextVertex( vertexId, vertexPoint ) )
435+
{
436+
//transform
437+
mapPoint.setX( vertexPoint.x() ); mapPoint.setY( vertexPoint.y() ); z = vertexPoint.z();
438+
mtp.transformInPlace( mapPoint.rx(), mapPoint.ry() );
439+
if ( ct )
440+
{
441+
ct->transformInPlace( mapPoint.rx(), mapPoint.ry(), z );
442+
}
443+
renderVertexMarker( mapPoint, context );
444+
}
445+
}
446+
447+
if ( deleteSegmentizedGeometry )
448+
{
449+
delete segmentizedGeometry;
450+
}
437451
}
438452

439453
QString QgsFeatureRendererV2::dump() const

0 commit comments

Comments
 (0)