Skip to content

Commit 55a1778

Browse files
committed
other workaround for Qt#5114 (fixes #3250, #3028, #2598)
1 parent 8eb7664 commit 55a1778

File tree

2 files changed

+79
-3
lines changed

2 files changed

+79
-3
lines changed

src/app/composer/qgscomposer.cpp

100644100755
+39-3
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,7 @@
6666
#include <QToolBar>
6767
#include <QToolButton>
6868
#include <QUndoView>
69-
70-
71-
69+
#include <QPaintEngine>
7270

7371

7472
QgsComposer::QgsComposer( QgisApp *qgis, const QString& title ): QMainWindow(), mTitle( title ), mUndoView( 0 )
@@ -486,6 +484,36 @@ void QgsComposer::on_mActionRefreshView_triggered()
486484
mComposition->update();
487485
}
488486

487+
// Hack to workaround Qt #5114 by disabling PatternTransform
488+
class QgsPaintEngineHack : public QPaintEngine
489+
{
490+
public:
491+
void fixFlags()
492+
{
493+
gccaps = 0;
494+
gccaps |= ( QPaintEngine::PrimitiveTransform
495+
// | QPaintEngine::PatternTransform
496+
| QPaintEngine::PixmapTransform
497+
// | QPaintEngine::PatternBrush
498+
// | QPaintEngine::LinearGradientFill
499+
// | QPaintEngine::RadialGradientFill
500+
// | QPaintEngine::ConicalGradientFill
501+
| QPaintEngine::AlphaBlend
502+
// | QPaintEngine::PorterDuff
503+
| QPaintEngine::PainterPaths
504+
| QPaintEngine::Antialiasing
505+
| QPaintEngine::BrushStroke
506+
| QPaintEngine::ConstantOpacity
507+
| QPaintEngine::MaskedBrush
508+
// | QPaintEngine::PerspectiveTransform
509+
| QPaintEngine::BlendModes
510+
// | QPaintEngine::ObjectBoundingModeGradients
511+
| QPaintEngine::RasterOpModes
512+
| QPaintEngine::PaintOutsidePaintEvent
513+
);
514+
}
515+
};
516+
489517
void QgsComposer::on_mActionExportAsPDF_triggered()
490518
{
491519
QSettings myQSettings; // where we keep last used filter in persistent state
@@ -521,6 +549,14 @@ void QgsComposer::on_mActionExportAsPDF_triggered()
521549
printer.setOutputFileName( myOutputFileNameQString );
522550
printer.setPaperSize( QSizeF( mComposition->paperWidth(), mComposition->paperHeight() ), QPrinter::Millimeter );
523551

552+
QPaintEngine *engine = printer.paintEngine();
553+
if ( engine && engine->hasFeature( QPaintEngine::PatternTransform ) )
554+
{
555+
QgsPaintEngineHack *hack = static_cast<QgsPaintEngineHack*>( engine );
556+
hack->fixFlags();
557+
Q_ASSERT( !engine->hasFeature( QPaintEngine::PatternTransform ) );
558+
}
559+
524560
print( printer );
525561
}
526562

src/mapserver/qgswmsserver.cpp

100644100755
+40
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
#include <QPrinter>
5252
#include <QSvgGenerator>
5353
#include <QUrl>
54+
#include <QPaintEngine>
5455

5556
QgsWMSServer::QgsWMSServer( std::map<QString, QString> parameters, QgsMapRenderer* renderer )
5657
: mParameterMap( parameters )
@@ -337,6 +338,36 @@ QDomDocument QgsWMSServer::getStyle()
337338
return mConfigParser->getStyle( styleName, layerName );
338339
}
339340

341+
// Hack to workaround Qt #5114 by disabling PatternTransform
342+
class QgsPaintEngineHack : public QPaintEngine
343+
{
344+
public:
345+
void fixFlags()
346+
{
347+
gccaps = 0;
348+
gccaps |= ( QPaintEngine::PrimitiveTransform
349+
// | QPaintEngine::PatternTransform
350+
| QPaintEngine::PixmapTransform
351+
// | QPaintEngine::PatternBrush
352+
// | QPaintEngine::LinearGradientFill
353+
// | QPaintEngine::RadialGradientFill
354+
// | QPaintEngine::ConicalGradientFill
355+
| QPaintEngine::AlphaBlend
356+
// | QPaintEngine::PorterDuff
357+
| QPaintEngine::PainterPaths
358+
| QPaintEngine::Antialiasing
359+
| QPaintEngine::BrushStroke
360+
| QPaintEngine::ConstantOpacity
361+
| QPaintEngine::MaskedBrush
362+
// | QPaintEngine::PerspectiveTransform
363+
| QPaintEngine::BlendModes
364+
// | QPaintEngine::ObjectBoundingModeGradients
365+
| QPaintEngine::RasterOpModes
366+
| QPaintEngine::PaintOutsidePaintEvent
367+
);
368+
}
369+
};
370+
340371
QByteArray* QgsWMSServer::getPrint( const QString& formatString )
341372
{
342373
QStringList layersList, stylesList, layerIdList;
@@ -429,6 +460,15 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString )
429460
printer.setPaperSize( QSizeF( c->paperWidth(), c->paperHeight() ), QPrinter::Millimeter );
430461
QRectF paperRectMM = printer.pageRect( QPrinter::Millimeter );
431462
QRectF paperRectPixel = printer.pageRect( QPrinter::DevicePixel );
463+
464+
QPaintEngine *engine = printer.paintEngine();
465+
if ( engine->hasFeature( QPaintEngine::PatternTransform ) )
466+
{
467+
QgsPaintEngineHack *hack = static_cast<QgsPaintEngineHack*>( engine );
468+
hack->fixFlags();
469+
Q_ASSERT( !engine->hasFeature( QPaintEngine::PatternTransform ) );
470+
}
471+
432472
QPainter p( &printer );
433473
if ( c->printAsRaster() ) //embed one raster into the pdf
434474
{

0 commit comments

Comments
 (0)