Skip to content

Commit 52b559e

Browse files
committed
Add renderer class for multiband color
1 parent 5f21627 commit 52b559e

File tree

6 files changed

+169
-7
lines changed

6 files changed

+169
-7
lines changed

src/core/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,9 @@ SET(QGIS_CORE_SRCS
165165
raster/qgsrastershaderfunction.cpp
166166

167167
raster/qgsrasterrenderer.cpp
168-
raster/qgspalettedrasterrenderer.cpp
169168
raster/qgsbilinearrasterresampler.cpp
169+
raster/qgspalettedrasterrenderer.cpp
170+
raster/qgsmultibandcolorrenderer.cpp
170171

171172
renderer/qgscontinuouscolorrenderer.cpp
172173
renderer/qgsgraduatedsymbolrenderer.cpp
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
/***************************************************************************
2+
qgsmultibandcolorrenderer.cpp
3+
-----------------------------
4+
begin : December 2011
5+
copyright : (C) 2011 by Marco Hugentobler
6+
email : marco at sourcepole dot ch
7+
***************************************************************************/
8+
9+
/***************************************************************************
10+
* *
11+
* This program is free software; you can redistribute it and/or modify *
12+
* it under the terms of the GNU General Public License as published by *
13+
* the Free Software Foundation; either version 2 of the License, or *
14+
* (at your option) any later version. *
15+
* *
16+
***************************************************************************/
17+
18+
#include "qgsmultibandcolorrenderer.h"
19+
#include "qgsmaptopixel.h"
20+
#include "qgsrasterresampler.h"
21+
#include "qgsrasterviewport.h"
22+
#include <QImage>
23+
#include <QPainter>
24+
25+
QgsMultiBandColorRenderer::QgsMultiBandColorRenderer( QgsRasterDataProvider* provider, int redBand, int greenBand, int blueBand, QgsRasterResampler* resampler ):
26+
QgsRasterRenderer( provider, resampler ), mRedBand( redBand ), mGreenBand( greenBand ), mBlueBand( blueBand )
27+
{
28+
}
29+
30+
QgsMultiBandColorRenderer::~QgsMultiBandColorRenderer()
31+
{
32+
}
33+
34+
void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel )
35+
{
36+
if ( !p || !mProvider || !viewPort || !theQgsMapToPixel )
37+
{
38+
return;
39+
}
40+
41+
//read data from provider
42+
int redTypeSize = mProvider->dataTypeSize( mRedBand ) / 8;
43+
int greenTypeSize = mProvider->dataTypeSize( mGreenBand ) / 8;
44+
int blueTypeSize = mProvider->dataTypeSize( mBlueBand ) / 8;
45+
46+
QgsRasterDataProvider::DataType redType = ( QgsRasterDataProvider::DataType )mProvider->dataType( mRedBand );
47+
QgsRasterDataProvider::DataType greenType = ( QgsRasterDataProvider::DataType )mProvider->dataType( mGreenBand );
48+
QgsRasterDataProvider::DataType blueType = ( QgsRasterDataProvider::DataType )mProvider->dataType( mBlueBand );
49+
50+
int nCols, nRows;
51+
52+
if ( mResampler )
53+
{
54+
//read data at source resolution if zoomed in, else do oversampling with factor 2.5
55+
QgsRectangle providerExtent = mProvider->extent();
56+
if ( viewPort->mSrcCRS.isValid() && viewPort->mDestCRS.isValid() && viewPort->mSrcCRS != viewPort->mDestCRS )
57+
{
58+
QgsCoordinateTransform t( viewPort->mSrcCRS, viewPort->mDestCRS );
59+
providerExtent = t.transformBoundingBox( providerExtent );
60+
}
61+
double pixelRatio = theQgsMapToPixel->mapUnitsPerPixel() / ( providerExtent.width() / mProvider->xSize() );
62+
double oversampling = pixelRatio > 1.0 ? 2.5 : pixelRatio;
63+
nCols = viewPort->drawableAreaXDim * oversampling;
64+
nRows = viewPort->drawableAreaYDim * oversampling;
65+
}
66+
else
67+
{
68+
nCols = viewPort->drawableAreaXDim;
69+
nRows = viewPort->drawableAreaYDim;
70+
}
71+
72+
void* redData = VSIMalloc( redTypeSize * nCols * nRows );
73+
void* greenData = VSIMalloc( greenTypeSize * nCols * nRows );
74+
void* blueData = VSIMalloc( blueTypeSize * nCols * nRows );
75+
76+
mProvider->readBlock( mRedBand, viewPort->mDrawnExtent, nCols, nRows,
77+
viewPort->mSrcCRS, viewPort->mDestCRS, redData );
78+
mProvider->readBlock( mGreenBand, viewPort->mDrawnExtent, nCols, nRows,
79+
viewPort->mSrcCRS, viewPort->mDestCRS, greenData );
80+
mProvider->readBlock( mBlueBand, viewPort->mDrawnExtent, nCols, nRows,
81+
viewPort->mSrcCRS, viewPort->mDestCRS, blueData );
82+
83+
QImage img( nCols, nRows, QImage::Format_ARGB32_Premultiplied );
84+
QRgb* imageScanLine = 0;
85+
int currentRasterPos = 0;
86+
int redVal, greenVal, blueVal;
87+
88+
for ( int i = 0; i < nRows; ++i )
89+
{
90+
imageScanLine = ( QRgb* )( img.scanLine( i ) );
91+
for ( int j = 0; j < nCols; ++j )
92+
{
93+
redVal = readValue( redData, redType, currentRasterPos );
94+
greenVal = readValue( greenData, greenType, currentRasterPos );
95+
blueVal = readValue( blueData, blueType, currentRasterPos );
96+
imageScanLine[j] = qRgba( redVal, greenVal, blueVal, 255 );
97+
++currentRasterPos;
98+
}
99+
}
100+
101+
CPLFree( redData );
102+
CPLFree( greenData );
103+
CPLFree( blueData );
104+
105+
if ( mResampler )
106+
{
107+
QImage dstImg( viewPort->drawableAreaXDim, viewPort->drawableAreaYDim, QImage::Format_ARGB32_Premultiplied );
108+
mResampler->resample( img, dstImg );
109+
p->drawImage( QPointF( viewPort->topLeftPoint.x(), viewPort->topLeftPoint.y() ), dstImg );
110+
}
111+
else
112+
{
113+
p->drawImage( QPointF( viewPort->topLeftPoint.x(), viewPort->topLeftPoint.y() ), img );
114+
}
115+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/***************************************************************************
2+
qgsmultibandcolorrenderer.h
3+
---------------------------
4+
begin : December 2011
5+
copyright : (C) 2011 by Marco Hugentobler
6+
email : marco at sourcepole dot ch
7+
***************************************************************************/
8+
9+
/***************************************************************************
10+
* *
11+
* This program is free software; you can redistribute it and/or modify *
12+
* it under the terms of the GNU General Public License as published by *
13+
* the Free Software Foundation; either version 2 of the License, or *
14+
* (at your option) any later version. *
15+
* *
16+
***************************************************************************/
17+
18+
#ifndef QGSMULTIBANDCOLORRENDERER_H
19+
#define QGSMULTIBANDCOLORRENDERER_H
20+
21+
#include "qgsrasterrenderer.h"
22+
23+
/**Renderer for multiband images with the color components*/
24+
class QgsMultiBandColorRenderer: public QgsRasterRenderer
25+
{
26+
public:
27+
QgsMultiBandColorRenderer( QgsRasterDataProvider* provider, int redBand, int greenBand, int blueBand, QgsRasterResampler* resampler = 0 );
28+
~QgsMultiBandColorRenderer();
29+
30+
void draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel );
31+
32+
private:
33+
int mRedBand;
34+
int mGreenBand;
35+
int mBlueBand;
36+
};
37+
38+
#endif // QGSMULTIBANDCOLORRENDERER_H

src/core/raster/qgspalettedrasterrenderer.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,12 @@
1818
#include "qgspalettedrasterrenderer.h"
1919
#include "qgscoordinatetransform.h"
2020
#include "qgsmaptopixel.h"
21+
#include "qgsrasterresampler.h"
2122
#include "qgsrasterviewport.h"
2223
#include <QColor>
2324
#include <QImage>
2425
#include <QPainter>
2526

26-
#include "qgsbilinearrasterresampler.h"
27-
2827
QgsPalettedRasterRenderer::QgsPalettedRasterRenderer( QgsRasterDataProvider* provider, int bandNumber,
2928
QColor* colorArray, int nColors, QgsRasterResampler* resampler ):
3029
QgsRasterRenderer( provider, resampler ), mBandNumber( bandNumber ), mColors( colorArray ), mNColors( nColors )
@@ -74,13 +73,14 @@ void QgsPalettedRasterRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
7473

7574
QImage img( nCols, nRows, QImage::Format_ARGB32_Premultiplied );
7675
QRgb* imageScanLine = 0;
76+
int val = 0;
7777

7878
for ( int i = 0; i < nRows; ++i )
7979
{
8080
imageScanLine = ( QRgb* )( img.scanLine( i ) );
8181
for ( int j = 0; j < nCols; ++j )
8282
{
83-
int val = readValue( rasterData, rasterType, currentRasterPos );
83+
val = readValue( rasterData, rasterType, currentRasterPos );
8484
imageScanLine[j] = mColors[ val ].rgba();
8585
++currentRasterPos;
8686
}
@@ -90,8 +90,7 @@ void QgsPalettedRasterRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
9090
if ( mResampler ) //resample to output resolution
9191
{
9292
QImage dstImg( viewPort->drawableAreaXDim, viewPort->drawableAreaYDim, QImage::Format_ARGB32_Premultiplied );
93-
QgsBilinearRasterResampler rs;
94-
rs.resample( img, dstImg );
93+
mResampler->resample( img, dstImg );
9594
p->drawImage( QPointF( viewPort->topLeftPoint.x(), viewPort->topLeftPoint.y() ), dstImg );
9695
}
9796
else //use original image

src/core/raster/qgsrasterlayer.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ email : tim at linfiniti.com
3939
//renderers
4040
#include "qgspalettedrasterrenderer.h"
4141
#include "qgsbilinearrasterresampler.h"
42+
#include "qgsmultibandcolorrenderer.h"
4243

4344
#include <cstdio>
4445
#include <cmath>
@@ -936,8 +937,16 @@ void QgsRasterLayer::draw( QPainter * theQPainter,
936937
}
937938
else
938939
{
940+
int red = bandNumber( mRedBandName );
941+
int green = bandNumber( mGreenBandName );
942+
int blue = bandNumber( mBlueBandName );
943+
QgsBilinearRasterResampler resampler;
944+
QgsMultiBandColorRenderer r( mDataProvider, red, green, blue, &resampler );
945+
r.draw( theQPainter, theRasterViewPort, theQgsMapToPixel );
946+
#if 0
939947
drawMultiBandColor( theQPainter, theRasterViewPort,
940948
theQgsMapToPixel );
949+
#endif //0
941950
}
942951
break;
943952
case SingleBandColorDataStyle:

src/core/raster/qgsrasterresampler.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class QImage;
2424
class QgsRasterResampler
2525
{
2626
public:
27-
void resample( const QImage& srcImage, QImage& dstImage ) const;
27+
virtual void resample( const QImage& srcImage, QImage& dstImage ) const = 0;
2828
};
2929

3030
#endif // QGSRASTERRESAMPLER_H

0 commit comments

Comments
 (0)