152 changes: 127 additions & 25 deletions src/core/raster/qgsrasterlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -590,6 +590,110 @@ QString QgsRasterLayer::contrastEnhancementAlgorithmAsString() const
return QString( "NoEnhancement" );
}

void QgsRasterLayer::setRendererForDrawingStyle( const DrawingStyle & theDrawingStyle )
{
QgsRasterRenderer* renderer = 0;

switch ( theDrawingStyle )
{
case PalettedColor:
{
//create color array for renderer
int grayBand = bandNumber( grayBandName() );
QList<QgsColorRampShader::ColorRampItem> itemList = mRasterStatsList[ grayBand - 1].colorTable;
QColor* colorArray = new QColor[itemList.size()];
QList<QgsColorRampShader::ColorRampItem>::const_iterator colorIt = itemList.constBegin();
for ( ; colorIt != itemList.constEnd(); ++colorIt )
{
colorArray[( int )colorIt->value] = colorIt->color;
}
renderer = new QgsPalettedRasterRenderer( mDataProvider,
grayBand,
colorArray,
itemList.size(),
mResampler );
break;
}
case SingleBandGray:
{
int grayBand = bandNumber( mGrayBandName );
renderer = new QgsSingleBandGrayRenderer( mDataProvider, grayBand, mResampler );
if ( QgsContrastEnhancement::NoEnhancement != contrastEnhancementAlgorithm() && !mUserDefinedGrayMinimumMaximum && mStandardDeviations > 0 )
{
mGrayMinimumMaximumEstimated = false;
QgsRasterBandStats myGrayBandStats = bandStatistics( grayBand );
setMaximumValue( grayBand, myGrayBandStats.mean + ( mStandardDeviations * myGrayBandStats.stdDev ) );
setMinimumValue( grayBand, myGrayBandStats.mean - ( mStandardDeviations * myGrayBandStats.stdDev ) );
}
else if ( QgsContrastEnhancement::NoEnhancement != contrastEnhancementAlgorithm() && !mUserDefinedGrayMinimumMaximum )
{
mGrayMinimumMaximumEstimated = true;
setMaximumValue( grayBand, mDataProvider->maximumValue( grayBand ) );
setMinimumValue( grayBand, mDataProvider->minimumValue( grayBand ) );
}
(( QgsSingleBandGrayRenderer* )renderer )->setContrastEnhancement( contrastEnhancement( grayBand ) );
break;
}
case SingleBandPseudoColor:
{
int bandNo = bandNumber( mGrayBandName );
QgsRasterBandStats myRasterBandStats = bandStatistics( bandNo );
double myMinimumValue = 0.0;
double myMaximumValue = 0.0;
//Use standard deviations if set, otherwise, use min max of band
if ( mStandardDeviations > 0 )
{
myMinimumValue = ( myRasterBandStats.mean - ( mStandardDeviations * myRasterBandStats.stdDev ) );
myMaximumValue = ( myRasterBandStats.mean + ( mStandardDeviations * myRasterBandStats.stdDev ) );
}
else
{
myMinimumValue = myRasterBandStats.minimumValue;
myMaximumValue = myRasterBandStats.maximumValue;
}

mRasterShader->setMinimumValue( myMinimumValue );
mRasterShader->setMaximumValue( myMaximumValue );

renderer = new QgsSingleBandPseudoColorRenderer( mDataProvider, bandNo, mRasterShader, mResampler );
break;
}
case MultiBandColor:
{
int red = bandNumber( mRedBandName );
int green = bandNumber( mGreenBandName );
int blue = bandNumber( mBlueBandName );
renderer = new QgsMultiBandColorRenderer( mDataProvider, red, green, blue, mResampler );
break;
}
case SingleBandColorDataStyle:
{
renderer = new QgsSingleBandColorDataRenderer( mDataProvider, bandNumber( mGrayBandName ), mResampler );
break;
}
default:
break;
}

if ( !renderer )
{
return;
}

renderer->setOpacity( mTransparencyLevel / 255.0 );
renderer->setRasterTransparency( &mRasterTransparency );
if ( mTransparencyBandName != TRSTRING_NOT_SET )
{
int tBand = bandNumber( mTransparencyBandName );
if ( tBand > 0 )
{
renderer->setAlphaBand( tBand );
}
}
renderer->setInvertColor( mInvertColor );
setRenderer( renderer );
}

/**
* @note Note implemented yet
* @return always returns false
Expand Down Expand Up @@ -808,6 +912,12 @@ void QgsRasterLayer::draw( QPainter * theQPainter,
// procedure to use :
//

if ( mRenderer )
{
mRenderer->draw( theQPainter, theRasterViewPort, theQgsMapToPixel );
}

#if 0
QgsDebugMsg( "mDrawingStyle = " + QString::number( mDrawingStyle ) );
switch ( mDrawingStyle )
{
Expand Down Expand Up @@ -849,10 +959,8 @@ void QgsRasterLayer::draw( QPainter * theQPainter,
r.setContrastEnhancement( contrastEnhancement( grayBand ) );
r.draw( theQPainter, theRasterViewPort, theQgsMapToPixel );

#if 0
drawSingleBandGray( theQPainter, theRasterViewPort,
theQgsMapToPixel, bandNumber( mGrayBandName ) );
#endif //0
//drawSingleBandGray( theQPainter, theRasterViewPort,
theQgsMapToPixel, bandNumber( mGrayBandName ) );
break;
}
// a "Gray" or "Undefined" layer drawn using a pseudocolor algorithm
Expand Down Expand Up @@ -890,10 +998,8 @@ void QgsRasterLayer::draw( QPainter * theQPainter,
r.setInvertColor( mInvertColor );
r.draw( theQPainter, theRasterViewPort, theQgsMapToPixel );

#if 0
drawSingleBandPseudoColor( theQPainter, theRasterViewPort,
theQgsMapToPixel, bandNumber( mGrayBandName ) );
#endif //0
//drawSingleBandPseudoColor( theQPainter, theRasterViewPort,
theQgsMapToPixel, bandNumber( mGrayBandName ) );
break;
}
// a single band with a color map
Expand Down Expand Up @@ -931,10 +1037,8 @@ void QgsRasterLayer::draw( QPainter * theQPainter,
}
renderer.setInvertColor( mInvertColor );
renderer.draw( theQPainter, theRasterViewPort, theQgsMapToPixel );
#if 0
drawPalettedSingleBandColor( theQPainter, theRasterViewPort,
theQgsMapToPixel, bandNumber( mGrayBandName ) );
#endif //0
//drawPalettedSingleBandColor( theQPainter, theRasterViewPort,
theQgsMapToPixel, bandNumber( mGrayBandName ) );
break;
}
// a "Palette" layer drawn in gray scale (using only one of the color components)
Expand Down Expand Up @@ -1035,10 +1139,8 @@ void QgsRasterLayer::draw( QPainter * theQPainter,
}
r.setInvertColor( mInvertColor );
r.draw( theQPainter, theRasterViewPort, theQgsMapToPixel );
#if 0
drawMultiBandColor( theQPainter, theRasterViewPort,
theQgsMapToPixel );
#endif //0
//drawMultiBandColor( theQPainter, theRasterViewPort,
theQgsMapToPixel );
}
break;
case SingleBandColorDataStyle:
Expand All @@ -1051,17 +1153,17 @@ void QgsRasterLayer::draw( QPainter * theQPainter,
{
QgsSingleBandColorDataRenderer r( mDataProvider, bandNumber( mGrayBandName ), mResampler );
r.draw( theQPainter, theRasterViewPort, theQgsMapToPixel );
#if 0
drawSingleBandColorData( theQPainter, theRasterViewPort,
theQgsMapToPixel, bandNumber( mGrayBandName ) );
#endif //0
//drawSingleBandColorData( theQPainter, theRasterViewPort,
theQgsMapToPixel, bandNumber( mGrayBandName ) );
break;
}

default:
break;

}
#endif //0

QgsDebugMsg( QString( "raster draw time (ms): %1" ).arg( time.elapsed() ) );
} //end of draw method

Expand Down Expand Up @@ -2221,7 +2323,7 @@ void QgsRasterLayer::init()
mRGBMinimumMaximumEstimated = true;
mGrayMinimumMaximumEstimated = true;

mDrawingStyle = QgsRasterLayer::UndefinedDrawingStyle;
setDrawingStyle( QgsRasterLayer::UndefinedDrawingStyle );
mContrastEnhancementAlgorithm = QgsContrastEnhancement::NoEnhancement;
mColorShadingAlgorithm = QgsRasterLayer::UndefinedShader;
mRasterShader = new QgsRasterShader();
Expand Down Expand Up @@ -2400,7 +2502,7 @@ void QgsRasterLayer::setDataProvider( QString const & provider,
QgsDebugMsg( "mLayerName: " + name() );

// set up the raster drawing style
mDrawingStyle = MultiBandColor; //sensible default
setDrawingStyle( MultiBandColor ); //sensible default

// Setup source CRS
if ( mProviderKey == "wms" )
Expand Down Expand Up @@ -2481,7 +2583,7 @@ void QgsRasterLayer::setDataProvider( QString const & provider,
if ( mRasterType == ColorLayer )
{
QgsDebugMsg( "Setting mDrawingStyle to SingleBandColorDataStyle " + QString::number( SingleBandColorDataStyle ) );
mDrawingStyle = SingleBandColorDataStyle;
setDrawingStyle( SingleBandColorDataStyle );
mGrayBandName = bandName( 1 ); //sensible default
}
else if ( mRasterType == Palette )
Expand All @@ -2493,7 +2595,7 @@ void QgsRasterLayer::setDataProvider( QString const & provider,
mGrayBandName = bandName( 1 ); //sensible default
QgsDebugMsg( mGrayBandName );

mDrawingStyle = PalettedColor; //sensible default
setDrawingStyle( PalettedColor ); //sensible default

//Set up a new color ramp shader
setColorShadingAlgorithm( ColorRampShader );
Expand Down Expand Up @@ -2541,7 +2643,7 @@ void QgsRasterLayer::setDataProvider( QString const & provider,

mTransparencyBandName = TRSTRING_NOT_SET;
mGrayBandName = TRSTRING_NOT_SET; //sensible default
mDrawingStyle = MultiBandColor; //sensible default
setDrawingStyle( MultiBandColor ); //sensible default

// read standard deviations
if ( mContrastEnhancementAlgorithm == QgsContrastEnhancement::StretchToMinimumMaximum )
Expand Down
7 changes: 6 additions & 1 deletion src/core/raster/qgsrasterlayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -373,7 +373,9 @@ class CORE_EXPORT QgsRasterLayer : public QgsMapLayer


/** \brief Mutator for drawing style */
void setDrawingStyle( const DrawingStyle & theDrawingStyle ) { mDrawingStyle = theDrawingStyle; }
void setDrawingStyle( const DrawingStyle & theDrawingStyle ) { mDrawingStyle = theDrawingStyle; setRendererForDrawingStyle( theDrawingStyle ); }
/**Sets corresponding renderer for style*/
void setRendererForDrawingStyle( const DrawingStyle & theDrawingStyle );

/** \brief Mutator for mGrayMinimumMaximumEstimated */
void setGrayMinimumMaximumEstimated( bool theBool ) { mGrayMinimumMaximumEstimated = theBool; }
Expand All @@ -395,6 +397,7 @@ class CORE_EXPORT QgsRasterLayer : public QgsMapLayer

/** Set raster resampler. Uses nearest neighbour resampling per default. Takes ownership of the resampler object*/
void setResampler( QgsRasterResampler* resampler );
QgsRasterResampler* resampler() { return mResampler; }
const QgsRasterResampler* resampler() const { return mResampler; }

/**Set raster renderer. Takes ownership of the renderer object*/
Expand Down Expand Up @@ -571,6 +574,8 @@ class CORE_EXPORT QgsRasterLayer : public QgsMapLayer
/** \brief Returns the number of raster units per each raster pixel. In a world file, this is normally the first row (without the sign) */
double rasterUnitsPerPixel();

const RasterStatsList rasterStatsList() const { return mRasterStatsList; }

/** \brief Read color table from GDAL raster band */
// Keep this for QgsRasterLayerProperties
bool readColorTable( int theBandNumber, QList<QgsColorRampShader::ColorRampItem>* theList );
Expand Down