From 3bab9ec6881069ef141b906e94d6908d52cc9fee Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 27 Jun 2020 16:52:53 +0200 Subject: [PATCH] copy constructor for labimage, further cleanup for locallab periphery --- rtengine/dcrop.cc | 12 ++++-------- rtengine/improccoordinator.cc | 16 ++++------------ rtengine/labimage.cc | 10 ++++++++-- rtengine/labimage.h | 5 +++-- rtengine/simpleprocess.cc | 12 ++++-------- 5 files changed, 23 insertions(+), 32 deletions(-) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 28e5afc1f..81457940d 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -856,10 +856,8 @@ void Crop::update(int todo) labnCrop->CopyFrom(laboCrop); if (params.locallab.enabled && !params.locallab.spots.empty()) { - const std::unique_ptr reservCrop(new LabImage(laboCrop->W, laboCrop->H)); - reservCrop->CopyFrom(laboCrop); - const std::unique_ptr lastorigCrop(new LabImage(laboCrop->W, laboCrop->H)); - lastorigCrop->CopyFrom(laboCrop); + const std::unique_ptr reservCrop(new LabImage(*laboCrop, true)); + const std::unique_ptr lastorigCrop(new LabImage(*laboCrop, true)); auto& lllocalcurve2 = parent->lllocalcurve; auto& cllocalcurve2 = parent->cllocalcurve; auto& lclocalcurve2 = parent->lclocalcurve; @@ -1235,19 +1233,17 @@ void Crop::update(int todo) if (WaveParams.softrad > 0.f) { - provradius = new LabImage(labnCrop->W, labnCrop->H); - provradius->CopyFrom(labnCrop); + provradius = new LabImage(*labnCrop, true); } if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { - unshar = new LabImage(labnCrop->W, labnCrop->H); provis = params.wavelet.CLmethod; params.wavelet.CLmethod = "all"; parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); - unshar->CopyFrom(labnCrop); + unshar = new LabImage(*labnCrop, true); params.wavelet.CLmethod = provis; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 386de6310..2839f483f 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1040,10 +1040,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) * 2017 2018 Jacques Desmis * 2019 Pierre Cabrera */ - const std::unique_ptr reserv(new LabImage(oprevl->W, oprevl->H)); - reserv->CopyFrom(oprevl); - const std::unique_ptr lastorigimp(new LabImage(oprevl->W, oprevl->H)); - lastorigimp->CopyFrom(oprevl); + const std::unique_ptr reserv(new LabImage(*oprevl, true)); + const std::unique_ptr lastorigimp(new LabImage(*oprevl, true)); float **shbuffer = nullptr; int sca = 1; double huere, chromare, lumare, huerefblu, chromarefblu, lumarefblu, sobelre; @@ -1287,20 +1285,14 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } if (WaveParams.softrad > 0.f) { - provradius = new LabImage(pW, pH); - provradius->CopyFrom(nprevl); + provradius = new LabImage(*nprevl, true); } - - - if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { - unshar = new LabImage(pW, pH); provis = params->wavelet.CLmethod; params->wavelet.CLmethod = "all"; ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); - - unshar->CopyFrom(nprevl); + unshar = new LabImage(*nprevl, true); params->wavelet.CLmethod = provis; diff --git a/rtengine/labimage.cc b/rtengine/labimage.cc index 319103d64..68d3857e5 100644 --- a/rtengine/labimage.cc +++ b/rtengine/labimage.cc @@ -32,12 +32,18 @@ LabImage::LabImage (int w, int h, bool initZero, bool multiThread) : W(w), H(h) } } +LabImage::LabImage (const LabImage& source, bool multiThread) : W(source.W), H(source.H) +{ + allocLab(W, H); + CopyFrom(&source, multiThread); +} + LabImage::~LabImage () { deleteLab(); } -void LabImage::CopyFrom(LabImage *Img, bool multiThread) +void LabImage::CopyFrom(const LabImage *Img, bool multiThread) { #ifdef _OPENMP #pragma omp parallel sections if(multiThread) @@ -54,7 +60,7 @@ void LabImage::CopyFrom(LabImage *Img, bool multiThread) #endif } -void LabImage::getPipetteData (float &v1, float &v2, float &v3, int posX, int posY, int squareSize) +void LabImage::getPipetteData (float &v1, float &v2, float &v3, int posX, int posY, int squareSize) const { float accumulator_L = 0.f; float accumulator_a = 0.f; diff --git a/rtengine/labimage.h b/rtengine/labimage.h index b4b974c29..4d1c05aed 100644 --- a/rtengine/labimage.h +++ b/rtengine/labimage.h @@ -36,11 +36,12 @@ public: float** b; LabImage (int w, int h, bool initZero = false, bool multiThread = true); + LabImage (const LabImage& source, bool multiThread); ~LabImage (); //Copies image data in Img into this instance. - void CopyFrom(LabImage *Img, bool multiThread = true); - void getPipetteData (float &L, float &a, float &b, int posX, int posY, int squareSize); + void CopyFrom(const LabImage *Img, bool multiThread = true); + void getPipetteData (float &L, float &a, float &b, int posX, int posY, int squareSize) const; void deleteLab(); void reallocLab(); void clear(bool multiThread = false); diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 6ab39b771..fc5c78997 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1081,10 +1081,8 @@ private: if (params.locallab.enabled && params.locallab.spots.size() > 0) { MyTime t1, t2; t1.set(); - const std::unique_ptr reservView(new LabImage(fw, fh)); - reservView->CopyFrom(labView); - const std::unique_ptr lastorigView(new LabImage(fw, fh)); - lastorigView->CopyFrom(labView); + const std::unique_ptr reservView(new LabImage(*labView, true)); + const std::unique_ptr lastorigView(new LabImage(*labView, true)); LocretigainCurve locRETgainCurve; LocretitransCurve locRETtransCurve; LocLHCurve loclhCurve; @@ -1370,8 +1368,7 @@ private: } */ if (WaveParams.softrad > 0.f) { - provradius = new LabImage(fw, fh); - provradius->CopyFrom(labView); + provradius = new LabImage(*labView, true); } params.wavelet.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); @@ -1379,11 +1376,10 @@ private: CurveFactory::curveWavContL(wavcontlutili, params.wavelet.wavclCurve, wavclCurve,/* hist16C, dummy,*/ 1); if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { - unshar = new LabImage(fw, fh); provis = params.wavelet.CLmethod; params.wavelet.CLmethod = "all"; ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); - unshar->CopyFrom(labView); + unshar = new LabImage(*labView, true); params.wavelet.CLmethod = provis; WaveParams.expcontrast = false;