From e9218c314fb67a6c96b3eeac0aa0209f9dae4a53 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 7 Jun 2020 23:20:52 +0200 Subject: [PATCH] iplocallab.cc: further cleanups --- rtengine/iplocallab.cc | 279 ++++++++++------------------------------- 1 file changed, 68 insertions(+), 211 deletions(-) diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 061174ed1..57dc51bcd 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -13932,7 +13932,7 @@ void ImProcFunctions::Lab_Local( //inverse else if (lp.invex && (lp.expcomp != 0.0 || lp.laplacexp > 0.1f || params->locallab.spots.at(sp).fatamount > 1.f || (exlocalcurve && localexutili) || lp.enaExpMaskinv || lp.showmaskexpmetinv == 1) && lp.exposena) { - float adjustr = 2.f; + constexpr float adjustr = 2.f; std::unique_ptr bufmaskblurexp; std::unique_ptr originalmaskexp; const std::unique_ptr bufexporig(new LabImage(GW, GH)); @@ -13952,51 +13952,38 @@ void ImProcFunctions::Lab_Local( } } - int inv = 1; - bool showmaske = false; - bool enaMask = false; - bool deltaE = false; - bool modmask = false; - bool zero = false; - bool modif = false; - - if (lp.showmaskexpmetinv == 1) { - showmaske = true; - } - - if (lp.enaExpMaskinv) { - enaMask = true; - } - - if (lp.showmaskexpmetinv == 0) { - zero = true; - } - - float chrom = lp.chromaexp; - float rad = lp.radmaexp; - float gamma = lp.gammaexp; - float slope = lp.slomaexp; - float blendm = lp.blendmaexp; - float lap = params->locallab.spots.at(sp).lapmaskexp; - bool pde = params->locallab.spots.at(sp).laplac; + constexpr int inv = 1; + const bool showmaske = lp.showmaskexpmetinv == 1; + const bool enaMask = lp.enaExpMaskinv; + constexpr bool deltaE = false; + constexpr bool modmask = false; + const bool zero = lp.showmaskexpmetinv == 0; + constexpr bool modif = false; + const float chrom = lp.chromaexp; + const float rad = lp.radmaexp; + const float gamma = lp.gammaexp; + const float slope = lp.slomaexp; + const float blendm = lp.blendmaexp; + const float lap = params->locallab.spots.at(sp).lapmaskexp; + const bool pde = params->locallab.spots.at(sp).laplac; LocwavCurve dummy; - bool lmasutilicolwav = false; + const bool lmasutilicolwav = false; // bool delt = params->locallab.spots.at(sp).deltae; - bool delt = false; - int sco = params->locallab.spots.at(sp).scopemask; - int shado = 0; - int shortcu = 0;//lp.mergemet; //params->locallab.spots.at(sp).shortc; - int lumask = params->locallab.spots.at(sp).lumask; + const bool delt = false; + const int sco = params->locallab.spots.at(sp).scopemask; + constexpr int shado = 0; + constexpr int shortcu = 0;//lp.mergemet; //params->locallab.spots.at(sp).shortc; + const int lumask = params->locallab.spots.at(sp).lumask; - const int limscope = 80; + constexpr int limscope = 80; const float mindE = 2.f + MINSCOPE * sco * lp.thr; const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); - float amountcd = 0.f; - float anchorcd = 50.f; + constexpr float amountcd = 0.f; + constexpr float anchorcd = 50.f; LocHHmaskCurve lochhhmasCurve; - bool lhhmasutili = false; + constexpr bool lhhmasutili = false; maskcalccol(false, pde, GW, GH, 0, 0, sk, cx, cy, bufexporig.get(), bufmaskblurexp.get(), originalmaskexp.get(), original, reserved, inv, lp, 0.f, false, @@ -14008,7 +13995,6 @@ void ImProcFunctions::Lab_Local( if (lp.showmaskexpmetinv == 1) { showmask(lumask, lp, 0, 0, cx, cy, GW, GH, bufexporig.get(), transformed, bufmaskblurexp.get(), inv); - return; } @@ -14019,138 +14005,45 @@ void ImProcFunctions::Lab_Local( float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); } - } - //local color and light const float factor = LocallabParams::LABGRIDL_CORR_MAX * 3.276f; const float scaling = LocallabParams::LABGRIDL_CORR_SCALE; const float scaledirect = LocallabParams::LABGRIDL_DIRECT_SCALE; - float a_scale = (lp.highA - lp.lowA) / factor / scaling; - float a_base = lp.lowA / scaling; - float b_scale = (lp.highB - lp.lowB) / factor / scaling; - float b_base = lp.lowB / scaling; - bool ctoning = (a_scale != 0.f || b_scale != 0.f || a_base != 0.f || b_base != 0.f); - - float a_scalemerg = (lp.highAmerg - lp.lowAmerg) / factor / scaling; - float a_basemerg = lp.lowAmerg / scaling; - float b_scalemerg = (lp.highBmerg - lp.lowBmerg) / factor / scaling; - float b_basemerg = lp.lowBmerg / scaling; - bool ctoningmerg = (a_scalemerg != 0.f || b_scalemerg != 0.f || a_basemerg != 0.f || b_basemerg != 0.f); + const float a_scale = (lp.highA - lp.lowA) / factor / scaling; + const float a_base = lp.lowA / scaling; + const float b_scale = (lp.highB - lp.lowB) / factor / scaling; + const float b_base = lp.lowB / scaling; + const bool ctoning = (a_scale != 0.f || b_scale != 0.f || a_base != 0.f || b_base != 0.f); + const float a_scalemerg = (lp.highAmerg - lp.lowAmerg) / factor / scaling; + const float a_basemerg = lp.lowAmerg / scaling; + const float b_scalemerg = (lp.highBmerg - lp.lowBmerg) / factor / scaling; + const float b_basemerg = lp.lowBmerg / scaling; + const bool ctoningmerg = (a_scalemerg != 0.f || b_scalemerg != 0.f || a_basemerg != 0.f || b_basemerg != 0.f); if (!lp.inv && (lp.chro != 0 || lp.ligh != 0.f || lp.cont != 0 || ctoning || lp.mergemet > 0 || lp.strcol != 0.f || lp.strcolab != 0.f || lp.qualcurvemet != 0 || lp.showmaskcolmet == 2 || lp.enaColorMask || lp.showmaskcolmet == 3 || lp.showmaskcolmet == 4 || lp.showmaskcolmet == 5 || lp.prevdE) && lp.colorena) { // || lllocalcurve)) { //interior ellipse renforced lightness and chroma //locallutili - /* - //test for fftw blur with tiles fftw_tile_blur....not good we can see tiles - very long time - int GW = original->W; - int GH = original->H; - MyMutex::MyLock lock (*fftwMutex); - - double radius = 100.f; - int tilssize = 64; - #ifdef _OPENMP - const int numThreads = omp_get_max_threads(); - #else - const int numThreads = 1; - - #endif - int max_numblox_W = ceil((static_cast(GW)) / offset) + 2; - // calculate min size of numblox_W. - int min_numblox_W = ceil((static_cast(GW)) / offset) + 2; - fftw_tile_blur(GW, GH, tilssize , max_numblox_W, min_numblox_W, original->L, numThreads, radius); - */ - - -//test for fftw blur with fftw_convol_blur: good result speedup moderate , but less used of memory than gaussianblur - -//with FFTW curious results ex with playraw23_hombre.pef - size 4942*3276 -// with size 4942*3276 time for tIF 3200ms -// with size 4941*3275 time for TIF 950ms...no differences in TIF and with 4928*3250 (2^6 * 7 * 11) * (2 * 5^3 * 13) = 520ms -// "step" to reproduce about 6 pixels -//another strange with DSCF1337.RAF 4012*6018 time 1318ms -// with 4004*6016 time 1091ms -//with 4004*6013 time 4057ms...steps seem also about 6 or 8 -//NEF D200 best with 3888 * 2607 instead of 3892 2608 -//D700 4275*2835 instead 4276*2836 -//PANA LX100 4120*3095 instead of 4120*3096 -//I have compared many things with FFTF COS -0.5 2*n -0.5, prime factor decomposition....nothing found -//I have read doc...nothing about that -//doc says optimum is with size 2^a * 3^b * 5^c * 7^d * 11^e * 13^f with e+f = 0 or 1 -//we must found a number below of size as this -//combinaison -//see above fftw_size - - /* - int GW = 4928/SQR(sk); //original->W-lp.ligh;//for test change size W - int GH = 3250/SQR(sk);//original->H- lp.cont;//test for chnage size H - printf("Gw=%i Gh=%i\n", GW, GH); - MyMutex::MyLock lock (*fftwMutex); - - - float *datain = nullptr; //new float[GW*GH]; - datain = (float*) fftwf_malloc(sizeof(float) * (GW * GH));//allocate real datas for FFT - - float *dataout = new float[GW*GH]; - float radius = 500.f; - #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) - #endif - for (int y = 0; y < GH; y++) { - for (int x = 0; x < GW; x++) { - datain[y * GW + x] =original->L[y][x]; - } - } - fftw_convol_blur(datain, dataout, GW, GH, radius, 0); - #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) - #endif - for (int y = 0; y < GH; y++) { - for (int x = 0; x < GW; x++) { - original->L[y][x] = dataout[y * GW + x]; - } - } - - delete [] dataout; - fftwf_free(datain); - */ - - int ystart = std::max(static_cast(lp.yc - lp.lyT) - cy, 0); int yend = std::min(static_cast(lp.yc + lp.ly) - cy, original->H); int xstart = std::max(static_cast(lp.xc - lp.lxL) - cx, 0); int xend = std::min(static_cast(lp.xc + lp.lx) - cx, original->W); int bfh = yend - ystart; int bfw = xend - xstart; - bool spez = params->locallab.spots.at(sp).special; - int bfhr = bfh; - int bfwr = bfw; - // printf("bfw=%i bfh=%i lpx=%f lpy=%f lpxL=%f lpYT=%f\n", bfw, bfh, lp.lx, lp.ly, lp.lxL, lp.lyT); + const bool spez = params->locallab.spots.at(sp).special; if (bfw >= mSP && bfh >= mSP) { if (lp.blurcolmask >= 0.25f && lp.fftColorMask && call == 2) { - optfft(N_fftwsize, bfh, bfw, bfhr, bfwr, lp, original->H, original->W, xstart, ystart, xend, yend, cx, cy); + optfft(N_fftwsize, bfh, bfw, bfh, bfw, lp, original->H, original->W, xstart, ystart, xend, yend, cx, cy); } - //printf("bfwred=%i bfhred=%i lpx=%f lpy=%f lpxL=%f lpYT=%f\n", bfwr, bfhr, lp.lx, lp.ly, lp.lxL, lp.lyT); - - bfh = bfhr; - bfw = bfwr; - std::unique_ptr bufcolorig; std::unique_ptr bufcolfin; std::unique_ptr bufmaskblurcol; std::unique_ptr originalmaskcol; std::unique_ptr bufcolreserv; std::unique_ptr buftemp; - -// array2D buflight(bfw, bfh, true); -// JaggedArray bufchro(bfw, bfh, true); -// JaggedArray bufhh(bfw, bfh, true); - array2D blend2; -// JaggedArray buf_a(bfw, bfh, true); -// JaggedArray buf_b(bfw, bfh, true); float adjustr = 1.0f; @@ -14184,7 +14077,6 @@ void ImProcFunctions::Lab_Local( #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) #endif - for (int y = 0; y < bfh ; y++) { for (int x = 0; x < bfw; x++) { bufcolorig->L[y][x] = original->L[y + ystart][x + xstart]; @@ -14210,7 +14102,6 @@ void ImProcFunctions::Lab_Local( #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) #endif - for (int y = ystart; y < yend ; y++) { for (int x = xstart; x < xend; x++) { const int lox = cx + x; @@ -14232,65 +14123,38 @@ void ImProcFunctions::Lab_Local( } } } - return; } - } - int inv = 0; - bool showmaske = false; - bool enaMask = false; - bool deltaE = false; - bool modmask = false; - bool zero = false; - bool modif = false; - - if (lp.showmaskcolmet == 3) { - showmaske = true; - } - - if (lp.enaColorMask) { - enaMask = true; - } - - if (lp.showmaskcolmet == 5) { - deltaE = true; - } - - if (lp.showmaskcolmet == 2) { - modmask = true; - } - - if (lp.showmaskcolmet == 1) { - modif = true; - } - - if (lp.showmaskcolmet == 0) { - zero = true; - } - - float chrom = lp.chromacol; - float rad = lp.radmacol; - float gamma = lp.gammacol; - float slope = lp.slomacol; - float blendm = lp.blendmacol; - float lap = params->locallab.spots.at(sp).lapmaskcol; - bool pde = params->locallab.spots.at(sp).laplac; - int shado = params->locallab.spots.at(sp).shadmaskcol; - int sco = params->locallab.spots.at(sp).scopemask; - int level_bl = params->locallab.spots.at(sp).csthresholdcol.getBottomLeft(); - int level_hl = params->locallab.spots.at(sp).csthresholdcol.getTopLeft(); - int level_br = params->locallab.spots.at(sp).csthresholdcol.getBottomRight(); - int level_hr = params->locallab.spots.at(sp).csthresholdcol.getTopRight(); - int shortcu = lp.mergemet; //params->locallab.spots.at(sp).shortc; - int lumask = params->locallab.spots.at(sp).lumask; - float strumask = 0.02f * (float) params->locallab.spots.at(sp).strumaskcol; + const int inv = 0; + const bool showmaske = lp.showmaskcolmet == 3; + const bool enaMask = lp.enaColorMask; + const bool deltaE = lp.showmaskcolmet == 5; + const bool modmask = lp.showmaskcolmet == 2; + const bool zero = lp.showmaskcolmet == 0; + const bool modif = lp.showmaskcolmet == 1; + const float chrom = lp.chromacol; + const float rad = lp.radmacol; + const float gamma = lp.gammacol; + const float slope = lp.slomacol; + const float blendm = lp.blendmacol; + const float lap = params->locallab.spots.at(sp).lapmaskcol; + const bool pde = params->locallab.spots.at(sp).laplac; + const int shado = params->locallab.spots.at(sp).shadmaskcol; + const int sco = params->locallab.spots.at(sp).scopemask; + const int level_bl = params->locallab.spots.at(sp).csthresholdcol.getBottomLeft(); + const int level_hl = params->locallab.spots.at(sp).csthresholdcol.getTopLeft(); + const int level_br = params->locallab.spots.at(sp).csthresholdcol.getBottomRight(); + const int level_hr = params->locallab.spots.at(sp).csthresholdcol.getTopRight(); + const int shortcu = lp.mergemet; //params->locallab.spots.at(sp).shortc; + const int lumask = params->locallab.spots.at(sp).lumask; + const float strumask = 0.02f * (float) params->locallab.spots.at(sp).strumaskcol; float conthr = 0.01f * params->locallab.spots.at(sp).conthrcol; - int tonemod = 0; - float mercol = params->locallab.spots.at(sp).mercol; - float merlucol = params->locallab.spots.at(sp).merlucol; + const float mercol = params->locallab.spots.at(sp).mercol; + const float merlucol = params->locallab.spots.at(sp).merlucol; + int tonemod = 0; if (params->locallab.spots.at(sp).toneMethod == "one") { tonemod = 0; } else if (params->locallab.spots.at(sp).toneMethod == "two") { @@ -14301,13 +14165,13 @@ void ImProcFunctions::Lab_Local( tonemod = 3; } - const int limscope = 80; + constexpr int limscope = 80; const float mindE = 2.f + MINSCOPE * sco * lp.thr; const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); - float amountcd = 0.f; - float anchorcd = 50.f; + const float amountcd = 0.f; + const float anchorcd = 50.f; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, reserved, inv, lp, strumask, astool, @@ -14320,11 +14184,8 @@ void ImProcFunctions::Lab_Local( if (lp.showmaskcolmet == 3) { showmask(lumask, lp, xstart, ystart, cx, cy, bfw, bfh, bufcolorig.get(), transformed, bufmaskblurcol.get(), 0); - return; - } - - if (lp.showmaskcolmet == 4) { + } else if (lp.showmaskcolmet == 4) { return; } @@ -14334,9 +14195,7 @@ void ImProcFunctions::Lab_Local( if (rgblocalcurve && localrgbutili && lp.qualcurvemet != 0) { usergb = true; - - Imagefloat *tmpImage = nullptr; - tmpImage = new Imagefloat(bfw, bfh); + Imagefloat *tmpImage = new Imagefloat(bfw, bfh); float *rtemp = new float[bfw * bfh]; float *gtemp = new float[bfw * bfh]; @@ -14353,8 +14212,6 @@ void ImProcFunctions::Lab_Local( gtemp[y * bfw + x] = tmpImage->g(y, x); btemp[y * bfw + x] = tmpImage->b(y, x); - assert(rgblocalcurve); - //std if (tonemod == 0) { curves::setLutVal(rgblocalcurve, rtemp[y * bfw + x], gtemp[y * bfw + x], btemp[y * bfw + x]);