Skip to content

Commit 908a494

Browse files
jef-ntimlinux
authored andcommitted
other workaround for Qt#5114 (fixes #3250, #3028, #2598)
1 parent 9164946 commit 908a494

File tree

2 files changed

+79
-3
lines changed

2 files changed

+79
-3
lines changed

src/app/composer/qgscomposer.cpp

100644100755
Lines changed: 39 additions & 3 deletions
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 )
@@ -496,6 +494,36 @@ void QgsComposer::on_mActionRefreshView_triggered()
496494
mComposition->update();
497495
}
498496

497+
// Hack to workaround Qt #5114 by disabling PatternTransform
498+
class QgsPaintEngineHack : public QPaintEngine
499+
{
500+
public:
501+
void fixFlags()
502+
{
503+
gccaps = 0;
504+
gccaps |= ( QPaintEngine::PrimitiveTransform
505+
// | QPaintEngine::PatternTransform
506+
| QPaintEngine::PixmapTransform
507+
// | QPaintEngine::PatternBrush
508+
// | QPaintEngine::LinearGradientFill
509+
// | QPaintEngine::RadialGradientFill
510+
// | QPaintEngine::ConicalGradientFill
511+
| QPaintEngine::AlphaBlend
512+
// | QPaintEngine::PorterDuff
513+
| QPaintEngine::PainterPaths
514+
| QPaintEngine::Antialiasing
515+
| QPaintEngine::BrushStroke
516+
| QPaintEngine::ConstantOpacity
517+
| QPaintEngine::MaskedBrush
518+
// | QPaintEngine::PerspectiveTransform
519+
| QPaintEngine::BlendModes
520+
// | QPaintEngine::ObjectBoundingModeGradients
521+
| QPaintEngine::RasterOpModes
522+
| QPaintEngine::PaintOutsidePaintEvent
523+
);
524+
}
525+
};
526+
499527
void QgsComposer::on_mActionExportAsPDF_triggered()
500528
{
501529
QSettings myQSettings; // where we keep last used filter in persistent state
@@ -530,6 +558,14 @@ void QgsComposer::on_mActionExportAsPDF_triggered()
530558
printer.setOutputFileName( myOutputFileNameQString );
531559
printer.setPaperSize( QSizeF( mComposition->paperWidth(), mComposition->paperHeight() ), QPrinter::Millimeter );
532560

561+
QPaintEngine *engine = printer.paintEngine();
562+
if ( engine && engine->hasFeature( QPaintEngine::PatternTransform ) )
563+
{
564+
QgsPaintEngineHack *hack = static_cast<QgsPaintEngineHack*>( engine );
565+
hack->fixFlags();
566+
Q_ASSERT( !engine->hasFeature( QPaintEngine::PatternTransform ) );
567+
}
568+
533569
print( printer );
534570
}
535571

src/mapserver/qgswmsserver.cpp

100644100755
Lines changed: 40 additions & 0 deletions
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;
@@ -425,6 +456,15 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString )
425456
printer.setPaperSize( QSizeF( c->paperWidth(), c->paperHeight() ), QPrinter::Millimeter );
426457
QRectF paperRectMM = printer.pageRect( QPrinter::Millimeter );
427458
QRectF paperRectPixel = printer.pageRect( QPrinter::DevicePixel );
459+
460+
QPaintEngine *engine = printer.paintEngine();
461+
if ( engine->hasFeature( QPaintEngine::PatternTransform ) )
462+
{
463+
QgsPaintEngineHack *hack = static_cast<QgsPaintEngineHack*>( engine );
464+
hack->fixFlags();
465+
Q_ASSERT( !engine->hasFeature( QPaintEngine::PatternTransform ) );
466+
}
467+
428468
QPainter p( &printer );
429469
if ( c->printAsRaster() ) //embed one raster into the pdf
430470
{

0 commit comments

Comments
 (0)