diff --git a/HPPA/HPPA.cpp b/HPPA/HPPA.cpp index 3b451c1..50c16f1 100644 --- a/HPPA/HPPA.cpp +++ b/HPPA/HPPA.cpp @@ -2667,7 +2667,7 @@ void HPPA::addLayer(const QString& baseName, const QString& filePath,bool refres if (isAddImage) { - newImage(ml, RasterImageLayer::RendererType::Multiband, node); + newImage(ml, RasterImageLayer::RendererType::Multiband, node, refresh); } } diff --git a/HPPA/RasterImageLayer.cpp b/HPPA/RasterImageLayer.cpp index efe3ca0..2fd41f5 100644 --- a/HPPA/RasterImageLayer.cpp +++ b/HPPA/RasterImageLayer.cpp @@ -8,32 +8,46 @@ RasterImageLayer::RasterImageLayer(RasterLayer* layer, RendererType type) : m_layer(layer) , m_rendererType(type) + , m_rendererInitialized(false) { +} + +void RasterImageLayer::ensureRenderer() +{ + if (m_rendererInitialized) return; if (!m_layer) return; RasterDataProvider* provider = nullptr; - if (m_layer->dataProvider()) { + if (m_layer->dataProvider()) + { provider = m_layer->dataProvider(); - } else if (m_layer->openDataProvider()) { + } + else if (m_layer->openDataProvider()) + { provider = m_layer->dataProvider(); } if (!provider) return; - switch (type) { - case RendererType::Multiband: { - auto* multiRenderer = new MultibandRasterRenderer(provider); - m_renderer.reset(multiRenderer); - multiRenderer->setParams(m_multibandParams); - break; - } - case RendererType::Singleband: { - auto* singleRenderer = new SinglebandRasterRenderer(provider); - m_renderer.reset(singleRenderer); - singleRenderer->setParams(m_singlebandParams); - break; - } + switch (m_rendererType) + { + case RendererType::Multiband: + { + auto* multiRenderer = new MultibandRasterRenderer(provider); + m_renderer.reset(multiRenderer); + multiRenderer->setParams(m_multibandParams); + break; + } + case RendererType::Singleband: + { + auto* singleRenderer = new SinglebandRasterRenderer(provider); + m_renderer.reset(singleRenderer); + singleRenderer->setParams(m_singlebandParams); + break; + } } + + m_rendererInitialized = true; } RasterImageLayer::~RasterImageLayer() @@ -43,6 +57,7 @@ RasterImageLayer::~RasterImageLayer() QImage RasterImageLayer::render() { + ensureRenderer(); if (!m_renderer) return QImage(); return m_renderer->render(); } @@ -50,7 +65,7 @@ QImage RasterImageLayer::render() void RasterImageLayer::setMultibandParams(const MultibandRenderParams& params) { m_multibandParams = params; - if (m_rendererType == RendererType::Multiband) { + if (m_rendererInitialized && m_rendererType == RendererType::Multiband) { auto* r = static_cast(m_renderer.get()); r->setParams(params); } @@ -59,7 +74,7 @@ void RasterImageLayer::setMultibandParams(const MultibandRenderParams& params) void RasterImageLayer::setSinglebandParams(const SinglebandRenderParams& params) { m_singlebandParams = params; - if (m_rendererType == RendererType::Singleband) { + if (m_rendererInitialized && m_rendererType == RendererType::Singleband) { auto* r = static_cast(m_renderer.get()); r->setParams(params); } diff --git a/HPPA/RasterImageLayer.h b/HPPA/RasterImageLayer.h index 66c4ab7..b791e46 100644 --- a/HPPA/RasterImageLayer.h +++ b/HPPA/RasterImageLayer.h @@ -22,6 +22,7 @@ public: RasterImageLayer(RasterLayer* layer, RendererType type); ~RasterImageLayer(); + void ensureRenderer(); QImage render(); RasterLayer* layer() const { return m_layer; } @@ -41,4 +42,5 @@ private: std::unique_ptr m_renderer; MultibandRenderParams m_multibandParams; SinglebandRenderParams m_singlebandParams; + bool m_rendererInitialized = false; };