Skip to content

Commit 94c2e1c

Browse files
committed
Transfer ownership of renderer to c++ in sip bindings when calling QgsRasterLayer.setRenderer and when passing shader to QgsSingleBandPseudoColorRenderer. Fixes crash experienced when using python bindings and replacing the shader or renderer of a raster.
1 parent 05fb394 commit 94c2e1c

3 files changed

Lines changed: 8 additions & 7 deletions

File tree

‎python/core/qgsrasterlayer.sip‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ public:
217217
//void setUserDefinedRGBMinimumMaximum( bool theBool ); //removed with raster redesign
218218

219219
/**Set raster renderer. Takes ownership of the renderer object*/
220-
void setRenderer( QgsRasterRenderer* renderer );
220+
void setRenderer( QgsRasterRenderer* renderer /Transfer/ );
221221
QgsRasterRenderer* renderer();
222222

223223
/** \brief Accessor to find out how many standard deviations are being plotted */
@@ -226,7 +226,7 @@ public:
226226
/** \brief Accessor for transparent band name mapping */
227227
//QString transparentBandName() const; //removed with raster redesign
228228

229-
/** \brief [ data provider interface ] Does this layer use a provider for setting/retrieving data?
229+
/** \brief [ data provider interface ] Does this layer use a provider for setting/retrieving data?
230230
* @deprecated in 2.0
231231
*/
232232
bool usesProvider() /Deprecated/;
@@ -271,14 +271,14 @@ public:
271271
/** \brief Wrapper for GDALComputeRasterMinMax with the estimate option
272272
\note added in v1.6 */
273273
void computeMinimumMaximumEstimates( int theBand, double& theMin /Out/, double& theMax /Out/ );
274-
274+
275275
/** \brief Compute the actual minimum maximum pixel values based on the current (last) display extent */
276276
// (would need MethodCode directive) void computeMinimumMaximumFromLastExtent( int theBand, double* theMinMax );
277277

278278
/** \brief Compute the actual minimum maximum pixel values based on the current (last) display extent */
279279
// (would need MethodCode directive) void computeMinimumMaximumFromLastExtent( QString theBand, double* theMinMax );
280280

281-
/** \brief Compute the actual minimum maximum pixel values based on the current (last) display extent
281+
/** \brief Compute the actual minimum maximum pixel values based on the current (last) display extent
282282
\note added in v1.6 */
283283
void computeMinimumMaximumFromLastExtent( int theBand, double& theMin /Out/, double& theMax /Out/ );
284284

@@ -366,12 +366,12 @@ public:
366366
/** \brief Get an 100x100 pixmap of the color palette. If the layer has no palette a white pixmap will be returned */
367367
QPixmap paletteAsPixmap( int theBand = 1 );
368368

369-
/** \brief [ data provider interface ] Which provider is being used for this Raster Layer?
369+
/** \brief [ data provider interface ] Which provider is being used for this Raster Layer?
370370
* @note added in 2.0
371371
*/
372372
QString providerType() const;
373373

374-
/** \brief [ data provider interface ] Which provider is being used for this Raster Layer?
374+
/** \brief [ data provider interface ] Which provider is being used for this Raster Layer?
375375
* @deprecated in 2.0
376376
*/
377377
QString providerKey() const /Deprecated/;

‎python/core/qgsrasterrenderer.sip‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ class QgsSingleBandPseudoColorRenderer: QgsRasterRenderer
124124
%End
125125
public:
126126
/**Note: takes ownership of QgsRasterShader*/
127-
QgsSingleBandPseudoColorRenderer( QgsRasterDataProvider* provider, int band, QgsRasterShader* shader );
127+
QgsSingleBandPseudoColorRenderer( QgsRasterDataProvider* provider, int band, QgsRasterShader* shader /Transfer/ );
128128
~QgsSingleBandPseudoColorRenderer();
129129
QgsRasterInterface * clone();
130130

‎tests/src/python/test_qgsrasterlayer.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ def testShaderCrash(self):
140140
myPseudoRenderer = QgsSingleBandPseudoColorRenderer(myRasterLayer.dataProvider(), 1, myRasterShader)
141141
myRasterLayer.setRenderer(myPseudoRenderer)
142142

143+
return
143144
######## works first time #############
144145

145146
myRasterShader = QgsRasterShader()

0 commit comments

Comments
 (0)