18 changes: 18 additions & 0 deletions src/core/raster/qgsmultibandcolorrenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,24 @@ QgsMultiBandColorRenderer::~QgsMultiBandColorRenderer()
delete mBlueContrastEnhancement;
}

QgsRasterInterface * QgsMultiBandColorRenderer::clone() const
{
QgsMultiBandColorRenderer * renderer = new QgsMultiBandColorRenderer( 0, mRedBand, mGreenBand, mBlueBand );
if ( mRedContrastEnhancement )
{
renderer->setRedContrastEnhancement( new QgsContrastEnhancement( *mRedContrastEnhancement ) );
}
if ( mGreenContrastEnhancement )
{
renderer->setGreenContrastEnhancement( new QgsContrastEnhancement( *mGreenContrastEnhancement ) );
}
if ( mBlueContrastEnhancement )
{
renderer->setBlueContrastEnhancement( new QgsContrastEnhancement( *mBlueContrastEnhancement ) );
}
return renderer;
}

void QgsMultiBandColorRenderer::setRedContrastEnhancement( QgsContrastEnhancement* ce )
{
delete mRedContrastEnhancement; mRedContrastEnhancement = ce;
Expand Down
1 change: 1 addition & 0 deletions src/core/raster/qgsmultibandcolorrenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ class CORE_EXPORT QgsMultiBandColorRenderer: public QgsRasterRenderer
QgsContrastEnhancement* redEnhancement = 0, QgsContrastEnhancement* greenEnhancement = 0,
QgsContrastEnhancement* blueEnhancement = 0 );
~QgsMultiBandColorRenderer();
QgsRasterInterface * clone() const;

static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterInterface* input );

Expand Down
6 changes: 6 additions & 0 deletions src/core/raster/qgspalettedrasterrenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@ QgsPalettedRasterRenderer::~QgsPalettedRasterRenderer()
delete[] mColors;
}

QgsRasterInterface * QgsPalettedRasterRenderer::clone() const
{
QgsPalettedRasterRenderer * renderer = new QgsPalettedRasterRenderer( 0, mBandNumber, colors(), mNColors );
return renderer;
}

QgsRasterRenderer* QgsPalettedRasterRenderer::create( const QDomElement& elem, QgsRasterInterface* input )
{
if ( elem.isNull() )
Expand Down
1 change: 1 addition & 0 deletions src/core/raster/qgspalettedrasterrenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class CORE_EXPORT QgsPalettedRasterRenderer: public QgsRasterRenderer
/**Renderer owns color array*/
QgsPalettedRasterRenderer( QgsRasterInterface* input, int bandNumber, QColor* colorArray, int nColors );
~QgsPalettedRasterRenderer();
QgsRasterInterface * clone() const;
static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterInterface* input );

void draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel );
Expand Down
30 changes: 24 additions & 6 deletions src/core/raster/qgsrasterfilewriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ QgsRasterFileWriter::~QgsRasterFileWriter()
QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeRaster( QgsRasterIterator* iter, int nCols, int nRows, QgsRectangle outputExtent,
const QgsCoordinateReferenceSystem& crs, QProgressDialog* p )
{
QgsDebugMsg( "Entered" );
if ( !iter )
{
return SourceProviderError;
Expand All @@ -52,9 +53,16 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeRaster( QgsRasterIter
return SourceProviderError;
}

if ( !iface->srcInput() )
{
QgsDebugMsg( "iface->srcInput() == 0" );
return SourceProviderError;
}

mProgressDialog = p;

if ( iface->dataType( 1 ) == QgsRasterInterface::ARGB32 )
if ( iface->dataType( 1 ) == QgsRasterInterface::ARGB32 ||
iface->dataType( 1 ) == QgsRasterInterface::ARGB32_Premultiplied )
{
WriterError e = writeImageRaster( iter, nCols, nRows, outputExtent, crs, p );
mProgressDialog = 0;
Expand All @@ -71,6 +79,7 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeRaster( QgsRasterIter
QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeDataRaster( QgsRasterIterator* iter, int nCols, int nRows, const QgsRectangle& outputExtent,
const QgsCoordinateReferenceSystem& crs, QProgressDialog* p )
{
QgsDebugMsg( "Entered" );
if ( !iter )
{
return SourceProviderError;
Expand All @@ -82,6 +91,13 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeDataRaster( QgsRaster
return SourceProviderError;
}

const QgsRasterDataProvider* srcProvider = dynamic_cast<const QgsRasterDataProvider*>( iface->srcInput() );
if ( !srcProvider )
{
QgsDebugMsg( "Cannot get source data provider" );
return SourceProviderError;
}

//create directory for output files
QDir destDir( mOutputUrl );
if ( mTiledMode )
Expand Down Expand Up @@ -112,10 +128,10 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeDataRaster( QgsRaster

//check if all the bands have the same data type size, otherwise we cannot write it to the provider
//(at least not with the current interface)
int dataTypeSize = iface->typeSize( iface->dataType( 1 ) );
int dataTypeSize = srcProvider->typeSize( srcProvider->srcDataType( 1 ) );
for ( int i = 2; i <= nBands; ++i )
{
if ( iface->typeSize( iface->dataType( 1 ) ) != dataTypeSize )
if ( srcProvider->typeSize( srcProvider->srcDataType( 1 ) ) != dataTypeSize )
{
return DestProviderError;
}
Expand All @@ -128,7 +144,7 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeDataRaster( QgsRaster
dataList.push_back( VSIMalloc( dataTypeSize * mMaxTileWidth * mMaxTileHeight ) );
}

destProvider = initOutput( nCols, nRows, crs, geoTransform, nBands, iface->dataType( 1 ) );
destProvider = initOutput( nCols, nRows, crs, geoTransform, nBands, srcProvider->srcDataType( 1 ) );

int nParts = 0;
int fileIndex = 0;
Expand Down Expand Up @@ -210,13 +226,15 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeDataRaster( QgsRaster
QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeImageRaster( QgsRasterIterator* iter, int nCols, int nRows, const QgsRectangle& outputExtent,
const QgsCoordinateReferenceSystem& crs, QProgressDialog* p )
{
QgsDebugMsg( "Entered" );
if ( !iter )
{
return SourceProviderError;
}

const QgsRasterInterface* iface = iter->input();
if ( !iface || iface->dataType( 1 ) != QgsRasterInterface::ARGB32 )
if ( !iface || ( iface->dataType( 1 ) != QgsRasterInterface::ARGB32 &&
iface->dataType( 1 ) != QgsRasterInterface::ARGB32_Premultiplied ) )
{
return SourceProviderError;
}
Expand All @@ -231,7 +249,7 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeImageRaster( QgsRaste
iter->setMaximumTileWidth( mMaxTileWidth );
iter->setMaximumTileHeight( mMaxTileHeight );

void* data = VSIMalloc( iface->typeSize( QgsRasterInterface::ARGB32 ) * mMaxTileWidth * mMaxTileHeight );
void* data = VSIMalloc( iface->typeSize( iface->dataType( 1 ) ) / 8 * mMaxTileWidth * mMaxTileHeight );
void* redData = VSIMalloc( mMaxTileWidth * mMaxTileHeight );
void* greenData = VSIMalloc( mMaxTileWidth * mMaxTileHeight );
void* blueData = VSIMalloc( mMaxTileWidth * mMaxTileHeight );
Expand Down
1 change: 1 addition & 0 deletions src/core/raster/qgsrasterfilewriter.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

#include "qgscoordinatereferencesystem.h"
#include "qgsrasterdataprovider.h"
#include "qgsrasterpipe.h"
#include "qgsrectangle.h"
#include <QDomDocument>
#include <QDomElement>
Expand Down
6 changes: 5 additions & 1 deletion src/core/raster/qgsrasterinterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,9 @@ class CORE_EXPORT QgsRasterInterface
}
}

/** Clone itself, create deep copy */
virtual QgsRasterInterface *clone() const = 0;

int dataTypeSize( int bandNo ) const
{
return typeSize( dataType( bandNo ) );
Expand Down Expand Up @@ -152,7 +155,8 @@ class CORE_EXPORT QgsRasterInterface
* It may be used to get info about original data, e.g. resolution to decide
* resampling etc.
*/
virtual QgsRasterInterface * srcInput() { return mInput ? mInput->srcInput() : 0; }
virtual const QgsRasterInterface * srcInput() const { return mInput ? mInput->srcInput() : this; }
virtual QgsRasterInterface * srcInput() { return mInput ? mInput->srcInput() : this; }

/** Create a new image with extraneous data, such data may be used
* after the image is destroyed. The memory is not initialized.
Expand Down
21 changes: 21 additions & 0 deletions src/core/raster/qgsrasterpipe.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,27 @@ QgsRasterPipe::QgsRasterPipe()
{
}

QgsRasterPipe::QgsRasterPipe( const QgsRasterPipe& thePipe )
{
for ( int i = 0; i < thePipe.size(); i++ )
{
QgsRasterInterface* interface = thePipe.at( i );
QgsRasterInterface* clone = interface->clone();

Role role = interfaceRole( clone );
QgsDebugMsg( QString( "cloned inerface with role %1" ).arg( role ) );
if ( i > 0 )
{
clone->setInput( mInterfaces.at( i - 1 ) );
}
mInterfaces.append( clone );
if ( role != UnknownRole )
{
mRoleMap.insert( role, i );
}
}
}

QgsRasterPipe::~QgsRasterPipe()
{
foreach ( QgsRasterInterface* interface, mInterfaces )
Expand Down
7 changes: 4 additions & 3 deletions src/core/raster/qgsrasterpipe.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ class CORE_EXPORT QgsRasterPipe
};

QgsRasterPipe( );
QgsRasterPipe( const QgsRasterPipe& thePipe );

virtual ~QgsRasterPipe();

Expand Down Expand Up @@ -77,9 +78,9 @@ class CORE_EXPORT QgsRasterPipe
/** Remove and delete interface from pipe if possible */
bool remove( QgsRasterInterface * theInterface );

int size() { return mInterfaces.size(); }
QgsRasterInterface * at( int idx ) { return mInterfaces.at( idx ); }
QgsRasterInterface * last() { return mInterfaces.last(); }
int size() const { return mInterfaces.size(); }
QgsRasterInterface * at( int idx ) const { return mInterfaces.at( idx ); }
QgsRasterInterface * last() const { return mInterfaces.last(); }

/** Set interface at index on/off
* Returns true on success */
Expand Down
2 changes: 2 additions & 0 deletions src/core/raster/qgsrasterrenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ class CORE_EXPORT QgsRasterRenderer : public QgsRasterInterface
QgsRasterRenderer( QgsRasterInterface* input = 0, const QString& type = "" );
virtual ~QgsRasterRenderer();

QgsRasterInterface * clone() const = 0;

virtual int bandCount() const;

virtual QgsRasterInterface::DataType dataType( int bandNo ) const;
Expand Down
16 changes: 16 additions & 0 deletions src/core/raster/qgsrasterresamplefilter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,22 @@ QgsRasterResampleFilter::~QgsRasterResampleFilter()
delete mZoomedOutResampler;
}

QgsRasterInterface * QgsRasterResampleFilter::clone() const
{
QgsDebugMsg( "Entered" );
QgsRasterResampleFilter * resampler = new QgsRasterResampleFilter( 0 );
if ( mZoomedInResampler )
{
resampler->setZoomedInResampler( mZoomedInResampler->clone() );
}
if ( mZoomedOutResampler )
{
resampler->setZoomedOutResampler( mZoomedOutResampler->clone() );
}
resampler->setMaxOversampling( mMaxOversampling );
return resampler;
}

int QgsRasterResampleFilter::bandCount() const
{
if ( mOn ) return 1;
Expand Down
2 changes: 2 additions & 0 deletions src/core/raster/qgsrasterresamplefilter.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ class CORE_EXPORT QgsRasterResampleFilter : public QgsRasterInterface
QgsRasterResampleFilter( QgsRasterInterface* input = 0 );
~QgsRasterResampleFilter();

QgsRasterInterface * clone() const;

int bandCount() const;

QgsRasterInterface::DataType dataType( int bandNo ) const;
Expand Down
1 change: 1 addition & 0 deletions src/core/raster/qgsrasterresampler.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class QgsRasterResampler
virtual ~QgsRasterResampler() {}
virtual void resample( const QImage& srcImage, QImage& dstImage ) = 0;
virtual QString type() const = 0;
virtual QgsRasterResampler * clone() const = 0;
};

#endif // QGSRASTERRESAMPLER_H
6 changes: 6 additions & 0 deletions src/core/raster/qgssinglebandcolordatarenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,12 @@ QgsSingleBandColorDataRenderer::~QgsSingleBandColorDataRenderer()
{
}

QgsRasterInterface * QgsSingleBandColorDataRenderer::clone() const
{
QgsSingleBandColorDataRenderer * renderer = new QgsSingleBandColorDataRenderer( 0, mBand );
return renderer;
}

QgsRasterRenderer* QgsSingleBandColorDataRenderer::create( const QDomElement& elem, QgsRasterInterface* input )
{
if ( elem.isNull() )
Expand Down
1 change: 1 addition & 0 deletions src/core/raster/qgssinglebandcolordatarenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class CORE_EXPORT QgsSingleBandColorDataRenderer: public QgsRasterRenderer
public:
QgsSingleBandColorDataRenderer( QgsRasterInterface* input, int band );
~QgsSingleBandColorDataRenderer();
QgsRasterInterface * clone() const;

static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterInterface* input );

Expand Down
10 changes: 10 additions & 0 deletions src/core/raster/qgssinglebandgrayrenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,16 @@ QgsSingleBandGrayRenderer::~QgsSingleBandGrayRenderer()
delete mContrastEnhancement;
}

QgsRasterInterface * QgsSingleBandGrayRenderer::clone() const
{
QgsSingleBandGrayRenderer * renderer = new QgsSingleBandGrayRenderer( 0, mGrayBand );
if ( mContrastEnhancement )
{
renderer->setContrastEnhancement( new QgsContrastEnhancement( *mContrastEnhancement ) );
}
return renderer;
}

QgsRasterRenderer* QgsSingleBandGrayRenderer::create( const QDomElement& elem, QgsRasterInterface* input )
{
if ( elem.isNull() )
Expand Down
1 change: 1 addition & 0 deletions src/core/raster/qgssinglebandgrayrenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class CORE_EXPORT QgsSingleBandGrayRenderer: public QgsRasterRenderer
public:
QgsSingleBandGrayRenderer( QgsRasterInterface* input, int grayBand );
~QgsSingleBandGrayRenderer();
QgsRasterInterface * clone() const;

static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterInterface* input );

Expand Down
11 changes: 11 additions & 0 deletions src/core/raster/qgssinglebandpseudocolorrenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,17 @@ QgsSingleBandPseudoColorRenderer::~QgsSingleBandPseudoColorRenderer()
delete mShader;
}

QgsRasterInterface * QgsSingleBandPseudoColorRenderer::clone() const
{
QgsRasterShader *shader = 0;
if ( mShader )
{
shader = new QgsRasterShader( mShader->minimumValue(), mShader->maximumValue() );
}
QgsSingleBandPseudoColorRenderer * renderer = new QgsSingleBandPseudoColorRenderer( 0, mBand, shader );
return renderer;
}

void QgsSingleBandPseudoColorRenderer::setShader( QgsRasterShader* shader )
{
delete mShader;
Expand Down
1 change: 1 addition & 0 deletions src/core/raster/qgssinglebandpseudocolorrenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class CORE_EXPORT QgsSingleBandPseudoColorRenderer: public QgsRasterRenderer
/**Note: takes ownership of QgsRasterShader*/
QgsSingleBandPseudoColorRenderer( QgsRasterInterface* input, int band, QgsRasterShader* shader );
~QgsSingleBandPseudoColorRenderer();
QgsRasterInterface * clone() const;

static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterInterface* input );

Expand Down
32 changes: 23 additions & 9 deletions src/gui/qgsrasterlayersaveasdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,16 +47,12 @@ QgsRasterLayerSaveAsDialog::QgsRasterLayerSaveAsDialog( QgsRasterDataProvider* s
setOriginalResolution();
int xSize = mDataProvider->xSize();
int ySize = mDataProvider->ySize();
//mColumnsLineEdit->setText( QString::number( xSize ) );
//mRowsLineEdit->setText( QString::number( ySize ) );
mMaximumSizeXLineEdit->setText( QString::number( xSize ) );
mMaximumSizeYLineEdit->setText( QString::number( ySize ) );
}
else //wms
else //wms, sometimes wcs
{
mTileModeCheckBox->setChecked( true );
mColumnsLineEdit->setText( QString::number( 6000 ) );
mRowsLineEdit->setText( QString::number( 6000 ) );
mMaximumSizeXLineEdit->setText( QString::number( 2000 ) );
mMaximumSizeYLineEdit->setText( QString::number( 2000 ) );
}
Expand Down Expand Up @@ -245,19 +241,31 @@ void QgsRasterLayerSaveAsDialog::hideOutput()

void QgsRasterLayerSaveAsDialog::toggleResolutionSize()
{
bool hasResolution = mDataProvider && mDataProvider->capabilities() & QgsRasterDataProvider::ExactResolution;

bool on = mResolutionRadioButton->isChecked();
mXResolutionLineEdit->setEnabled( on );
mYResolutionLineEdit->setEnabled( on );
mOriginalResolutionPushButton->setEnabled( on );
mOriginalResolutionPushButton->setEnabled( on && hasResolution );
mColumnsLineEdit->setEnabled( !on );
mRowsLineEdit->setEnabled( !on );
mOriginalSizePushButton->setEnabled( !on );
mOriginalSizePushButton->setEnabled( !on && hasResolution );
}

void QgsRasterLayerSaveAsDialog::setOriginalResolution()
{
double xRes = mDataProvider->extent().width() / mDataProvider->xSize();
double yRes = mDataProvider->extent().height() / mDataProvider->ySize();
double xRes, yRes;

if ( mDataProvider->capabilities() & QgsRasterDataProvider::ExactResolution )
{
xRes = mDataProvider->extent().width() / mDataProvider->xSize();
yRes = mDataProvider->extent().height() / mDataProvider->ySize();
}
else
{
// Init to something if no original resolution is available
xRes = yRes = mDataProvider->extent().width() / 100;
}
setResolution( xRes, yRes, mDataProvider->crs() );
mResolutionState = OriginalResolution;
recalcSize();
Expand Down Expand Up @@ -470,3 +478,9 @@ QgsCoordinateReferenceSystem QgsRasterLayerSaveAsDialog::outputCrs()
}
return mUserCrs;
}

QgsRasterLayerSaveAsDialog::Mode QgsRasterLayerSaveAsDialog::mode() const
{
if ( mRenderedModeRadioButton->isChecked() ) return RenderedImageMode;
return RawDataMode;
}
6 changes: 6 additions & 0 deletions src/gui/qgsrasterlayersaveasdialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@ class GUI_EXPORT QgsRasterLayerSaveAsDialog: public QDialog, private Ui::QgsRast
{
Q_OBJECT
public:
enum Mode
{
RawDataMode,
RenderedImageMode
};
enum CrsState
{
OriginalCrs,
Expand All @@ -33,6 +38,7 @@ class GUI_EXPORT QgsRasterLayerSaveAsDialog: public QDialog, private Ui::QgsRast
QgsRasterLayerSaveAsDialog( QgsRasterDataProvider* sourceProvider, const QgsRectangle& currentExtent, const QgsCoordinateReferenceSystem& currentCrs, QWidget* parent = 0, Qt::WindowFlags f = 0 );
~QgsRasterLayerSaveAsDialog();

Mode mode() const;
int nColumns() const;
int nRows() const;
double xResolution() const;
Expand Down
7 changes: 7 additions & 0 deletions src/providers/gdal/qgsgdalprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,13 @@ QgsGdalProvider::QgsGdalProvider( QString const & uri )
initBaseDataset();
}

QgsRasterInterface * QgsGdalProvider::clone() const
{
QgsDebugMsg( "Entered" );
QgsGdalProvider * provider = new QgsGdalProvider( dataSourceUri() );
return provider;
}

bool QgsGdalProvider::crsFromWkt( const char *wkt )
{
void *hCRS = OSRNewSpatialReference( NULL );
Expand Down
2 changes: 2 additions & 0 deletions src/providers/gdal/qgsgdalprovider.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ class QgsGdalProvider : public QgsRasterDataProvider, QgsGdalProviderBase
//! Destructor
~QgsGdalProvider();

QgsRasterInterface * clone() const;

/** \brief Renders the layer as an image
*/
QImage* draw( QgsRectangle const & viewExtent, int pixelWidth, int pixelHeight );
Expand Down
6 changes: 6 additions & 0 deletions src/providers/grass/qgsgrassrasterprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,12 @@ QgsGrassRasterProvider::~QgsGrassRasterProvider()
QgsDebugMsg( "QgsGrassRasterProvider: deconstructing." );
}

QgsRasterInterface * QgsGrassRasterProvider::clone() const
{
QgsGrassRasterProvider * provider = new QgsGrassRasterProvider( dataSourceUri() );
return provider;
}

QImage* QgsGrassRasterProvider::draw( QgsRectangle const & viewExtent, int pixelWidth, int pixelHeight )
{
QgsDebugMsg( "pixelWidth = " + QString::number( pixelWidth ) );
Expand Down
2 changes: 2 additions & 0 deletions src/providers/grass/qgsgrassrasterprovider.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ class QgsGrassRasterProvider : public QgsRasterDataProvider
//! Destructor
~QgsGrassRasterProvider();

QgsRasterInterface * clone() const;

/** \brief Renders the layer as an image
*/
QImage* draw( QgsRectangle const & viewExtent, int pixelWidth, int pixelHeight );
Expand Down
6 changes: 6 additions & 0 deletions src/providers/wcs/qgswcsprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,12 @@ QgsWcsProvider::~QgsWcsProvider()
}
}

QgsRasterInterface * QgsWcsProvider::clone() const
{
QgsWcsProvider * provider = new QgsWcsProvider( dataSourceUri() );
return provider;
}

QString QgsWcsProvider::baseUrl() const
{
return mBaseUrl;
Expand Down
2 changes: 2 additions & 0 deletions src/providers/wcs/qgswcsprovider.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ class QgsWcsProvider : public QgsRasterDataProvider, QgsGdalProviderBase
//! Destructor
virtual ~QgsWcsProvider();

QgsRasterInterface * clone() const;

/*! Get the QgsCoordinateReferenceSystem for this layer
* @note Must be reimplemented by each provider.
* If the provider isn't capable of returning
Expand Down
10 changes: 10 additions & 0 deletions src/providers/wms/qgswmsprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,11 @@ QgsWmsProvider::~QgsWmsProvider()
}
}

QgsRasterInterface * QgsWmsProvider::clone() const
{
QgsWmsProvider * provider = new QgsWmsProvider( dataSourceUri() );
return provider;
}

bool QgsWmsProvider::supportedLayers( QVector<QgsWmsLayerProperty> &layers )
{
Expand Down Expand Up @@ -492,6 +497,11 @@ QImage *QgsWmsProvider::draw( QgsRectangle const &viewExtent, int pixelWidth, i
{
QgsDebugMsg( "Entering." );

if ( !retrieveServerCapabilities() )
{
return false;
}

// Can we reuse the previously cached image?
if ( mCachedImage &&
mCachedViewExtent == viewExtent &&
Expand Down
2 changes: 2 additions & 0 deletions src/providers/wms/qgswmsprovider.h
Original file line number Diff line number Diff line change
Expand Up @@ -459,6 +459,8 @@ class QgsWmsProvider : public QgsRasterDataProvider
//! Destructor
virtual ~QgsWmsProvider();

QgsRasterInterface * clone() const;

virtual QgsWmsCapabilitiesProperty capabilitiesProperty() { return mCapabilities; }

/**
Expand Down
53 changes: 53 additions & 0 deletions src/ui/qgsrasterlayersaveasdialogbase.ui
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,56 @@
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QLabel" name="mModeLabel">
<property name="text">
<string>Output mode</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="mRawModeRadioButton">
<property name="toolTip">
<string>Write out raw raster layer data. Optionaly user defined no data values may be applied.</string>
</property>
<property name="text">
<string>Raw data</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="mRenderedModeRadioButton">
<property name="toolTip">
<string>Write out 3 bands RGB image rendered using current layer style.</string>
</property>
<property name="text">
<string>Rendered image</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
Expand Down Expand Up @@ -76,6 +126,9 @@
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
Expand Down