diff --git a/rtdata/languages/default b/rtdata/languages/default index ca4044715..235645c46 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -986,6 +986,7 @@ HISTORY_MSG_745;Local - Exp Fattal Anchor HISTORY_MSG_746;Local - Exp Fattal levels HISTORY_MSG_747;Local Spot created HISTORY_MSG_748;Local - Exp Denoise +HISTORY_MSG_749;Local - Reti Depth HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2099,7 +2100,8 @@ TP_LOCALLAB_DARKRETI;Darkness TP_LOCALLAB_LIGHTRETI;Lightness TP_LOCALLAB_THRESRETI;Threshold TP_LOCALLAB_DENOIS;Denoise -TP_LOCALLAB_DEHAZ;Dehaze +TP_LOCALLAB_DEHAZ;Strength Dehaze +TP_LOCALLAB_DEPTH;Dehaze depth TP_LOCALLAB_EXPMETHOD_TOOLTIP;Standard : use an algorithm similar as main Exposure but in L*a*b* and taking account of deltaE.\n\nLaplacian & PDE : use another algorithm also with deltaE and with Poisson equation to solve Laplacian in Fourier space.\nPDE Ipol, PDE Fattal and Standard can be combined.\nFFTW Fourier Transform is optimized in size to reduce processing time.\nPDE reduce artifacts and noise. TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE Ipol - personal algorithm adapted from Ipol to Rawtherapee: lead to very different results and needs differents settings that Standard (negative black, gamma < 1,...)\nMay be usefull for low exposure.\n TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal - use Fattal Tone mapping algorithm.\nAnchor allows selection according to the images over or under exposed.\nUseful to increase Luminance for a Second spot near the current and using mask @@ -2190,7 +2192,7 @@ TP_LOCALLAB_RADIUS;Radius TP_LOCALLAB_RADMASKCOL;Radius TP_LOCALLAB_RESID;Residual Image TP_LOCALLAB_CONTRESID;Contrast -TP_LOCALLAB_RETI;Retinex - Strong local contrast +TP_LOCALLAB_RETI;Dehaze - Retinex Strong local contrast TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;Adapt these values according to images - if misty images and depending on whether you want to act on the front or the background TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improve quality and allow big radius.\nThe treatment time depends on the surface to be treated.\nTo be used preferably for large radius.\n\nDimensions can be reduced by a few pixels to optimize FFTW. TP_LOCALLAB_RETI_FFTW_TOOLTIP;FFT improve quality and allow big radius.\nThe treatment time depends on the surface to be treated.\nTo be used preferably for large radius.\n\nDimensions can be reduced by a few pixels to optimize FFTW.\nThis optimization is not possible if the 2 delimiters of the Spot (vertical or horizontal) are outside the image @@ -2206,7 +2208,7 @@ TP_LOCALLAB_SHOWDCT;Show process Fourier TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Show process Fourier:\nShows the different stages of the process.\nLaplace - builds the second derivative according to the threshold (first step).\nFourier -shows the transformed Laplacian with DCT.\nPoisson - show solution of Poisson DCE.\nNormalize - show result whithout normalization luminance. TP_LOCALLAB_SHOWNORMAL;Normalize luminance (no) TP_LOCALLAB_TM;Tone Mapping -TP_LOCALLAB_STR;Strength +TP_LOCALLAB_STR;Strength Retinex TP_LOCALLAB_NEIGH;Radius TP_LOCALLAB_VART;Contrast (variance) TP_LOCALLAB_SENSI;Scope diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 851c8ab9d..1aa5633a9 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -255,6 +255,7 @@ struct local_params { float transweak; float transgrad; int dehaze; + int depth; bool inv; bool invex; bool invsh; @@ -613,6 +614,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall int local_warm = locallab.spots.at(sp).warm; int local_sensih = locallab.spots.at(sp).sensih; int local_dehaze = locallab.spots.at(sp).dehaz; + int local_depth = locallab.spots.at(sp).depth; int local_sensicb = locallab.spots.at(sp).sensicb; float local_clarityml = (float) locallab.spots.at(sp).clarityml; float local_contresid = (float) locallab.spots.at(sp).contresid; @@ -772,6 +774,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.sens = local_sensi; lp.sensh = local_sensih; lp.dehaze = local_dehaze; + lp.depth = local_depth; lp.senscb = local_sensicb; lp.clarityml = local_clarityml; lp.contresid = local_contresid; @@ -3108,6 +3111,9 @@ void ImProcFunctions::transit_shapedetect(int senstype, const LabImage * bufexpo } else if (senstype == 3) //soft light { varsens = lp.senssf; + } else if (senstype == 30) //dehaze + { + varsens = lp.sensh; } else if (senstype == 6 || senstype == 7) //cbdl { varsens = lp.senscb; @@ -3384,7 +3390,7 @@ void ImProcFunctions::transit_shapedetect(int senstype, const LabImage * bufexpo } else if (senstype == 6 || senstype == 8 || senstype == 10) { difL = (bufexporig->L[y - ystart][x - xstart] - original->L[y][x]) * localFactor * reducdE; transformed->L[y][x] = CLIP(original->L[y][x] + difL); - } else if (senstype == 1 || senstype == 0 || senstype == 9 || senstype == 3) { + } else if (senstype == 1 || senstype == 0 || senstype == 9 || senstype == 3 || senstype == 30) { if (HHutili) { const float hhro = bufhh[y - ystart][x - xstart]; @@ -3420,7 +3426,7 @@ void ImProcFunctions::transit_shapedetect(int senstype, const LabImage * bufexpo const float chra = bufexporig->a[y - ystart][x - xstart]; const float chrb = bufexporig->b[y - ystart][x - xstart]; - if (senstype == 2 || senstype == 3 || senstype == 8 || senstype == 9 || senstype == 6 || senstype == 10) { + if (senstype == 2 || senstype == 3 || senstype == 30 || senstype == 8 || senstype == 9 || senstype == 6 || senstype == 10) { flia = flib = ((100.f + realstrchdE) / 100.f); } else if (senstype == 1) { @@ -3508,7 +3514,7 @@ void ImProcFunctions::transit_shapedetect(int senstype, const LabImage * bufexpo } else if (senstype == 6 || senstype == 8 || senstype == 10) { difL = (bufexporig->L[y - ystart][x - xstart] - original->L[y][x]) * reducdE; transformed->L[y][x] = CLIP(original->L[y][x] + difL); - } else if (senstype == 1 || senstype == 0 || senstype == 9 || senstype == 3) { + } else if (senstype == 1 || senstype == 0 || senstype == 9 || senstype == 3 || senstype == 30) { if (HHutili) { const float hhro = bufhh[y - ystart][x - xstart]; @@ -3544,7 +3550,7 @@ void ImProcFunctions::transit_shapedetect(int senstype, const LabImage * bufexpo const float chra = bufexporig->a[y - ystart][x - xstart]; const float chrb = bufexporig->b[y - ystart][x - xstart]; - if (senstype == 2 || senstype == 3 || senstype == 8 || senstype == 9 || senstype == 6 || senstype == 10) { + if (senstype == 2 || senstype == 3 || senstype == 30 || senstype == 8 || senstype == 9 || senstype == 6 || senstype == 10) { flia = flib = (100.f + realstrchdE) / 100.f; } else if (senstype == 1) { flia = (100.f + realstradE + 100.f * realstrchdE) / 100.f; @@ -5309,7 +5315,7 @@ void ImProcFunctions::fftw_denoise(int GW, int GH, int max_numblox_W, int min_nu noisevar_Ldetail = SQR(static_cast(SQR(100. - params_Ldetail) + 50.*(100. - params_Ldetail)) * TS * 0.5f); } else if (chrom == 1) { params_Ldetail = min(float(lp.noisechrodetail), 99.9f); - // noisevar_Ldetail = 100.f * pow((static_cast(SQR(100. - params_Ldetail) + 50.*(100. - params_Ldetail)) * TS * 0.5f), 2);//to test ??? + // noisevar_Ldetail = 100.f * pow((static_cast(SQR(100. - params_Ldetail) + 50.*(100. - params_Ldetail)) * TS * 0.5f), 2);//to test ??? noisevar_Ldetail = 100.f * pow((static_cast(SQR(100. - params_Ldetail)) * TS * 0.5f), 2);//to test ??? } @@ -5463,7 +5469,7 @@ void ImProcFunctions::DeNoise(int call, int del, float * slidL, float * slida, f float vari[levred]; float mxsl = 0.f; - // float mxsfl = 0.f; + // float mxsfl = 0.f; if (aut == 0) { if (levred == 7) { @@ -5489,8 +5495,8 @@ void ImProcFunctions::DeNoise(int call, int del, float * slidL, float * slida, f vari[0] = SQR(slidL[0]); vari[1] = SQR(slidL[1]); vari[2] = SQR(slidL[2]); - // float maxf01 = max(slidL[0], slidL[1]); - // mxsfl = max(maxf01, slidL[2]); + // float maxf01 = max(slidL[0], slidL[1]); + // mxsfl = max(maxf01, slidL[2]); vari[3] = SQR(slidL[3]); vari[4] = SQR(slidL[4]); @@ -5948,7 +5954,7 @@ void ImProcFunctions::DeNoise(int call, int del, float * slidL, float * slida, f if (!adecomp.memoryAllocationFailed && aut == 0) { if ((lp.noisecf >= 0.1f || lp.noisecc >= 0.1f) && levred == 7 && lp.noisechrodetail != 100.f) { - fftw_denoise(GW, GH, max_numblox_W, min_numblox_W, tmp1.a, Ain, numThreads, lp, 1); + fftw_denoise(GW, GH, max_numblox_W, min_numblox_W, tmp1.a, Ain, numThreads, lp, 1); } } @@ -5972,9 +5978,9 @@ void ImProcFunctions::DeNoise(int call, int del, float * slidL, float * slida, f if (!bdecomp.memoryAllocationFailed && aut == 0) { - if ((lp.noisecf >= 0.1f || lp.noisecc >= 0.1f) && levred == 7 && lp.noisechrodetail != 100.f) { - fftw_denoise(GW, GH, max_numblox_W, min_numblox_W, tmp1.b, Bin, numThreads, lp, 1); - } + if ((lp.noisecf >= 0.1f || lp.noisecc >= 0.1f) && levred == 7 && lp.noisechrodetail != 100.f) { + fftw_denoise(GW, GH, max_numblox_W, min_numblox_W, tmp1.b, Bin, numThreads, lp, 1); + } } @@ -6045,7 +6051,7 @@ void ImProcFunctions::DeNoise(int call, int del, float * slidL, float * slida, f float vari[levred]; float mxsl = 0.f; - // float mxsfl = 0.f; + // float mxsfl = 0.f; if (aut == 0) { if (levred == 7) { @@ -6071,8 +6077,8 @@ void ImProcFunctions::DeNoise(int call, int del, float * slidL, float * slida, f vari[0] = SQR(slidL[0]); vari[1] = SQR(slidL[1]); vari[2] = SQR(slidL[2]); - // float maxf01 = max(slidL[0], slidL[1]); - // mxsfl = max(maxf01, slidL[2]); + // float maxf01 = max(slidL[0], slidL[1]); + // mxsfl = max(maxf01, slidL[2]); vari[3] = SQR(slidL[3]); vari[4] = SQR(slidL[4]); @@ -6479,6 +6485,7 @@ void ImProcFunctions::DeNoise(int call, int del, float * slidL, float * slida, f #pragma omp parallel for #endif + for (int i = 0; i < bfh; ++i) { for (int j = 0; j < bfw; ++j) { (*Lin)[i][j] = bufwv.L[i][j]; @@ -6504,18 +6511,19 @@ void ImProcFunctions::DeNoise(int call, int del, float * slidL, float * slida, f #pragma omp parallel for #endif + for (int i = 0; i < bfh; ++i) { for (int j = 0; j < bfw; ++j) { (*Ain)[i][j] = bufwv.a[i][j]; } } - + adecomp.reconstruct(bufwv.a[0]); } if (!adecomp.memoryAllocationFailed && aut == 0) { if ((lp.noisecf >= 0.1f || lp.noisecc >= 0.1f) && levred == 7 && lp.noisechrodetail != 100.f) { - fftw_denoise(bfw, bfh, max_numblox_W, min_numblox_W, bufwv.a, Ain, numThreads, lp, 1); + fftw_denoise(bfw, bfh, max_numblox_W, min_numblox_W, bufwv.a, Ain, numThreads, lp, 1); } } @@ -6526,19 +6534,20 @@ void ImProcFunctions::DeNoise(int call, int del, float * slidL, float * slida, f #pragma omp parallel for #endif + for (int i = 0; i < bfh; ++i) { for (int j = 0; j < bfw; ++j) { (*Bin)[i][j] = bufwv.b[i][j]; } } - + bdecomp.reconstruct(bufwv.b[0]); } if (!bdecomp.memoryAllocationFailed && aut == 0) { - if ((lp.noisecf >= 0.1f || lp.noisecc >= 0.1f) && levred == 7 && lp.noisechrodetail != 100.f) { - fftw_denoise(bfw, bfh, max_numblox_W, min_numblox_W, bufwv.b, Bin, numThreads, lp, 1); - } + if ((lp.noisecf >= 0.1f || lp.noisecc >= 0.1f) && levred == 7 && lp.noisechrodetail != 100.f) { + fftw_denoise(bfw, bfh, max_numblox_W, min_numblox_W, bufwv.b, Bin, numThreads, lp, 1); + } } @@ -8596,6 +8605,65 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o // } //&& lp.retiena + + if (lp.dehaze > 0 && lp.str == 0.f && lp.retiena) { + 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; + std::unique_ptr bufexporig(new LabImage(bfw, bfh)); //buffer for data in zone limit + std::unique_ptr bufexpfin(new LabImage(bfw, bfh)); //buffer for data in zone limit + JaggedArray buflight(bfw, bfh); + JaggedArray bufl_ab(bfw, bfh); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int y = ystart; y < yend; y++) { + for (int x = xstart; x < xend; x++) { + bufexporig->L[y - ystart][x - xstart] = original->L[y][x]; + bufexporig->a[y - ystart][x - xstart] = original->a[y][x]; + bufexporig->b[y - ystart][x - xstart] = original->b[y][x]; + } + } + + bufexpfin->CopyFrom(bufexporig.get()); + //calc dehaze + Imagefloat *tmpImage = nullptr; + + if (lp.dehaze > 0) { + DehazeParams dehazeParams; + dehazeParams.enabled = true; + dehazeParams.strength = lp.dehaze; + dehazeParams.showDepthMap = false; + dehazeParams.depth = lp.depth; + tmpImage = new Imagefloat(bfw, bfh); + lab2rgb(*bufexpfin, *tmpImage, params->icm.workingProfile); + dehaze(tmpImage, dehazeParams); + rgb2lab(*tmpImage, *bufexpfin, params->icm.workingProfile); + + delete tmpImage; + } + + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + buflight[y][x] = CLIPRET((bufexpfin->L[y][x] - bufexporig->L[y][x]) / 328.f); + bufl_ab[y][x] = CLIPRET((sqrt(SQR(bufexpfin->a[y][x]) + SQR(bufexpfin->b[y][x])) - sqrt(SQR(bufexporig->a[y][x]) + SQR(bufexporig->b[y][x]))) / 250.f); + } + } + + bufexpfin.reset(); + transit_shapedetect(30, bufexporig.get(), nullptr, buflight, bufl_ab, nullptr, nullptr, nullptr, false, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } + if (lp.str > 0.f && lp.retiena) { int GW = transformed->W; int GH = transformed->H; @@ -8734,7 +8802,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o Imagefloat *tmpImage = nullptr; if (lp.dehaze > 0) { - const float depthcombi = 0.3f * params->locallab.spots.at(sp).neigh + 0.15f * (500.f - params->locallab.spots.at(sp).vart); + const float depthcombi = 0.5f * lp.depth + 0.5f * (0.3f * params->locallab.spots.at(sp).neigh + 0.15f * (500.f - params->locallab.spots.at(sp).vart)); DehazeParams dehazeParams; dehazeParams.enabled = true; dehazeParams.strength = 0.9f * lp.dehaze + 0.3f * lp.str; @@ -8789,7 +8857,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o bufreti = new LabImage(Wd, Hd); if (lp.dehaze > 0) { - const float depthcombi = 0.3f * params->locallab.spots.at(sp).neigh + 0.15f * (500.f - params->locallab.spots.at(sp).vart); + const float depthcombi = 0.5f * lp.depth + 0.5f * ( 0.3f * params->locallab.spots.at(sp).neigh + 0.15f * (500.f - params->locallab.spots.at(sp).vart)); DehazeParams dehazeParams; dehazeParams.enabled = true; dehazeParams.strength = 0.9f * lp.dehaze + 0.3f * lp.str; diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 536f25123..180c491b3 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -775,6 +775,7 @@ enum ProcEventCode { Evlocallabfatlevel = 745, EvLocallabSpotCreated = 746, EvlocallabexnoiseMethod = 747, + Evlocallabdepth = 748, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 97afedc9c..f1068cd93 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2578,9 +2578,10 @@ LocallabParams::LocallabSpot::LocallabSpot() : retinexMethod("high"), str(0.0), chrrt(0.0), - neigh(200.), - vart(70.), + neigh(0.1), + vart(0.1), dehaz(0), + depth(25), sensih(30), localTgaincurve{(double)FCT_MinMaxCPoints, 0.0, 0.12, 0.35, 0.35, 0.70, 0.50, 0.35, 0.35, 1.00, 0.12, 0.35, 0.35}, inversret(false), @@ -2596,7 +2597,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : chromaskreti(0.0), gammaskreti(1.0), slomaskreti(0.0), - scalereti(3.0), + scalereti(1.0), darkness(1.0), lightnessreti(1.0), limd(8.0), @@ -2842,6 +2843,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && neigh == other.neigh && vart == other.vart && dehaz == other.dehaz + && depth == other.depth && sensih == other.sensih && localTgaincurve == other.localTgaincurve && inversret == other.inversret @@ -4086,6 +4088,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).neigh, "Locallab", "Neigh_" + std::to_string(i), spot.neigh, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).vart, "Locallab", "Vart_" + std::to_string(i), spot.vart, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).dehaz, "Locallab", "Dehaz_" + std::to_string(i), spot.dehaz, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).depth, "Locallab", "Depth_" + std::to_string(i), spot.depth, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).sensih, "Locallab", "Sensih_" + std::to_string(i), spot.sensih, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).localTgaincurve, "Locallab", "TgainCurve_" + std::to_string(i), spot.localTgaincurve, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).inversret, "Locallab", "Inversret_" + std::to_string(i), spot.inversret, keyFile); @@ -5459,6 +5462,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Neigh_" + std::to_string(i), pedited, spot.neigh, spotEdited.neigh); assignFromKeyfile(keyFile, "Locallab", "Vart_" + std::to_string(i), pedited, spot.vart, spotEdited.vart); assignFromKeyfile(keyFile, "Locallab", "Dehaz_" + std::to_string(i), pedited, spot.dehaz, spotEdited.dehaz); + assignFromKeyfile(keyFile, "Locallab", "Depth_" + std::to_string(i), pedited, spot.depth, spotEdited.depth); assignFromKeyfile(keyFile, "Locallab", "Sensih_" + std::to_string(i), pedited, spot.sensih, spotEdited.sensih); assignFromKeyfile(keyFile, "Locallab", "TgainCurve_" + std::to_string(i), pedited, spot.localTgaincurve, spotEdited.localTgaincurve); assignFromKeyfile(keyFile, "Locallab", "Inversret_" + std::to_string(i), pedited, spot.inversret, spotEdited.inversret); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index dea1e81af..79e432150 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1131,6 +1131,7 @@ struct LocallabParams { double neigh; double vart; int dehaz; + int depth; int sensih; std::vector localTgaincurve; bool inversret; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 8b06e9230..927ecbd17 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -774,7 +774,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //Evlocallabfatanchor LUMINANCECURVE, //Evlocallabfatlevel LUMINANCECURVE, //EvlocallabSpotCreated - LUMINANCECURVE // EvlocallabexnoiseMethod + LUMINANCECURVE, // EvlocallabexnoiseMethod + LUMINANCECURVE // Evlocallabdepth }; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 32f6ddf1b..5645c4346 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -36,7 +36,7 @@ #define MINCHRO 0. #define MAXCHRO 150 #define MAXCHROCC 100 -#define MINNEIGH 4 +#define MINNEIGH 0.1 #define MAXNEIGH 5000 #define CENTERNEIGH 200 @@ -267,11 +267,10 @@ Locallab::Locallab(): // Retinex str(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STR"), 0., 100., 0.1, 0.0))), chrrt(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHRRT"), 0.0, 100.0, 0.1, 0.0))), - neigh(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NEIGH"), MINNEIGH, MAXNEIGH, 0.5, CENTERNEIGH, nullptr, nullptr, &retiSlider2neigh, &retiNeigh2Slider))), - - // neigh(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NEIGH"), 4., 4000., 0.5, 50.))), - vart(Gtk::manage(new Adjuster(M("TP_LOCALLAB_VART"), 4.0, 500., 0.1, 70.))), + neigh(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NEIGH"), MINNEIGH, MAXNEIGH, 0.5, 0.1, nullptr, nullptr, &retiSlider2neigh, &retiNeigh2Slider))), + vart(Gtk::manage(new Adjuster(M("TP_LOCALLAB_VART"), 0.1, 500., 0.1, 0.1))), dehaz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DEHAZ"), 0, 100, 1, 0))), + depth(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DEPTH"), 0, 100, 1, 25))), sensih(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSIH"), 0, 100, 1, 30))), softradiusret(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GUIDFILTER"), 0.0, 100.0, 0.5, 0.))), blendmaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKCOL"), -100, 100, 1, 0))), @@ -279,7 +278,7 @@ Locallab::Locallab(): chromaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), gammaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMMASKCOL"), 0.05, 5.0, 0.01, 1.))), slomaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOMASKCOL"), 0.0, 15.0, 0.1, 0.))), - scalereti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SCALERETI"), 1.0, 10.0, 1., 3.))), + scalereti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SCALERETI"), 1.0, 10.0, 1., 1.))), darkness(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DARKRETI"), 0.01, 3.0, 0.01, 1.))), lightnessreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LIGHTRETI"), 0.01, 3.0, 0.01, 1.))), limd(Gtk::manage(new Adjuster(M("TP_LOCALLAB_THRESRETI"), 1.2, 100.0, 0.1, 8.))), @@ -411,7 +410,9 @@ Locallab::Locallab(): fatFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_FATFRA")))), residFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_RESID")))), clariFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CLARIFRA")))), - +// retiBox(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CLARIFRA")))), + retiBox(Gtk::manage(new ToolParamBlock())), + maskretiBox(Gtk::manage(new ToolParamBlock())), // Others defparams(nullptr), defpedited(nullptr), @@ -706,6 +707,7 @@ Locallab::Locallab(): if (showtooltip) { exnoiseMethod->set_tooltip_text(M("TP_LOCALLAB_EXPMETHOD_TOOLTIP")); } + ctboxexpmethod->pack_start(*exnoiseMethod); setExpandAlignProperties(expmaskexp, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); @@ -838,9 +840,11 @@ Locallab::Locallab(): pdeFrame->set_label_align(0.025, 0.5); + if (showtooltip) { pdeFrame->set_tooltip_text(M("TP_LOCALLAB_PDEFRAME_TOOLTIP")); } + ToolParamBlock* const pdeBox = Gtk::manage(new ToolParamBlock()); pdeBox->pack_start(*laplacexp); pdeBox->pack_start(*linear); @@ -849,9 +853,11 @@ Locallab::Locallab(): pdeBox->pack_start(*ctboxexpmethod); fatFrame->set_label_align(0.025, 0.5); + if (showtooltip) { fatFrame->set_tooltip_text(M("TP_LOCALLAB_FATFRAME_TOOLTIP")); } + ToolParamBlock* const fatBox = Gtk::manage(new ToolParamBlock()); fatBox->pack_start(*fatamount); fatBox->pack_start(*fatdetail); @@ -1326,6 +1332,7 @@ Locallab::Locallab(): } dehaz->setAdjusterListener(this); + depth->setAdjusterListener(this); chrrt->setAdjusterListener(this); @@ -1419,7 +1426,7 @@ Locallab::Locallab(): lightnessreti->setAdjusterListener(this); limd->setAdjusterListener(this); - ToolParamBlock* const maskretiBox = Gtk::manage(new ToolParamBlock()); +// ToolParamBlock* const maskretiBox = Gtk::manage(new ToolParamBlock()); maskretiBox->pack_start(*showmaskretiMethod, Gtk::PACK_SHRINK, 4); maskretiBox->pack_start(*enaretiMask, Gtk::PACK_SHRINK, 0); maskretiBox->pack_start(*enaretiMasktmap, Gtk::PACK_SHRINK, 0); @@ -1431,11 +1438,22 @@ Locallab::Locallab(): maskretiBox->pack_start(*slomaskreti, Gtk::PACK_SHRINK, 0); expmaskreti->add(*maskretiBox, false); - ToolParamBlock* const retiBox = Gtk::manage(new ToolParamBlock()); + ToolParamBlock* const dehaBox = Gtk::manage(new ToolParamBlock()); + dehaBox->pack_start(*dehaz); + dehaBox->pack_start(*depth); + dehaBox->pack_start(*str); + expreti->add(*dehaBox, false); + + ToolParamBlock* const scopeBox = Gtk::manage(new ToolParamBlock()); + scopeBox->pack_start(*sensih); + expreti->add(*scopeBox, false); + +// ToolParamBlock* const retiBox = Gtk::manage(new ToolParamBlock()); retiBox->pack_start(*retinexMethod); retiBox->pack_start(*fftwreti); retiBox->pack_start(*equilret); - retiBox->pack_start(*str); +// retiBox->pack_start(*str); +// retiBox->pack_start(*dehaz); retiBox->pack_start(*chrrt); retiBox->pack_start(*neigh); retiBox->pack_start(*vart); @@ -1443,9 +1461,8 @@ Locallab::Locallab(): retiBox->pack_start(*limd); retiBox->pack_start(*darkness); retiBox->pack_start(*lightnessreti); - retiBox->pack_start(*dehaz); retiBox->pack_start(*softradiusret); - retiBox->pack_start(*sensih); +// retiBox->pack_start(*sensih); retiBox->pack_start(*LocalcurveEditorgainT, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor retiBox->pack_start(*expmaskreti); retiBox->pack_start(*inversret); @@ -1936,7 +1953,7 @@ Locallab::Locallab(): noiselumc->setAdjusterListener(this); noiselumdetail->setAdjusterListener(this); - + if (showtooltip) { noiselumdetail->set_tooltip_text(M("TP_LOCALLAB_NOISEDETAIL_TOOLTIP")); } @@ -2874,7 +2891,8 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).exnoiseMethod = "med"; } else if (exnoiseMethod->get_active_row_number() == 2) { pp->locallab.spots.at(pp->locallab.selspot).exnoiseMethod = "medhi"; - } + } + /* } else if (exnoiseMethod->get_active_row_number() == 3) { pp->locallab.spots.at(pp->locallab.selspot).exnoiseMethod = "wavlo"; @@ -3016,6 +3034,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).neigh = neigh->getValue(); pp->locallab.spots.at(pp->locallab.selspot).vart = vart->getValue(); pp->locallab.spots.at(pp->locallab.selspot).dehaz = dehaz->getIntValue(); + pp->locallab.spots.at(pp->locallab.selspot).depth = depth->getIntValue(); pp->locallab.spots.at(pp->locallab.selspot).sensih = sensih->getIntValue(); pp->locallab.spots.at(pp->locallab.selspot).localTgaincurve = cTgainshape->getCurve(); pp->locallab.spots.at(pp->locallab.selspot).inversret = inversret->get_active(); @@ -3285,6 +3304,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pe->locallab.spots.at(pp->locallab.selspot).neigh = pe->locallab.spots.at(pp->locallab.selspot).neigh || neigh->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).vart = pe->locallab.spots.at(pp->locallab.selspot).vart || vart->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).dehaz = pe->locallab.spots.at(pp->locallab.selspot).dehaz || dehaz->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).depth = pe->locallab.spots.at(pp->locallab.selspot).depth || depth->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).sensih = pe->locallab.spots.at(pp->locallab.selspot).sensih || sensih->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).localTgaincurve = pe->locallab.spots.at(pp->locallab.selspot).localTgaincurve || !cTgainshape->isUnChanged(); pe->locallab.spots.at(pp->locallab.selspot).inversret = pe->locallab.spots.at(pp->locallab.selspot).inversret || !inversret->get_inconsistent(); @@ -3552,6 +3572,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).neigh = pedited->locallab.spots.at(pp->locallab.selspot).neigh || neigh->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).vart = pedited->locallab.spots.at(pp->locallab.selspot).vart || vart->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).dehaz = pedited->locallab.spots.at(pp->locallab.selspot).dehaz || dehaz->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).depth = pedited->locallab.spots.at(pp->locallab.selspot).depth || depth->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).sensih = pedited->locallab.spots.at(pp->locallab.selspot).sensih || sensih->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).localTgaincurve = pedited->locallab.spots.at(pp->locallab.selspot).localTgaincurve || !cTgainshape->isUnChanged(); pedited->locallab.spots.at(pp->locallab.selspot).inversret = pedited->locallab.spots.at(pp->locallab.selspot).inversret || !inversret->get_inconsistent(); @@ -4241,7 +4262,7 @@ void Locallab::exnoiseMethodChanged() if (getEnabled() && expexpose->getEnabled()) { if (listener) { - listener->panelChanged(EvlocallabexnoiseMethod, exnoiseMethod->get_active_text() ); + listener->panelChanged(EvlocallabexnoiseMethod, exnoiseMethod->get_active_text()); } } } @@ -5071,11 +5092,13 @@ void Locallab::inversretChanged() } else if (inversret->get_active()) { sensih->show(); dehaz->show(); + depth->show(); softradiuscol->show(); expmaskreti->hide(); } else { sensih->show(); dehaz->show(); + depth->show(); softradiusret->show(); expmaskreti->show(); } @@ -5256,6 +5279,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe neigh->setDefault(defSpot->neigh); vart->setDefault(defSpot->vart); dehaz->setDefault((double)defSpot->dehaz); + depth->setDefault((double)defSpot->depth); sensih->setDefault((double)defSpot->sensih); softradiusret->setDefault(defSpot->softradiusret); blendmaskreti->setDefault((double)defSpot->blendmaskreti); @@ -5418,6 +5442,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe neigh->setDefaultEditedState(Irrelevant); vart->setDefaultEditedState(Irrelevant); dehaz->setDefaultEditedState(Irrelevant); + depth->setDefaultEditedState(Irrelevant); sensih->setDefaultEditedState(Irrelevant); softradiusret->setDefaultEditedState(Irrelevant); blendmaskreti->setDefaultEditedState(Irrelevant); @@ -5584,6 +5609,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe neigh->setDefaultEditedState(defSpotState->neigh ? Edited : UnEdited); vart->setDefaultEditedState(defSpotState->vart ? Edited : UnEdited); dehaz->setDefaultEditedState(defSpotState->dehaz ? Edited : UnEdited); + depth->setDefaultEditedState(defSpotState->depth ? Edited : UnEdited); sensih->setDefaultEditedState(defSpotState->sensih ? Edited : UnEdited); softradiusret->setDefaultEditedState(defSpotState->softradiusret ? Edited : UnEdited); blendmaskreti->setDefaultEditedState(defSpotState->blendmaskreti ? Edited : UnEdited); @@ -6232,6 +6258,12 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) // Retinex if (getEnabled() && expreti->getEnabled()) { if (a == str) { + if (str->getValue() >= 0.1f) { + retiBox->show(); + } else { + retiBox->hide(); + } + if (listener) { listener->panelChanged(Evlocallabstr, str->getTextValue()); } @@ -6261,6 +6293,12 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + if (a == depth) { + if (listener) { + listener->panelChanged(Evlocallabdepth, depth->getTextValue()); + } + } + if (a == sensih) { if (listener) { listener->panelChanged(Evlocallabsensih, sensih->getTextValue()); @@ -6746,6 +6784,7 @@ void Locallab::setBatchMode(bool batchMode) neigh->showEditedCB(); vart->showEditedCB(); dehaz->showEditedCB(); + depth->showEditedCB(); sensih->showEditedCB(); softradiusret->showEditedCB(); blendmaskreti->showEditedCB(); @@ -7210,6 +7249,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con } else if (pp->locallab.spots.at(index).exnoiseMethod == "medhi") { exnoiseMethod->set_active(2); } + /* } else if (pp->locallab.spots.at(index).exnoiseMethod == "wavlo") { exnoiseMethod->set_active(3); @@ -7355,6 +7395,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con neigh->setValue(pp->locallab.spots.at(index).neigh); vart->setValue(pp->locallab.spots.at(index).vart); dehaz->setValue(pp->locallab.spots.at(index).dehaz); + depth->setValue(pp->locallab.spots.at(index).depth); sensih->setValue(pp->locallab.spots.at(index).sensih); cTgainshape->setCurve(pp->locallab.spots.at(index).localTgaincurve); inversret->set_active(pp->locallab.spots.at(index).inversret); @@ -7674,6 +7715,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con neigh->setEditedState(spotState->neigh ? Edited : UnEdited); vart->setEditedState(spotState->vart ? Edited : UnEdited); dehaz->setEditedState(spotState->dehaz ? Edited : UnEdited); + depth->setEditedState(spotState->depth ? Edited : UnEdited); sensih->setEditedState(spotState->sensih ? Edited : UnEdited); cTgainshape->setUnChanged(!spotState->localTgaincurve); inversret->set_inconsistent(multiImage && !spotState->inversret); @@ -7996,6 +8038,13 @@ void Locallab::updateSpecificGUIState() softradiusret->show(); } + if (str->getValue() >= 0.1f) { + retiBox->show(); + } else { + retiBox->hide(); + } + + if (localcontMethod->get_active_row_number() == 0) { levelwav->hide(); residcont->hide(); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 9b763efe4..9ea657417 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -218,6 +218,7 @@ private: Adjuster* const neigh; Adjuster* const vart; Adjuster* const dehaz; + Adjuster* const depth; Adjuster* const sensih; Adjuster* const softradiusret; @@ -401,6 +402,8 @@ private: Gtk::Frame* fatFrame; Gtk::Frame* residFrame; Gtk::Frame* clariFrame; + ToolParamBlock * retiBox; + ToolParamBlock * maskretiBox; LabGrid *labgrid; // Others Gtk::HBox* ctboxsoftmethod; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 7381dc845..b7bf2e009 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1121,6 +1121,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).neigh = locallab.spots.at(j).neigh && pSpot.neigh == otherSpot.neigh; locallab.spots.at(j).vart = locallab.spots.at(j).vart && pSpot.vart == otherSpot.vart; locallab.spots.at(j).dehaz = locallab.spots.at(j).dehaz && pSpot.dehaz == otherSpot.dehaz; + locallab.spots.at(j).depth = locallab.spots.at(j).depth && pSpot.depth == otherSpot.depth; locallab.spots.at(j).sensih = locallab.spots.at(j).sensih && pSpot.sensih == otherSpot.sensih; locallab.spots.at(j).localTgaincurve = locallab.spots.at(j).localTgaincurve && pSpot.localTgaincurve == otherSpot.localTgaincurve; locallab.spots.at(j).inversret = locallab.spots.at(j).inversret && pSpot.inversret == otherSpot.inversret; @@ -3331,6 +3332,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).dehaz = mods.locallab.spots.at(i).dehaz; } + if (locallab.spots.at(i).depth) { + toEdit.locallab.spots.at(i).depth = mods.locallab.spots.at(i).depth; + } + if (locallab.spots.at(i).sensih) { toEdit.locallab.spots.at(i).sensih = mods.locallab.spots.at(i).sensih; } @@ -4775,6 +4780,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : neigh(v), vart(v), dehaz(v), + depth(v), sensih(v), localTgaincurve(v), inversret(v), @@ -5033,6 +5039,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) neigh = v; vart = v; dehaz = v; + depth = v; sensih = v; localTgaincurve = v; inversret = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 0370e8a3b..adb2e5cb9 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -541,6 +541,7 @@ public: bool neigh; bool vart; bool dehaz; + bool depth; bool sensih; bool localTgaincurve; bool inversret;