Skip to content

Commit

Permalink
rasterlayerrenderer: Store min max computation as QgsRenderedItemDetails
Browse files Browse the repository at this point in the history
  • Loading branch information
ptitjano committed Nov 14, 2024
1 parent a421114 commit be05cf5
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 11 deletions.
15 changes: 9 additions & 6 deletions src/core/raster/qgsrasterlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1544,7 +1544,7 @@ void QgsRasterLayer::refreshContrastEnhancement( const QgsRectangle &extent )
}

bool QgsRasterLayer::refreshRendererIfNeeded( QgsRasterRenderer *rasterRenderer,
const QgsRectangle &extent )
const QgsRectangle &extent, double &min, double &max )
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

Expand All @@ -1553,17 +1553,20 @@ bool QgsRasterLayer::refreshRendererIfNeeded( QgsRasterRenderer *rasterRenderer,
rasterRenderer->minMaxOrigin().limits() != QgsRasterMinMaxOrigin::None &&
rasterRenderer->minMaxOrigin().extent() == QgsRasterMinMaxOrigin::UpdatedCanvas )
{
return refreshRenderer( rasterRenderer, extent );
return refreshRenderer( rasterRenderer, extent, min, max );
}

return false;
}

bool QgsRasterLayer::refreshRenderer( QgsRasterRenderer *rasterRenderer, const QgsRectangle &extent )
bool QgsRasterLayer::refreshRenderer( QgsRasterRenderer *rasterRenderer, const QgsRectangle &extent, double &min, double &max )
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

min = std::numeric_limits<double>::quiet_NaN();
max = std::numeric_limits<double>::quiet_NaN();
bool refreshed = false;

if ( mDataProvider )
{
QgsSingleBandGrayRenderer *singleBandRenderer = nullptr;
Expand All @@ -1581,8 +1584,6 @@ bool QgsRasterLayer::refreshRenderer( QgsRasterRenderer *rasterRenderer, const Q
else if ( ( sbpcr = dynamic_cast<QgsSingleBandPseudoColorRenderer *>( rasterRenderer ) ) )
{
mLastRectangleUsedByRefreshContrastEnhancementIfNeeded = extent;
double min;
double max;
computeMinMax( sbpcr->inputBand(),
rasterRenderer->minMaxOrigin(),
rasterRenderer->minMaxOrigin().limits(), extent,
Expand Down Expand Up @@ -1700,8 +1701,10 @@ bool QgsRasterLayer::setSubsetString( const QString &subset )

if ( res )
{
double min;
double max;
setExtent( mDataProvider->extent() );
refreshRenderer( renderer(), extent() );
refreshRenderer( renderer(), extent(), min, max );
emit subsetStringChanged();
}

Expand Down
5 changes: 3 additions & 2 deletions src/core/raster/qgsrasterlayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -408,7 +408,7 @@ class CORE_EXPORT QgsRasterLayer : public QgsMapLayer, public QgsAbstractProfile
* \returns true if the renderer has been refreshed.
* \note not available in Python bindings
*/
bool refreshRendererIfNeeded( QgsRasterRenderer *rasterRenderer, const QgsRectangle &extent ) SIP_SKIP;
bool refreshRendererIfNeeded( QgsRasterRenderer *rasterRenderer, const QgsRectangle &extent, double &min, double &max ) SIP_SKIP;

/**
* Returns the string (typically sql) used to define a subset of the layer.
Expand Down Expand Up @@ -527,9 +527,10 @@ class CORE_EXPORT QgsRasterLayer : public QgsMapLayer, public QgsAbstractProfile

/**
* \brief Refresh renderer with new extent
* Min - max values are set if the renderer relies on it. Otherwise, they are set to NaN.
* \returns true if the renderer has been refreshed.
*/
bool refreshRenderer( QgsRasterRenderer *rasterRenderer, const QgsRectangle &extent );
bool refreshRenderer( QgsRasterRenderer *rasterRenderer, const QgsRectangle &extent, double &min, double &max );

void computeMinMax( int band,
const QgsRasterMinMaxOrigin &mmo,
Expand Down
12 changes: 11 additions & 1 deletion src/core/raster/qgsrasterlayerrenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,13 @@
#include "qgsinterval.h"
#include "qgsunittypes.h"
#include "qgsrasternuller.h"
#include "qgsrenderedcalculatedresults.h"

#include <QElapsedTimer>
#include <QPointer>
#include <QThread>
#include <cmath>
#include <limits>

///@cond PRIVATE

Expand Down Expand Up @@ -273,7 +276,14 @@ QgsRasterLayerRenderer::QgsRasterLayerRenderer( QgsRasterLayer *layer, QgsRender
&& !( rendererContext.flags() & Qgis::RenderContextFlag::RenderPreviewJob )
&& !( rendererContext.flags() & Qgis::RenderContextFlag::Render3DMap ) )
{
layer->refreshRendererIfNeeded( rasterRenderer, rendererContext.extent() );
double min = std::numeric_limits<double>::quiet_NaN();
double max = std::numeric_limits<double>::quiet_NaN();
if ( layer->refreshRendererIfNeeded( rasterRenderer, rendererContext.extent(), min, max ) && !std::isnan( min ) && !std::isnan( max ) )
{
QgsRenderedCalculatedResults *computedResults = new QgsRenderedCalculatedResults( layer->id(), min, max );
computedResults->setBoundingBox( rendererContext.extent() );
appendRenderedItemDetails( computedResults );
}
}

mPipe->evaluateDataDefinedProperties( rendererContext.expressionContext() );
Expand Down
6 changes: 4 additions & 2 deletions tests/src/core/testqgsrasterlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1007,7 +1007,9 @@ void TestQgsRasterLayer::testRefreshRendererIfNeeded()

// Should do nothing
const QgsRectangle newExtent = QgsRectangle( 785000, 3340000, 785100, 3340100 );
const bool refreshed = mpLandsatRasterLayer->refreshRendererIfNeeded( mpLandsatRasterLayer->renderer(), newExtent );
double min;
double max;
const bool refreshed = mpLandsatRasterLayer->refreshRendererIfNeeded( mpLandsatRasterLayer->renderer(), newExtent, min, max );
QVERIFY( !refreshed );
QCOMPARE( mpLandsatRasterLayer->renderer()->minMaxOrigin().limits(), QgsRasterMinMaxOrigin::MinMax );
const double minVal = static_cast<QgsMultiBandColorRenderer *>( mpLandsatRasterLayer->renderer() )->redContrastEnhancement()->minimumValue();
Expand All @@ -1019,7 +1021,7 @@ void TestQgsRasterLayer::testRefreshRendererIfNeeded()
mmo.setStatAccuracy( QgsRasterMinMaxOrigin::Exact );
mpLandsatRasterLayer->renderer()->setMinMaxOrigin( mmo );
QCOMPARE( mpLandsatRasterLayer->renderer()->minMaxOrigin().extent(), QgsRasterMinMaxOrigin::UpdatedCanvas );
const bool newRefreshed = mpLandsatRasterLayer->refreshRendererIfNeeded( mpLandsatRasterLayer->renderer(), newExtent );
const bool newRefreshed = mpLandsatRasterLayer->refreshRendererIfNeeded( mpLandsatRasterLayer->renderer(), newExtent, min, max );
QVERIFY( newRefreshed );
const double newMinVal = static_cast<QgsMultiBandColorRenderer *>( mpLandsatRasterLayer->renderer() )->redContrastEnhancement()->minimumValue();
QGSCOMPARENOTNEAR( initMinVal, newMinVal, 1e-5 );
Expand Down

0 comments on commit be05cf5

Please sign in to comment.