Skip to content

Commit 8ea43ae

Browse files
committedDec 30, 2011
Provide convenience function to draw image parts for raster renderer
1 parent ab26a7f commit 8ea43ae

File tree

5 files changed

+43
-76
lines changed

5 files changed

+43
-76
lines changed
 

‎src/core/raster/qgsmultibandcolorrenderer.cpp

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,8 @@
1616
***************************************************************************/
1717

1818
#include "qgsmultibandcolorrenderer.h"
19-
#include "qgsmaptopixel.h"
20-
#include "qgsrasterresampler.h"
2119
#include "qgsrastertransparency.h"
22-
#include "qgsrasterviewport.h"
2320
#include <QImage>
24-
#include <QPainter>
2521
#include <QSet>
2622

2723
QgsMultiBandColorRenderer::QgsMultiBandColorRenderer( QgsRasterDataProvider* provider, int redBand, int greenBand, int blueBand, QgsRasterResampler* resampler ):
@@ -43,7 +39,7 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
4339
QgsRasterDataProvider::DataType redType = ( QgsRasterDataProvider::DataType )mProvider->dataType( mRedBand );
4440
QgsRasterDataProvider::DataType greenType = ( QgsRasterDataProvider::DataType )mProvider->dataType( mGreenBand );
4541
QgsRasterDataProvider::DataType blueType = ( QgsRasterDataProvider::DataType )mProvider->dataType( mBlueBand );
46-
QgsRasterDataProvider::DataType transparencyType;
42+
QgsRasterDataProvider::DataType transparencyType = QgsRasterDataProvider::UnknownDataType;
4743
if ( mAlphaBand > 0 )
4844
{
4945
transparencyType = ( QgsRasterDataProvider::DataType )mProvider->dataType( mAlphaBand );
@@ -58,27 +54,27 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
5854
}
5955

6056
QMap<int, void*> bandData;
61-
void* defaultPointer;
57+
void* defaultPointer = 0;
6258
QSet<int>::const_iterator bandIt = bands.constBegin();
6359
for ( ; bandIt != bands.constEnd(); ++bandIt )
6460
{
6561
bandData.insert( *bandIt, defaultPointer );
6662
startRasterRead( *bandIt, viewPort, theQgsMapToPixel, oversamplingX, oversamplingY );
6763
}
6864

69-
void* redData;
70-
void* greenData;
71-
void* blueData;
72-
void* alphaData;
65+
void* redData = 0;
66+
void* greenData = 0;
67+
void* blueData = 0;
68+
void* alphaData = 0;
7369
int nCols, nRows, topLeftCol, topLeftRow;
7470

75-
bool readSuccess;
71+
bool readSuccess = true;
7672
while ( true )
7773
{
7874
QSet<int>::const_iterator bandIt = bands.constBegin();
7975
for ( ; bandIt != bands.constEnd(); ++bandIt )
8076
{
81-
readSuccess = readNextRasterPart( *bandIt, viewPort, nCols, nRows, &bandData[*bandIt], topLeftCol, topLeftRow );
77+
readSuccess = readSuccess && readNextRasterPart( *bandIt, viewPort, nCols, nRows, &bandData[*bandIt], topLeftCol, topLeftRow );
8278
}
8379

8480
if ( !readSuccess )
@@ -139,21 +135,7 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
139135
}
140136
}
141137

142-
//draw image
143-
//top left position in device coords
144-
QPointF tlPoint = QPointF( viewPort->topLeftPoint.x(), viewPort->topLeftPoint.y() );
145-
tlPoint += QPointF( topLeftCol / oversamplingX, topLeftRow / oversamplingY );
146-
147-
if ( mResampler ) //resample to output resolution
148-
{
149-
QImage dstImg( nCols / oversamplingX + 1.0, nRows / oversamplingY + 1.0, QImage::Format_ARGB32_Premultiplied );
150-
mResampler->resample( img, dstImg );
151-
p->drawImage( tlPoint, dstImg );
152-
}
153-
else //use original image
154-
{
155-
p->drawImage( tlPoint, img );
156-
}
138+
drawImage( p, viewPort, img, topLeftCol, topLeftRow, nCols, nRows, oversamplingX, oversamplingY );
157139
}
158140

159141
bandIt = bands.constBegin();

‎src/core/raster/qgspalettedrasterrenderer.cpp

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,9 @@
1616
***************************************************************************/
1717

1818
#include "qgspalettedrasterrenderer.h"
19-
#include "qgscoordinatetransform.h"
20-
#include "qgsmaptopixel.h"
21-
#include "qgsrasterresampler.h"
2219
#include "qgsrastertransparency.h"
23-
#include "qgsrasterviewport.h"
2420
#include <QColor>
2521
#include <QImage>
26-
#include <QPainter>
2722

2823
QgsPalettedRasterRenderer::QgsPalettedRasterRenderer( QgsRasterDataProvider* provider, int bandNumber,
2924
QColor* colorArray, int nColors, QgsRasterResampler* resampler ):
@@ -44,7 +39,7 @@ void QgsPalettedRasterRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
4439
}
4540

4641
double oversamplingX, oversamplingY;
47-
QgsRasterDataProvider::DataType transparencyType;
42+
QgsRasterDataProvider::DataType transparencyType = QgsRasterDataProvider::UnknownDataType;
4843
if ( mAlphaBand > 0 )
4944
{
5045
transparencyType = ( QgsRasterDataProvider::DataType )mProvider->dataType( mAlphaBand );
@@ -122,30 +117,7 @@ void QgsPalettedRasterRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
122117
}
123118
}
124119

125-
//top left position in device coords
126-
QPointF tlPoint = QPointF( viewPort->topLeftPoint.x(), viewPort->topLeftPoint.y() );
127-
tlPoint += QPointF( topLeftCol / oversamplingX, topLeftRow / oversamplingY );
128-
129-
//draw image
130-
if ( mResampler ) //resample to output resolution
131-
{
132-
QImage dstImg( nCols / oversamplingX + 1.0, nRows / oversamplingY + 1.0, QImage::Format_ARGB32_Premultiplied );
133-
mResampler->resample( img, dstImg );
134-
p->drawImage( tlPoint, dstImg );
135-
136-
//debug output
137-
qWarning("*************************************************");
138-
qWarning("topleft:");
139-
qWarning( QString::number( tlPoint.x() ).toLocal8Bit().data() );
140-
qWarning( QString::number( tlPoint.y() ).toLocal8Bit().data() );
141-
qWarning("width/height:");
142-
qWarning( QString::number( nCols / oversamplingX ).toLocal8Bit().data() );
143-
qWarning( QString::number( nRows / oversamplingY ).toLocal8Bit().data() );
144-
}
145-
else //use original image
146-
{
147-
p->drawImage( tlPoint, img );
148-
}
120+
drawImage( p, viewPort, img, topLeftCol, topLeftRow, nCols, nRows, oversamplingX, oversamplingY );
149121
}
150122

151123
//stop raster reading

‎src/core/raster/qgsrasterrenderer.cpp

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,12 @@
1616
***************************************************************************/
1717

1818
#include "qgsrasterrenderer.h"
19+
#include "qgsrasterresampler.h"
1920
#include "qgsrastertransparency.h"
2021
#include "qgsrasterviewport.h"
2122
#include "qgsmaptopixel.h"
23+
#include <QImage>
24+
#include <QPainter>
2225

2326
QgsRasterRenderer::QgsRasterRenderer( QgsRasterDataProvider* provider, QgsRasterResampler* resampler ): mProvider( provider ), mResampler( resampler ),
2427
mOpacity( 1.0 ), mRasterTransparency( 0 ), mAlphaBand( -1 ), mInvertColor( false )
@@ -56,7 +59,7 @@ void QgsRasterRenderer::startRasterRead( int bandNumber, QgsRasterViewPort* view
5659
providerExtent = t.transformBoundingBox( providerExtent );
5760
}
5861
double pixelRatio = mapToPixel->mapUnitsPerPixel() / ( providerExtent.width() / mProvider->xSize() );
59-
oversampling = pixelRatio > 1.0 ? 2.5 : pixelRatio;
62+
oversampling = pixelRatio > 1.0 ? 1.0 : pixelRatio;
6063
}
6164

6265
//split raster into small portions if necessary
@@ -158,3 +161,28 @@ bool QgsRasterRenderer::usesTransparency() const
158161
{
159162
return ( mAlphaBand > 0 || ( mRasterTransparency && !mRasterTransparency->isEmpty() ) || !doubleNear( mOpacity, 1.0 ) );
160163
}
164+
165+
void QgsRasterRenderer::drawImage( QPainter* p, QgsRasterViewPort* viewPort, const QImage& img, int topLeftCol, int topLeftRow,
166+
int nCols, int nRows, double oversamplingX, double oversamplingY ) const
167+
{
168+
if ( !p || !viewPort )
169+
{
170+
return;
171+
}
172+
173+
//top left position in device coords
174+
QPointF tlPoint = QPointF( viewPort->topLeftPoint.x(), viewPort->topLeftPoint.y() );
175+
tlPoint += QPointF( topLeftCol / oversamplingX, topLeftRow / oversamplingY );
176+
177+
//draw image
178+
if ( mResampler && !( doubleNear( oversamplingX, 1.0 ) && doubleNear( oversamplingY, 1.0 ) ) ) //resampling with factor 1.0 not useful
179+
{
180+
QImage dstImg( nCols / oversamplingX + 1.0, nRows / oversamplingY + 1.0, QImage::Format_ARGB32_Premultiplied );
181+
mResampler->resample( img, dstImg );
182+
p->drawImage( tlPoint, dstImg );
183+
}
184+
else //use original image
185+
{
186+
p->drawImage( tlPoint, img );
187+
}
188+
}

‎src/core/raster/qgsrasterrenderer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ class QgsRasterRenderer
6464

6565
void startRasterRead( int bandNumber, QgsRasterViewPort* viewPort, const QgsMapToPixel* mapToPixel, double& oversamplingX, double& oversamplingY );
6666
bool readNextRasterPart( int bandNumber, QgsRasterViewPort* viewPort, int& nCols, int& nRows, void** rasterData, int& topLeftCol, int& topLeftRow );
67+
void drawImage( QPainter* p, QgsRasterViewPort* viewPort, const QImage& img, int topLeftCol, int topLeftRow,
68+
int nCols, int nRows, double oversamplingX, double oversamplingY ) const;
6769
void stopRasterRead( int bandNumber );
6870

6971

‎src/core/raster/qgssinglebandgrayrenderer.cpp

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,7 @@
1717

1818
#include "qgssinglebandgrayrenderer.h"
1919
#include "qgscontrastenhancement.h"
20-
#include "qgsrasterresampler.h"
21-
#include "qgsrasterviewport.h"
2220
#include <QImage>
23-
#include <QPainter>
2421

2522
QgsSingleBandGrayRenderer::QgsSingleBandGrayRenderer( QgsRasterDataProvider* provider, int grayBand, QgsRasterResampler* resampler ):
2623
QgsRasterRenderer( provider, resampler ), mGrayBand( grayBand ), mContrastEnhancement( 0 )
@@ -78,21 +75,7 @@ void QgsSingleBandGrayRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
7875
}
7976
}
8077

81-
//draw image
82-
//top left position in device coords
83-
QPointF tlPoint = QPointF( viewPort->topLeftPoint.x(), viewPort->topLeftPoint.y() );
84-
tlPoint += QPointF( topLeftCol / oversamplingX, topLeftRow / oversamplingY );
85-
86-
if ( mResampler ) //resample to output resolution
87-
{
88-
QImage dstImg( nCols / oversamplingX + 1.0, nRows / oversamplingY + 1.0, QImage::Format_ARGB32_Premultiplied );
89-
mResampler->resample( img, dstImg );
90-
p->drawImage( tlPoint, dstImg );
91-
}
92-
else //use original image
93-
{
94-
p->drawImage( tlPoint, img );
95-
}
78+
drawImage( p, viewPort, img, topLeftCol, topLeftRow, nCols, nRows, oversamplingX, oversamplingY );
9679
}
9780

9881
stopRasterRead( mGrayBand );

0 commit comments

Comments
 (0)
Please sign in to comment.