Skip to content

Commit fa22fab

Browse files
authored
Merge pull request #4266 from nyalldawson/raster_proj
Avoid getting stuck in raster projector loop for long times
2 parents 9887734 + 2dbb128 commit fa22fab

19 files changed

+121
-199
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

0 commit comments

Comments
 (0)