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
439453QString QgsFeatureRendererV2::dump () const
0 commit comments