mirror of
https://github.com/qgis/QGIS.git
synced 2025-03-01 00:46:20 -05:00
[symbology] Fix potential crash in data defined symbol rotation
This commit is contained in:
parent
d9f54c42fc
commit
d62794de5d
@ -58,15 +58,15 @@ QgsDataDefined* scaleWholeSymbol( double scaleFactor, const QgsDataDefined& dd )
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline
|
inline
|
||||||
QgsDataDefined* scaleWholeSymbol( double scaleFactorX, double scaleFactorY, const QgsDataDefined& dd )
|
QgsDataDefined* scaleWholeSymbol( double scaleFactorX, double scaleFactorY, const QgsDataDefined& dd )
|
||||||
{
|
{
|
||||||
QgsDataDefined* scaledDD = new QgsDataDefined( dd );
|
QgsDataDefined* scaledDD = new QgsDataDefined( dd );
|
||||||
scaledDD->setUseExpression( true );
|
scaledDD->setUseExpression( true );
|
||||||
QString exprString = dd.useExpression() ? dd.expressionString() : dd.field();
|
QString exprString = dd.useExpression() ? dd.expressionString() : dd.field();
|
||||||
scaledDD->setExpressionString(
|
scaledDD->setExpressionString(
|
||||||
( scaleFactorX ? "tostring(" + QString::number( scaleFactorX ) + "*(" + exprString + "))" : "'0'" ) +
|
( scaleFactorX ? "tostring(" + QString::number( scaleFactorX ) + "*(" + exprString + "))" : "'0'" ) +
|
||||||
"|| ',' || " +
|
"|| ',' || " +
|
||||||
( scaleFactorY ? "tostring(" + QString::number( scaleFactorY ) + "*(" + exprString + "))" : "'0'" ));
|
( scaleFactorY ? "tostring(" + QString::number( scaleFactorY ) + "*(" + exprString + "))" : "'0'" ) );
|
||||||
return scaledDD;
|
return scaledDD;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -631,13 +631,13 @@ QgsDataDefined QgsMarkerSymbolV2::dataDefinedAngle() const
|
|||||||
|
|
||||||
if ( qgsDoubleNear( layer->angle(), symbolRotation ) )
|
if ( qgsDoubleNear( layer->angle(), symbolRotation ) )
|
||||||
{
|
{
|
||||||
if ( *layerAngleDD != *symbolDD )
|
if ( !layerAngleDD || *layerAngleDD != *symbolDD )
|
||||||
return QgsDataDefined();
|
return QgsDataDefined();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QScopedPointer< QgsDataDefined > rotatedDD( rotateWholeSymbol( layer->angle() - symbolRotation, *symbolDD ) );
|
QScopedPointer< QgsDataDefined > rotatedDD( rotateWholeSymbol( layer->angle() - symbolRotation, *symbolDD ) );
|
||||||
if ( *layerAngleDD != *( rotatedDD.data() ) )
|
if ( !layerAngleDD || *layerAngleDD != *( rotatedDD.data() ) )
|
||||||
return QgsDataDefined();
|
return QgsDataDefined();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -707,8 +707,8 @@ void QgsMarkerSymbolV2::setDataDefinedSize( const QgsDataDefined &dd )
|
|||||||
if ( layer->offset().x() || layer->offset().y() )
|
if ( layer->offset().x() || layer->offset().y() )
|
||||||
{
|
{
|
||||||
layer->setDataDefinedProperty( "offset", scaleWholeSymbol(
|
layer->setDataDefinedProperty( "offset", scaleWholeSymbol(
|
||||||
layer->offset().x() / symbolSize,
|
layer->offset().x() / symbolSize,
|
||||||
layer->offset().y() / symbolSize, dd ) );
|
layer->offset().y() / symbolSize, dd ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -757,10 +757,9 @@ QgsDataDefined QgsMarkerSymbolV2::dataDefinedSize() const
|
|||||||
return QgsDataDefined();
|
return QgsDataDefined();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QScopedPointer< QgsDataDefined > scaledOffsetDD( scaleWholeSymbol( layer->offset().x() / symbolSize, layer->offset().y() / symbolSize, *symbolDD ) );
|
QScopedPointer< QgsDataDefined > scaledOffsetDD( scaleWholeSymbol( layer->offset().x() / symbolSize, layer->offset().y() / symbolSize, *symbolDD ) );
|
||||||
if ( layerOffsetDD && *layerOffsetDD != *( scaledOffsetDD.data() ) )
|
if ( layerOffsetDD && *layerOffsetDD != *( scaledOffsetDD.data() ) )
|
||||||
return QgsDataDefined();
|
return QgsDataDefined();
|
||||||
}
|
}
|
||||||
|
|
||||||
return QgsDataDefined( *symbolDD );
|
return QgsDataDefined( *symbolDD );
|
||||||
@ -961,7 +960,7 @@ QgsDataDefined QgsLineSymbolV2::dataDefinedWidth() const
|
|||||||
|
|
||||||
QScopedPointer< QgsDataDefined > scaledOffsetDD( scaleWholeSymbol( layer->offset() / symbolWidth, *symbolDD ) );
|
QScopedPointer< QgsDataDefined > scaledOffsetDD( scaleWholeSymbol( layer->offset() / symbolWidth, *symbolDD ) );
|
||||||
if ( layerOffsetDD && *layerOffsetDD != *( scaledOffsetDD.data() ) )
|
if ( layerOffsetDD && *layerOffsetDD != *( scaledOffsetDD.data() ) )
|
||||||
return QgsDataDefined();
|
return QgsDataDefined();
|
||||||
}
|
}
|
||||||
|
|
||||||
return QgsDataDefined( *symbolDD );
|
return QgsDataDefined( *symbolDD );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user