Skip to content

Commit 2dbb128

Browse files
committedMar 17, 2017
Make raster engine safer with memory usage
1 parent 68ec95d commit 2dbb128

19 files changed

+114
-197
lines changed
 

‎src/core/raster/qgsbrightnesscontrastfilter.cpp

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -110,33 +110,30 @@ QgsRasterBlock *QgsBrightnessContrastFilter::block( int bandNo, QgsRectangle co
110110
Q_UNUSED( bandNo );
111111
QgsDebugMsgLevel( QString( "width = %1 height = %2 extent = %3" ).arg( width ).arg( height ).arg( extent.toString() ), 4 );
112112

113-
QgsRasterBlock *outputBlock = new QgsRasterBlock();
113+
std::unique_ptr< QgsRasterBlock > outputBlock( new QgsRasterBlock() );
114114
if ( !mInput )
115115
{
116-
return outputBlock;
116+
return outputBlock.release();
117117
}
118118

119119
// At this moment we know that we read rendered image
120120
int bandNumber = 1;
121-
QgsRasterBlock *inputBlock = mInput->block( bandNumber, extent, width, height, feedback );
121+
std::unique_ptr< QgsRasterBlock > inputBlock( mInput->block( bandNumber, extent, width, height, feedback ) );
122122
if ( !inputBlock || inputBlock->isEmpty() )
123123
{
124124
QgsDebugMsg( "No raster data!" );
125-
delete inputBlock;
126-
return outputBlock;
125+
return outputBlock.release();
127126
}
128127

129128
if ( mBrightness == 0 && mContrast == 0 )
130129
{
131130
QgsDebugMsgLevel( "No brightness changes.", 4 );
132-
delete outputBlock;
133-
return inputBlock;
131+
return inputBlock.release();
134132
}
135133

136134
if ( !outputBlock->reset( Qgis::ARGB32_Premultiplied, width, height ) )
137135
{
138-
delete inputBlock;
139-
return outputBlock;
136+
return outputBlock.release();
140137
}
141138

142139
// adjust image
@@ -164,8 +161,7 @@ QgsRasterBlock *QgsBrightnessContrastFilter::block( int bandNo, QgsRectangle co
164161
outputBlock->setColor( i, qRgba( r, g, b, alpha ) );
165162
}
166163

167-
delete inputBlock;
168-
return outputBlock;
164+
return outputBlock.release();
169165
}
170166

171167
int QgsBrightnessContrastFilter::adjustColorComponent( int colorComponent, int alpha, int brightness, double contrastFactor ) const

‎src/core/raster/qgscontrastenhancement.cpp

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ class originally created circa 2004 by T.Sutton, Gary E.Sherman, Steve Halasz
3131

3232
QgsContrastEnhancement::QgsContrastEnhancement( Qgis::DataType dataType )
3333
: mContrastEnhancementAlgorithm( NoEnhancement )
34-
, mContrastEnhancementFunction( nullptr )
3534
, mEnhancementDirty( false )
3635
, mLookupTable( nullptr )
3736
, mRasterDataType( dataType )
@@ -42,7 +41,7 @@ QgsContrastEnhancement::QgsContrastEnhancement( Qgis::DataType dataType )
4241

4342
mLookupTableOffset = mMinimumValue * -1;
4443

45-
mContrastEnhancementFunction = new QgsContrastEnhancementFunction( mRasterDataType, mMinimumValue, mMaximumValue );
44+
mContrastEnhancementFunction.reset( new QgsContrastEnhancementFunction( mRasterDataType, mMinimumValue, mMaximumValue ) );
4645

4746
//If the data type is larger than 16-bit do not generate a lookup table
4847
if ( mRasterDataTypeRange <= 65535.0 )
@@ -53,8 +52,7 @@ QgsContrastEnhancement::QgsContrastEnhancement( Qgis::DataType dataType )
5352
}
5453

5554
QgsContrastEnhancement::QgsContrastEnhancement( const QgsContrastEnhancement &ce )
56-
: mContrastEnhancementFunction( nullptr )
57-
, mEnhancementDirty( true )
55+
: mEnhancementDirty( true )
5856
, mLookupTable( nullptr )
5957
, mMinimumValue( ce.mMinimumValue )
6058
, mMaximumValue( ce.mMaximumValue )
@@ -76,7 +74,6 @@ QgsContrastEnhancement::QgsContrastEnhancement( const QgsContrastEnhancement &ce
7674
QgsContrastEnhancement::~QgsContrastEnhancement()
7775
{
7876
delete [] mLookupTable;
79-
delete mContrastEnhancementFunction;
8077
}
8178
/*
8279
*
@@ -249,23 +246,19 @@ void QgsContrastEnhancement::setContrastEnhancementAlgorithm( ContrastEnhancemen
249246
switch ( algorithm )
250247
{
251248
case StretchToMinimumMaximum :
252-
delete mContrastEnhancementFunction;
253-
mContrastEnhancementFunction = new QgsLinearMinMaxEnhancement( mRasterDataType, mMinimumValue, mMaximumValue );
249+
mContrastEnhancementFunction.reset( new QgsLinearMinMaxEnhancement( mRasterDataType, mMinimumValue, mMaximumValue ) );
254250
break;
255251
case StretchAndClipToMinimumMaximum :
256-
delete mContrastEnhancementFunction;
257-
mContrastEnhancementFunction = new QgsLinearMinMaxEnhancementWithClip( mRasterDataType, mMinimumValue, mMaximumValue );
252+
mContrastEnhancementFunction.reset( new QgsLinearMinMaxEnhancementWithClip( mRasterDataType, mMinimumValue, mMaximumValue ) );
258253
break;
259254
case ClipToMinimumMaximum :
260-
delete mContrastEnhancementFunction;
261-
mContrastEnhancementFunction = new QgsClipToMinMaxEnhancement( mRasterDataType, mMinimumValue, mMaximumValue );
255+
mContrastEnhancementFunction.reset( new QgsClipToMinMaxEnhancement( mRasterDataType, mMinimumValue, mMaximumValue ) );
262256
break;
263257
case UserDefinedEnhancement :
264258
//Do nothing
265259
break;
266260
default:
267-
delete mContrastEnhancementFunction;
268-
mContrastEnhancementFunction = new QgsContrastEnhancementFunction( mRasterDataType, mMinimumValue, mMaximumValue );
261+
mContrastEnhancementFunction.reset( new QgsContrastEnhancementFunction( mRasterDataType, mMinimumValue, mMaximumValue ) );
269262
break;
270263
}
271264

@@ -289,8 +282,7 @@ void QgsContrastEnhancement::setContrastEnhancementFunction( QgsContrastEnhancem
289282

290283
if ( function )
291284
{
292-
delete mContrastEnhancementFunction;
293-
mContrastEnhancementFunction = function;
285+
mContrastEnhancementFunction.reset( function );
294286
mContrastEnhancementAlgorithm = UserDefinedEnhancement;
295287
generateLookupTable();
296288
}

‎src/core/raster/qgscontrastenhancement.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class originally created circa 2004 by T.Sutton, Gary E.Sherman, Steve Halasz
2626

2727
#include "qgis.h"
2828
#include "qgsraster.h"
29+
#include <memory>
2930

3031
class QgsContrastEnhancementFunction;
3132
class QDomDocument;
@@ -120,7 +121,7 @@ class CORE_EXPORT QgsContrastEnhancement
120121
ContrastEnhancementAlgorithm mContrastEnhancementAlgorithm;
121122

122123
//! \brief Pointer to the contrast enhancement function
123-
QgsContrastEnhancementFunction *mContrastEnhancementFunction = nullptr;
124+
std::unique_ptr< QgsContrastEnhancementFunction > mContrastEnhancementFunction;
124125

125126
//! \brief Flag indicating if the lookup table needs to be regenerated
126127
bool mEnhancementDirty;

‎src/core/raster/qgshillshaderenderer.cpp

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
#include "qgsrasterinterface.h"
2323
#include "qgsrasterblock.h"
2424
#include "qgsrectangle.h"
25-
25+
#include <memory>
2626

2727
QgsHillshadeRenderer::QgsHillshadeRenderer( QgsRasterInterface *input, int band, double lightAzimuth, double lightAngle ):
2828
QgsRasterRenderer( input, QStringLiteral( "hillshade" ) )
@@ -86,34 +86,30 @@ void QgsHillshadeRenderer::writeXml( QDomDocument &doc, QDomElement &parentElem
8686
QgsRasterBlock *QgsHillshadeRenderer::block( int bandNo, const QgsRectangle &extent, int width, int height, QgsRasterBlockFeedback *feedback )
8787
{
8888
Q_UNUSED( bandNo );
89-
QgsRasterBlock *outputBlock = new QgsRasterBlock();
89+
std::unique_ptr< QgsRasterBlock > outputBlock( new QgsRasterBlock() );
9090
if ( !mInput )
9191
{
9292
QgsDebugMsg( "No input raster!" );
93-
return outputBlock;
93+
return outputBlock.release();
9494
}
9595

96-
QgsRasterBlock *inputBlock = mInput->block( mBand, extent, width, height, feedback );
96+
std::shared_ptr< QgsRasterBlock > inputBlock( mInput->block( mBand, extent, width, height, feedback ) );
9797

9898
if ( !inputBlock || inputBlock->isEmpty() )
9999
{
100100
QgsDebugMsg( "No raster data!" );
101-
delete inputBlock;
102-
return outputBlock;
101+
return outputBlock.release();
103102
}
104103

105-
QgsRasterBlock *alphaBlock = nullptr;
104+
std::shared_ptr< QgsRasterBlock > alphaBlock;
106105

107106
if ( mAlphaBand > 0 && mBand != mAlphaBand )
108107
{
109-
110-
alphaBlock = mInput->block( mAlphaBand, extent, width, height, feedback );
108+
alphaBlock.reset( mInput->block( mAlphaBand, extent, width, height, feedback ) );
111109
if ( !alphaBlock || alphaBlock->isEmpty() )
112110
{
113111
// TODO: better to render without alpha
114-
delete inputBlock;
115-
delete alphaBlock;
116-
return outputBlock;
112+
return outputBlock.release();
117113
}
118114
}
119115
else if ( mAlphaBand > 0 )
@@ -123,13 +119,9 @@ QgsRasterBlock *QgsHillshadeRenderer::block( int bandNo, const QgsRectangle &ext
123119

124120
if ( !outputBlock->reset( Qgis::ARGB32_Premultiplied, width, height ) )
125121
{
126-
delete inputBlock;
127-
delete alphaBlock;
128-
return outputBlock;
122+
return outputBlock.release();
129123
}
130124

131-
132-
133125
double cellXSize = extent.width() / double( width );
134126
double cellYSize = extent.height() / double( height );
135127
double zenithRad = qMax( 0.0, 90 - mLightAngle ) * M_PI / 180.0;
@@ -272,12 +264,7 @@ QgsRasterBlock *QgsHillshadeRenderer::block( int bandNo, const QgsRectangle &ext
272264
}
273265
}
274266

275-
delete inputBlock;
276-
if ( mAlphaBand > 0 && mBand != mAlphaBand )
277-
{
278-
delete alphaBlock;
279-
}
280-
return outputBlock;
267+
return outputBlock.release();
281268
}
282269

283270
QList<int> QgsHillshadeRenderer::usesBands() const

‎src/core/raster/qgshuesaturationfilter.cpp

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -119,33 +119,30 @@ QgsRasterBlock *QgsHueSaturationFilter::block( int bandNo, QgsRectangle const &
119119
Q_UNUSED( bandNo );
120120
QgsDebugMsgLevel( QString( "width = %1 height = %2 extent = %3" ).arg( width ).arg( height ).arg( extent.toString() ), 4 );
121121

122-
QgsRasterBlock *outputBlock = new QgsRasterBlock();
122+
std::unique_ptr< QgsRasterBlock > outputBlock( new QgsRasterBlock() );
123123
if ( !mInput )
124124
{
125-
return outputBlock;
125+
return outputBlock.release();
126126
}
127127

128128
// At this moment we know that we read rendered image
129129
int bandNumber = 1;
130-
QgsRasterBlock *inputBlock = mInput->block( bandNumber, extent, width, height, feedback );
130+
std::unique_ptr< QgsRasterBlock > inputBlock( mInput->block( bandNumber, extent, width, height, feedback ) );
131131
if ( !inputBlock || inputBlock->isEmpty() )
132132
{
133133
QgsDebugMsg( "No raster data!" );
134-
delete inputBlock;
135-
return outputBlock;
134+
return outputBlock.release();
136135
}
137136

138137
if ( mSaturation == 0 && mGrayscaleMode == GrayscaleOff && !mColorizeOn )
139138
{
140139
QgsDebugMsgLevel( "No hue/saturation change.", 4 );
141-
delete outputBlock;
142-
return inputBlock;
140+
return inputBlock.release();
143141
}
144142

145143
if ( !outputBlock->reset( Qgis::ARGB32_Premultiplied, width, height ) )
146144
{
147-
delete inputBlock;
148-
return outputBlock;
145+
return outputBlock.release();
149146
}
150147

151148
// adjust image
@@ -216,8 +213,7 @@ QgsRasterBlock *QgsHueSaturationFilter::block( int bandNo, QgsRectangle const &
216213
outputBlock->setColor( i, qRgba( r, g, b, alpha ) );
217214
}
218215

219-
delete inputBlock;
220-
return outputBlock;
216+
return outputBlock.release();
221217
}
222218

223219
// Process a colorization and update resultant HSL & RGB values

‎src/core/raster/qgsmultibandcolorrenderer.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,10 @@ QgsRasterRenderer *QgsMultiBandColorRenderer::create( const QDomElement &elem, Q
133133
QgsRasterBlock *QgsMultiBandColorRenderer::block( int bandNo, QgsRectangle const &extent, int width, int height, QgsRasterBlockFeedback *feedback )
134134
{
135135
Q_UNUSED( bandNo );
136-
QgsRasterBlock *outputBlock = new QgsRasterBlock();
136+
std::unique_ptr< QgsRasterBlock > outputBlock( new QgsRasterBlock() );
137137
if ( !mInput )
138138
{
139-
return outputBlock;
139+
return outputBlock.release();
140140
}
141141

142142
//In some (common) cases, we can simplify the drawing loop considerably and save render time
@@ -161,7 +161,7 @@ QgsRasterBlock *QgsMultiBandColorRenderer::block( int bandNo, QgsRectangle cons
161161
{
162162
// no need to draw anything if no band is set
163163
// TODO:: we should probably return default color block
164-
return outputBlock;
164+
return outputBlock.release();
165165
}
166166

167167
if ( mAlphaBand > 0 )
@@ -195,7 +195,7 @@ QgsRasterBlock *QgsMultiBandColorRenderer::block( int bandNo, QgsRectangle cons
195195
{
196196
delete bandBlocks[*bandIt];
197197
}
198-
return outputBlock;
198+
return outputBlock.release();
199199
}
200200
}
201201

@@ -222,7 +222,7 @@ QgsRasterBlock *QgsMultiBandColorRenderer::block( int bandNo, QgsRectangle cons
222222
{
223223
delete bandBlocks.value( i );
224224
}
225-
return outputBlock;
225+
return outputBlock.release();
226226
}
227227

228228
QRgb myDefaultColor = NODATA_COLOR;
@@ -323,7 +323,7 @@ QgsRasterBlock *QgsMultiBandColorRenderer::block( int bandNo, QgsRectangle cons
323323
delete bandDelIt.value();
324324
}
325325

326-
return outputBlock;
326+
return outputBlock.release();
327327
}
328328

329329
void QgsMultiBandColorRenderer::writeXml( QDomDocument &doc, QDomElement &parentElem ) const

‎src/core/raster/qgsrasternuller.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ QgsRasterBlock *QgsRasterNuller::block( int bandNo, QgsRectangle const &extent,
7373
return new QgsRasterBlock();
7474
}
7575

76-
QgsRasterBlock *inputBlock = mInput->block( bandNo, extent, width, height, feedback );
76+
std::unique_ptr< QgsRasterBlock > inputBlock( mInput->block( bandNo, extent, width, height, feedback ) );
7777
if ( !inputBlock )
7878
{
7979
return new QgsRasterBlock();
@@ -82,10 +82,10 @@ QgsRasterBlock *QgsRasterNuller::block( int bandNo, QgsRectangle const &extent,
8282
// We don't support nuller for color types
8383
if ( QgsRasterBlock::typeIsColor( inputBlock->dataType() ) )
8484
{
85-
return inputBlock;
85+
return inputBlock.release();
8686
}
8787

88-
QgsRasterBlock *outputBlock = new QgsRasterBlock( inputBlock->dataType(), width, height );
88+
std::unique_ptr< QgsRasterBlock > outputBlock( new QgsRasterBlock( inputBlock->dataType(), width, height ) );
8989
if ( mHasOutputNoData.value( bandNo - 1 ) || inputBlock->hasNoDataValue() )
9090
{
9191
double noDataValue;
@@ -122,8 +122,6 @@ QgsRasterBlock *QgsRasterNuller::block( int bandNo, QgsRectangle const &extent,
122122
}
123123
}
124124
}
125-
delete inputBlock;
126-
127-
return outputBlock;
125+
return outputBlock.release();
128126
}
129127

‎src/core/raster/qgsrasterprojector.cpp

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ void QgsRasterProjector::setCrs( const QgsCoordinateReferenceSystem &srcCRS, con
7575

7676
ProjectorData::ProjectorData( const QgsRectangle &extent, int width, int height, QgsRasterInterface *input, const QgsCoordinateTransform &inverseCt, QgsRasterProjector::Precision precision )
7777
: mApproximate( false )
78-
, mInverseCt( new QgsCoordinateTransform( inverseCt ) )
78+
, mInverseCt( inverseCt )
7979
, mDestExtent( extent )
8080
, mDestRows( height )
8181
, mDestCols( width )
@@ -210,7 +210,6 @@ ProjectorData::~ProjectorData()
210210
{
211211
delete[] pHelperTop;
212212
delete[] pHelperBottom;
213-
delete mInverseCt;
214213
}
215214

216215

@@ -345,7 +344,7 @@ void ProjectorData::calcSrcRowsCols()
345344
//double
346345
QgsRectangle srcExtent;
347346
int srcXSize, srcYSize;
348-
if ( QgsRasterProjector::extentSize( *mInverseCt, mDestExtent, mDestCols, mDestRows, srcExtent, srcXSize, srcYSize ) )
347+
if ( QgsRasterProjector::extentSize( mInverseCt, mDestExtent, mDestCols, mDestRows, srcExtent, srcXSize, srcYSize ) )
349348
{
350349
double srcXRes = srcExtent.width() / srcXSize;
351350
double srcYRes = srcExtent.height() / srcYSize;
@@ -457,9 +456,9 @@ bool ProjectorData::preciseSrcRowCol( int destRow, int destCol, int *srcRow, int
457456
QgsDebugMsgLevel( QString( "x = %1 y = %2" ).arg( x ).arg( y ), 5 );
458457
#endif
459458

460-
if ( mInverseCt->isValid() )
459+
if ( mInverseCt.isValid() )
461460
{
462-
mInverseCt->transformInPlace( x, y, z );
461+
mInverseCt.transformInPlace( x, y, z );
463462
}
464463

465464
#ifdef QGISDEBUG
@@ -774,26 +773,24 @@ QgsRasterBlock *QgsRasterProjector::block( int bandNo, QgsRectangle const &exte
774773
return new QgsRasterBlock();
775774
}
776775

777-
QgsRasterBlock *inputBlock = mInput->block( bandNo, pd.srcExtent(), pd.srcCols(), pd.srcRows(), feedback );
776+
std::unique_ptr< QgsRasterBlock > inputBlock( mInput->block( bandNo, pd.srcExtent(), pd.srcCols(), pd.srcRows(), feedback ) );
778777
if ( !inputBlock || inputBlock->isEmpty() )
779778
{
780779
QgsDebugMsg( "No raster data!" );
781-
delete inputBlock;
782780
return new QgsRasterBlock();
783781
}
784782

785783
qgssize pixelSize = QgsRasterBlock::typeSize( mInput->dataType( bandNo ) );
786784

787-
QgsRasterBlock *outputBlock = new QgsRasterBlock( inputBlock->dataType(), width, height );
785+
std::unique_ptr< QgsRasterBlock > outputBlock( new QgsRasterBlock( inputBlock->dataType(), width, height ) );
788786
if ( inputBlock->hasNoDataValue() )
789787
{
790788
outputBlock->setNoDataValue( inputBlock->noDataValue() );
791789
}
792790
if ( !outputBlock->isValid() )
793791
{
794792
QgsDebugMsg( "Cannot create block" );
795-
delete inputBlock;
796-
return outputBlock;
793+
return outputBlock.release();
797794
}
798795

799796
// set output to no data, it should be fast
@@ -850,9 +847,7 @@ QgsRasterBlock *QgsRasterProjector::block( int bandNo, QgsRectangle const &exte
850847
}
851848
}
852849

853-
delete inputBlock;
854-
855-
return outputBlock;
850+
return outputBlock.release();
856851
}
857852

858853
bool QgsRasterProjector::destExtentSize( const QgsRectangle &srcExtent, int srcXSize, int srcYSize,

‎src/core/raster/qgsrasterprojector.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@
2929

3030
#include "qgsrectangle.h"
3131
#include "qgscoordinatereferencesystem.h"
32+
#include "qgscoordinatetransform.h"
3233
#include "qgsrasterinterface.h"
3334

3435
#include <cmath>
3536

3637
class QgsPoint;
37-
class QgsCoordinateTransform;
3838

3939
/** \ingroup core
4040
* \brief QgsRasterProjector implements approximate projection support for
@@ -193,7 +193,7 @@ class ProjectorData
193193
bool mApproximate;
194194

195195
//! Transformation from destination CRS to source CRS
196-
QgsCoordinateTransform *mInverseCt = nullptr;
196+
QgsCoordinateTransform mInverseCt;
197197

198198
//! Destination extent
199199
QgsRectangle mDestExtent;

‎src/core/raster/qgsrasterresamplefilter.cpp

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,10 @@
3434

3535
QgsRasterResampleFilter::QgsRasterResampleFilter( QgsRasterInterface *input )
3636
: QgsRasterInterface( input )
37-
, mZoomedInResampler( nullptr )
38-
, mZoomedOutResampler( nullptr )
3937
, mMaxOversampling( 2.0 )
4038
{
4139
}
4240

43-
QgsRasterResampleFilter::~QgsRasterResampleFilter()
44-
{
45-
delete mZoomedInResampler;
46-
delete mZoomedOutResampler;
47-
}
48-
4941
QgsRasterResampleFilter *QgsRasterResampleFilter::clone() const
5042
{
5143
QgsDebugMsgLevel( "Entered", 4 );
@@ -119,22 +111,21 @@ bool QgsRasterResampleFilter::setInput( QgsRasterInterface *input )
119111

120112
void QgsRasterResampleFilter::setZoomedInResampler( QgsRasterResampler *r )
121113
{
122-
delete mZoomedInResampler;
123-
mZoomedInResampler = r;
114+
mZoomedInResampler.reset( r );
124115
}
125116

126117
void QgsRasterResampleFilter::setZoomedOutResampler( QgsRasterResampler *r )
127118
{
128-
delete mZoomedOutResampler;
129-
mZoomedOutResampler = r;
119+
mZoomedOutResampler.reset( r );
130120
}
131121

132122
QgsRasterBlock *QgsRasterResampleFilter::block( int bandNo, QgsRectangle const &extent, int width, int height, QgsRasterBlockFeedback *feedback )
133123
{
134124
Q_UNUSED( bandNo );
135125
QgsDebugMsgLevel( QString( "width = %1 height = %2 extent = %3" ).arg( width ).arg( height ).arg( extent.toString() ), 4 );
136-
QgsRasterBlock *outputBlock = new QgsRasterBlock();
137-
if ( !mInput ) return outputBlock;
126+
std::unique_ptr< QgsRasterBlock > outputBlock( new QgsRasterBlock() );
127+
if ( !mInput )
128+
return outputBlock.release();
138129

139130
double oversampling = 1.0; // approximate global oversampling factor
140131

@@ -168,7 +159,6 @@ QgsRasterBlock *QgsRasterResampleFilter::block( int bandNo, QgsRectangle const
168159
if ( ( ( oversampling < 1.0 || qgsDoubleNear( oversampling, 1.0 ) ) && !mZoomedInResampler ) || ( oversampling > 1.0 && !mZoomedOutResampler ) )
169160
{
170161
QgsDebugMsgLevel( "No oversampling.", 4 );
171-
delete outputBlock;
172162
return mInput->block( bandNumber, extent, width, height, feedback );
173163
}
174164

@@ -181,18 +171,16 @@ QgsRasterBlock *QgsRasterResampleFilter::block( int bandNo, QgsRectangle const
181171
int resWidth = width * oversamplingX;
182172
int resHeight = height * oversamplingY;
183173

184-
QgsRasterBlock *inputBlock = mInput->block( bandNumber, extent, resWidth, resHeight, feedback );
174+
std::unique_ptr< QgsRasterBlock > inputBlock( mInput->block( bandNumber, extent, resWidth, resHeight, feedback ) );
185175
if ( !inputBlock || inputBlock->isEmpty() )
186176
{
187177
QgsDebugMsg( "No raster data!" );
188-
delete inputBlock;
189-
return outputBlock;
178+
return outputBlock.release();
190179
}
191180

192181
if ( !outputBlock->reset( Qgis::ARGB32_Premultiplied, width, height ) )
193182
{
194-
delete inputBlock;
195-
return outputBlock;
183+
return outputBlock.release();
196184
}
197185

198186
//resample image
@@ -219,8 +207,7 @@ QgsRasterBlock *QgsRasterResampleFilter::block( int bandNo, QgsRectangle const
219207

220208
outputBlock->setImage( &dstImg );
221209

222-
delete inputBlock;
223-
return outputBlock; // No resampling
210+
return outputBlock.release(); // No resampling
224211
}
225212

226213
void QgsRasterResampleFilter::writeXml( QDomDocument &doc, QDomElement &parentElem ) const
@@ -256,16 +243,16 @@ void QgsRasterResampleFilter::readXml( const QDomElement &filterElem )
256243
QString zoomedInResamplerType = filterElem.attribute( QStringLiteral( "zoomedInResampler" ) );
257244
if ( zoomedInResamplerType == QLatin1String( "bilinear" ) )
258245
{
259-
mZoomedInResampler = new QgsBilinearRasterResampler();
246+
mZoomedInResampler.reset( new QgsBilinearRasterResampler() );
260247
}
261248
else if ( zoomedInResamplerType == QLatin1String( "cubic" ) )
262249
{
263-
mZoomedInResampler = new QgsCubicRasterResampler();
250+
mZoomedInResampler.reset( new QgsCubicRasterResampler() );
264251
}
265252

266253
QString zoomedOutResamplerType = filterElem.attribute( QStringLiteral( "zoomedOutResampler" ) );
267254
if ( zoomedOutResamplerType == QLatin1String( "bilinear" ) )
268255
{
269-
mZoomedOutResampler = new QgsBilinearRasterResampler();
256+
mZoomedOutResampler.reset( new QgsBilinearRasterResampler() );
270257
}
271258
}

‎src/core/raster/qgsrasterresamplefilter.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@
2020

2121
#include "qgis_core.h"
2222
#include "qgsrasterinterface.h"
23-
24-
class QgsRasterResampler;
23+
#include "qgsrasterresampler.h"
2524

2625
class QDomElement;
2726

@@ -32,7 +31,6 @@ class CORE_EXPORT QgsRasterResampleFilter : public QgsRasterInterface
3231
{
3332
public:
3433
QgsRasterResampleFilter( QgsRasterInterface *input = nullptr );
35-
~QgsRasterResampleFilter();
3634

3735
QgsRasterResampleFilter *clone() const override;
3836

@@ -46,11 +44,11 @@ class CORE_EXPORT QgsRasterResampleFilter : public QgsRasterInterface
4644

4745
//! Set resampler for zoomed in scales. Takes ownership of the object
4846
void setZoomedInResampler( QgsRasterResampler *r );
49-
const QgsRasterResampler *zoomedInResampler() const { return mZoomedInResampler; }
47+
const QgsRasterResampler *zoomedInResampler() const { return mZoomedInResampler.get(); }
5048

5149
//! Set resampler for zoomed out scales. Takes ownership of the object
5250
void setZoomedOutResampler( QgsRasterResampler *r );
53-
const QgsRasterResampler *zoomedOutResampler() const { return mZoomedOutResampler; }
51+
const QgsRasterResampler *zoomedOutResampler() const { return mZoomedOutResampler.get(); }
5452

5553
void setMaxOversampling( double os ) { mMaxOversampling = os; }
5654
double maxOversampling() const { return mMaxOversampling; }
@@ -62,9 +60,9 @@ class CORE_EXPORT QgsRasterResampleFilter : public QgsRasterInterface
6260

6361
protected:
6462
//! Resampler used if screen resolution is higher than raster resolution (zoomed in). 0 means no resampling (nearest neighbour)
65-
QgsRasterResampler *mZoomedInResampler = nullptr;
63+
std::unique_ptr< QgsRasterResampler > mZoomedInResampler;
6664
//! Resampler used if raster resolution is higher than raster resolution (zoomed out). 0 mean no resampling (nearest neighbour)
67-
QgsRasterResampler *mZoomedOutResampler = nullptr;
65+
std::unique_ptr< QgsRasterResampler > mZoomedOutResampler;
6866

6967
//! Maximum boundary for oversampling (to avoid too much data traffic). Default: 2.0
7068
double mMaxOversampling;

‎src/core/raster/qgsrastershader.cpp

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,11 @@ email : ersts@amnh.org
2626
#include <QDomElement>
2727

2828
QgsRasterShader::QgsRasterShader( double minimumValue, double maximumValue )
29+
: mMinimumValue( minimumValue )
30+
, mMaximumValue( maximumValue )
31+
, mRasterShaderFunction( new QgsRasterShaderFunction( mMinimumValue, mMaximumValue ) )
2932
{
3033
QgsDebugMsgLevel( "called.", 4 );
31-
32-
mMinimumValue = minimumValue;
33-
mMaximumValue = maximumValue;
34-
mRasterShaderFunction = new QgsRasterShaderFunction( mMinimumValue, mMaximumValue );
35-
}
36-
37-
QgsRasterShader::~QgsRasterShader()
38-
{
39-
delete mRasterShaderFunction;
4034
}
4135

4236
/**
@@ -92,13 +86,12 @@ void QgsRasterShader::setRasterShaderFunction( QgsRasterShaderFunction *function
9286
{
9387
QgsDebugMsgLevel( "called.", 4 );
9488

95-
if ( mRasterShaderFunction == function )
89+
if ( mRasterShaderFunction.get() == function )
9690
return;
9791

9892
if ( function )
9993
{
100-
delete mRasterShaderFunction;
101-
mRasterShaderFunction = function;
94+
mRasterShaderFunction.reset( function );
10295
}
10396
}
10497

@@ -142,7 +135,7 @@ void QgsRasterShader::writeXml( QDomDocument &doc, QDomElement &parent ) const
142135
}
143136

144137
QDomElement rasterShaderElem = doc.createElement( QStringLiteral( "rastershader" ) );
145-
QgsColorRampShader *colorRampShader = dynamic_cast<QgsColorRampShader *>( mRasterShaderFunction );
138+
QgsColorRampShader *colorRampShader = dynamic_cast<QgsColorRampShader *>( mRasterShaderFunction.get() );
146139
if ( colorRampShader )
147140
{
148141
QDomElement colorRampShaderElem = doc.createElement( QStringLiteral( "colorrampshader" ) );

‎src/core/raster/qgsrastershader.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ class CORE_EXPORT QgsRasterShader
3434

3535
public:
3636
QgsRasterShader( double minimumValue = 0.0, double maximumValue = 255.0 );
37-
~QgsRasterShader();
3837

3938
//! QgsRasterShader cannot be copied
4039
QgsRasterShader( const QgsRasterShader &rh ) = delete;
@@ -52,8 +51,8 @@ class CORE_EXPORT QgsRasterShader
5251
//! \brief Return the minimum value for the raster shader
5352
double minimumValue() { return mMinimumValue; }
5453

55-
QgsRasterShaderFunction *rasterShaderFunction() { return mRasterShaderFunction; }
56-
const QgsRasterShaderFunction *rasterShaderFunction() const { return mRasterShaderFunction; }
54+
QgsRasterShaderFunction *rasterShaderFunction() { return mRasterShaderFunction.get(); }
55+
const QgsRasterShaderFunction *rasterShaderFunction() const { return mRasterShaderFunction.get(); }
5756

5857
/*
5958
*
@@ -94,7 +93,7 @@ class CORE_EXPORT QgsRasterShader
9493
double mMaximumValue;
9594

9695
//! \brief Pointer to the shader function
97-
QgsRasterShaderFunction *mRasterShaderFunction = nullptr;
96+
std::unique_ptr< QgsRasterShaderFunction > mRasterShaderFunction;
9897

9998
};
10099
#endif

‎src/core/raster/qgsrastershaderfunction.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,11 @@ email : ersts@amnh.org
2020
#include "qgsrastershaderfunction.h"
2121

2222
QgsRasterShaderFunction::QgsRasterShaderFunction( double minimumValue, double maximumValue )
23+
: mMaximumValue( maximumValue )
24+
, mMinimumValue( minimumValue )
25+
, mMinimumMaximumRange( mMaximumValue - mMinimumValue )
2326
{
2427
QgsDebugMsgLevel( "entered.", 4 );
25-
26-
mMinimumValue = minimumValue;
27-
mMaximumValue = maximumValue;
28-
mMinimumMaximumRange = mMaximumValue - mMinimumValue;
2928
}
3029

3130
/**

‎src/core/raster/qgssinglebandcolordatarenderer.cpp

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <QDomDocument>
2222
#include <QDomElement>
2323
#include <QImage>
24+
#include <memory>
2425

2526
QgsSingleBandColorDataRenderer::QgsSingleBandColorDataRenderer( QgsRasterInterface *input, int band ):
2627
QgsRasterRenderer( input, QStringLiteral( "singlebandcolordata" ) ), mBand( band )
@@ -52,33 +53,30 @@ QgsRasterBlock *QgsSingleBandColorDataRenderer::block( int bandNo, QgsRectangle
5253
{
5354
Q_UNUSED( bandNo );
5455

55-
QgsRasterBlock *outputBlock = new QgsRasterBlock();
56+
std::unique_ptr< QgsRasterBlock > outputBlock( new QgsRasterBlock() );
5657
if ( !mInput )
5758
{
58-
return outputBlock;
59+
return outputBlock.release();
5960
}
6061

61-
QgsRasterBlock *inputBlock = mInput->block( mBand, extent, width, height, feedback );
62+
std::unique_ptr< QgsRasterBlock > inputBlock( mInput->block( mBand, extent, width, height, feedback ) );
6263
if ( !inputBlock || inputBlock->isEmpty() )
6364
{
6465
QgsDebugMsg( "No raster data!" );
65-
delete inputBlock;
66-
return outputBlock;
66+
return outputBlock.release();
6767
}
6868

6969
bool hasTransparency = usesTransparency();
7070
if ( !hasTransparency )
7171
{
7272
// Nothing to do, just retype if necessary
7373
inputBlock->convert( Qgis::ARGB32_Premultiplied );
74-
delete outputBlock;
75-
return inputBlock;
74+
return inputBlock.release();
7675
}
7776

7877
if ( !outputBlock->reset( Qgis::ARGB32_Premultiplied, width, height ) )
7978
{
80-
delete inputBlock;
81-
return outputBlock;
79+
return outputBlock.release();
8280
}
8381

8482
// make sure input is also premultiplied!
@@ -92,8 +90,7 @@ QgsRasterBlock *QgsSingleBandColorDataRenderer::block( int bandNo, QgsRectangle
9290
outputBits[i] = qRgba( mOpacity * qRed( c ), mOpacity * qGreen( c ), mOpacity * qBlue( c ), mOpacity * qAlpha( c ) );
9391
}
9492

95-
delete inputBlock;
96-
return outputBlock;
93+
return outputBlock.release();
9794
}
9895

9996
void QgsSingleBandColorDataRenderer::writeXml( QDomDocument &doc, QDomElement &parentElem ) const

‎src/core/raster/qgssinglebandgrayrenderer.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,14 @@
2424
#include <QColor>
2525
#include <memory>
2626

27-
QgsSingleBandGrayRenderer::QgsSingleBandGrayRenderer( QgsRasterInterface *input, int grayBand ):
28-
QgsRasterRenderer( input, QStringLiteral( "singlebandgray" ) ), mGrayBand( grayBand ), mGradient( BlackToWhite ), mContrastEnhancement( nullptr )
27+
QgsSingleBandGrayRenderer::QgsSingleBandGrayRenderer( QgsRasterInterface *input, int grayBand )
28+
: QgsRasterRenderer( input, QStringLiteral( "singlebandgray" ) )
29+
, mGrayBand( grayBand )
30+
, mGradient( BlackToWhite )
31+
, mContrastEnhancement( nullptr )
2932
{
3033
}
3134

32-
QgsSingleBandGrayRenderer::~QgsSingleBandGrayRenderer()
33-
{
34-
delete mContrastEnhancement;
35-
}
36-
3735
QgsSingleBandGrayRenderer *QgsSingleBandGrayRenderer::clone() const
3836
{
3937
QgsSingleBandGrayRenderer *renderer = new QgsSingleBandGrayRenderer( nullptr, mGrayBand );
@@ -76,8 +74,7 @@ QgsRasterRenderer *QgsSingleBandGrayRenderer::create( const QDomElement &elem, Q
7674

7775
void QgsSingleBandGrayRenderer::setContrastEnhancement( QgsContrastEnhancement *ce )
7876
{
79-
delete mContrastEnhancement;
80-
mContrastEnhancement = ce;
77+
mContrastEnhancement.reset( ce );
8178
}
8279

8380
QgsRasterBlock *QgsSingleBandGrayRenderer::block( int bandNo, QgsRectangle const &extent, int width, int height, QgsRasterBlockFeedback *feedback )

‎src/core/raster/qgssinglebandgrayrenderer.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
#include "qgis_core.h"
2222
#include "qgsrasterrenderer.h"
23+
#include <memory>
2324

2425
class QgsContrastEnhancement;
2526
class QDomElement;
@@ -37,7 +38,6 @@ class CORE_EXPORT QgsSingleBandGrayRenderer: public QgsRasterRenderer
3738
};
3839

3940
QgsSingleBandGrayRenderer( QgsRasterInterface *input, int grayBand );
40-
~QgsSingleBandGrayRenderer();
4141

4242
//! QgsSingleBandGrayRenderer cannot be copied. Use clone() instead.
4343
QgsSingleBandGrayRenderer( const QgsSingleBandGrayRenderer & ) = delete;
@@ -52,7 +52,7 @@ class CORE_EXPORT QgsSingleBandGrayRenderer: public QgsRasterRenderer
5252

5353
int grayBand() const { return mGrayBand; }
5454
void setGrayBand( int band ) { mGrayBand = band; }
55-
const QgsContrastEnhancement *contrastEnhancement() const { return mContrastEnhancement; }
55+
const QgsContrastEnhancement *contrastEnhancement() const { return mContrastEnhancement.get(); }
5656
//! Takes ownership
5757
void setContrastEnhancement( QgsContrastEnhancement *ce );
5858

@@ -68,7 +68,7 @@ class CORE_EXPORT QgsSingleBandGrayRenderer: public QgsRasterRenderer
6868
private:
6969
int mGrayBand;
7070
Gradient mGradient;
71-
QgsContrastEnhancement *mContrastEnhancement = nullptr;
71+
std::unique_ptr< QgsContrastEnhancement > mContrastEnhancement;
7272

7373
};
7474

‎src/core/raster/qgssinglebandpseudocolorrenderer.cpp

Lines changed: 12 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,15 @@
2626
#include <QDomElement>
2727
#include <QImage>
2828

29-
QgsSingleBandPseudoColorRenderer::QgsSingleBandPseudoColorRenderer( QgsRasterInterface *input, int band, QgsRasterShader *shader ):
30-
QgsRasterRenderer( input, QStringLiteral( "singlebandpseudocolor" ) )
29+
QgsSingleBandPseudoColorRenderer::QgsSingleBandPseudoColorRenderer( QgsRasterInterface *input, int band, QgsRasterShader *shader )
30+
: QgsRasterRenderer( input, QStringLiteral( "singlebandpseudocolor" ) )
3131
, mShader( shader )
3232
, mBand( band )
3333
, mClassificationMin( std::numeric_limits<double>::quiet_NaN() )
3434
, mClassificationMax( std::numeric_limits<double>::quiet_NaN() )
3535
{
3636
}
3737

38-
QgsSingleBandPseudoColorRenderer::~QgsSingleBandPseudoColorRenderer()
39-
{
40-
delete mShader;
41-
}
42-
4338
void QgsSingleBandPseudoColorRenderer::setBand( int bandNo )
4439
{
4540
if ( bandNo > mInput->bandCount() || bandNo <= 0 )
@@ -109,8 +104,7 @@ QgsSingleBandPseudoColorRenderer *QgsSingleBandPseudoColorRenderer::clone() cons
109104

110105
void QgsSingleBandPseudoColorRenderer::setShader( QgsRasterShader *shader )
111106
{
112-
delete mShader;
113-
mShader = shader;
107+
mShader.reset( shader );
114108
}
115109

116110
void QgsSingleBandPseudoColorRenderer::createShader( QgsColorRamp *colorRamp, QgsColorRampShader::Type colorRampType, QgsColorRampShader::ClassificationMode classificationMode, int classes, bool clip, const QgsRectangle &extent )
@@ -203,33 +197,30 @@ QgsRasterBlock *QgsSingleBandPseudoColorRenderer::block( int bandNo, QgsRectangl
203197
{
204198
Q_UNUSED( bandNo );
205199

206-
QgsRasterBlock *outputBlock = new QgsRasterBlock();
200+
std::unique_ptr< QgsRasterBlock > outputBlock( new QgsRasterBlock() );
207201
if ( !mInput || !mShader )
208202
{
209-
return outputBlock;
203+
return outputBlock.release();
210204
}
211205

212206

213-
QgsRasterBlock *inputBlock = mInput->block( mBand, extent, width, height, feedback );
207+
std::shared_ptr< QgsRasterBlock > inputBlock( mInput->block( mBand, extent, width, height, feedback ) );
214208
if ( !inputBlock || inputBlock->isEmpty() )
215209
{
216210
QgsDebugMsg( "No raster data!" );
217-
delete inputBlock;
218-
return outputBlock;
211+
return outputBlock.release();
219212
}
220213

221214
//rendering is faster without considering user-defined transparency
222215
bool hasTransparency = usesTransparency();
223216

224-
QgsRasterBlock *alphaBlock = nullptr;
217+
std::shared_ptr< QgsRasterBlock > alphaBlock;
225218
if ( mAlphaBand > 0 && mAlphaBand != mBand )
226219
{
227-
alphaBlock = mInput->block( mAlphaBand, extent, width, height, feedback );
220+
alphaBlock.reset( mInput->block( mAlphaBand, extent, width, height, feedback ) );
228221
if ( !alphaBlock || alphaBlock->isEmpty() )
229222
{
230-
delete inputBlock;
231-
delete alphaBlock;
232-
return outputBlock;
223+
return outputBlock.release();
233224
}
234225
}
235226
else if ( mAlphaBand == mBand )
@@ -239,9 +230,7 @@ QgsRasterBlock *QgsSingleBandPseudoColorRenderer::block( int bandNo, QgsRectangl
239230

240231
if ( !outputBlock->reset( Qgis::ARGB32_Premultiplied, width, height ) )
241232
{
242-
delete inputBlock;
243-
delete alphaBlock;
244-
return outputBlock;
233+
return outputBlock.release();
245234
}
246235

247236
QRgb myDefaultColor = NODATA_COLOR;
@@ -290,13 +279,7 @@ QgsRasterBlock *QgsSingleBandPseudoColorRenderer::block( int bandNo, QgsRectangl
290279
}
291280
}
292281

293-
delete inputBlock;
294-
if ( mAlphaBand > 0 && mBand != mAlphaBand )
295-
{
296-
delete alphaBlock;
297-
}
298-
299-
return outputBlock;
282+
return outputBlock.release();
300283
}
301284

302285
void QgsSingleBandPseudoColorRenderer::writeXml( QDomDocument &doc, QDomElement &parentElem ) const

‎src/core/raster/qgssinglebandpseudocolorrenderer.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ class CORE_EXPORT QgsSingleBandPseudoColorRenderer: public QgsRasterRenderer
3737

3838
//! Note: takes ownership of QgsRasterShader
3939
QgsSingleBandPseudoColorRenderer( QgsRasterInterface *input, int band = -1, QgsRasterShader *shader = nullptr );
40-
~QgsSingleBandPseudoColorRenderer();
4140

4241
//! QgsSingleBandPseudoColorRenderer cannot be copied. Use clone() instead.
4342
QgsSingleBandPseudoColorRenderer( const QgsSingleBandPseudoColorRenderer & ) = delete;
@@ -54,10 +53,10 @@ class CORE_EXPORT QgsSingleBandPseudoColorRenderer: public QgsRasterRenderer
5453
void setShader( QgsRasterShader *shader );
5554

5655
//! Returns the raster shader
57-
QgsRasterShader *shader() { return mShader; }
56+
QgsRasterShader *shader() { return mShader.get(); }
5857

5958
//! @note available in python as constShader
60-
const QgsRasterShader *shader() const { return mShader; }
59+
const QgsRasterShader *shader() const { return mShader.get(); }
6160

6261
/** Creates a color ramp shader
6362
* @param colorRamp vector color ramp
@@ -93,7 +92,7 @@ class CORE_EXPORT QgsSingleBandPseudoColorRenderer: public QgsRasterRenderer
9392

9493
private:
9594

96-
QgsRasterShader *mShader = nullptr;
95+
std::unique_ptr< QgsRasterShader > mShader;
9796
int mBand;
9897

9998
// Minimum and maximum values used for automatic classification, these

0 commit comments

Comments
 (0)
Please sign in to comment.