diff --git a/python/core/qgsmaprenderer.sip b/python/core/qgsmaprenderer.sip index ddb3aeb5a345..2ef6272b0353 100644 --- a/python/core/qgsmaprenderer.sip +++ b/python/core/qgsmaprenderer.sip @@ -325,6 +325,9 @@ class QgsMapRenderer : QObject */ void setFeatureFilterProvider( const QgsFeatureFilterProvider* ffp ); + /** Set tile mode (render code tries to prevent tile border effects)*/ + void setTileRenderMode( bool enabled ); + signals: //! @deprecated in 2.4 - not emitted anymore diff --git a/python/server/qgswmsconfigparser.sip b/python/server/qgswmsconfigparser.sip index d2316375daa1..efd3eb88879e 100644 --- a/python/server/qgswmsconfigparser.sip +++ b/python/server/qgswmsconfigparser.sip @@ -123,6 +123,9 @@ class QgsWMSConfigParser virtual bool useLayerIDs() const = 0; + /** True if tile render mode is enabled in the configuration*/ + virtual bool tileRenderMode() const = 0; + private: QgsWMSConfigParser(); diff --git a/src/core/qgsmaprenderer.cpp b/src/core/qgsmaprenderer.cpp index 97aa8eb2da96..de158fc048ce 100644 --- a/src/core/qgsmaprenderer.cpp +++ b/src/core/qgsmaprenderer.cpp @@ -62,6 +62,8 @@ QgsMapRenderer::QgsMapRenderer() mLabelingEngine = nullptr; readDefaultDatumTransformations(); + + mTileRenderMode = false; } QgsMapRenderer::~QgsMapRenderer() @@ -343,6 +345,8 @@ void QgsMapRenderer::render( QPainter* painter, double* forceWidthScale ) QListIterator li( mLayerSet ); li.toBack(); + mRenderContext.setFlag( QgsRenderContext::RenderMapTile, mTileRenderMode ); + QgsRectangle r1, r2; while ( li.hasPrevious() ) diff --git a/src/core/qgsmaprenderer.h b/src/core/qgsmaprenderer.h index e037d295cf9f..ff9082058a8f 100644 --- a/src/core/qgsmaprenderer.h +++ b/src/core/qgsmaprenderer.h @@ -396,6 +396,9 @@ class CORE_EXPORT QgsMapRenderer : public QObject mRenderContext.setFeatureFilterProvider( ffp ); } + /** Set tile mode (render code tries to prevent tile border effects)*/ + void setTileRenderMode( bool enabled ) { mTileRenderMode = enabled; } + signals: //! @deprecated in 2.4 - not emitted anymore @@ -512,6 +515,9 @@ class CORE_EXPORT QgsMapRenderer : public QObject QHash< QPair< QString, QString >, QPair< int, int > > mDefaultDatumTransformations; + /** Tell the render system we are rendering a map tile*/ + bool mTileRenderMode; + private: void readDefaultDatumTransformations(); }; diff --git a/src/server/qgssldconfigparser.cpp b/src/server/qgssldconfigparser.cpp index 6f81893ce718..6f816052fb29 100644 --- a/src/server/qgssldconfigparser.cpp +++ b/src/server/qgssldconfigparser.cpp @@ -801,6 +801,15 @@ void QgsSLDConfigParser::serviceCapabilities( QDomElement& parentElement, QDomDo } } +bool QgsSLDConfigParser::tileRenderMode() const +{ + if ( mFallbackParser ) + { + return mFallbackParser->tileRenderMode(); + } + return false; +} + QList QgsSLDConfigParser::findNamedLayerElements( const QString& layerName ) const { QList resultList; diff --git a/src/server/qgssldconfigparser.h b/src/server/qgssldconfigparser.h index 6688109eecea..6f346ccc6218 100644 --- a/src/server/qgssldconfigparser.h +++ b/src/server/qgssldconfigparser.h @@ -132,6 +132,9 @@ class QgsSLDConfigParser : public QgsWMSConfigParser void serviceCapabilities( QDomElement& parentElement, QDomDocument& doc ) const override; + /** True if tile render mode is enabled in the configuration*/ + bool tileRenderMode() const override; + private: /** SLD as dom document*/ diff --git a/src/server/qgswmsconfigparser.h b/src/server/qgswmsconfigparser.h index 5128e4bc4618..6846ccecff1c 100644 --- a/src/server/qgswmsconfigparser.h +++ b/src/server/qgswmsconfigparser.h @@ -139,6 +139,9 @@ class SERVER_EXPORT QgsWMSConfigParser virtual bool useLayerIDs() const = 0; + /** True if tile render mode is enabled in the configuration*/ + virtual bool tileRenderMode() const = 0; + /** Adds highlight layers to the layer registry and to the layer set. Returns the ids of the newly created layers (for later removal)*/ static QStringList addHighlightLayers( const QMap& parameterMap, QStringList& layerSet, const QString& parameterPrefix = QString() ); static void removeHighlightLayers( const QStringList& layerIds ); diff --git a/src/server/qgswmsprojectparser.cpp b/src/server/qgswmsprojectparser.cpp index 081c49a31c24..5e776a06c669 100644 --- a/src/server/qgswmsprojectparser.cpp +++ b/src/server/qgswmsprojectparser.cpp @@ -2323,6 +2323,28 @@ void QgsWMSProjectParser::serviceCapabilities( QDomElement& parentElement, QDomD mProjectParser->serviceCapabilities( parentElement, doc, "WMS", featureInfoFormatSIA2045() ); } +bool QgsWMSProjectParser::tileRenderMode() const +{ + if ( !mProjectParser->xmlDocument() ) + { + return false; + } + + QDomElement qgisElem = mProjectParser->xmlDocument()->documentElement(); + QDomElement mapCanvasElem = qgisElem.firstChildElement( "mapcanvas" ); + if ( mapCanvasElem.isNull() ) + { + return false; + } + QDomElement renderMapTileElem = mapCanvasElem.firstChildElement( "rendermaptile" ); + if ( renderMapTileElem.isNull() ) + { + return false; + } + + return ( renderMapTileElem.text() == "1" ); +} + QDomElement QgsWMSProjectParser::composerByName( const QString& composerName ) const { QDomElement composerElem; diff --git a/src/server/qgswmsprojectparser.h b/src/server/qgswmsprojectparser.h index cb6af2123218..bb11f1170b8d 100644 --- a/src/server/qgswmsprojectparser.h +++ b/src/server/qgswmsprojectparser.h @@ -127,6 +127,9 @@ class SERVER_EXPORT QgsWMSProjectParser : public QgsWMSConfigParser bool useLayerIDs() const override { return mProjectParser->useLayerIDs(); } + /** True if tile render mode is enabled in the configuration*/ + bool tileRenderMode() const override; + private: QgsServerProjectParser* mProjectParser; #ifdef HAVE_SERVER_PYTHON_PLUGINS diff --git a/src/server/qgswmsserver.cpp b/src/server/qgswmsserver.cpp index cb039a4a2c13..705a14951650 100644 --- a/src/server/qgswmsserver.cpp +++ b/src/server/qgswmsserver.cpp @@ -2103,6 +2103,7 @@ int QgsWMSServer::configureMapRender( const QPaintDevice* paintDevice ) const mMapRenderer->clearLayerCoordinateTransforms(); mMapRenderer->setOutputSize( QSize( paintDevice->width(), paintDevice->height() ), paintDevice->logicalDpiX() ); + mMapRenderer->setTileRenderMode( mConfigParser->tileRenderMode() ); //map extent bool bboxOk = true;