Skip to content

Commit

Permalink
Fix confusing memory management in dxf export
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed May 23, 2019
1 parent d2a0eb2 commit 2c9c665
Showing 1 changed file with 51 additions and 48 deletions.
99 changes: 51 additions & 48 deletions src/core/dxf/qgsdxfexport.cpp
Expand Up @@ -3721,13 +3721,13 @@ void QgsDxfExport::addFeature( QgsSymbolRenderContext &ctx, const QgsCoordinateT
if ( !fet->hasGeometry() )
return;

std::unique_ptr<QgsAbstractGeometry> geom( fet->geometry().constGet()->clone() );
QgsGeometry geom( fet->geometry() );
if ( ct.isValid() )
{
geom->transform( ct );
geom.transform( ct );
}

QgsWkbTypes::Type geometryType = geom->wkbType();
QgsWkbTypes::Type geometryType = geom.wkbType();

QColor penColor;
QColor brushColor;
Expand Down Expand Up @@ -3763,13 +3763,13 @@ void QgsDxfExport::addFeature( QgsSymbolRenderContext &ctx, const QgsCoordinateT
// single point
if ( QgsWkbTypes::flatType( geometryType ) == QgsWkbTypes::Point )
{
writePoint( geom->coordinateSequence().at( 0 ).at( 0 ).at( 0 ), layer, penColor, ctx, symbolLayer, symbol, angle );
writePoint( geom.constGet()->coordinateSequence().at( 0 ).at( 0 ).at( 0 ), layer, penColor, ctx, symbolLayer, symbol, angle );
return;
}

if ( QgsWkbTypes::flatType( geometryType ) == QgsWkbTypes::MultiPoint )
{
const QgsCoordinateSequence &cs = geom->coordinateSequence();
const QgsCoordinateSequence &cs = geom.constGet()->coordinateSequence();
for ( int i = 0; i < cs.size(); i++ )
{
writePoint( cs.at( i ).at( 0 ).at( 0 ), layer, penColor, ctx, symbolLayer, symbol, angle );
Expand All @@ -3779,49 +3779,52 @@ void QgsDxfExport::addFeature( QgsSymbolRenderContext &ctx, const QgsCoordinateT

if ( penStyle != Qt::NoPen )
{
const QgsAbstractGeometry *tempGeom = geom.get();
const QgsAbstractGeometry *sourceGeom = geom.constGet();
std::unique_ptr< QgsAbstractGeometry > tempGeom;

switch ( QgsWkbTypes::flatType( geometryType ) )
{
case QgsWkbTypes::CircularString:
case QgsWkbTypes::CompoundCurve:
tempGeom = geom->segmentize();
tempGeom.reset( geom.constGet()->segmentize() );
sourceGeom = tempGeom.get();
if ( !tempGeom )
break;
FALLTHROUGH
case QgsWkbTypes::LineString:
if ( !qgsDoubleNear( offset, 0.0 ) )
{
QgsGeos geos( tempGeom );
if ( tempGeom != geom.get() )
delete tempGeom;
tempGeom = geos.offsetCurve( offset, 0, GEOSBUF_JOIN_MITRE, 2.0 ); //#spellok
if ( !tempGeom )
tempGeom = geom.get();
QgsGeos geos( sourceGeom );
tempGeom.reset( geos.offsetCurve( offset, 0, GEOSBUF_JOIN_MITRE, 2.0 ) ); //#spellok
if ( tempGeom )
sourceGeom = tempGeom.get();
else
sourceGeom = geom.constGet();
}

writePolyline( tempGeom->coordinateSequence().at( 0 ).at( 0 ), layer, lineStyleName, penColor, width );
writePolyline( sourceGeom->coordinateSequence().at( 0 ).at( 0 ), layer, lineStyleName, penColor, width );

break;

case QgsWkbTypes::MultiCurve:
tempGeom = geom->segmentize();
tempGeom.reset( geom.constGet()->segmentize() );
if ( !tempGeom )
break;
sourceGeom = tempGeom.get();
FALLTHROUGH
case QgsWkbTypes::MultiLineString:
{
if ( !qgsDoubleNear( offset, 0.0 ) )
{
QgsGeos geos( tempGeom );
if ( tempGeom != geom.get() )
delete tempGeom;
tempGeom = geos.offsetCurve( offset, 0, GEOSBUF_JOIN_MITRE, 2.0 ); //#spellok
if ( !tempGeom )
tempGeom = geom.get();
QgsGeos geos( sourceGeom );
tempGeom.reset( geos.offsetCurve( offset, 0, GEOSBUF_JOIN_MITRE, 2.0 ) ); //#spellok
if ( tempGeom )
sourceGeom = tempGeom.get();
else
sourceGeom = geom.constGet();
}

const QgsCoordinateSequence &cs = tempGeom->coordinateSequence();
const QgsCoordinateSequence &cs = sourceGeom->coordinateSequence();
for ( int i = 0; i < cs.size(); i++ )
{
writePolyline( cs.at( i ).at( 0 ), layer, lineStyleName, penColor, width );
Expand All @@ -3831,23 +3834,24 @@ void QgsDxfExport::addFeature( QgsSymbolRenderContext &ctx, const QgsCoordinateT
}

case QgsWkbTypes::CurvePolygon:
tempGeom = geom->segmentize();
tempGeom.reset( geom.constGet()->segmentize() );
if ( !tempGeom )
break;
sourceGeom = tempGeom.get();
FALLTHROUGH
case QgsWkbTypes::Polygon:
{
if ( !qgsDoubleNear( offset, 0.0 ) )
{
QgsGeos geos( tempGeom );
if ( tempGeom != geom.get() )
delete tempGeom;
tempGeom = geos.buffer( offset, 0, GEOSBUF_CAP_FLAT, GEOSBUF_JOIN_MITRE, 2.0 ); //#spellok
if ( !tempGeom )
tempGeom = geom.get();
QgsGeos geos( sourceGeom );
tempGeom.reset( geos.buffer( offset, 0, GEOSBUF_CAP_FLAT, GEOSBUF_JOIN_MITRE, 2.0 ) ); //#spellok
if ( tempGeom )
sourceGeom = tempGeom.get();
else
sourceGeom = geom.constGet();
}

const QgsCoordinateSequence &cs = tempGeom->coordinateSequence();
const QgsCoordinateSequence &cs = sourceGeom->coordinateSequence();
for ( int i = 0; i < cs.at( 0 ).size(); i++ )
{
writePolyline( cs.at( 0 ).at( i ), layer, lineStyleName, penColor, width );
Expand All @@ -3857,23 +3861,24 @@ void QgsDxfExport::addFeature( QgsSymbolRenderContext &ctx, const QgsCoordinateT
}

case QgsWkbTypes::MultiSurface:
tempGeom = geom->segmentize();
tempGeom.reset( geom.constGet()->segmentize() );
if ( !tempGeom )
break;
sourceGeom = tempGeom.get();
FALLTHROUGH
case QgsWkbTypes::MultiPolygon:
{
if ( !qgsDoubleNear( offset, 0.0 ) )
{
QgsGeos geos( tempGeom );
if ( tempGeom != geom.get() )
delete tempGeom;
tempGeom = geos.buffer( offset, 0, GEOSBUF_CAP_FLAT, GEOSBUF_JOIN_MITRE, 2.0 ); //#spellok
if ( !tempGeom )
tempGeom = geom.get();
QgsGeos geos( sourceGeom );
tempGeom.reset( geos.buffer( offset, 0, GEOSBUF_CAP_FLAT, GEOSBUF_JOIN_MITRE, 2.0 ) ); //#spellok
if ( tempGeom )
sourceGeom = tempGeom.get();
else
sourceGeom = geom.constGet();
}

const QgsCoordinateSequence &cs = tempGeom->coordinateSequence();
const QgsCoordinateSequence &cs = sourceGeom->coordinateSequence();
for ( int i = 0; i < cs.size(); i++ )
for ( int j = 0; j < cs.at( i ).size(); j++ )
writePolyline( cs.at( i ).at( j ), layer, lineStyleName, penColor, width );
Expand All @@ -3885,33 +3890,34 @@ void QgsDxfExport::addFeature( QgsSymbolRenderContext &ctx, const QgsCoordinateT
break;
}

if ( tempGeom != geom.get() )
delete tempGeom;
}

if ( brushStyle != Qt::NoBrush )
{
const QgsAbstractGeometry *tempGeom = geom.get();
const QgsAbstractGeometry *sourceGeom = geom.constGet();
std::unique_ptr< QgsAbstractGeometry > tempGeom;

switch ( QgsWkbTypes::flatType( geometryType ) )
{
case QgsWkbTypes::CurvePolygon:
tempGeom = tempGeom->segmentize();
tempGeom.reset( geom.constGet()->segmentize() );
if ( !tempGeom )
break;
sourceGeom = tempGeom.get();
FALLTHROUGH
case QgsWkbTypes::Polygon:
writePolygon( tempGeom->coordinateSequence().at( 0 ), layer, QStringLiteral( "SOLID" ), brushColor );
writePolygon( sourceGeom->coordinateSequence().at( 0 ), layer, QStringLiteral( "SOLID" ), brushColor );
break;

case QgsWkbTypes::MultiSurface:
tempGeom = tempGeom->segmentize();
tempGeom.reset( geom.constGet()->segmentize() );
if ( !tempGeom )
break;
sourceGeom = tempGeom.get();
FALLTHROUGH
case QgsWkbTypes::MultiPolygon:
{
const QgsCoordinateSequence &cs = tempGeom->coordinateSequence();
const QgsCoordinateSequence &cs = sourceGeom->coordinateSequence();
for ( int i = 0; i < cs.size(); i++ )
{
writePolygon( cs.at( i ), layer, QStringLiteral( "SOLID" ), brushColor );
Expand All @@ -3923,9 +3929,6 @@ void QgsDxfExport::addFeature( QgsSymbolRenderContext &ctx, const QgsCoordinateT
break;

}

if ( tempGeom != geom.get() )
delete tempGeom;
}
}

Expand Down

0 comments on commit 2c9c665

Please sign in to comment.