Skip to content

Commit d937dbb

Browse files
committedJul 1, 2012
QgsRasterPipe
1 parent b34e058 commit d937dbb

13 files changed

+464
-82
lines changed
 

‎src/core/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ SET(QGIS_CORE_SRCS
163163
raster/qgsrasterinterface.cpp
164164
raster/qgsrasterlayer.cpp
165165
raster/qgsrastertransparency.cpp
166+
raster/qgsrasterpipe.cpp
166167
raster/qgsrastershader.cpp
167168
raster/qgsrastershaderfunction.cpp
168169

@@ -391,6 +392,7 @@ SET(QGIS_CORE_HDRS
391392
raster/qgsrasterinterface.h
392393
raster/qgsrasterlayer.h
393394
raster/qgsrastertransparency.h
395+
raster/qgsrasterpipe.h
394396
raster/qgsrastershader.h
395397
raster/qgsrastershaderfunction.h
396398
raster/qgsrasterviewport.h

‎src/core/qgsrasterdataprovider.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,15 @@ void * QgsRasterDataProvider::readBlock( int bandNo, QgsRectangle const & exten
104104
return data;
105105
}
106106

107-
QgsRasterDataProvider::QgsRasterDataProvider(): mDpi( -1 )
107+
QgsRasterDataProvider::QgsRasterDataProvider()
108+
: QgsRasterInterface( 0, QgsRasterInterface::ProviderRole )
109+
, mDpi( -1 )
108110
{
109111
}
110112

111113
QgsRasterDataProvider::QgsRasterDataProvider( QString const & uri )
112114
: QgsDataProvider( uri )
115+
, QgsRasterInterface( 0, QgsRasterInterface::ProviderRole )
113116
, mDpi( -1 )
114117
{
115118
}

‎src/core/qgsrasterprojector.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ QgsRasterProjector::QgsRasterProjector(
2626
int theDestRows, int theDestCols,
2727
double theMaxSrcXRes, double theMaxSrcYRes,
2828
QgsRectangle theExtent )
29-
: mSrcCRS( theSrcCRS )
29+
: QgsRasterInterface( 0, QgsRasterInterface::ProjectorRole )
30+
, mSrcCRS( theSrcCRS )
3031
, mDestCRS( theDestCRS )
3132
, mCoordinateTransform( theDestCRS, theSrcCRS )
3233
, mDestExtent( theDestExtent )
@@ -45,7 +46,8 @@ QgsRasterProjector::QgsRasterProjector(
4546
QgsCoordinateReferenceSystem theDestCRS,
4647
double theMaxSrcXRes, double theMaxSrcYRes,
4748
QgsRectangle theExtent )
48-
: mSrcCRS( theSrcCRS )
49+
: QgsRasterInterface( 0, QgsRasterInterface::ProjectorRole )
50+
, mSrcCRS( theSrcCRS )
4951
, mDestCRS( theDestCRS )
5052
, mCoordinateTransform( theDestCRS, theSrcCRS )
5153
, mExtent( theExtent )
@@ -54,13 +56,27 @@ QgsRasterProjector::QgsRasterProjector(
5456
QgsDebugMsg( "Entered" );
5557
}
5658

59+
QgsRasterProjector::QgsRasterProjector()
60+
: QgsRasterInterface( 0, QgsRasterInterface::ProjectorRole )
61+
{
62+
QgsDebugMsg( "Entered" );
63+
}
64+
5765
QgsRasterProjector::~QgsRasterProjector()
5866
{
5967
//delete mCoordinateTransform;
6068
//delete pHelperTop;
6169
//delete pHelperBottom;
6270
}
6371

72+
void QgsRasterProjector::setCRS( QgsCoordinateReferenceSystem theSrcCRS, QgsCoordinateReferenceSystem theDestCRS )
73+
{
74+
mSrcCRS = theSrcCRS;
75+
mDestCRS = theDestCRS;
76+
mCoordinateTransform.setSourceCrs( theSrcCRS );
77+
mCoordinateTransform.setDestCRS( theDestCRS );
78+
}
79+
6480
void QgsRasterProjector::calc()
6581
{
6682
mCPMatrix.clear();

‎src/core/qgsrasterprojector.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,20 @@ class QgsRasterProjector : public QgsRasterInterface
6060
double theMaxSrcXRes, double theMaxSrcYRes,
6161
QgsRectangle theExtent
6262
);
63+
QgsRasterProjector();
6364

6465
/** \brief The destructor */
6566
~QgsRasterProjector();
6667

68+
/** \brief set source and destination CRS */
69+
void setCRS( QgsCoordinateReferenceSystem theSrcCRS, QgsCoordinateReferenceSystem theDestCRS );
70+
71+
/** \brief set maximum source resolution */
72+
void setMaxSrcRes( double theMaxSrcXRes, double theMaxSrcYRes )
73+
{
74+
mMaxSrcXRes = theMaxSrcXRes; mMaxSrcYRes = theMaxSrcYRes;
75+
}
76+
6777
/** \brief get destination point for _current_ destination position */
6878
void destPointOnCPMatrix( int theRow, int theCol, double *theX, double *theY );
6979

@@ -125,6 +135,9 @@ class QgsRasterProjector : public QgsRasterInterface
125135
/** get source extent */
126136
QgsRectangle srcExtent() { return mSrcExtent; }
127137

138+
/** set source extent */
139+
void setSrcExtent( const QgsRectangle theExtent ) { mSrcExtent = theExtent; }
140+
128141
/** get/set source width/height */
129142
int srcRows() { return mSrcRows; }
130143
int srcCols() { return mSrcCols; }

‎src/core/raster/qgsrasterinterface.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,26 @@
2020

2121
#include <QByteArray>
2222

23-
QgsRasterInterface::QgsRasterInterface( QgsRasterInterface * input ): mInput( input )
23+
QgsRasterInterface::QgsRasterInterface( QgsRasterInterface * input, Role role ):
24+
mInput( input )
25+
, mRole( role )
2426
{
2527
}
2628

2729
QgsRasterInterface::~QgsRasterInterface()
2830
{
2931
}
3032

31-
// To give to an image preallocated memory is the only way to avoid memcpy
33+
// To give to an image preallocated memory is the only way to avoid memcpy
3234
// when we want to keep data but delete QImage
33-
QImage * QgsRasterInterface::createImage ( int width, int height, QImage::Format format )
35+
QImage * QgsRasterInterface::createImage( int width, int height, QImage::Format format )
3436
{
3537
// Qt has its own internal function depthForFormat(), unfortunately it is not public
3638

3739
QImage img( 1, 1, format );
3840

3941
// We ignore QImage::Format_Mono and QImage::Format_MonoLSB ( depth 1)
4042
int size = width * height * img.bytesPerLine();
41-
uchar * data = (uchar *) malloc ( size );
43+
uchar * data = ( uchar * ) malloc( size );
4244
return new QImage( data, width, height, format );
4345
}

‎src/core/raster/qgsrasterinterface.h

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
* *
1616
***************************************************************************/
1717

18-
#ifndef QGSRASTERFACE_H
19-
#define QGSRASTERFACE_H
18+
#ifndef QGSRASTERINTERFACE_H
19+
#define QGSRASTERINTERFACE_H
2020

2121
#include <QObject>
2222
#include <QImage>
@@ -26,16 +26,25 @@
2626
/** \ingroup core
2727
* Base class for processing modules.
2828
*/
29-
// TODO: inherit from QObject? QgsRasterDataProvider inherits already from QObject
29+
// TODO: inherit from QObject? QgsDataProvider inherits already from QObject, multiple inheritance from QObject is not allowed
3030
class CORE_EXPORT QgsRasterInterface //: public QObject
3131
{
3232

3333
//Q_OBJECT
3434

3535
public:
3636

37-
// TODO: This is copy of QgsRasterDataProvider::DataType, the QgsRasterDataProvider
38-
// should use this DataType
37+
enum Role
38+
{
39+
UnknownRole = 0,
40+
ProviderRole = 1,
41+
RendererRole = 2,
42+
ResamplerRole = 3,
43+
ProjectorRole = 4
44+
};
45+
46+
Role role() { return mRole; }
47+
3948
// This is modified copy of GDALDataType
4049
enum DataType
4150
{
@@ -51,11 +60,11 @@ class CORE_EXPORT QgsRasterInterface //: public QObject
5160
/*! Complex Int32 */ CInt32 = 9,
5261
/*! Complex Float32 */ CFloat32 = 10,
5362
/*! Complex Float64 */ CFloat64 = 11,
54-
/*! Color, alpha, red, green, blue, 4 bytes the same as
55-
QImage::Format_ARGB32 */ ARGB32 = 12,
56-
/*! Color, alpha, red, green, blue, 4 bytes the same as
57-
QImage::Format_ARGB32_Premultiplied */ ARGB32_Premultiplied = 13,
58-
63+
/*! Color, alpha, red, green, blue, 4 bytes the same as
64+
QImage::Format_ARGB32 */ ARGB32 = 12,
65+
/*! Color, alpha, red, green, blue, 4 bytes the same as
66+
QImage::Format_ARGB32_Premultiplied */ ARGB32_Premultiplied = 13,
67+
5968
TypeCount = 14 /* maximum type # + 1 */
6069
};
6170

@@ -98,7 +107,7 @@ class CORE_EXPORT QgsRasterInterface //: public QObject
98107
return typeSize( dataType( bandNo ) );
99108
}
100109

101-
QgsRasterInterface( QgsRasterInterface * input = 0 );
110+
QgsRasterInterface( QgsRasterInterface * input = 0, Role role = UnknownRole );
102111

103112
virtual ~QgsRasterInterface();
104113

@@ -128,14 +137,19 @@ class CORE_EXPORT QgsRasterInterface //: public QObject
128137
return 0;
129138
}
130139

131-
void setInput( QgsRasterInterface* input ) { mInput = input; }
140+
/** Set input.
141+
* Returns true if set correctly, false if cannot use that input */
142+
virtual bool setInput( QgsRasterInterface* input ) { mInput = input; return true; }
132143

133-
/** Create a new image with extraneous data, such data may be used
144+
/** Create a new image with extraneous data, such data may be used
134145
* after the image is destroyed. The memory is not initialized.
135146
*/
136-
QImage * createImage ( int width, int height, QImage::Format format );
147+
QImage * createImage( int width, int height, QImage::Format format );
137148

138149
//protected:
150+
151+
Role mRole;
152+
139153
// QgsRasterInterface from used as input, data are read from it
140154
QgsRasterInterface* mInput;
141155

‎src/core/raster/qgsrasterlayer.cpp

Lines changed: 92 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ email : tim at linfiniti.com
5151
#include <cstdio>
5252
#include <cmath>
5353
#include <limits>
54+
#include <typeinfo>
5455

5556
#include <QApplication>
5657
#include <QCursor>
@@ -100,8 +101,9 @@ QgsRasterLayer::QgsRasterLayer()
100101
, mDataProvider( 0 )
101102
, mWidth( std::numeric_limits<int>::max() )
102103
, mHeight( std::numeric_limits<int>::max() )
103-
, mRenderer( 0 )
104-
, mResampleFilter( 0 )
104+
, mInvertColor( false )
105+
//, mRenderer( 0 )
106+
//, mResampleFilter( 0 )
105107
{
106108
init();
107109
mValid = false;
@@ -119,8 +121,9 @@ QgsRasterLayer::QgsRasterLayer(
119121
, mDataProvider( 0 )
120122
, mWidth( std::numeric_limits<int>::max() )
121123
, mHeight( std::numeric_limits<int>::max() )
122-
, mRenderer( 0 )
123-
, mResampleFilter( 0 )
124+
, mInvertColor( false )
125+
//, mRenderer( 0 )
126+
//, mResampleFilter( 0 )
124127
{
125128
QgsDebugMsg( "Entered" );
126129

@@ -134,8 +137,6 @@ QgsRasterLayer::QgsRasterLayer(
134137
loadDefaultStyle( defaultLoadedFlag );
135138
}
136139
return;
137-
138-
139140
} // QgsRasterLayer ctor
140141

141142
/**
@@ -157,8 +158,8 @@ QgsRasterLayer::QgsRasterLayer( const QString & uri,
157158
, mHeight( std::numeric_limits<int>::max() )
158159
, mModified( false )
159160
, mProviderKey( providerKey )
160-
, mRenderer( 0 )
161-
, mResampleFilter( 0 )
161+
//, mRenderer( 0 )
162+
//, mResampleFilter( 0 )
162163
{
163164
QgsDebugMsg( "Entered" );
164165
init();
@@ -192,9 +193,10 @@ QgsRasterLayer::QgsRasterLayer( const QString & uri,
192193
QgsRasterLayer::~QgsRasterLayer()
193194
{
194195
mValid = false;
195-
delete mDataProvider;
196-
delete mRenderer;
197-
delete mResampleFilter;
196+
delete mRasterShader;
197+
delete mDataProvider; // delete in pipe ?
198+
//delete mRenderer;
199+
//delete mResampleFilter;
198200
}
199201

200202
//////////////////////////////////////////////////////////
@@ -827,28 +829,51 @@ void QgsRasterLayer::draw( QPainter * theQPainter,
827829
// procedure to use :
828830
//
829831

830-
if ( mRenderer )
832+
double maxSrcXRes = 0;
833+
double maxSrcYRes = 0;
834+
835+
if ( mDataProvider->capabilities() & QgsRasterDataProvider::ExactResolution )
831836
{
832-
//QgsRasterDrawer drawer( mRenderer );
833-
//QgsRasterDrawer drawer( mResampleFilter );
837+
maxSrcXRes = mDataProvider->extent().width() / mDataProvider->xSize();
838+
maxSrcYRes = mDataProvider->extent().height() / mDataProvider->ySize();
839+
}
840+
/*
841+
if ( mRenderer )
842+
{
843+
//QgsRasterDrawer drawer( mRenderer );
844+
//QgsRasterDrawer drawer( mResampleFilter );
834845
835-
double maxSrcXRes = 0;
836-
double maxSrcYRes = 0;
837846
838-
if ( mDataProvider->capabilities() & QgsRasterDataProvider::ExactResolution )
839-
{
840-
maxSrcXRes = mDataProvider->extent().width() / mDataProvider->xSize();
841-
maxSrcYRes = mDataProvider->extent().height() / mDataProvider->ySize();
842-
}
847+
QgsRasterProjector projector( theRasterViewPort->mSrcCRS, theRasterViewPort->mDestCRS, maxSrcXRes, maxSrcYRes, mDataProvider->extent() );
848+
849+
projector.setInput( mResampleFilter );
843850
844-
QgsRasterProjector projector( theRasterViewPort->mSrcCRS, theRasterViewPort->mDestCRS, maxSrcXRes, maxSrcYRes, mDataProvider->extent() );
851+
QgsRasterDrawer drawer( &projector );
852+
drawer.draw( theQPainter, theRasterViewPort, theQgsMapToPixel );
853+
}
854+
*/
845855

846-
projector.setInput( mResampleFilter );
856+
QgsRasterProjector *projector = dynamic_cast<QgsRasterProjector *>( mPipe.filter( QgsRasterInterface::ProjectorRole ) );
857+
// TODO: add in init?
858+
if ( !projector )
859+
{
860+
projector = new QgsRasterProjector;
861+
mPipe.insertOrReplace( projector );
862+
}
847863

848-
QgsRasterDrawer drawer( &projector );
849-
drawer.draw( theQPainter, theRasterViewPort, theQgsMapToPixel );
864+
// TODO add a method to interface to get provider and get provider
865+
// params in QgsRasterProjector
866+
if ( projector )
867+
{
868+
projector->setCRS( theRasterViewPort->mSrcCRS, theRasterViewPort->mDestCRS );
869+
projector->setMaxSrcRes( maxSrcXRes, maxSrcYRes );
870+
projector->setSrcExtent( mDataProvider->extent() );
850871
}
851872

873+
// Drawer to pipe?
874+
QgsRasterDrawer drawer( mPipe.last() );
875+
drawer.draw( theQPainter, theRasterViewPort, theQgsMapToPixel );
876+
852877
QgsDebugMsg( QString( "raster draw time (ms): %1" ).arg( time.elapsed() ) );
853878
} //end of draw method
854879

@@ -993,9 +1018,14 @@ QString QgsRasterLayer::lastErrorTitle()
9931018
QList< QPair< QString, QColor > > QgsRasterLayer::legendSymbologyItems() const
9941019
{
9951020
QList< QPair< QString, QColor > > symbolList;
996-
if ( mRenderer )
1021+
//if ( mRenderer )
1022+
//{
1023+
// mRenderer->legendSymbologyItems( symbolList );
1024+
//}
1025+
QgsRasterRenderer *renderer = dynamic_cast<QgsRasterRenderer *>( mPipe.filter( QgsRasterInterface::RendererRole ) );
1026+
if ( renderer )
9971027
{
998-
mRenderer->legendSymbologyItems( symbolList );
1028+
renderer->legendSymbologyItems( symbolList );
9991029
}
10001030
return symbolList;
10011031

@@ -1641,6 +1671,7 @@ void QgsRasterLayer::setDataProvider( QString const & provider )
16411671
{
16421672
return;
16431673
}
1674+
mPipe.insertOrReplace( mDataProvider );
16441675

16451676
if ( provider == "gdal" )
16461677
{
@@ -1720,7 +1751,7 @@ void QgsRasterLayer::setDataProvider( QString const & provider )
17201751
{
17211752
mRasterType = Multiband;
17221753
}
1723-
else if ( mDataProvider->dataType( 1 ) == QgsRasterDataProvider::ARGB32
1754+
else if ( mDataProvider->dataType( 1 ) == QgsRasterDataProvider::ARGB32
17241755
|| mDataProvider->dataType( 1 ) == QgsRasterDataProvider::ARGB32_Premultiplied )
17251756
{
17261757
mRasterType = ColorLayer;
@@ -2082,30 +2113,33 @@ void QgsRasterLayer::setTransparentBandName( QString const & )
20822113
//legacy method
20832114
}
20842115

2085-
void QgsRasterLayer::setRenderer( QgsRasterRenderer* renderer )
2116+
void QgsRasterLayer::setRenderer( QgsRasterRenderer* theRenderer )
20862117
{
20872118
QgsDebugMsg( "Entered" );
2088-
delete mRenderer;
2089-
mRenderer = renderer;
2119+
//delete mRenderer;
2120+
//mRenderer = renderer;
2121+
mPipe.insertOrReplace( theRenderer );
20902122

2123+
/*
20912124
if ( !mResampleFilter )
20922125
{
20932126
mResampleFilter = new QgsRasterResampleFilter( mRenderer );
20942127
}
20952128
else
20962129
{
20972130
mResampleFilter->setInput( mRenderer );
2098-
//mResampleFilter = new QgsRasterResampleFilter( mRenderer );
20992131
}
2132+
*/
21002133
}
21012134

21022135
// not sure if we want it
21032136
void QgsRasterLayer::setResampleFilter( QgsRasterResampleFilter* resampleFilter )
21042137
{
21052138
QgsDebugMsg( "Entered" );
2106-
delete mResampleFilter;
2107-
mResampleFilter = resampleFilter;
2108-
mResampleFilter->setInput( mRenderer );
2139+
//delete mResampleFilter;
2140+
//mResampleFilter = resampleFilter;
2141+
//mResampleFilter->setInput( mRenderer );
2142+
mPipe.insertOrReplace( resampleFilter );
21092143
}
21102144

21112145
void QgsRasterLayer::showProgress( int theValue )
@@ -2263,28 +2297,34 @@ bool QgsRasterLayer::readSymbology( const QDomNode& layer_node, QString& errorMe
22632297

22642298
if ( !rasterRendererElem.isNull() )
22652299
{
2266-
delete mRenderer;
2267-
mRenderer = 0;
2300+
//delete mRenderer;
2301+
//mRenderer = 0;
22682302
if ( !rasterRendererElem.isNull() )
22692303
{
22702304
QString rendererType = rasterRendererElem.attribute( "type" );
22712305
QgsRasterRendererRegistryEntry rendererEntry;
22722306
if ( QgsRasterRendererRegistry::instance()->rendererData( rendererType, rendererEntry ) )
22732307
{
2274-
mRenderer = rendererEntry.rendererCreateFunction( rasterRendererElem, dataProvider() );
2308+
//mRenderer = rendererEntry.rendererCreateFunction( rasterRendererElem, dataProvider() );
2309+
QgsRasterRenderer *renderer = rendererEntry.rendererCreateFunction( rasterRendererElem, dataProvider() );
2310+
mPipe.insertOrReplace( renderer );
22752311
}
22762312
}
22772313
}
22782314

22792315
//resampler
2280-
delete mResampleFilter;
2281-
mResampleFilter = new QgsRasterResampleFilter( mRenderer );
2316+
//delete mResampleFilter;
2317+
//mResampleFilter = new QgsRasterResampleFilter( mRenderer );
2318+
2319+
QgsRasterResampleFilter * resampleFilter = new QgsRasterResampleFilter();
2320+
mPipe.insertOrReplace( resampleFilter );
22822321

22832322
//max oversampling
22842323
QDomElement resampleElem = layer_node.firstChildElement( "rasterresampler" );
22852324
if ( !resampleElem.isNull() )
22862325
{
2287-
mResampleFilter->readXML( resampleElem );
2326+
//mResampleFilter->readXML( resampleElem );
2327+
resampleFilter->readXML( resampleElem );
22882328
}
22892329
/*
22902330
if ( mResampleFilter )
@@ -2462,15 +2502,21 @@ bool QgsRasterLayer::writeSymbology( QDomNode & layer_node, QDomDocument & docum
24622502
Q_UNUSED( errorMessage );
24632503
QDomElement layerElem = layer_node.toElement();
24642504

2465-
if ( mRenderer )
2505+
//if ( mRenderer )
2506+
//{
2507+
//mRenderer->writeXML( document, layerElem );
2508+
//}
2509+
QgsRasterRenderer *renderer = dynamic_cast<QgsRasterRenderer *>( mPipe.filter( QgsRasterInterface::RendererRole ) );
2510+
if ( renderer )
24662511
{
2467-
mRenderer->writeXML( document, layerElem );
2512+
renderer->writeXML( document, layerElem );
24682513
}
24692514

2470-
if ( mResampleFilter )
2515+
QgsRasterResampleFilter *resampleFilter = dynamic_cast<QgsRasterResampleFilter *>( mPipe.filter( QgsRasterInterface::ResamplerRole ) );
2516+
if ( resampleFilter )
24712517
{
24722518
QDomElement layerElem = layer_node.toElement();
2473-
mResampleFilter->writeXML( document, layerElem );
2519+
resampleFilter->writeXML( document, layerElem );
24742520
}
24752521

24762522
return true;
@@ -2755,3 +2801,4 @@ bool QgsRasterLayer::readColorTable( int theBandNumber, QList<QgsColorRampShader
27552801
*theList = myColorRampItemList;
27562802
return true;
27572803
}
2804+

‎src/core/raster/qgsrasterlayer.h

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
#include "qgsrasterdrawer.h"
4646
#include "qgsrasterresamplefilter.h"
4747
#include "qgsrasterdataprovider.h"
48+
#include "qgsrasterpipe.h"
4849

4950
//
5051
// Forward declarations
@@ -350,14 +351,18 @@ class CORE_EXPORT QgsRasterLayer : public QgsMapLayer
350351
void setUserDefinedRGBMinimumMaximum( bool theBool ) { mUserDefinedRGBMinimumMaximum = theBool; }
351352

352353
/**Set raster renderer. Takes ownership of the renderer object*/
353-
void setRenderer( QgsRasterRenderer* renderer );
354-
const QgsRasterRenderer* renderer() const { return mRenderer; }
355-
QgsRasterRenderer* renderer() { return mRenderer; }
354+
void setRenderer( QgsRasterRenderer* theRenderer );
355+
//const QgsRasterRenderer* renderer() const { return mRenderer; }
356+
//QgsRasterRenderer* renderer() { return mRenderer; }
357+
const QgsRasterRenderer* renderer() const { return dynamic_cast<QgsRasterRenderer*>( mPipe.filter( QgsRasterInterface::RendererRole ) ); }
358+
QgsRasterRenderer* renderer() { return dynamic_cast<QgsRasterRenderer*>( mPipe.filter( QgsRasterInterface::RendererRole ) ); }
356359

357360
/**Set raster resample filter. Takes ownership of the resample filter object*/
358361
void setResampleFilter( QgsRasterResampleFilter* resampleFilter );
359-
const QgsRasterResampleFilter* resampleFilter() const { return mResampleFilter; }
360-
QgsRasterResampleFilter * resampleFilter() { return mResampleFilter; }
362+
//const QgsRasterResampleFilter* resampleFilter() const { return mResampleFilter; }
363+
//QgsRasterResampleFilter * resampleFilter() { return mResampleFilter; }
364+
const QgsRasterResampleFilter* resampleFilter() const { return dynamic_cast<QgsRasterResampleFilter*>( mPipe.filter( QgsRasterInterface::ResamplerRole ) ); }
365+
QgsRasterResampleFilter * resampleFilter() { return dynamic_cast<QgsRasterResampleFilter*>( mPipe.filter( QgsRasterInterface::ResamplerRole ) ); }
361366

362367
/** \brief Accessor to find out how many standard deviations are being plotted */
363368
double standardDeviations() const { return mStandardDeviations; }
@@ -860,8 +865,9 @@ class CORE_EXPORT QgsRasterLayer : public QgsMapLayer
860865
/** \brief Flag indicating if the nodatavalue is valid*/
861866
bool mValidNoDataValue;
862867

863-
QgsRasterRenderer* mRenderer;
864-
QgsRasterResampleFilter *mResampleFilter;
868+
//QgsRasterRenderer* mRenderer;
869+
//QgsRasterResampleFilter *mResampleFilter;
870+
QgsRasterPipe mPipe;
865871
};
866872

867873
#endif

‎src/core/raster/qgsrasterpipe.cpp

Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
/***************************************************************************
2+
qgsrasterpipe.cpp - Internal raster processing modules interface
3+
--------------------------------------
4+
Date : Jun 21, 2012
5+
Copyright : (C) 2012 by Radim Blazek
6+
email : radim dot blazek at gmail dot com
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 <typeinfo>
19+
20+
#include "qgsrasterpipe.h"
21+
#include "qgslogger.h"
22+
23+
#include <QByteArray>
24+
25+
QgsRasterPipe::QgsRasterPipe()
26+
{
27+
}
28+
29+
QgsRasterPipe::~QgsRasterPipe()
30+
{
31+
foreach ( QgsRasterInterface* filter, mFilters )
32+
{
33+
//delete filter; // TODO enable
34+
}
35+
}
36+
37+
bool QgsRasterPipe::connectFilters ( QVector<QgsRasterInterface*> theFilters )
38+
{
39+
QgsDebugMsg( "Entered" );
40+
for ( int i = 1; i < theFilters.size(); i++ )
41+
{
42+
if ( ! theFilters[i]->setInput ( theFilters[i-1] ) )
43+
{
44+
QgsDebugMsg( QString ( "cannot connect %1 to %2" ).arg( typeid(*(theFilters[i])).name() ).arg ( typeid(*(theFilters[i-1])).name() ) );
45+
return false;
46+
}
47+
}
48+
return true;
49+
}
50+
51+
/*
52+
bool QgsRasterPipe::addFilter ( QgsRasterInterface * theFilter )
53+
{
54+
mFilters.append ( theFilter );
55+
if ( mFilters.size() < 2 ) {
56+
return true;
57+
}
58+
return theFilter->setInput ( mFilters[ mFilters.size()-2 ] );
59+
}
60+
*/
61+
bool QgsRasterPipe::insert ( int idx, QgsRasterInterface* theFilter )
62+
{
63+
QgsDebugMsg( QString ( "insert %1 at %2" ).arg( typeid(*theFilter).name() ).arg ( idx ) );
64+
if ( idx > mFilters.size() )
65+
{
66+
idx = mFilters.size();
67+
}
68+
// make a copy of pipe to test connection, we test the connections
69+
// of the whole pipe, because the types and band numbers may change
70+
QVector<QgsRasterInterface*> filters = mFilters;
71+
72+
filters.insert ( idx, theFilter );
73+
bool success = false;
74+
if ( connectFilters ( filters ) )
75+
{
76+
success = true;
77+
mFilters.insert ( idx, theFilter );
78+
QgsDebugMsg( "inserted ok" );
79+
}
80+
81+
// Connect or reconnect (after the test) filters
82+
connectFilters ( mFilters );
83+
return success;
84+
}
85+
86+
bool QgsRasterPipe::replace ( int idx, QgsRasterInterface* theFilter )
87+
{
88+
QgsDebugMsg( QString ( "replace by %1 at %2" ).arg( typeid(*theFilter).name() ).arg ( idx ) );
89+
if ( idx < 0 || idx >= mFilters.size() )
90+
{
91+
return false;
92+
}
93+
if ( !theFilter ) return false;
94+
95+
// make a copy of pipe to test connection, we test the connections
96+
// of the whole pipe, because the types and band numbers may change
97+
QVector<QgsRasterInterface*> filters = mFilters;
98+
99+
filters[idx] = theFilter;
100+
bool success = false;
101+
if ( connectFilters ( filters ) )
102+
{
103+
success = true;
104+
delete mFilters[idx];
105+
mFilters[idx] = theFilter;
106+
QgsDebugMsg( "replaced ok" );
107+
}
108+
109+
// Connect or reconnect (after the test) filters
110+
connectFilters ( mFilters );
111+
return success;
112+
}
113+
114+
bool QgsRasterPipe::insertOrReplace( QgsRasterInterface* theFilter )
115+
{
116+
QgsDebugMsg( QString ( "%1" ).arg( typeid(*theFilter).name() ) );
117+
if ( !theFilter ) return false;
118+
int idx = indexOf ( theFilter->role() );
119+
if ( idx >= 0 )
120+
{
121+
return replace ( idx, theFilter ); // replace may still fail and return false
122+
}
123+
124+
// Not found, find the best default position for this kind of filter
125+
// The default order is:
126+
// QgsRasterDataProvider - ProviderRole
127+
// QgsRasterRenderer - RendererRole
128+
// QgsRasterResampler - ResamplerRole
129+
// QgsRasterProjector - ProjectorRole
130+
int providerIdx = indexOf ( QgsRasterInterface::ProviderRole );
131+
int rendererIdx = indexOf ( QgsRasterInterface::RendererRole );
132+
int resamplerIdx = indexOf ( QgsRasterInterface::ResamplerRole );
133+
if ( theFilter->role() == QgsRasterInterface::ProviderRole )
134+
{
135+
idx = 0;
136+
}
137+
else if ( theFilter->role() == QgsRasterInterface::RendererRole )
138+
{
139+
idx = providerIdx + 1;
140+
}
141+
else if ( theFilter->role() == QgsRasterInterface::ResamplerRole )
142+
{
143+
idx = qMax ( providerIdx, rendererIdx ) + 1;
144+
}
145+
else if ( theFilter->role() == QgsRasterInterface::ProjectorRole )
146+
{
147+
idx = qMax ( qMax( providerIdx,rendererIdx ), resamplerIdx ) + 1;
148+
}
149+
return insert ( idx, theFilter ); // insert may still fail and return false
150+
}
151+
152+
int QgsRasterPipe::indexOf ( QgsRasterInterface::Role theRole ) const
153+
{
154+
QgsDebugMsg( QString ( "role = %1" ).arg( theRole ) );
155+
//foreach ( QgsRasterInterface * filter, mFilters )
156+
157+
for ( int i = 0; i < mFilters.size(); i++ )
158+
{
159+
if ( !mFilters[i] ) continue;
160+
161+
if ( mFilters[i]->role() == theRole )
162+
{
163+
return i;
164+
}
165+
/*
166+
if ( typeid ( *theFilter ) == typeid ( *(mFilters[i]) ) )
167+
{
168+
169+
QgsDebugMsg( QString ( "%1 found at %2" ).arg( typeid(*(mFilters[i])).name() ).arg(i) );
170+
return i;
171+
}
172+
173+
// known ancestor
174+
if ( ( dynamic_cast<QgsRasterRenderer*>( theFilter ) && dynamic_cast<QgsRasterRenderer*>( mFilters[i] ) )
175+
|| ( dynamic_cast<QgsRasterDataProvider*>( theFilter ) && dynamic_cast<QgsRasterDataProvider*>( mFilters[i] ) ) )
176+
{
177+
QgsDebugMsg( QString ( "%1 found at %2" ).arg( typeid(*(mFilters[i])).name() ).arg(i) );
178+
return i;
179+
}
180+
*/
181+
}
182+
QgsDebugMsg( "role not found");
183+
return -1;
184+
}
185+
QgsRasterInterface * QgsRasterPipe::filter ( QgsRasterInterface::Role role ) const
186+
{
187+
QgsDebugMsg( QString ( "role = %1" ).arg ( role ) );
188+
int idx = indexOf ( role );
189+
if ( idx >= 0 )
190+
{
191+
return mFilters[idx];
192+
}
193+
return 0;
194+
}
195+

‎src/core/raster/qgsrasterpipe.h

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/***************************************************************************
2+
qgsrasterpipe.h - Internal raster processing modules interface
3+
--------------------------------------
4+
Date : Jun 21, 2012
5+
Copyright : (C) 2012 by Radim Blazek
6+
email : radim dot blazek at gmail dot com
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 QGSRASTERPIPE_H
19+
#define QGSRASTERPIPE_H
20+
21+
#include <QObject>
22+
#include <QImage>
23+
24+
#include "qgsrectangle.h"
25+
#include "qgsrasterinterface.h"
26+
#include "qgsrasterresamplefilter.h"
27+
#include "qgsrasterdataprovider.h"
28+
#include "qgsrasterrenderer.h"
29+
#include "qgsrasterprojector.h"
30+
31+
/** \ingroup core
32+
* Base class for processing modules.
33+
*/
34+
class CORE_EXPORT QgsRasterPipe //: public QObject
35+
{
36+
//Q_OBJECT
37+
38+
public:
39+
QgsRasterPipe( );
40+
41+
virtual ~QgsRasterPipe();
42+
43+
/** \brief Try to connect filters in pipe and to the provider at beginning.
44+
Returns true if connected or false if connection failed */
45+
bool connectFilters ( QVector<QgsRasterInterface*> theFilters );
46+
47+
48+
/** Add filter at the end of pipe and connect.
49+
Returns true if connected or false if connection failed */
50+
//bool addFilter ( QgsRasterInterface * theFilter );
51+
52+
/** Try to insert filter at specified index and connect
53+
* if connection would fail, the filter is not inserted and false is returned */
54+
bool insert ( int idx, QgsRasterInterface* theFilter );
55+
56+
/** Try to replace filter at specified index and connect
57+
* if connection would fail, the filter is not inserted and false is returned */
58+
bool replace ( int idx, QgsRasterInterface* theFilter );
59+
60+
/** Insert a new filter in prefered place or replace similar filter if it
61+
* already exists */
62+
bool insertOrReplace ( QgsRasterInterface * theFilter );
63+
64+
//QgsRasterInterface * filter ( QgsRasterInterface::Role role );
65+
QgsRasterInterface * filter ( QgsRasterInterface::Role role ) const;
66+
67+
QgsRasterInterface * last() { return mFilters.last(); }
68+
69+
/** Delete all filters */
70+
//void clear();
71+
72+
private:
73+
/** \brief Find index of existing filter of the given role */
74+
int indexOf ( QgsRasterInterface::Role role ) const;
75+
76+
// Filters in pipe, the first is always provider
77+
QVector<QgsRasterInterface*> mFilters;
78+
};
79+
80+
#endif
81+
82+

‎src/core/raster/qgsrasterrenderer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@
3131
#include <QImage>
3232
#include <QPainter>
3333

34-
QgsRasterRenderer::QgsRasterRenderer( QgsRasterInterface* input, const QString& type ): QgsRasterInterface( input ),
34+
QgsRasterRenderer::QgsRasterRenderer( QgsRasterInterface* input, const QString& type )
35+
: QgsRasterInterface( input, QgsRasterInterface::RendererRole ),
3536
mType( type ), mZoomedInResampler( 0 ), mZoomedOutResampler( 0 ), mOpacity( 1.0 ), mRasterTransparency( 0 ),
3637
mAlphaBand( -1 ), mInvertColor( false ), mMaxOversampling( 2.0 )
3738
{

‎src/core/raster/qgsrasterrenderer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class QDomElement;
3434
class CORE_EXPORT QgsRasterRenderer : public QgsRasterInterface
3535
{
3636
public:
37-
QgsRasterRenderer( QgsRasterInterface* input, const QString& type );
37+
QgsRasterRenderer( QgsRasterInterface* input = 0, const QString& type = "" );
3838
virtual ~QgsRasterRenderer();
3939

4040
virtual QString type() const { return mType; }
@@ -63,7 +63,7 @@ class CORE_EXPORT QgsRasterRenderer : public QgsRasterInterface
6363
/**Get symbology items if provided by renderer*/
6464
virtual void legendSymbologyItems( QList< QPair< QString, QColor > >& symbolItems ) const { Q_UNUSED( symbolItems ); }
6565

66-
virtual void writeXML( QDomDocument& doc, QDomElement& parentElem ) const = 0;
66+
virtual void writeXML( QDomDocument& doc, QDomElement& parentElem ) const {}
6767

6868
/**Sets base class members from xml. Usually called from create() methods of subclasses*/
6969
void readXML( const QDomElement& rendererElem );

‎src/core/raster/qgsrasterresamplefilter.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@
3131
#include <QImage>
3232
#include <QPainter>
3333

34-
QgsRasterResampleFilter::QgsRasterResampleFilter( QgsRasterInterface* input ): QgsRasterInterface( input ),
34+
QgsRasterResampleFilter::QgsRasterResampleFilter( QgsRasterInterface* input )
35+
: QgsRasterInterface( input, QgsRasterInterface::ResamplerRole ),
3536
mZoomedInResampler( 0 ), mZoomedOutResampler( 0 ),
3637
mMaxOversampling( 2.0 )
3738
{
@@ -68,7 +69,7 @@ void * QgsRasterResampleFilter::readBlock( int bandNo, QgsRectangle const & ext
6869
{
6970
// TODO: we must get it somehow from pipe (via projector), for now
7071
oversampling = 2.;
71-
/*
72+
/*
7273
QgsRectangle providerExtent = mInput->extent();
7374
if ( viewPort->mSrcCRS.isValid() && viewPort->mDestCRS.isValid() && viewPort->mSrcCRS != viewPort->mDestCRS )
7475
{
@@ -95,10 +96,10 @@ void * QgsRasterResampleFilter::readBlock( int bandNo, QgsRectangle const & ext
9596
// TODO: we must also increase the extent to get correct result on borders of parts
9697

9798

98-
int resWidth = width*oversamplingX;
99-
int resHeight = height*oversamplingY;
99+
int resWidth = width * oversamplingX;
100+
int resHeight = height * oversamplingY;
100101

101-
// At moment we know that we read rendered image
102+
// At moment we know that we read rendered image
102103
int bandNumber = 0;
103104
void *rasterData = mInput->readBlock( bandNumber, extent, resWidth, resHeight );
104105

@@ -130,7 +131,7 @@ void * QgsRasterResampleFilter::readBlock( int bandNo, QgsRectangle const & ext
130131
return rasterData; // No resampling
131132
}
132133

133-
void QgsRasterResampleFilter::writeXML( QDomDocument& doc, QDomElement& parentElem )
134+
void QgsRasterResampleFilter::writeXML( QDomDocument& doc, QDomElement& parentElem )
134135
{
135136
if ( parentElem.isNull() )
136137
{

0 commit comments

Comments
 (0)
Please sign in to comment.