Skip to content

Commit cfee456

Browse files
committedJul 9, 2015
[FEATURE] Add option to force a vector layer to render as a raster
(under the layer properties, rendering tab) So why would you want this? Well, extremely detailed layers (eg polygon layers with a huge number of nodes) can cause composer exports in PDF/SVG format to be huge as all nodes are included in the exported file. This can also make the resultant file very slow to work with/open in other programs (*cough* Inkscape *cough*). Now, these you can force these layers to be rasterised so that the exported files won't have to include all the nodes contained in these layers. (Before you could also do this by forcing the composer to export as a raster, but that was an all-or-nothing solution). The ideal solution would be a simplification option for composer exports which would simplify the layers by removing redundant points at the export DPI, but this is an easy workaround for now.
1 parent a9e9f86 commit cfee456

12 files changed

+84
-20
lines changed
 

‎python/core/symbology-ng/qgsrendererv2.sip

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,21 @@ class QgsFeatureRendererV2
211211
*/
212212
void setPaintEffect( QgsPaintEffect* effect /Transfer/);
213213

214+
/** Returns whether the renderer must render as a raster.
215+
* @note added in QGIS 2.12
216+
* @see setForceRasterRender
217+
*/
218+
bool forceRasterRender() const;
219+
220+
/** Sets whether the renderer should be rendered to a raster destination.
221+
* @param forceRaster set to true if renderer must be drawn on a raster surface.
222+
* This may be desirable for highly detailed layers where rendering as a vector
223+
* would result in a large, complex vector output.
224+
* @see forceRasterRender
225+
* @note added in QGIS 2.12
226+
*/
227+
void setForceRasterRender( bool forceRaster );
228+
214229
protected:
215230
QgsFeatureRendererV2( QString type );
216231

‎src/app/qgsvectorlayerproperties.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
#include "qgsvectordataprovider.h"
5050
#include "qgsquerybuilder.h"
5151
#include "qgsdatasourceuri.h"
52+
#include "qgsrendererv2.h"
5253

5354
#include <QMessageBox>
5455
#include <QDir>
@@ -435,15 +436,17 @@ void QgsVectorLayerProperties::syncToLayer( void )
435436
// disable simplification for point layers, now it is not implemented
436437
if ( layer->geometryType() == QGis::Point )
437438
{
438-
mOptionsStackedWidget->removeWidget( mOptsPage_Rendering );
439439
mSimplifyDrawingGroupBox->setChecked( false );
440+
mSimplifyDrawingGroupBox->setEnabled( false );
440441
}
441442

442443
QStringList myScalesList = PROJECT_SCALES.split( "," );
443444
myScalesList.append( "1:1" );
444445
mSimplifyMaximumScaleComboBox->updateScales( myScalesList );
445446
mSimplifyMaximumScaleComboBox->setScale( 1.0 / simplifyMethod.maximumScale() );
446447

448+
mForceRasterCheckBox->setChecked( layer->rendererV2() && layer->rendererV2()->forceRasterRender() );
449+
447450
// load appropriate symbology page (V1 or V2)
448451
updateSymbologyPage();
449452

@@ -602,6 +605,9 @@ void QgsVectorLayerProperties::apply()
602605
simplifyMethod.setMaximumScale( 1.0 / mSimplifyMaximumScaleComboBox->scale() );
603606
layer->setSimplifyMethod( simplifyMethod );
604607

608+
if ( layer->rendererV2() )
609+
layer->rendererV2()->setForceRasterRender( mForceRasterCheckBox->isChecked() );
610+
605611
mOldJoins = layer->vectorJoins();
606612

607613
// update symbology

‎src/core/qgsmaprenderercustompainterjob.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "qgsmaplayerrenderer.h"
2121
#include "qgspallabeling.h"
2222
#include "qgsvectorlayer.h"
23+
#include "qgsrendererv2.h"
2324

2425
QgsMapRendererCustomPainterJob::QgsMapRendererCustomPainterJob( const QgsMapSettings& settings, QPainter* painter )
2526
: QgsMapRendererJob( settings )
@@ -338,13 +339,22 @@ void QgsMapRendererJob::updateLayerGeometryCaches()
338339

339340
bool QgsMapRendererJob::needTemporaryImage( QgsMapLayer* ml )
340341
{
341-
if ( mSettings.testFlag( QgsMapSettings::UseAdvancedEffects ) && ml->type() == QgsMapLayer::VectorLayer )
342+
if ( ml->type() == QgsMapLayer::VectorLayer )
342343
{
343344
QgsVectorLayer* vl = qobject_cast<QgsVectorLayer *>( ml );
344-
if ((( vl->blendMode() != QPainter::CompositionMode_SourceOver )
345-
|| ( vl->featureBlendMode() != QPainter::CompositionMode_SourceOver )
346-
|| ( vl->layerTransparency() != 0 ) ) )
345+
if ( vl->rendererV2()->forceRasterRender() )
346+
{
347+
//raster rendering is forced for this layer
347348
return true;
349+
}
350+
if ( mSettings.testFlag( QgsMapSettings::UseAdvancedEffects ) &&
351+
(( vl->blendMode() != QPainter::CompositionMode_SourceOver )
352+
|| ( vl->featureBlendMode() != QPainter::CompositionMode_SourceOver )
353+
|| ( vl->layerTransparency() != 0 ) ) )
354+
{
355+
//layer properties require rasterisation
356+
return true;
357+
}
348358
}
349359

350360
return false;

‎src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,7 @@ QDomElement QgsCategorizedSymbolRendererV2::save( QDomDocument& doc )
626626
QDomElement rendererElem = doc.createElement( RENDERER_TAG_NAME );
627627
rendererElem.setAttribute( "type", "categorizedSymbol" );
628628
rendererElem.setAttribute( "symbollevels", ( mUsingSymbolLevels ? "1" : "0" ) );
629+
rendererElem.setAttribute( "forceraster", ( mForceRaster ? "1" : "0" ) );
629630
rendererElem.setAttribute( "attr", mAttrName );
630631

631632
// categories

‎src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1071,6 +1071,7 @@ QDomElement QgsGraduatedSymbolRendererV2::save( QDomDocument& doc )
10711071
QDomElement rendererElem = doc.createElement( RENDERER_TAG_NAME );
10721072
rendererElem.setAttribute( "type", "graduatedSymbol" );
10731073
rendererElem.setAttribute( "symbollevels", ( mUsingSymbolLevels ? "1" : "0" ) );
1074+
rendererElem.setAttribute( "forceraster", ( mForceRaster ? "1" : "0" ) );
10741075
rendererElem.setAttribute( "attr", mAttrName );
10751076
rendererElem.setAttribute( "graduatedMethod", graduatedMethodStr( mGraduatedMethod ) );
10761077

‎src/core/symbology-ng/qgsinvertedpolygonrenderer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,7 @@ QDomElement QgsInvertedPolygonRenderer::save( QDomDocument& doc )
360360
QDomElement rendererElem = doc.createElement( RENDERER_TAG_NAME );
361361
rendererElem.setAttribute( "type", "invertedPolygonRenderer" );
362362
rendererElem.setAttribute( "preprocessing", preprocessingEnabled() ? "1" : "0" );
363+
rendererElem.setAttribute( "forceraster", ( mForceRaster ? "1" : "0" ) );
363364

364365
if ( mSubRenderer )
365366
{

‎src/core/symbology-ng/qgspointdisplacementrenderer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@ QgsFeatureRendererV2* QgsPointDisplacementRenderer::create( QDomElement& symbolo
370370
QDomElement QgsPointDisplacementRenderer::save( QDomDocument& doc )
371371
{
372372
QDomElement rendererElement = doc.createElement( RENDERER_TAG_NAME );
373+
rendererElement.setAttribute( "forceraster", ( mForceRaster ? "1" : "0" ) );
373374
rendererElement.setAttribute( "type", "pointDisplacement" );
374375
rendererElement.setAttribute( "labelAttributeName", mLabelAttributeName );
375376
rendererElement.appendChild( QgsFontUtils::toXmlElement( mLabelFont, doc, "labelFontProperties" ) );

‎src/core/symbology-ng/qgsrendererv2.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ QgsFeatureRendererV2::QgsFeatureRendererV2( QString type )
209209
, mCurrentVertexMarkerType( QgsVectorLayer::Cross )
210210
, mCurrentVertexMarkerSize( 3 )
211211
, mPaintEffect( 0 )
212+
, mForceRaster( false )
212213
{
213214
mPaintEffect = QgsPaintEffectRegistry::defaultStack();
214215
mPaintEffect->setEnabled( false );
@@ -423,6 +424,7 @@ QgsFeatureRendererV2* QgsFeatureRendererV2::load( QDomElement& element )
423424
if ( r )
424425
{
425426
r->setUsingSymbolLevels( element.attribute( "symbollevels", "0" ).toInt() );
427+
r->setForceRasterRender( element.attribute( "forceraster", "0" ).toInt() );
426428

427429
//restore layer effect
428430
QDomElement effectElem = element.firstChildElement( "effect" );
@@ -438,6 +440,7 @@ QDomElement QgsFeatureRendererV2::save( QDomDocument& doc )
438440
{
439441
// create empty renderer element
440442
QDomElement rendererElem = doc.createElement( RENDERER_TAG_NAME );
443+
rendererElem.setAttribute( "forceraster", ( mForceRaster ? "1" : "0" ) );
441444

442445
if ( mPaintEffect )
443446
mPaintEffect->saveProperties( doc, rendererElem );

‎src/core/symbology-ng/qgsrendererv2.h

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class CORE_EXPORT QgsFeatureRendererV2
8181

8282
QString type() const { return mType; }
8383

84-
/** to be overridden
84+
/** To be overridden
8585
* @param feature feature
8686
* @return returns pointer to symbol or 0 if symbol was not found
8787
*/
@@ -144,7 +144,7 @@ class CORE_EXPORT QgsFeatureRendererV2
144144
//! @note added in 2.8
145145
virtual QDomElement writeSld( QDomDocument& doc, const QString& styleName ) const;
146146

147-
/** create a new renderer according to the information contained in
147+
/** Create a new renderer according to the information contained in
148148
* the UserStyle element of a SLD style document
149149
* @param node the node in the SLD document whose the UserStyle element
150150
* is a child
@@ -211,7 +211,7 @@ class CORE_EXPORT QgsFeatureRendererV2
211211
//! @note added in 2.6
212212
virtual QgsSymbolV2List originalSymbolsForFeature( QgsFeature& feat );
213213

214-
/**Allows for a renderer to modify the extent of a feature request prior to rendering
214+
/** Allows for a renderer to modify the extent of a feature request prior to rendering
215215
* @param extent reference to request's filter extent. Modify extent to change the
216216
* extent of feature request
217217
* @param context render context
@@ -233,6 +233,21 @@ class CORE_EXPORT QgsFeatureRendererV2
233233
*/
234234
void setPaintEffect( QgsPaintEffect* effect );
235235

236+
/** Returns whether the renderer must render as a raster.
237+
* @note added in QGIS 2.12
238+
* @see setForceRasterRender
239+
*/
240+
bool forceRasterRender() const { return mForceRaster; }
241+
242+
/** Sets whether the renderer should be rendered to a raster destination.
243+
* @param forceRaster set to true if renderer must be drawn on a raster surface.
244+
* This may be desirable for highly detailed layers where rendering as a vector
245+
* would result in a large, complex vector output.
246+
* @see forceRasterRender
247+
* @note added in QGIS 2.12
248+
*/
249+
void setForceRasterRender( bool forceRaster ) { mForceRaster = forceRaster; }
250+
236251
protected:
237252
QgsFeatureRendererV2( QString type );
238253

@@ -272,11 +287,13 @@ class CORE_EXPORT QgsFeatureRendererV2
272287

273288
QgsPaintEffect* mPaintEffect;
274289

275-
/**@note this function is used to convert old sizeScale expresssions to symbol
290+
bool mForceRaster;
291+
292+
/** @note this function is used to convert old sizeScale expresssions to symbol
276293
* level DataDefined size
277294
*/
278295
static void convertSymbolSizeScale( QgsSymbolV2 * symbol, QgsSymbolV2::ScaleMethod method, const QString & field );
279-
/**@note this function is used to convert old rotations expresssions to symbol
296+
/** @note this function is used to convert old rotations expresssions to symbol
280297
* level DataDefined angle
281298
*/
282299
static void convertSymbolRotation( QgsSymbolV2 * symbol, const QString & field );

‎src/core/symbology-ng/qgsrulebasedrendererv2.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -885,6 +885,7 @@ QDomElement QgsRuleBasedRendererV2::save( QDomDocument& doc )
885885
QDomElement rendererElem = doc.createElement( RENDERER_TAG_NAME );
886886
rendererElem.setAttribute( "type", "RuleRenderer" );
887887
rendererElem.setAttribute( "symbollevels", ( mUsingSymbolLevels ? "1" : "0" ) );
888+
rendererElem.setAttribute( "forceraster", ( mForceRaster ? "1" : "0" ) );
888889

889890
QgsSymbolV2Map symbols;
890891

‎src/core/symbology-ng/qgssinglesymbolrendererv2.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,7 @@ QDomElement QgsSingleSymbolRendererV2::save( QDomDocument& doc )
344344
QDomElement rendererElem = doc.createElement( RENDERER_TAG_NAME );
345345
rendererElem.setAttribute( "type", "singleSymbol" );
346346
rendererElem.setAttribute( "symbollevels", ( mUsingSymbolLevels ? "1" : "0" ) );
347+
rendererElem.setAttribute( "forceraster", ( mForceRaster ? "1" : "0" ) );
347348

348349
QgsSymbolV2Map symbols;
349350
symbols["0"] = mSymbol.data();

‎src/ui/qgsvectorlayerpropertiesbase.ui

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -692,8 +692,8 @@
692692
<rect>
693693
<x>0</x>
694694
<y>0</y>
695-
<width>123</width>
696-
<height>38</height>
695+
<width>730</width>
696+
<height>537</height>
697697
</rect>
698698
</property>
699699
<layout class="QVBoxLayout" name="verticalLayout_28">
@@ -774,8 +774,8 @@
774774
<rect>
775775
<x>0</x>
776776
<y>0</y>
777-
<width>100</width>
778-
<height>30</height>
777+
<width>730</width>
778+
<height>537</height>
779779
</rect>
780780
</property>
781781
<layout class="QVBoxLayout" name="verticalLayout_20">
@@ -834,8 +834,8 @@
834834
<rect>
835835
<x>0</x>
836836
<y>0</y>
837-
<width>721</width>
838-
<height>171</height>
837+
<width>730</width>
838+
<height>537</height>
839839
</rect>
840840
</property>
841841
<layout class="QVBoxLayout" name="verticalLayout_32">
@@ -940,6 +940,13 @@
940940
</layout>
941941
</widget>
942942
</item>
943+
<item>
944+
<widget class="QCheckBox" name="mForceRasterCheckBox">
945+
<property name="text">
946+
<string>Force layer to render as a raster (may result in smaller export file sizes)</string>
947+
</property>
948+
</widget>
949+
</item>
943950
<item>
944951
<spacer name="verticalSpacer_6">
945952
<property name="orientation">
@@ -1400,7 +1407,7 @@
14001407
<rect>
14011408
<x>0</x>
14021409
<y>0</y>
1403-
<width>393</width>
1410+
<width>714</width>
14041411
<height>608</height>
14051412
</rect>
14061413
</property>
@@ -1801,7 +1808,6 @@
18011808
</customwidget>
18021809
</customwidgets>
18031810
<tabstops>
1804-
<tabstop>buttonBox</tabstop>
18051811
<tabstop>mOptionsListWidget</tabstop>
18061812
<tabstop>scrollArea</tabstop>
18071813
<tabstop>mLayerOrigNameLineEdit</tabstop>
@@ -1823,7 +1829,7 @@
18231829
<tabstop>mSimplifyDrawingSpinBox</tabstop>
18241830
<tabstop>mSimplifyDrawingAtProvider</tabstop>
18251831
<tabstop>mSimplifyMaximumScaleComboBox</tabstop>
1826-
<tabstop>scrollArea_10</tabstop>
1832+
<tabstop>mForceRasterCheckBox</tabstop>
18271833
<tabstop>fieldComboRadio</tabstop>
18281834
<tabstop>displayFieldComboBox</tabstop>
18291835
<tabstop>htmlRadio</tabstop>
@@ -1836,7 +1842,6 @@
18361842
<tabstop>scrollArea_7</tabstop>
18371843
<tabstop>mButtonAddJoin</tabstop>
18381844
<tabstop>mButtonRemoveJoin</tabstop>
1839-
<tabstop>mDiagramFrame</tabstop>
18401845
<tabstop>scrollArea_2</tabstop>
18411846
<tabstop>mLayerTitleLineEdit</tabstop>
18421847
<tabstop>mLayerAbstractTextEdit</tabstop>
@@ -1851,6 +1856,8 @@
18511856
<tabstop>mLayerLegendUrlLineEdit</tabstop>
18521857
<tabstop>mLayerLegendUrlFormatComboBox</tabstop>
18531858
<tabstop>teMetadata</tabstop>
1859+
<tabstop>mButtonEditJoin</tabstop>
1860+
<tabstop>scrollArea_10</tabstop>
18541861
</tabstops>
18551862
<resources>
18561863
<include location="../../images/images.qrc"/>

0 commit comments

Comments
 (0)
Failed to load comments.