From 55a1778b68afd48db4b55a1060413c659c0e8a0e Mon Sep 17 00:00:00 2001 From: "Juergen E. Fischer" Date: Sun, 3 Jul 2011 16:41:43 +0200 Subject: [PATCH] other workaround for Qt#5114 (fixes #3250, #3028, #2598) --- src/app/composer/qgscomposer.cpp | 42 +++++++++++++++++++++++++++++--- src/mapserver/qgswmsserver.cpp | 40 ++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 3 deletions(-) mode change 100644 => 100755 src/app/composer/qgscomposer.cpp mode change 100644 => 100755 src/mapserver/qgswmsserver.cpp diff --git a/src/app/composer/qgscomposer.cpp b/src/app/composer/qgscomposer.cpp old mode 100644 new mode 100755 index b3f84b34ce3..a09690fb68e --- a/src/app/composer/qgscomposer.cpp +++ b/src/app/composer/qgscomposer.cpp @@ -66,9 +66,7 @@ #include #include #include - - - +#include QgsComposer::QgsComposer( QgisApp *qgis, const QString& title ): QMainWindow(), mTitle( title ), mUndoView( 0 ) @@ -486,6 +484,36 @@ void QgsComposer::on_mActionRefreshView_triggered() mComposition->update(); } +// Hack to workaround Qt #5114 by disabling PatternTransform +class QgsPaintEngineHack : public QPaintEngine +{ + public: + void fixFlags() + { + gccaps = 0; + gccaps |= ( QPaintEngine::PrimitiveTransform + // | QPaintEngine::PatternTransform + | QPaintEngine::PixmapTransform + // | QPaintEngine::PatternBrush + // | QPaintEngine::LinearGradientFill + // | QPaintEngine::RadialGradientFill + // | QPaintEngine::ConicalGradientFill + | QPaintEngine::AlphaBlend + // | QPaintEngine::PorterDuff + | QPaintEngine::PainterPaths + | QPaintEngine::Antialiasing + | QPaintEngine::BrushStroke + | QPaintEngine::ConstantOpacity + | QPaintEngine::MaskedBrush + // | QPaintEngine::PerspectiveTransform + | QPaintEngine::BlendModes + // | QPaintEngine::ObjectBoundingModeGradients + | QPaintEngine::RasterOpModes + | QPaintEngine::PaintOutsidePaintEvent + ); + } +}; + void QgsComposer::on_mActionExportAsPDF_triggered() { QSettings myQSettings; // where we keep last used filter in persistent state @@ -521,6 +549,14 @@ void QgsComposer::on_mActionExportAsPDF_triggered() printer.setOutputFileName( myOutputFileNameQString ); printer.setPaperSize( QSizeF( mComposition->paperWidth(), mComposition->paperHeight() ), QPrinter::Millimeter ); + QPaintEngine *engine = printer.paintEngine(); + if ( engine && engine->hasFeature( QPaintEngine::PatternTransform ) ) + { + QgsPaintEngineHack *hack = static_cast( engine ); + hack->fixFlags(); + Q_ASSERT( !engine->hasFeature( QPaintEngine::PatternTransform ) ); + } + print( printer ); } diff --git a/src/mapserver/qgswmsserver.cpp b/src/mapserver/qgswmsserver.cpp old mode 100644 new mode 100755 index 7d1c6da42d4..fb54ba54b1f --- a/src/mapserver/qgswmsserver.cpp +++ b/src/mapserver/qgswmsserver.cpp @@ -51,6 +51,7 @@ #include #include #include +#include QgsWMSServer::QgsWMSServer( std::map parameters, QgsMapRenderer* renderer ) : mParameterMap( parameters ) @@ -337,6 +338,36 @@ QDomDocument QgsWMSServer::getStyle() return mConfigParser->getStyle( styleName, layerName ); } +// Hack to workaround Qt #5114 by disabling PatternTransform +class QgsPaintEngineHack : public QPaintEngine +{ + public: + void fixFlags() + { + gccaps = 0; + gccaps |= ( QPaintEngine::PrimitiveTransform + // | QPaintEngine::PatternTransform + | QPaintEngine::PixmapTransform + // | QPaintEngine::PatternBrush + // | QPaintEngine::LinearGradientFill + // | QPaintEngine::RadialGradientFill + // | QPaintEngine::ConicalGradientFill + | QPaintEngine::AlphaBlend + // | QPaintEngine::PorterDuff + | QPaintEngine::PainterPaths + | QPaintEngine::Antialiasing + | QPaintEngine::BrushStroke + | QPaintEngine::ConstantOpacity + | QPaintEngine::MaskedBrush + // | QPaintEngine::PerspectiveTransform + | QPaintEngine::BlendModes + // | QPaintEngine::ObjectBoundingModeGradients + | QPaintEngine::RasterOpModes + | QPaintEngine::PaintOutsidePaintEvent + ); + } +}; + QByteArray* QgsWMSServer::getPrint( const QString& formatString ) { QStringList layersList, stylesList, layerIdList; @@ -429,6 +460,15 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString ) printer.setPaperSize( QSizeF( c->paperWidth(), c->paperHeight() ), QPrinter::Millimeter ); QRectF paperRectMM = printer.pageRect( QPrinter::Millimeter ); QRectF paperRectPixel = printer.pageRect( QPrinter::DevicePixel ); + + QPaintEngine *engine = printer.paintEngine(); + if ( engine->hasFeature( QPaintEngine::PatternTransform ) ) + { + QgsPaintEngineHack *hack = static_cast( engine ); + hack->fixFlags(); + Q_ASSERT( !engine->hasFeature( QPaintEngine::PatternTransform ) ); + } + QPainter p( &printer ); if ( c->printAsRaster() ) //embed one raster into the pdf {