diff --git a/src/core/raster/qgsrasterlayer.cpp b/src/core/raster/qgsrasterlayer.cpp index fcfa12f5379..f5de3a8af27 100644 --- a/src/core/raster/qgsrasterlayer.cpp +++ b/src/core/raster/qgsrasterlayer.cpp @@ -85,22 +85,31 @@ QgsRasterLayer::QgsRasterLayer( mInvertColor( false ) { + mRasterType = QgsRasterLayer::GrayOrUndefined; + + mRedBandName = TRSTRING_NOT_SET; + mGreenBandName = TRSTRING_NOT_SET; + mBlueBandName = TRSTRING_NOT_SET; + mGrayBandName = TRSTRING_NOT_SET; + mTransparencyBandName = TRSTRING_NOT_SET; + + mUserDefinedRGBMinimumMaximum = false; //defaults needed to bypass enhanceContrast mUserDefinedGrayMinimumMaximum = false; mRGBMinimumMaximumEstimated = true; mGrayMinimumMaximumEstimated = true; + mDrawingStyle = QgsRasterLayer::UndefinedDrawingStyle; + mContrastEnhancementAlgorithm = QgsContrastEnhancement::NoEnhancement; + mColorShadingAlgorithm = QgsRasterLayer::UndefinedShader; mRasterShader = new QgsRasterShader(); - if ( loadDefaultStyleFlag ) - { - bool defaultLoadedFlag = false; - loadDefaultStyle( defaultLoadedFlag ); - if ( defaultLoadedFlag ) - { - return; - } - } + mHasPyramids = false; + mNoDataValue = -9999; + mValidNoDataValue = false; + + mGdalBaseDataset = 0; + mGdalDataset = 0; // Initialise the affine transform matrix mGeoTransform[0] = 0; @@ -121,6 +130,18 @@ QgsRasterLayer::QgsRasterLayer( if ( ! path.isEmpty() ) { readFile( path ); // XXX check for failure? + + //readFile() is really an extension of the constructor as many imporant fields are set in this method + //loadDefaultStyle() can not be called before the layer has actually be opened + if ( loadDefaultStyleFlag ) + { + bool defaultLoadedFlag = false; + loadDefaultStyle( defaultLoadedFlag ); + if ( defaultLoadedFlag ) + { + return; + } + } } } // QgsRasterLayer ctor @@ -199,6 +220,10 @@ QgsRasterLayer::~QgsRasterLayer() if ( mGdalBaseDataset ) { GDALDereferenceDataset( mGdalBaseDataset ); + } + + if( mGdalDataset ) + { GDALClose( mGdalDataset ); } } @@ -3162,8 +3187,6 @@ void QgsRasterLayer::setColorShadingAlgorithm( ColorShadingAlgorithm theShadingA mRasterShader = new QgsRasterShader(); } - mColorShadingAlgorithm = theShadingAlgorithm; - switch ( theShadingAlgorithm ) { case PseudoColorShader: @@ -3182,6 +3205,9 @@ void QgsRasterLayer::setColorShadingAlgorithm( ColorShadingAlgorithm theShadingA mRasterShader->setRasterShaderFunction( new QgsRasterShaderFunction() ); break; } + + //Set the class variable after the call to setRasterShader(), so memory recovery can happen + mColorShadingAlgorithm = theShadingAlgorithm; } QgsDebugMsg( "mColorShadingAlgorithm = " + QString::number( theShadingAlgorithm ) ); } @@ -3378,6 +3404,12 @@ void QgsRasterLayer::setNoDataValue( double theNoDataValue ) void QgsRasterLayer::setRasterShaderFunction( QgsRasterShaderFunction* theFunction ) { + //Free old shader if it is not a userdefined shader + if( mColorShadingAlgorithm != QgsRasterLayer::UserDefinedShader && 0 != mRasterShader->rasterShaderFunction() ) + { + delete( mRasterShader->rasterShaderFunction() ); + } + if ( theFunction ) { mRasterShader->setRasterShaderFunction( theFunction ); @@ -3387,7 +3419,7 @@ void QgsRasterLayer::setRasterShaderFunction( QgsRasterShaderFunction* theFuncti { //If NULL as passed in, set a default shader function to prevent segfaults mRasterShader->setRasterShaderFunction( new QgsRasterShaderFunction() ); - mColorShadingAlgorithm = QgsRasterLayer::UserDefinedShader; + mColorShadingAlgorithm = QgsRasterLayer::UndefinedShader; } } @@ -5175,6 +5207,8 @@ bool QgsRasterLayer::readFile( QString const &theFilename ) //Set up a new color ramp shader setColorShadingAlgorithm( ColorRampShader ); QgsColorRampShader* myColorRampShader = ( QgsColorRampShader* ) mRasterShader->rasterShaderFunction(); + //TODO: Make sure the set algorithm and cast was successful, + //e.g., if ( 0 != myColorRampShader && myColorRampShader->shaderTypeAsString == "ColorRampShader" ) myColorRampShader->setColorRampType( QgsColorRampShader::INTERPOLATED ); myColorRampShader->setColorRampItemList( *colorTable( 1 ) ); }