Skip to content

Commit 136077c

Browse files
author
mhugent
committed
Option to print as raster also via WMS (mainly as a workaround because of some Qt pdf problems
git-svn-id: http://svn.osgeo.org/qgis/trunk@15124 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent e35ee4e commit 136077c

File tree

4 files changed

+58
-34
lines changed

4 files changed

+58
-34
lines changed

src/core/composer/qgscomposition.cpp

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
#include <QSettings>
2626

2727
QgsComposition::QgsComposition( QgsMapRenderer* mapRenderer ):
28-
QGraphicsScene( 0 ), mMapRenderer( mapRenderer ), mPlotStyle( QgsComposition::Preview ), mPaperItem( 0 ), mSnapToGrid( false ),
28+
QGraphicsScene( 0 ), mMapRenderer( mapRenderer ), mPlotStyle( QgsComposition::Preview ), mPaperItem( 0 ), mPrintAsRaster( false ), mSnapToGrid( false ),
2929
mSnapGridResolution( 0.0 ), mSnapGridOffsetX( 0.0 ), mSnapGridOffsetY( 0.0 ), mActiveCommand( 0 )
3030
{
3131
setBackgroundBrush( Qt::gray );
@@ -37,20 +37,13 @@ QgsComposition::QgsComposition( QgsMapRenderer* mapRenderer ):
3737
mPaperItem->setZValue( 0 );
3838
mPrintResolution = 300; //hardcoded default
3939
loadGridAppearanceSettings();
40-
41-
//mPrintAsRaster
42-
QSettings s;
43-
mPrintAsRaster = s.value( "/qgis/composerPrintAsRaster", false ).toBool();
4440
}
4541

4642
QgsComposition::QgsComposition():
4743
QGraphicsScene( 0 ), mMapRenderer( 0 ), mPlotStyle( QgsComposition::Preview ), mPaperItem( 0 ), mPrintAsRaster( false ),
4844
mSnapToGrid( false ), mSnapGridResolution( 0.0 ), mSnapGridOffsetX( 0.0 ), mSnapGridOffsetY( 0.0 ), mActiveCommand( 0 )
4945
{
5046
loadGridAppearanceSettings();
51-
//mPrintAsRaster
52-
QSettings s;
53-
mPrintAsRaster = s.value( "/qgis/composerPrintAsRaster", false ).toBool();
5447
}
5548

5649
QgsComposition::~QgsComposition()
@@ -197,6 +190,7 @@ bool QgsComposition::writeXML( QDomElement& composerElem, QDomDocument& doc )
197190
compositionElem.setAttribute( "snapGridOffsetY", mSnapGridOffsetY );
198191

199192
compositionElem.setAttribute( "printResolution", mPrintResolution );
193+
compositionElem.setAttribute( "printAsRaster", mPrintAsRaster );
200194

201195
composerElem.appendChild( compositionElem );
202196

@@ -236,6 +230,7 @@ bool QgsComposition::readXML( const QDomElement& compositionElem, const QDomDocu
236230
mSnapGridResolution = compositionElem.attribute( "snapGridResolution" ).toDouble();
237231
mSnapGridOffsetX = compositionElem.attribute( "snapGridOffsetX" ).toDouble();
238232
mSnapGridOffsetY = compositionElem.attribute( "snapGridOffsetY" ).toDouble();
233+
mPrintAsRaster = compositionElem.attribute( "printAsRaster" ).toInt();
239234

240235
mPrintResolution = compositionElem.attribute( "printResolution", "300" ).toInt();
241236

@@ -716,13 +711,6 @@ void QgsComposition::setGridStyle( GridStyle s )
716711
saveGridAppearanceSettings();
717712
}
718713

719-
void QgsComposition::setPrintAsRaster( bool enabled )
720-
{
721-
mPrintAsRaster = enabled;
722-
QSettings s;
723-
s.setValue( "/qgis/composerPrintAsRaster", QVariant( mPrintAsRaster ) );
724-
}
725-
726714
void QgsComposition::loadGridAppearanceSettings()
727715
{
728716
//read grid style, grid color and pen width from settings

src/core/composer/qgscomposition.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class CORE_EXPORT QgsComposition: public QGraphicsScene
107107
void setPrintResolution( int dpi ) {mPrintResolution = dpi;}
108108

109109
bool printAsRaster() const {return mPrintAsRaster;}
110-
void setPrintAsRaster( bool enabled );
110+
void setPrintAsRaster( bool enabled ) { mPrintAsRaster = enabled; }
111111

112112
/**Returns pointer to map renderer of qgis map canvas*/
113113
QgsMapRenderer* mapRenderer() {return mMapRenderer;}

src/mapserver/qgswmsserver.cpp

Lines changed: 51 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -383,26 +383,32 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString )
383383
QPainter p( &generator );
384384
QRectF sourceArea( 0, 0, c->paperWidth(), c->paperHeight() );
385385
QRectF targetArea( 0, 0, width, height );
386-
c->render( &p, targetArea, sourceArea );
386+
if ( c->printAsRaster() ) //embed one raster into the svg
387+
{
388+
QImage* img = printCompositionToImage( c );
389+
if ( img )
390+
{
391+
p.drawImage( targetArea, *img, QRectF( 0, 0, img->width(), img->height() ) );
392+
}
393+
delete img;
394+
}
395+
else
396+
{
397+
c->render( &p, targetArea, sourceArea );
398+
}
387399
p.end();
388400
}
389401
else if ( formatString.compare( "png", Qt::CaseInsensitive ) == 0 || formatString.compare( "jpg", Qt::CaseInsensitive ) == 0 )
390402
{
391-
int width = ( int )( c->paperWidth() * c->printResolution() / 25.4 ); //width in pixel
392-
int height = ( int )( c->paperHeight() * c->printResolution() / 25.4 ); //height in pixel
393-
QImage image( QSize( width, height ), QImage::Format_ARGB32 );
394-
image.setDotsPerMeterX( c->printResolution() / 25.4 * 1000 );
395-
image.setDotsPerMeterY( c->printResolution() / 25.4 * 1000 );
396-
image.fill( 0 );
397-
QPainter p( &image );
398-
QRectF sourceArea( 0, 0, c->paperWidth(), c->paperHeight() );
399-
QRectF targetArea( 0, 0, width, height );
400-
c->render( &p, targetArea, sourceArea );
401-
p.end();
402-
ba = new QByteArray();
403-
QBuffer buffer( ba );
404-
buffer.open( QIODevice::WriteOnly );
405-
image.save( &buffer, formatString.toLocal8Bit().data(), -1 );
403+
QImage* image = printCompositionToImage( c );
404+
if ( image )
405+
{
406+
ba = new QByteArray();
407+
QBuffer buffer( ba );
408+
buffer.open( QIODevice::WriteOnly );
409+
image->save( &buffer, formatString.toLocal8Bit().data(), -1 );
410+
}
411+
delete image;
406412
}
407413
else if ( formatString.compare( "pdf", Qt::CaseInsensitive ) == 0 )
408414
{
@@ -419,11 +425,22 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString )
419425
printer.setOutputFormat( QPrinter::PdfFormat );
420426
printer.setOutputFileName( tempFile.fileName() );
421427
printer.setPaperSize( QSizeF( c->paperWidth(), c->paperHeight() ), QPrinter::Millimeter );
422-
423428
QRectF paperRectMM = printer.pageRect( QPrinter::Millimeter );
424429
QRectF paperRectPixel = printer.pageRect( QPrinter::DevicePixel );
425430
QPainter p( &printer );
426-
c->render( &p, paperRectPixel, paperRectMM );
431+
if ( c->printAsRaster() ) //embed one raster into the pdf
432+
{
433+
QImage* img = printCompositionToImage( c );
434+
if ( img )
435+
{
436+
p.drawImage( paperRectPixel, *img, QRectF( 0, 0, img->width(), img->height() ) );
437+
}
438+
delete img;
439+
}
440+
else //vector pdf
441+
{
442+
c->render( &p, paperRectPixel, paperRectMM );
443+
}
427444
p.end();
428445

429446
ba = new QByteArray();
@@ -438,6 +455,22 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString )
438455
return ba;
439456
}
440457

458+
QImage* QgsWMSServer::printCompositionToImage( QgsComposition* c ) const
459+
{
460+
int width = ( int )( c->paperWidth() * c->printResolution() / 25.4 ); //width in pixel
461+
int height = ( int )( c->paperHeight() * c->printResolution() / 25.4 ); //height in pixel
462+
QImage* image = new QImage( QSize( width, height ), QImage::Format_ARGB32 );
463+
image->setDotsPerMeterX( c->printResolution() / 25.4 * 1000 );
464+
image->setDotsPerMeterY( c->printResolution() / 25.4 * 1000 );
465+
image->fill( 0 );
466+
QPainter p( image );
467+
QRectF sourceArea( 0, 0, c->paperWidth(), c->paperHeight() );
468+
QRectF targetArea( 0, 0, width, height );
469+
c->render( &p, targetArea, sourceArea );
470+
p.end();
471+
return image;
472+
}
473+
441474
QImage* QgsWMSServer::getMap()
442475
{
443476
QStringList layersList, stylesList, layerIdList;

src/mapserver/qgswmsserver.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
class QgsCoordinateReferenceSystem;
2727
class QgsComposerLayerItem;
2828
class QgsComposerLegendItem;
29+
class QgsComposition;
2930
class QgsMapLayer;
3031
class QgsMapRenderer;
3132
class QgsPoint;
@@ -135,6 +136,8 @@ class QgsWMSServer
135136
void drawLegendSymbolV2( QgsComposerLegendItem* item, QPainter* p, double boxSpace, double currentY, double& symbolWidth, double& symbolHeight, double dpi, double yDownShift ) const;
136137
void drawRasterSymbol( QgsComposerLegendItem* item, QPainter* p, double boxSpace, double currentY, double symbolWidth, double symbolHeight, double yDownShift ) const;
137138

139+
QImage* printCompositionToImage( QgsComposition* c ) const;
140+
138141
/**Map containing the WMS parameters*/
139142
std::map<QString, QString> mParameterMap;
140143
QgsConfigParser* mConfigParser;

0 commit comments

Comments
 (0)