@@ -26,6 +26,7 @@ QgsSimpleMarkerSymbolLayerV2::QgsSimpleMarkerSymbolLayerV2(QString name, QColor
2626 mBorderColor = borderColor;
2727 mSize = size;
2828 mAngle = angle;
29+ mOffset = QPointF (0 ,0 );
2930}
3031
3132QgsSymbolLayerV2* QgsSimpleMarkerSymbolLayerV2::create (const QgsStringMap& props)
@@ -47,7 +48,10 @@ QgsSymbolLayerV2* QgsSimpleMarkerSymbolLayerV2::create(const QgsStringMap& props
4748 if (props.contains (" angle" ))
4849 angle = props[" angle" ].toDouble ();
4950
50- return new QgsSimpleMarkerSymbolLayerV2 (name, color, borderColor, size, angle);
51+ QgsSimpleMarkerSymbolLayerV2* m = new QgsSimpleMarkerSymbolLayerV2 (name, color, borderColor, size, angle);
52+ if (props.contains (" offset" ))
53+ m->setOffset ( QgsSymbolLayerV2Utils::decodePoint (props[" offset" ]) );
54+ return m;
5155}
5256
5357
@@ -184,7 +188,7 @@ void QgsSimpleMarkerSymbolLayerV2::renderPoint(const QPointF& point, QgsRenderCo
184188 // drawMarker(p);
185189 double s = mCache .width ();
186190 // if (mCache.isValid())
187- p->drawImage (point + QPointF (-s/2.0 , -s/2.0 ), mCache );
191+ p->drawImage (point + QPointF (-s/2.0 , -s/2.0 ) + mOffset , mCache );
188192
189193 // p->restore();
190194}
@@ -198,12 +202,15 @@ QgsStringMap QgsSimpleMarkerSymbolLayerV2::properties() const
198202 map[" color_border" ] = QgsSymbolLayerV2Utils::encodeColor (mBorderColor );
199203 map[" size" ] = QString::number (mSize );
200204 map[" angle" ] = QString::number (mAngle );
205+ map[" offset" ] = QgsSymbolLayerV2Utils::encodePoint (mOffset );
201206 return map;
202207}
203208
204209QgsSymbolLayerV2* QgsSimpleMarkerSymbolLayerV2::clone () const
205210{
206- return new QgsSimpleMarkerSymbolLayerV2 (mName , mColor , mBorderColor , mSize , mAngle );
211+ QgsSimpleMarkerSymbolLayerV2* m = new QgsSimpleMarkerSymbolLayerV2 (mName , mColor , mBorderColor , mSize , mAngle );
212+ m->setOffset ( mOffset );
213+ return m;
207214}
208215
209216void QgsSimpleMarkerSymbolLayerV2::drawMarker (QPainter* p)
@@ -244,6 +251,7 @@ QgsSvgMarkerSymbolLayerV2::QgsSvgMarkerSymbolLayerV2(QString name, double size,
244251 mName = name;
245252 mSize = size;
246253 mAngle = angle;
254+ mOffset = QPointF (0 ,0 );
247255}
248256
249257
@@ -260,7 +268,10 @@ QgsSymbolLayerV2* QgsSvgMarkerSymbolLayerV2::create(const QgsStringMap& props)
260268 if (props.contains (" angle" ))
261269 angle = props[" angle" ].toDouble ();
262270
263- return new QgsSvgMarkerSymbolLayerV2 (name, size, angle);
271+ QgsSvgMarkerSymbolLayerV2* m = new QgsSvgMarkerSymbolLayerV2 (name, size, angle);
272+ if (props.contains (" offset" ))
273+ m->setOffset ( QgsSymbolLayerV2Utils::decodePoint (props[" offset" ]) );
274+ return m;
264275}
265276
266277
@@ -288,15 +299,18 @@ void QgsSvgMarkerSymbolLayerV2::stopRender(QgsRenderContext& context)
288299void QgsSvgMarkerSymbolLayerV2::renderPoint (const QPointF& point, QgsRenderContext& context)
289300{
290301 QPainter* p = context.painter ();
291- p->translate (point);
302+ p->save ();
303+ p->translate (point + mOffset );
304+
292305 if (mAngle != 0 )
293306 p->rotate (mAngle );
294307
295308 p->drawPicture (0 ,0 , mPicture );
296309
297310 if (mAngle != 0 )
298311 p->rotate (-mAngle );
299- p->translate (-point); // TODO: maybe save+restore is faster?
312+
313+ p->restore ();
300314}
301315
302316
@@ -306,10 +320,13 @@ QgsStringMap QgsSvgMarkerSymbolLayerV2::properties() const
306320 map[" name" ] = mName ;
307321 map[" size" ] = QString::number (mSize );
308322 map[" angle" ] = QString::number (mAngle );
323+ map[" offset" ] = QgsSymbolLayerV2Utils::encodePoint (mOffset );
309324 return map;
310325}
311326
312327QgsSymbolLayerV2* QgsSvgMarkerSymbolLayerV2::clone () const
313328{
314- return new QgsSvgMarkerSymbolLayerV2 (mName , mSize , mAngle );
329+ QgsSvgMarkerSymbolLayerV2* m = new QgsSvgMarkerSymbolLayerV2 (mName , mSize , mAngle );
330+ m->setOffset ( mOffset );
331+ return m;
315332}
0 commit comments