Skip to content

Commit 3b36620

Browse files
committedJan 28, 2012
Faster draw for multiband color in case there is no transparency, strech, inversion
1 parent 91c37fb commit 3b36620

File tree

3 files changed

+35
-7
lines changed

3 files changed

+35
-7
lines changed
 

‎src/core/raster/qgsmultibandcolorrenderer.cpp

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "qgsmultibandcolorrenderer.h"
1919
#include "qgscontrastenhancement.h"
2020
#include "qgsrastertransparency.h"
21+
#include "qgsrasterviewport.h"
2122
#include <QImage>
2223
#include <QSet>
2324

@@ -41,6 +42,13 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
4142
return;
4243
}
4344

45+
//In some (common) cases, we can simplify the drawing loop considerably and save render time
46+
bool fastDraw = (
47+
!usesTransparency( viewPort->mSrcCRS, viewPort->mDestCRS )
48+
&& mRedBand > 0 && mGreenBand > 0 && mBlueBand > 0
49+
&& mAlphaBand < 1 && !mRedContrastEnhancement && !mGreenContrastEnhancement && !mBlueContrastEnhancement
50+
&& !mInvertColor );
51+
4452
QgsRasterDataProvider::DataType redType;
4553
if ( mRedBand > 0 )
4654
{
@@ -155,15 +163,26 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
155163
imageScanLine = ( QRgb* )( img.scanLine( i ) );
156164
for ( int j = 0; j < nRasterCols; ++j )
157165
{
158-
if ( mRedBand )
166+
167+
if ( fastDraw ) //fast rendering if no transparency, stretching, color inversion, etc.
168+
{
169+
redVal = readValue( redData, redType, currentRasterPos );
170+
greenVal = readValue( greenData, greenType, currentRasterPos );
171+
blueVal = readValue( blueData, blueType, currentRasterPos );
172+
imageScanLine[j] = qRgba( redVal, greenVal, blueVal, 255 );
173+
++currentRasterPos;
174+
continue;
175+
}
176+
177+
if ( mRedBand > 0 )
159178
{
160179
redVal = readValue( redData, redType, currentRasterPos );
161180
}
162-
if ( mGreenBand )
181+
if ( mGreenBand > 0 )
163182
{
164183
greenVal = readValue( greenData, greenType, currentRasterPos );
165184
}
166-
if ( mBlueBand )
185+
if ( mBlueBand > 0 )
167186
{
168187
blueVal = readValue( blueData, blueType, currentRasterPos );
169188
}

‎src/core/raster/qgsrasterlayer.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -693,21 +693,30 @@ void QgsRasterLayer::setRendererForDrawingStyle( const DrawingStyle & theDrawin
693693
if ( mRedBandName != TRSTRING_NOT_SET )
694694
{
695695
red = bandNumber( mRedBandName );
696-
redEnhancement = contrastEnhancement( red );
696+
if ( contrastEnhancementAlgorithm() != QgsContrastEnhancement::NoEnhancement )
697+
{
698+
redEnhancement = contrastEnhancement( red );
699+
}
697700
}
698701
int green = -1;
699702
QgsContrastEnhancement* greenEnhancement = 0;
700703
if ( mGreenBandName != TRSTRING_NOT_SET )
701704
{
702705
green = bandNumber( mGreenBandName );
703-
greenEnhancement = contrastEnhancement( green );
706+
if ( contrastEnhancementAlgorithm() != QgsContrastEnhancement::NoEnhancement )
707+
{
708+
greenEnhancement = contrastEnhancement( green );
709+
}
704710
}
705711
int blue = -1;
706712
QgsContrastEnhancement* blueEnhancement = 0;
707713
if ( mBlueBandName != TRSTRING_NOT_SET )
708714
{
709715
blue = bandNumber( mBlueBandName );
710-
blueEnhancement = contrastEnhancement( blue );
716+
if ( contrastEnhancementAlgorithm() != QgsContrastEnhancement::NoEnhancement )
717+
{
718+
blueEnhancement = contrastEnhancement( blue );
719+
}
711720
}
712721
renderer = new QgsMultiBandColorRenderer( mDataProvider, red, green, blue,
713722
redEnhancement, greenEnhancement, blueEnhancement );

‎src/core/raster/qgsrastertransparency.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,6 @@ bool QgsRasterTransparency::isEmpty( double nodataValue ) const
177177
( mTransparentSingleValuePixelList.size() == 1 && doubleNear( mTransparentSingleValuePixelList.at( 0 ).pixelValue, nodataValue ) ) )
178178
&&
179179
( mTransparentThreeValuePixelList.isEmpty() ||
180-
( mTransparentThreeValuePixelList.size() == 1 && doubleNear( mTransparentThreeValuePixelList.at( 0 ).red, nodataValue ) &&
180+
( mTransparentThreeValuePixelList.size() < 4 && doubleNear( mTransparentThreeValuePixelList.at( 0 ).red, nodataValue ) &&
181181
doubleNear( mTransparentThreeValuePixelList.at( 0 ).green, nodataValue ) && doubleNear( mTransparentThreeValuePixelList.at( 0 ).blue, nodataValue ) ) ) );
182182
}

0 commit comments

Comments
 (0)
Please sign in to comment.