Skip to content

Commit 3f227c4

Browse files
committed
resampler separated, reenabled transparency in renderers
1 parent 8760718 commit 3f227c4

13 files changed

+421
-212
lines changed

src/app/qgsrasterlayerproperties.cpp

+13-9
Original file line numberDiff line numberDiff line change
@@ -201,16 +201,18 @@ QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer* lyr, QgsMapCanv
201201
mZoomedInResamplingComboBox->insertItem( 2, tr( "Cubic" ) );
202202
mZoomedOutResamplingComboBox->insertItem( 0, tr( "Nearest neighbour" ) );
203203
mZoomedOutResamplingComboBox->insertItem( 1, tr( "Average" ) );
204+
205+
const QgsRasterResampleFilter* resampleFilter = mRasterLayer->resampleFilter();
204206
//set combo boxes to current resampling types
205-
if ( renderer )
207+
if ( resampleFilter )
206208
{
207209
//invert color map
208210
if ( renderer->invertColor() )
209211
{
210212
mInvertColorMapCheckBox->setCheckState( Qt::Checked );
211213
}
212214

213-
const QgsRasterResampler* zoomedInResampler = renderer->zoomedInResampler();
215+
const QgsRasterResampler* zoomedInResampler = resampleFilter->zoomedInResampler();
214216
if ( zoomedInResampler )
215217
{
216218
if ( zoomedInResampler->type() == "bilinear" )
@@ -227,7 +229,7 @@ QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer* lyr, QgsMapCanv
227229
mZoomedInResamplingComboBox->setCurrentIndex( 0 );
228230
}
229231

230-
const QgsRasterResampler* zoomedOutResampler = renderer->zoomedOutResampler();
232+
const QgsRasterResampler* zoomedOutResampler = resampleFilter->zoomedOutResampler();
231233
if ( zoomedOutResampler )
232234
{
233235
if ( zoomedOutResampler->type() == "bilinear" ) //bilinear resampler does averaging when zooming out
@@ -798,6 +800,8 @@ void QgsRasterLayerProperties::apply()
798800
pixmapLegend->setScaledContents( true );
799801
pixmapLegend->repaint();
800802

803+
QgsRasterResampleFilter* resampleFilter = mRasterLayer->resampleFilter();
804+
801805
QgsRasterResampler* zoomedInResampler = 0;
802806
QString zoomedInResamplingMethod = mZoomedInResamplingComboBox->currentText();
803807
if ( zoomedInResamplingMethod == tr( "Bilinear" ) )
@@ -809,9 +813,9 @@ void QgsRasterLayerProperties::apply()
809813
zoomedInResampler = new QgsCubicRasterResampler();
810814
}
811815

812-
if ( rasterRenderer )
816+
if ( resampleFilter )
813817
{
814-
rasterRenderer->setZoomedInResampler( zoomedInResampler );
818+
resampleFilter->setZoomedInResampler( zoomedInResampler );
815819
}
816820

817821
//raster resampling
@@ -822,14 +826,14 @@ void QgsRasterLayerProperties::apply()
822826
zoomedOutResampler = new QgsBilinearRasterResampler();
823827
}
824828

825-
if ( rasterRenderer )
829+
if ( resampleFilter )
826830
{
827-
rasterRenderer->setZoomedOutResampler( zoomedOutResampler );
831+
resampleFilter->setZoomedOutResampler( zoomedOutResampler );
828832
}
829833

830-
if ( rasterRenderer )
834+
if ( resampleFilter )
831835
{
832-
rasterRenderer->setMaxOversampling( mMaximumOversamplingSpinBox->value() );
836+
resampleFilter->setMaxOversampling( mMaximumOversamplingSpinBox->value() );
833837
}
834838

835839

src/core/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ SET(QGIS_CORE_SRCS
167167
raster/qgsrastershaderfunction.cpp
168168

169169
raster/qgsrasterdrawer.cpp
170+
raster/qgsrasterresamplefilter.cpp
170171
raster/qgsrasterrendererregistry.cpp
171172
raster/qgsrasterrenderer.cpp
172173
raster/qgsbilinearrasterresampler.cpp

src/core/raster/qgsmultibandcolorrenderer.cpp

+1-17
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ QgsRasterRenderer* QgsMultiBandColorRenderer::create( const QDomElement& elem, Q
101101
return r;
102102
}
103103

104-
//void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel )
105104
void * QgsMultiBandColorRenderer::readBlock( int bandNo, QgsRectangle const & extent, int width, int height )
106105
{
107106
if ( !mInput )
@@ -171,31 +170,16 @@ void * QgsMultiBandColorRenderer::readBlock( int bandNo, QgsRectangle const & e
171170
for ( ; bandIt != bands.constEnd(); ++bandIt )
172171
{
173172
bandData.insert( *bandIt, defaultPointer );
174-
//startRasterRead( *bandIt, viewPort, theQgsMapToPixel, oversamplingX, oversamplingY );
175173
}
176174

177175
void* redData = 0;
178176
void* greenData = 0;
179177
void* blueData = 0;
180178
void* alphaData = 0;
181-
//number of cols/rows in output pixels
182-
int nCols = 0;
183-
int nRows = 0;
184-
//number of raster cols/rows with oversampling
185-
int nRasterCols = 0;
186-
int nRasterRows = 0;
187-
//shift to top left point for the raster part
188-
int topLeftCol = 0;
189-
int topLeftRow = 0;
190-
191-
bool readSuccess = true;
192-
193-
//QSet<int>::const_iterator bandIt = bands.constBegin();
179+
194180
bandIt = bands.constBegin();
195181
for ( ; bandIt != bands.constEnd(); ++bandIt )
196182
{
197-
//readSuccess = readSuccess && readNextRasterPart( *bandIt, oversamplingX, oversamplingY, viewPort, nCols, nRows,
198-
// nRasterCols, nRasterRows, &bandData[*bandIt], topLeftCol, topLeftRow );
199183
bandData[*bandIt] = mInput->readBlock( *bandIt, extent, width, height );
200184
if ( !bandData[*bandIt] ) return 0;
201185
}

src/core/raster/qgspalettedrasterrenderer.cpp

+18-38
Original file line numberDiff line numberDiff line change
@@ -81,38 +81,19 @@ QColor* QgsPalettedRasterRenderer::colors() const
8181
return colorArray;
8282
}
8383

84-
//void QgsPalettedRasterRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel )
8584
void * QgsPalettedRasterRenderer::readBlock( int bandNo, QgsRectangle const & extent, int width, int height )
8685
{
8786
if ( !mInput )
8887
{
8988
return 0;
9089
}
9190

92-
//double oversamplingX, oversamplingY;
93-
//QgsRasterFace::DataType transparencyType = QgsRasterFace::UnknownDataType;
94-
//if ( mAlphaBand > 0 )
95-
//{
96-
//transparencyType = ( QgsRasterFace::DataType )mInput->dataType( mAlphaBand );
97-
//}
98-
//startRasterRead( mBandNumber, viewPort, theQgsMapToPixel, oversamplingX, oversamplingY );
99-
100-
////Read alpha band if necessary
101-
//if ( mAlphaBand > 0 && mAlphaBand != mBandNumber )
102-
//{
103-
//startRasterRead( mAlphaBand, viewPort, theQgsMapToPixel, oversamplingX, oversamplingY );
104-
//}
105-
106-
////number of cols/rows in output pixels
107-
//int nCols = 0;
108-
//int nRows = 0;
109-
////number of raster cols/rows with oversampling
110-
//int nRasterCols = 0;
111-
//int nRasterRows = 0;
112-
////shift to top left point for the raster part
113-
//int topLeftCol = 0;
114-
//int topLeftRow = 0;
115-
//int currentRasterPos = 0;
91+
QgsRasterFace::DataType transparencyType = QgsRasterFace::UnknownDataType;
92+
if ( mAlphaBand > 0 )
93+
{
94+
transparencyType = ( QgsRasterFace::DataType )mInput->dataType( mAlphaBand );
95+
}
96+
11697
QgsRasterFace::DataType rasterType = ( QgsRasterFace::DataType )mInput->dataType( mBandNumber );
11798
void* rasterData = mInput->readBlock( bandNo, extent, width, height );
11899
double currentOpacity = mOpacity;
@@ -123,15 +104,14 @@ void * QgsPalettedRasterRenderer::readBlock( int bandNo, QgsRectangle const & e
123104
//bool hasTransparency = usesTransparency( viewPort->mSrcCRS, viewPort->mDestCRS );
124105
void* transparencyData = 0;
125106

126-
//if ( mAlphaBand > 0 && mAlphaBand != mBandNumber )
127-
//{
128-
//readNextRasterPart( mAlphaBand, oversamplingX, oversamplingY, viewPort, nCols, nRows, nRasterCols, nRasterRows,
129-
//&transparencyData, topLeftCol, topLeftRow );
130-
//}
131-
//else if ( mAlphaBand == mBandNumber )
132-
//{
133-
//transparencyData = rasterData;
134-
//}
107+
if ( mAlphaBand > 0 && mAlphaBand != mBandNumber )
108+
{
109+
transparencyData = mInput->readBlock( mAlphaBand, extent, width, height );
110+
}
111+
else if ( mAlphaBand == mBandNumber )
112+
{
113+
transparencyData = rasterData;
114+
}
135115

136116
//create image
137117
QImage img( width, height, QImage::Format_ARGB32_Premultiplied );
@@ -156,10 +136,10 @@ void * QgsPalettedRasterRenderer::readBlock( int bandNo, QgsRectangle const & e
156136
{
157137
currentOpacity = mRasterTransparency->alphaValue( val, mOpacity * 255 ) / 255.0;
158138
}
159-
//if ( mAlphaBand > 0 )
160-
//{
161-
//currentOpacity *= ( readValue( transparencyData, transparencyType, currentRasterPos ) / 255.0 );
162-
//}
139+
if ( mAlphaBand > 0 )
140+
{
141+
currentOpacity *= ( readValue( transparencyData, transparencyType, currentRasterPos ) / 255.0 );
142+
}
163143
QColor& currentColor = mColors[val];
164144

165145
if ( mInvertColor )

src/core/raster/qgsrasterlayer.cpp

+91-1
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ QgsRasterLayer::QgsRasterLayer(
117117
, mWidth( std::numeric_limits<int>::max() )
118118
, mHeight( std::numeric_limits<int>::max() )
119119
, mRenderer( 0 )
120+
, mResampleFilter( 0 )
120121
{
121122
QgsDebugMsg( "Entered" );
122123

@@ -189,6 +190,7 @@ QgsRasterLayer::~QgsRasterLayer()
189190
mValid = false;
190191
delete mDataProvider;
191192
delete mRenderer;
193+
delete mResampleFilter;
192194
}
193195

194196
//////////////////////////////////////////////////////////
@@ -824,8 +826,16 @@ void QgsRasterLayer::draw( QPainter * theQPainter,
824826
if ( mRenderer )
825827
{
826828
//mRenderer->draw( theQPainter, theRasterViewPort, theQgsMapToPixel );
827-
QgsRasterDrawer drawer( mRenderer );
829+
//if ( mResampleFilter )
830+
//{
831+
QgsRasterDrawer drawer( mResampleFilter );
828832
drawer.draw( theQPainter, theRasterViewPort, theQgsMapToPixel );
833+
//}
834+
//else
835+
//{
836+
// QgsRasterDrawer drawer( mRenderer );
837+
// drawer.draw( theQPainter, theRasterViewPort, theQgsMapToPixel );
838+
//}
829839
}
830840

831841
QgsDebugMsg( QString( "raster draw time (ms): %1" ).arg( time.elapsed() ) );
@@ -2062,8 +2072,27 @@ void QgsRasterLayer::setTransparentBandName( QString const & )
20622072

20632073
void QgsRasterLayer::setRenderer( QgsRasterRenderer* renderer )
20642074
{
2075+
QgsDebugMsg( "Entered" );
20652076
delete mRenderer;
20662077
mRenderer = renderer;
2078+
2079+
if ( !mResampleFilter )
2080+
{
2081+
mResampleFilter = new QgsRasterResampleFilter( mRenderer );
2082+
}
2083+
else
2084+
{
2085+
mResampleFilter->setInput( mRenderer );
2086+
}
2087+
}
2088+
2089+
// not sure if we want it
2090+
void QgsRasterLayer::setResampleFilter( QgsRasterResampleFilter* resampleFilter )
2091+
{
2092+
QgsDebugMsg( "Entered" );
2093+
delete mResampleFilter;
2094+
mResampleFilter = resampleFilter;
2095+
mResampleFilter->setInput( mRenderer );
20672096
}
20682097

20692098
void QgsRasterLayer::showProgress( int theValue )
@@ -2233,6 +2262,60 @@ bool QgsRasterLayer::readSymbology( const QDomNode& layer_node, QString& errorMe
22332262
}
22342263
}
22352264
}
2265+
2266+
//resampler
2267+
delete mResampleFilter;
2268+
mResampleFilter = new QgsRasterResampleFilter( mRenderer );
2269+
2270+
//max oversampling
2271+
QDomElement resampleElem = layer_node.firstChildElement( "rasterresampler" );
2272+
if ( !resampleElem.isNull() )
2273+
{
2274+
mResampleFilter->readXML( resampleElem );
2275+
}
2276+
/*
2277+
if ( mResampleFilter )
2278+
{
2279+
QDomElement maxOversamplingElem = mnl.firstChildElement( "maxOversampling" );
2280+
if ( !maxOversamplingElem.isNull() )
2281+
{
2282+
bool conversion;
2283+
double maxOversampling = maxOversamplingElem.text().toDouble( &conversion );
2284+
if ( conversion )
2285+
{
2286+
mResampleFilter->setMaxOversampling( maxOversampling );
2287+
}
2288+
}
2289+
}
2290+
2291+
QDomElement zoomedInResamplerElem = mnl.firstChildElement( "zoomedInResampler" );
2292+
if ( mResampleFilter && !zoomedInResamplerElem.isNull() )
2293+
{
2294+
QgsRasterResampler* zoomedInResampler = 0;
2295+
QString zoomedInResamplerType = zoomedInResamplerElem.text();
2296+
if ( zoomedInResamplerType == "bilinear" )
2297+
{
2298+
zoomedInResampler = new QgsBilinearRasterResampler();
2299+
}
2300+
else if ( zoomedInResamplerType == "cubic" )
2301+
{
2302+
zoomedInResampler = new QgsCubicRasterResampler();
2303+
}
2304+
mResampleFilter->setZoomedInResampler( zoomedInResampler );
2305+
}
2306+
QDomElement zoomedOutResamplerElem = mnl.firstChildElement( "zoomedOutResampler" );
2307+
if ( mResampleFilter && !zoomedOutResamplerElem.isNull() )
2308+
{
2309+
QgsRasterResampler* zoomedOutResampler = 0;
2310+
QString zoomedOutResamplerType = zoomedOutResamplerElem.text();
2311+
if ( zoomedOutResamplerType == "bilinear" )
2312+
{
2313+
zoomedOutResampler = new QgsBilinearRasterResampler();
2314+
}
2315+
mResampleFilter->setZoomedOutResampler( zoomedOutResampler );
2316+
}
2317+
*/
2318+
22362319
return true;
22372320
} //readSymbology
22382321

@@ -2365,11 +2448,18 @@ bool QgsRasterLayer::writeSymbology( QDomNode & layer_node, QDomDocument & docum
23652448
{
23662449
Q_UNUSED( errorMessage );
23672450
QDomElement layerElem = layer_node.toElement();
2451+
23682452
if ( mRenderer )
23692453
{
23702454
mRenderer->writeXML( document, layerElem );
23712455
}
23722456

2457+
if ( mResampleFilter )
2458+
{
2459+
QDomElement layerElem = layer_node.toElement();
2460+
mResampleFilter->writeXML( document, layerElem );
2461+
}
2462+
23732463
return true;
23742464
} // bool QgsRasterLayer::writeSymbology
23752465

src/core/raster/qgsrasterlayer.h

+7
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#include "qgsrastershaderfunction.h"
4444
#include "qgsrasterface.h"
4545
#include "qgsrasterdrawer.h"
46+
#include "qgsrasterresamplefilter.h"
4647
#include "qgsrasterdataprovider.h"
4748

4849
//
@@ -353,6 +354,11 @@ class CORE_EXPORT QgsRasterLayer : public QgsMapLayer
353354
const QgsRasterRenderer* renderer() const { return mRenderer; }
354355
QgsRasterRenderer* renderer() { return mRenderer; }
355356

357+
/**Set raster resample filter. Takes ownership of the resample filter object*/
358+
void setResampleFilter( QgsRasterResampleFilter* resampleFilter );
359+
const QgsRasterResampleFilter* resampleFilter() const { return mResampleFilter; }
360+
QgsRasterResampleFilter * resampleFilter() { return mResampleFilter; }
361+
356362
/** \brief Accessor to find out how many standard deviations are being plotted */
357363
double standardDeviations() const { return mStandardDeviations; }
358364

@@ -855,6 +861,7 @@ class CORE_EXPORT QgsRasterLayer : public QgsMapLayer
855861
bool mValidNoDataValue;
856862

857863
QgsRasterRenderer* mRenderer;
864+
QgsRasterResampleFilter *mResampleFilter;
858865
};
859866

860867
#endif

0 commit comments

Comments
 (0)