Skip to content

Commit

Permalink
Provide convenience function to draw image parts for raster renderer
Browse files Browse the repository at this point in the history
  • Loading branch information
mhugent committed Dec 30, 2011
1 parent ab26a7f commit 8ea43ae
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 76 deletions.
36 changes: 9 additions & 27 deletions src/core/raster/qgsmultibandcolorrenderer.cpp
Expand Up @@ -16,12 +16,8 @@
***************************************************************************/

#include "qgsmultibandcolorrenderer.h"
#include "qgsmaptopixel.h"
#include "qgsrasterresampler.h"
#include "qgsrastertransparency.h"
#include "qgsrasterviewport.h"
#include <QImage>
#include <QPainter>
#include <QSet>

QgsMultiBandColorRenderer::QgsMultiBandColorRenderer( QgsRasterDataProvider* provider, int redBand, int greenBand, int blueBand, QgsRasterResampler* resampler ):
Expand All @@ -43,7 +39,7 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
QgsRasterDataProvider::DataType redType = ( QgsRasterDataProvider::DataType )mProvider->dataType( mRedBand );
QgsRasterDataProvider::DataType greenType = ( QgsRasterDataProvider::DataType )mProvider->dataType( mGreenBand );
QgsRasterDataProvider::DataType blueType = ( QgsRasterDataProvider::DataType )mProvider->dataType( mBlueBand );
QgsRasterDataProvider::DataType transparencyType;
QgsRasterDataProvider::DataType transparencyType = QgsRasterDataProvider::UnknownDataType;
if ( mAlphaBand > 0 )
{
transparencyType = ( QgsRasterDataProvider::DataType )mProvider->dataType( mAlphaBand );
Expand All @@ -58,27 +54,27 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
}

QMap<int, void*> bandData;
void* defaultPointer;
void* defaultPointer = 0;
QSet<int>::const_iterator bandIt = bands.constBegin();
for ( ; bandIt != bands.constEnd(); ++bandIt )
{
bandData.insert( *bandIt, defaultPointer );
startRasterRead( *bandIt, viewPort, theQgsMapToPixel, oversamplingX, oversamplingY );
}

void* redData;
void* greenData;
void* blueData;
void* alphaData;
void* redData = 0;
void* greenData = 0;
void* blueData = 0;
void* alphaData = 0;
int nCols, nRows, topLeftCol, topLeftRow;

bool readSuccess;
bool readSuccess = true;
while ( true )
{
QSet<int>::const_iterator bandIt = bands.constBegin();
for ( ; bandIt != bands.constEnd(); ++bandIt )
{
readSuccess = readNextRasterPart( *bandIt, viewPort, nCols, nRows, &bandData[*bandIt], topLeftCol, topLeftRow );
readSuccess = readSuccess && readNextRasterPart( *bandIt, viewPort, nCols, nRows, &bandData[*bandIt], topLeftCol, topLeftRow );
}

if ( !readSuccess )
Expand Down Expand Up @@ -139,21 +135,7 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
}
}

//draw image
//top left position in device coords
QPointF tlPoint = QPointF( viewPort->topLeftPoint.x(), viewPort->topLeftPoint.y() );
tlPoint += QPointF( topLeftCol / oversamplingX, topLeftRow / oversamplingY );

if ( mResampler ) //resample to output resolution
{
QImage dstImg( nCols / oversamplingX + 1.0, nRows / oversamplingY + 1.0, QImage::Format_ARGB32_Premultiplied );
mResampler->resample( img, dstImg );
p->drawImage( tlPoint, dstImg );
}
else //use original image
{
p->drawImage( tlPoint, img );
}
drawImage( p, viewPort, img, topLeftCol, topLeftRow, nCols, nRows, oversamplingX, oversamplingY );
}

bandIt = bands.constBegin();
Expand Down
32 changes: 2 additions & 30 deletions src/core/raster/qgspalettedrasterrenderer.cpp
Expand Up @@ -16,14 +16,9 @@
***************************************************************************/

#include "qgspalettedrasterrenderer.h"
#include "qgscoordinatetransform.h"
#include "qgsmaptopixel.h"
#include "qgsrasterresampler.h"
#include "qgsrastertransparency.h"
#include "qgsrasterviewport.h"
#include <QColor>
#include <QImage>
#include <QPainter>

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

double oversamplingX, oversamplingY;
QgsRasterDataProvider::DataType transparencyType;
QgsRasterDataProvider::DataType transparencyType = QgsRasterDataProvider::UnknownDataType;
if ( mAlphaBand > 0 )
{
transparencyType = ( QgsRasterDataProvider::DataType )mProvider->dataType( mAlphaBand );
Expand Down Expand Up @@ -122,30 +117,7 @@ void QgsPalettedRasterRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
}
}

//top left position in device coords
QPointF tlPoint = QPointF( viewPort->topLeftPoint.x(), viewPort->topLeftPoint.y() );
tlPoint += QPointF( topLeftCol / oversamplingX, topLeftRow / oversamplingY );

//draw image
if ( mResampler ) //resample to output resolution
{
QImage dstImg( nCols / oversamplingX + 1.0, nRows / oversamplingY + 1.0, QImage::Format_ARGB32_Premultiplied );
mResampler->resample( img, dstImg );
p->drawImage( tlPoint, dstImg );

//debug output
qWarning("*************************************************");
qWarning("topleft:");
qWarning( QString::number( tlPoint.x() ).toLocal8Bit().data() );
qWarning( QString::number( tlPoint.y() ).toLocal8Bit().data() );
qWarning("width/height:");
qWarning( QString::number( nCols / oversamplingX ).toLocal8Bit().data() );
qWarning( QString::number( nRows / oversamplingY ).toLocal8Bit().data() );
}
else //use original image
{
p->drawImage( tlPoint, img );
}
drawImage( p, viewPort, img, topLeftCol, topLeftRow, nCols, nRows, oversamplingX, oversamplingY );
}

//stop raster reading
Expand Down
30 changes: 29 additions & 1 deletion src/core/raster/qgsrasterrenderer.cpp
Expand Up @@ -16,9 +16,12 @@
***************************************************************************/

#include "qgsrasterrenderer.h"
#include "qgsrasterresampler.h"
#include "qgsrastertransparency.h"
#include "qgsrasterviewport.h"
#include "qgsmaptopixel.h"
#include <QImage>
#include <QPainter>

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

//split raster into small portions if necessary
Expand Down Expand Up @@ -158,3 +161,28 @@ bool QgsRasterRenderer::usesTransparency() const
{
return ( mAlphaBand > 0 || ( mRasterTransparency && !mRasterTransparency->isEmpty() ) || !doubleNear( mOpacity, 1.0 ) );
}

void QgsRasterRenderer::drawImage( QPainter* p, QgsRasterViewPort* viewPort, const QImage& img, int topLeftCol, int topLeftRow,
int nCols, int nRows, double oversamplingX, double oversamplingY ) const
{
if ( !p || !viewPort )
{
return;
}

//top left position in device coords
QPointF tlPoint = QPointF( viewPort->topLeftPoint.x(), viewPort->topLeftPoint.y() );
tlPoint += QPointF( topLeftCol / oversamplingX, topLeftRow / oversamplingY );

//draw image
if ( mResampler && !( doubleNear( oversamplingX, 1.0 ) && doubleNear( oversamplingY, 1.0 ) ) ) //resampling with factor 1.0 not useful
{
QImage dstImg( nCols / oversamplingX + 1.0, nRows / oversamplingY + 1.0, QImage::Format_ARGB32_Premultiplied );
mResampler->resample( img, dstImg );
p->drawImage( tlPoint, dstImg );
}
else //use original image
{
p->drawImage( tlPoint, img );
}
}
2 changes: 2 additions & 0 deletions src/core/raster/qgsrasterrenderer.h
Expand Up @@ -64,6 +64,8 @@ class QgsRasterRenderer

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


Expand Down
19 changes: 1 addition & 18 deletions src/core/raster/qgssinglebandgrayrenderer.cpp
Expand Up @@ -17,10 +17,7 @@

#include "qgssinglebandgrayrenderer.h"
#include "qgscontrastenhancement.h"
#include "qgsrasterresampler.h"
#include "qgsrasterviewport.h"
#include <QImage>
#include <QPainter>

QgsSingleBandGrayRenderer::QgsSingleBandGrayRenderer( QgsRasterDataProvider* provider, int grayBand, QgsRasterResampler* resampler ):
QgsRasterRenderer( provider, resampler ), mGrayBand( grayBand ), mContrastEnhancement( 0 )
Expand Down Expand Up @@ -78,21 +75,7 @@ void QgsSingleBandGrayRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
}
}

//draw image
//top left position in device coords
QPointF tlPoint = QPointF( viewPort->topLeftPoint.x(), viewPort->topLeftPoint.y() );
tlPoint += QPointF( topLeftCol / oversamplingX, topLeftRow / oversamplingY );

if ( mResampler ) //resample to output resolution
{
QImage dstImg( nCols / oversamplingX + 1.0, nRows / oversamplingY + 1.0, QImage::Format_ARGB32_Premultiplied );
mResampler->resample( img, dstImg );
p->drawImage( tlPoint, dstImg );
}
else //use original image
{
p->drawImage( tlPoint, img );
}
drawImage( p, viewPort, img, topLeftCol, topLeftRow, nCols, nRows, oversamplingX, oversamplingY );
}

stopRasterRead( mGrayBand );
Expand Down

0 comments on commit 8ea43ae

Please sign in to comment.