Skip to content

Commit

Permalink
Symbol rendering engine does not rely on guaranteed types
Browse files Browse the repository at this point in the history
  • Loading branch information
m-kuhn committed Dec 10, 2015
1 parent 68b5209 commit 554b41d
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 16 deletions.
41 changes: 41 additions & 0 deletions src/core/symbology-ng/qgslinesymbollayerv2.h
Expand Up @@ -142,6 +142,9 @@ class CORE_EXPORT QgsMarkerLineSymbolLayerV2 : public QgsLineSymbolLayerV2


~QgsMarkerLineSymbolLayerV2(); ~QgsMarkerLineSymbolLayerV2();


/**
* Defines how/where the marker should be placed on the line
*/
enum Placement enum Placement
{ {
Interval, Interval,
Expand All @@ -154,7 +157,22 @@ class CORE_EXPORT QgsMarkerLineSymbolLayerV2 : public QgsLineSymbolLayerV2


// static stuff // static stuff


/**
* Create a new MarkerLineSymbolLayerV2
*
* @param properties A property map to deserialize saved information from properties()
*
* @return A new MarkerLineSymbolLayerV2
*/
static QgsSymbolLayerV2* create( const QgsStringMap& properties = QgsStringMap() ); static QgsSymbolLayerV2* create( const QgsStringMap& properties = QgsStringMap() );

/**
* Create a new MarkerLineSymbolLayerV2 from SLD
*
* @param element An SLD XML DOM element
*
* @return A new MarkerLineSymbolLayerV2
*/
static QgsSymbolLayerV2* createFromSld( QDomElement &element ); static QgsSymbolLayerV2* createFromSld( QDomElement &element );


// implemented from base classes // implemented from base classes
Expand Down Expand Up @@ -187,13 +205,36 @@ class CORE_EXPORT QgsMarkerLineSymbolLayerV2 : public QgsLineSymbolLayerV2


// new stuff // new stuff


/**
* Shall the marker be rotated.
*
* @return True if the marker should be rotated.
*/
bool rotateMarker() const { return mRotateMarker; } bool rotateMarker() const { return mRotateMarker; }

/**
* Shall the marker be rotated.
*/
void setRotateMarker( bool rotate ) { mRotateMarker = rotate; } void setRotateMarker( bool rotate ) { mRotateMarker = rotate; }


/**
* The interval between individual markers.
*/
double interval() const { return mInterval; } double interval() const { return mInterval; }

/**
* The interval between individual markers.
*/
void setInterval( double interval ) { mInterval = interval; } void setInterval( double interval ) { mInterval = interval; }


/**
* The placement of the markers.
*/
Placement placement() const { return mPlacement; } Placement placement() const { return mPlacement; }

/**
* The placement of the markers.
*/
void setPlacement( Placement p ) { mPlacement = p; } void setPlacement( Placement p ) { mPlacement = p; }


/** Returns the offset along the line for the marker placement. For Interval placements, this is the distance /** Returns the offset along the line for the marker placement. For Interval placements, this is the distance
Expand Down
56 changes: 40 additions & 16 deletions src/core/symbology-ng/qgssymbolv2.cpp
Expand Up @@ -1273,15 +1273,20 @@ void QgsMarkerSymbolV2::renderPointUsingLayer( QgsMarkerSymbolLayerV2* layer, co
} }
} }


void QgsMarkerSymbolV2::renderPoint( const QPointF& point, const QgsFeature* f, QgsRenderContext& context, int layer, bool selected ) void QgsMarkerSymbolV2::renderPoint( const QPointF& point, const QgsFeature* f, QgsRenderContext& context, int layerIdx, bool selected )
{ {
QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f, 0, mapUnitScale() ); QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f, 0, mapUnitScale() );


if ( layer != -1 ) if ( layerIdx != -1 )
{ {
if ( layer >= 0 && layer < mLayers.count() ) if ( layerIdx >= 0 && layerIdx < mLayers.count() )
{ {
renderPointUsingLayer(( QgsMarkerSymbolLayerV2* ) mLayers[layer], point, symbolContext ); QgsMarkerSymbolLayerV2* markerLayer = dynamic_cast<QgsMarkerSymbolLayerV2*>( mLayers.at( layerIdx ) );

if ( markerLayer )
renderPointUsingLayer( markerLayer, point, symbolContext );
else
renderUsingLayer( mLayers.at( layerIdx ), symbolContext );
} }
return; return;
} }
Expand All @@ -1292,6 +1297,8 @@ void QgsMarkerSymbolV2::renderPoint( const QPointF& point, const QgsFeature* f,


if ( markerLayer ) if ( markerLayer )
renderPointUsingLayer( markerLayer, point, symbolContext ); renderPointUsingLayer( markerLayer, point, symbolContext );
else
renderUsingLayer( layer, symbolContext );
} }
} }


Expand Down Expand Up @@ -1459,24 +1466,34 @@ QgsDataDefined QgsLineSymbolV2::dataDefinedWidth() const
return QgsDataDefined( *symbolDD ); return QgsDataDefined( *symbolDD );
} }


void QgsLineSymbolV2::renderPolyline( const QPolygonF& points, const QgsFeature* f, QgsRenderContext& context, int layer, bool selected ) void QgsLineSymbolV2::renderPolyline( const QPolygonF& points, const QgsFeature* f, QgsRenderContext& context, int layerIdx, bool selected )
{ {
//save old painter //save old painter
QPainter* renderPainter = context.painter(); QPainter* renderPainter = context.painter();
QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f, 0, mapUnitScale() ); QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f, 0, mapUnitScale() );


if ( layer != -1 ) if ( layerIdx != -1 )
{ {
if ( layer >= 0 && layer < mLayers.count() ) if ( layerIdx >= 0 && layerIdx < mLayers.count() )
{ {
renderPolylineUsingLayer(( QgsLineSymbolLayerV2* ) mLayers[layer], points, symbolContext ); QgsLineSymbolLayerV2* lineLayer = dynamic_cast<QgsLineSymbolLayerV2*>( mLayers.at( layerIdx ) );

if ( lineLayer )
renderPolylineUsingLayer( lineLayer, points, symbolContext );
else
renderUsingLayer( mLayers.at( layerIdx ), symbolContext );
} }
return; return;
} }


for ( QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it ) Q_FOREACH ( QgsSymbolLayerV2* symbolLayer, mLayers )
{ {
renderPolylineUsingLayer(( QgsLineSymbolLayerV2* ) * it, points, symbolContext ); QgsLineSymbolLayerV2* lineLayer = dynamic_cast<QgsLineSymbolLayerV2*>( symbolLayer );

if ( lineLayer )
renderPolylineUsingLayer( lineLayer, points, symbolContext );
else
renderUsingLayer( symbolLayer, symbolContext );
} }


context.setPainter( renderPainter ); context.setPainter( renderPainter );
Expand Down Expand Up @@ -1523,22 +1540,29 @@ QgsFillSymbolV2::QgsFillSymbolV2( const QgsSymbolLayerV2List& layers )
mLayers.append( new QgsSimpleFillSymbolLayerV2() ); mLayers.append( new QgsSimpleFillSymbolLayerV2() );
} }


void QgsFillSymbolV2::renderPolygon( const QPolygonF& points, QList<QPolygonF>* rings, const QgsFeature* f, QgsRenderContext& context, int layer, bool selected ) void QgsFillSymbolV2::renderPolygon( const QPolygonF& points, QList<QPolygonF>* rings, const QgsFeature* f, QgsRenderContext& context, int layerIdx, bool selected )
{ {
QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f, 0, mapUnitScale() ); QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f, 0, mapUnitScale() );


if ( layer != -1 ) if ( layerIdx != -1 )
{ {
if ( layer >= 0 && layer < mLayers.count() ) if ( layerIdx >= 0 && layerIdx < mLayers.count() )
{ {
renderPolygonUsingLayer( mLayers[layer], points, rings, symbolContext ); QgsSymbolLayerV2* layer = mLayers.at( layerIdx );
if ( layer->type() == Fill || layer->type() == Line )
renderPolygonUsingLayer( layer, points, rings, symbolContext );
else
renderUsingLayer( layer, symbolContext );
} }
return; return;
} }


for ( QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it ) Q_FOREACH ( QgsSymbolLayerV2* layer, mLayers )
{ {
renderPolygonUsingLayer( *it, points, rings, symbolContext ); if ( layer->type() == Fill || layer->type() == Line )
renderPolygonUsingLayer( layer, points, rings, symbolContext );
else
renderUsingLayer( layer, symbolContext );
} }
} }


Expand Down

0 comments on commit 554b41d

Please sign in to comment.