diff --git a/rtdata/languages/default b/rtdata/languages/default index b36815757..06085613b 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1106,6 +1106,14 @@ HISTORY_MSG_865;Local - Contrast Anchor HISTORY_MSG_867;Local - Contrast Amount residual HISTORY_MSG_868;Local - balance ΔE C-H HISTORY_MSG_869;Local - denoise curve luminance +HISTORY_MSG_870;Local - LC mask curve LC(H) +HISTORY_MSG_871;Local - LC mask curve C(C) +HISTORY_MSG_872;Local - LC mask curve L(L) +HISTORY_MSG_873;Local - LC mask enable +HISTORY_MSG_875;Local - LC mask blend +HISTORY_MSG_876;Local - LC mask radius +HISTORY_MSG_877;Local - LC mask chroma +HISTORY_MSG_878;Local - LC mask curve contrast HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2513,12 +2521,13 @@ TP_LOCALLAB_SHARRADIUS;Radius TP_LOCALLAB_SHORTC;Short Curves 'L' Mask TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7 TP_LOCALLAB_SHOWC1;Merge file -TP_LOCALLAB_SHOWC;8+* - Mask and modifications +TP_LOCALLAB_SHOWC;9+* - Mask and modifications TP_LOCALLAB_SHOWCB;2+ - Mask and modifications TP_LOCALLAB_SHOWDCT;Show process Fourier -TP_LOCALLAB_SHOWE;7+ - Mask and modifications +TP_LOCALLAB_SHOWE;8+ - Mask and modifications TP_LOCALLAB_SHOWFOURIER;Fourier (dct) TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) +TP_LOCALLAB_SHOWLC;6 - Mask and modifications TP_LOCALLAB_SHOWMASK;Show mask TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Display modifications.\nBeware, you can only view one modification (color and light or Exposure or Shadows-Highlight or TM or CBDL or Retinex MSR or Blur).\n\nUse Mask is before algorihtm shape detection 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. @@ -2528,7 +2537,7 @@ TP_LOCALLAB_SHOWMODIFMASK;Show modifications whith mask TP_LOCALLAB_SHOWNORMAL;Normalize luminance (no) TP_LOCALLAB_SHOWPLUS;1+* - Mask and modifications - Smooth-Blur & Denoise TP_LOCALLAB_SHOWPOISSON;Poisson (pde) -TP_LOCALLAB_SHOWR;6 - Mask and modifications +TP_LOCALLAB_SHOWR;7 - Mask and modifications TP_LOCALLAB_SHOWS;5+* - Mask and modifications TP_LOCALLAB_SHOWSTRUC;Show structure Spot TP_LOCALLAB_SHOWSTRUCEX;Show structure Spot - disabled in "normal" diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 8036cd204..90e8db9bb 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -887,6 +887,7 @@ void Crop::update(int todo) bool localmaskretiutili = parent->localmaskretiutili; bool localmaskcbutili = parent->localmaskcbutili; bool localmaskblutili = parent->localmaskblutili; + bool localmasklcutili = parent->localmasklcutili; LUTf lmasklocalcurve2(65536, 0); LUTf lmaskexplocalcurve2(65536, 0); LUTf lmaskSHlocalcurve2(65536, 0); @@ -895,6 +896,7 @@ void Crop::update(int todo) LUTf lmaskretilocalcurve2(65536, 0); LUTf lmaskcblocalcurve2(65536, 0); LUTf lmaskbllocalcurve2(65536, 0); + LUTf lmasklclocalcurve2(65536, 0); LUTf hltonecurveloc2(65536, 0); //65536 LUTf shtonecurveloc2(65536, 0); LUTf tonecurveloc2(65536, 0); @@ -914,6 +916,9 @@ void Crop::update(int todo) bool lhmasvibutili = parent->lhmasvibutili; bool lcmasvibutili = parent->lcmasvibutili; bool llmasvibutili = parent->llmasvibutili; + bool lhmaslcutili = parent->lhmaslcutili; + bool lcmaslcutili = parent->lcmaslcutili; + bool llmaslcutili = parent->llmaslcutili; bool lhmascbutili = parent->lhmascbutili; bool lcmascbutili = parent->lcmascbutili; bool llmascbutili = parent->llmascbutili; @@ -955,6 +960,9 @@ void Crop::update(int todo) LocCCmaskCurve locccmasvibCurve; LocLLmaskCurve locllmasvibCurve; LocHHmaskCurve lochhmasvibCurve; + LocCCmaskCurve locccmaslcCurve; + LocLLmaskCurve locllmaslcCurve; + LocHHmaskCurve lochhmaslcCurve; LocCCmaskCurve locccmascbCurve; LocLLmaskCurve locllmascbCurve; LocHHmaskCurve lochhmascbCurve; @@ -1012,9 +1020,12 @@ void Crop::update(int todo) lochhmastmCurve.Set(params.locallab.spots.at(sp).HHmasktmcurve, lhmastmutili); locccmasblCurve.Set(params.locallab.spots.at(sp).CCmaskblcurve, lcmasblutili); locllmasblCurve.Set(params.locallab.spots.at(sp).LLmaskblcurve, llmasblutili); - lochhmasblCurve.Set(params.locallab.spots.at(sp).HHmaskblcurve, lhmastmutili); + lochhmasblCurve.Set(params.locallab.spots.at(sp).HHmaskblcurve, lhmasblutili); loclmasCurveblwav.Set(params.locallab.spots.at(sp).LLmaskblcurvewav, lmasutiliblwav); loclmasCurvecolwav.Set(params.locallab.spots.at(sp).LLmaskcolcurvewav, lmasutilicolwav); + locccmaslcCurve.Set(params.locallab.spots.at(sp).CCmasklccurve, lcmaslcutili); + locllmaslcCurve.Set(params.locallab.spots.at(sp).LLmasklccurve, llmaslcutili); + lochhmaslcCurve.Set(params.locallab.spots.at(sp).HHmasklccurve, lhmaslcutili); locwavCurve.Set(params.locallab.spots.at(sp).locwavcurve, locwavutili); locwavCurveden.Set(params.locallab.spots.at(sp).locwavcurveden, locwavdenutili); @@ -1047,8 +1058,8 @@ void Crop::update(int todo) CurveFactory::curvemaskLocal(localmaskretiutili, params.locallab.spots.at(sp).Lmaskreticurve, lmaskretilocalcurve2, sca); localmaskcbutili = false; CurveFactory::curvemaskLocal(localmaskcbutili, params.locallab.spots.at(sp).Lmaskcbcurve, lmaskcblocalcurve2, sca); - localmaskblutili = false; - CurveFactory::curvemaskLocal(localmaskblutili, params.locallab.spots.at(sp).Lmaskblcurve, lmaskbllocalcurve2, sca); + localmasklcutili = false; + CurveFactory::curvemaskLocal(localmasklcutili, params.locallab.spots.at(sp).Lmasklccurve, lmasklclocalcurve2, sca); double ecomp = params.locallab.spots.at(sp).expcomp; @@ -1102,6 +1113,7 @@ void Crop::update(int todo) lmaskretilocalcurve2, localmaskretiutili, lmaskcblocalcurve2, localmaskcbutili, lmaskbllocalcurve2, localmaskblutili, + lmasklclocalcurve2, localmasklcutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, lochhhmasCurve, lhhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmasvibCurve, lcmasvibutili, locllmasvibCurve, llmasvibutili, lochhmasvibCurve, lhmasvibutili, @@ -1109,6 +1121,7 @@ void Crop::update(int todo) locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili, locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili, + locccmaslcCurve, lcmaslcutili, locllmaslcCurve, llmaslcutili, lochhmaslcCurve, lhmaslcutili, loclmasCurveblwav,lmasutiliblwav, loclmasCurvecolwav,lmasutilicolwav, locwavCurve, locwavutili, @@ -1137,6 +1150,7 @@ void Crop::update(int todo) lmaskretilocalcurve2, localmaskretiutili, lmaskcblocalcurve2, localmaskcbutili, lmaskbllocalcurve2, localmaskblutili, + lmasklclocalcurve2, localmasklcutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili,lochhhmasCurve, lhhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmasvibCurve, lcmasvibutili, locllmasvibCurve, llmasvibutili, lochhmasvibCurve, lhmasvibutili, @@ -1144,6 +1158,7 @@ void Crop::update(int todo) locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili, locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili, + locccmaslcCurve, lcmaslcutili, locllmaslcCurve, llmaslcutili, lochhmaslcCurve, lhmaslcutili, loclmasCurveblwav,lmasutiliblwav, loclmasCurvecolwav,lmasutilicolwav, locwavCurve, locwavutili, @@ -1205,6 +1220,9 @@ void Crop::update(int todo) locllmasblCurve.Reset(); locccmasblCurve.Reset(); lochhmasblCurve.Reset(); + locllmaslcCurve.Reset(); + locccmaslcCurve.Reset(); + lochhmaslcCurve.Reset(); locwavCurve.Reset(); loclevwavCurve.Reset(); locconwavCurve.Reset(); diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 663c0f33d..16263e61a 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -188,6 +188,7 @@ ImProcCoordinator::ImProcCoordinator() : lmaskretilocalcurve(65536, 0), lmaskcblocalcurve(65536, 0), lmaskbllocalcurve(65536, 0), + lmasklclocalcurve(65536, 0), locallutili(false), localclutili(false), locallcutili(false), @@ -206,6 +207,7 @@ ImProcCoordinator::ImProcCoordinator() : localmaskretiutili(false), localmaskcbutili(false), localmaskblutili(false), + localmasklcutili(false), lcmasexputili(false), lhmasexputili(false), llmasexputili(false), @@ -215,6 +217,9 @@ ImProcCoordinator::ImProcCoordinator() : lcmasvibutili(false), lhmasvibutili(false), llmasvibutili(false), + lcmaslcutili(false), + lhmaslcutili(false), + llmaslcutili(false), lcmascbutili(false), lhmascbutili(false), llmascbutili(false), @@ -1063,6 +1068,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) localmaskretiutili = false; localmaskcbutili = false; localmaskblutili = false; + localmasklcutili = false; lcmasSHutili = false; lhmasSHutili = false; llmasSHutili = false; @@ -1072,6 +1078,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lcmascbutili = false; lhmascbutili = false; llmascbutili = false; + lcmaslcutili = false; + lhmaslcutili = false; + llmaslcutili = false; lcmasretiutili = false; lhmasretiutili = false; llmasretiutili = false; @@ -1109,6 +1118,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) locllmascbCurve.Set(params->locallab.spots.at(sp).LLmaskcbcurve, llmascbutili); locccmascbCurve.Set(params->locallab.spots.at(sp).CCmaskcbcurve, lcmascbutili); lochhmascbCurve.Set(params->locallab.spots.at(sp).HHmaskcbcurve, lhmascbutili); + locllmaslcCurve.Set(params->locallab.spots.at(sp).LLmasklccurve, llmaslcutili); + locccmaslcCurve.Set(params->locallab.spots.at(sp).CCmasklccurve, lcmaslcutili); + lochhmaslcCurve.Set(params->locallab.spots.at(sp).HHmasklccurve, lhmaslcutili); locllmasretiCurve.Set(params->locallab.spots.at(sp).LLmaskreticurve, llmasretiutili); locccmasretiCurve.Set(params->locallab.spots.at(sp).CCmaskreticurve, lcmasretiutili); lochhmasretiCurve.Set(params->locallab.spots.at(sp).HHmaskreticurve, lhmasretiutili); @@ -1140,6 +1152,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) CurveFactory::curvemaskLocal(localmaskretiutili, params->locallab.spots.at(sp).Lmaskreticurve, lmaskretilocalcurve, sca); CurveFactory::curvemaskLocal(localmaskcbutili, params->locallab.spots.at(sp).Lmaskcbcurve, lmaskcblocalcurve, sca); CurveFactory::curvemaskLocal(localmaskblutili, params->locallab.spots.at(sp).Lmaskblcurve, lmaskbllocalcurve, sca); + CurveFactory::curvemaskLocal(localmasklcutili, params->locallab.spots.at(sp).Lmasklccurve, lmasklclocalcurve, sca); double ecomp = params->locallab.spots.at(sp).expcomp; double black = params->locallab.spots.at(sp).black; double hlcompr = params->locallab.spots.at(sp).hlcompr; @@ -1208,7 +1221,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) float Tsigma; float Tmin; float Tmax; - if (sp == params->locallab.selspot) { ipf.Lab_Local(3, sp, (float**)shbuffer, nprevl, nprevl, reserv, lastorigimp, 0, 0, pW, pH, scale, locRETgainCurve, locRETtransCurve, lllocalcurve, locallutili, @@ -1223,6 +1235,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lmaskretilocalcurve, localmaskretiutili, lmaskcblocalcurve, localmaskcbutili, lmaskbllocalcurve, localmaskblutili, + lmasklclocalcurve, localmasklcutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, lochhhmasCurve, lhhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmasvibCurve, lcmasvibutili, locllmasvibCurve, llmasvibutili, lochhmasvibCurve, lhmasvibutili, @@ -1230,6 +1243,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili, locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili, + locccmaslcCurve, lcmaslcutili, locllmaslcCurve, llmaslcutili, lochhmaslcCurve, lhmaslcutili, loclmasCurveblwav, lmasutiliblwav, loclmasCurvecolwav, lmasutilicolwav, locwavCurve, locwavutili, @@ -1263,6 +1277,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lmaskretilocalcurve, localmaskretiutili, lmaskcblocalcurve, localmaskcbutili, lmaskbllocalcurve, localmaskblutili, + lmasklclocalcurve, localmasklcutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, lochhhmasCurve, lhhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmasvibCurve, lcmasvibutili, locllmasvibCurve, llmasvibutili, lochhmasvibCurve, lhmasvibutili, @@ -1270,6 +1285,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili, locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili, + locccmaslcCurve, lcmaslcutili, locllmaslcCurve, llmaslcutili, lochhmaslcCurve, lhmaslcutili, loclmasCurveblwav, lmasutiliblwav, loclmasCurvecolwav, lmasutilicolwav, locwavCurve, locwavutili, @@ -1321,6 +1337,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lmaskretilocalcurve.clear(); lmaskcblocalcurve.clear(); lmaskbllocalcurve.clear(); + lmasklclocalcurve.clear(); hltonecurveloc.clear(); shtonecurveloc.clear(); tonecurveloc.clear(); @@ -1353,6 +1370,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) locllmasblCurve.Reset(); locccmasblCurve.Reset(); lochhmasblCurve.Reset(); + locllmaslcCurve.Reset(); + locccmaslcCurve.Reset(); + lochhmaslcCurve.Reset(); locwavCurve.Reset(); loclevwavCurve.Reset(); locconwavCurve.Reset(); diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index c3aadb0b9..735998647 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -250,6 +250,7 @@ protected: LUTf lmaskretilocalcurve; LUTf lmaskcblocalcurve; LUTf lmaskbllocalcurve; + LUTf lmasklclocalcurve; // LUTu lhist16loc; LocretigainCurve locRETgainCurve; LocretitransCurve locRETtransCurve; @@ -269,6 +270,9 @@ protected: LocCCmaskCurve locccmasvibCurve; LocLLmaskCurve locllmasvibCurve; LocHHmaskCurve lochhmasvibCurve; + LocCCmaskCurve locccmaslcCurve; + LocLLmaskCurve locllmaslcCurve; + LocHHmaskCurve lochhmaslcCurve; LocCCmaskCurve locccmascbCurve; LocLLmaskCurve locllmascbCurve; LocHHmaskCurve lochhmascbCurve; @@ -307,6 +311,7 @@ protected: bool localmaskretiutili; bool localmaskcbutili; bool localmaskblutili; + bool localmasklcutili; bool lcmasexputili; bool lhmasexputili; bool llmasexputili; @@ -316,6 +321,9 @@ protected: bool lcmasvibutili; bool lhmasvibutili; bool llmasvibutili; + bool lcmaslcutili; + bool lhmaslcutili; + bool llmaslcutili; bool lcmascbutili; bool lhmascbutili; bool llmascbutili; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 5a83ad038..3b93f4b79 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -287,6 +287,7 @@ public: LUTf & lmaskretilocalcurve, bool & localmaskretiutili, LUTf & lmaskcblocalcurve, bool & localmaskcbutili, LUTf & lmaskbllocalcurve, bool & localmaskblutili, + LUTf & lmasklclocalcurve, bool & localmasklcutili, const LocCCmaskCurve & locccmasCurve, bool & lcmasutili, const LocLLmaskCurve & locllmasCurve, bool & llmasutili, const LocHHmaskCurve & lochhmasCurve, bool & lhmasutili, const LocHHmaskCurve & lochhhmasCurve, bool & lhhmasutili, const LocCCmaskCurve & locccmasexpCurve, bool &lcmasexputili, const LocLLmaskCurve & locllmasexpCurve, bool &llmasexputili, const LocHHmaskCurve & lochhmasexpCurve, bool & lhmasexputili, const LocCCmaskCurve & locccmasSHCurve, bool &lcmasSHutili, const LocLLmaskCurve & locllmasSHCurve, bool &llmasSHutili, const LocHHmaskCurve & lochhmasSHCurve, bool & lhmasSHutili, @@ -295,6 +296,7 @@ public: const LocCCmaskCurve & locccmasretiCurve, bool &lcmasretiutili, const LocLLmaskCurve & locllmasretiCurve, bool &llmasretiutili, const LocHHmaskCurve & lochhmasretiCurve, bool & lhmasretiutili, const LocCCmaskCurve & locccmastmCurve, bool &lcmastmutili, const LocLLmaskCurve & locllmastmCurve, bool &llmastmutili, const LocHHmaskCurve & lochhmastmCurve, bool & lhmastmutili, const LocCCmaskCurve & locccmasblCurve, bool &lcmasblutili, const LocLLmaskCurve & locllmasblCurve, bool &llmasblutili, const LocHHmaskCurve & lochhmasblCurve, bool & lhmasblutili, + const LocCCmaskCurve & locccmaslcCurve, bool &lcmaslcutili, const LocLLmaskCurve & locllmaslcCurve, bool &llmaslcutili, const LocHHmaskCurve & lochhmaslcCurve, bool & lhmaslcutili, const LocwavCurve & loclmasCurveblwav, bool & lmasutiliblwav, const LocwavCurve & loclmasCurvecolwav, bool & lmasutilicolwav, const LocwavCurve & locwavCurve, bool & locwavutili, diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index e3e3f8921..803e71e0c 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -96,7 +96,7 @@ void calcGammaLut(double gamma, double ts, LUTf &gammaLut) std::swap(pwr, gamm); } - printf("OK calcgamm\n"); +// printf("OK calcgamm\n"); rtengine::Color::calcGamma(pwr, ts, 0, g_a); // call to calcGamma with selected gamma and slope @@ -211,6 +211,9 @@ struct local_params { float chromacol; float gammacol; float slomacol; + float blendmalc; + float radmalc; + float chromalc; float radmaexp; float chromaexp; float gammaexp; @@ -588,7 +591,6 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.showmaskSHmetinv = llSHMaskinv; lp.showmaskvibmet = llvibMask; lp.showmasklcmet = lllcMask; - printf("lpshamlc=%i\n",lp.showmasklcmet); lp.showmaskcbmet = llcbMask; lp.showmaskretimet = llretiMask; lp.showmasksoftmet = llsoftMask; @@ -799,6 +801,9 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall float labgridALowlocmerg = locallab.spots.at(sp).labgridALowmerg; float labgridAHighlocmerg = locallab.spots.at(sp).labgridAHighmerg; + float blendmasklc = ((float) locallab.spots.at(sp).blendmasklc) / 100.f ; + float radmasklc = ((float) locallab.spots.at(sp).radmasklc); + float chromasklc = ((float) locallab.spots.at(sp).chromasklc); float structcolor = (float) locallab.spots.at(sp).structcol; float blendmaskcolor = ((float) locallab.spots.at(sp).blendmaskcol) / 100.f ; float radmaskcolor = ((float) locallab.spots.at(sp).radmaskcol); @@ -934,6 +939,9 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.chro = local_chroma; lp.struco = structcolor; lp.strengrid = strengthgrid; + lp.blendmalc = blendmasklc; + lp.radmalc = radmasklc; + lp.chromalc = chromasklc; lp.blendmacol = blendmaskcolor; lp.radmacol = radmaskcolor; lp.chromacol = chromaskcolor; @@ -3809,7 +3817,6 @@ void ImProcFunctions::maskcalccol(int call, bool invmask, bool pde, int bfw, int } } - #ifdef _OPENMP #pragma omp parallel #endif @@ -3867,6 +3874,7 @@ void ImProcFunctions::maskcalccol(int call, bool invmask, bool pde, int bfw, int if (locllmasCurve && llmasutili) { kmaskL = 32768.f * LIM01(kinv - kneg * locllmasCurve[(500.f / 32768.f) * bufcolorig->L[ir][jr]]); + } if (!deltaE && locccmasCurve && lcmasutili) { @@ -3988,7 +3996,6 @@ void ImProcFunctions::maskcalccol(int call, bool invmask, bool pde, int bfw, int rtengine::guidedFilter(guid, ble, ble, r2, 0.2 * epsil, multiThread); } - printf("OK A\n"); LUTf lutTonemaskexp(65536); calcGammaLut(gamma, slope, lutTonemaskexp); @@ -6180,12 +6187,14 @@ void ImProcFunctions::transit_shapedetect2(int call, int senstype, const LabImag const bool colshow = ((lp.showmaskcolmet == 1 || lp.showmaskcolmet == 2) && senstype == 0); const bool SHshow = ((lp.showmaskSHmet == 1 || lp.showmaskSHmet == 2) && senstype == 9); const bool tmshow = ((lp.showmasktmmet == 1 || lp.showmasktmmet == 2) && senstype == 8); + const bool lcshow = ((lp.showmasklcmet == 1 || lp.showmasklcmet == 2) && senstype == 10); const bool previewvib = ((lp.showmaskvibmet == 4) && senstype == 2); const bool previewexp = ((lp.showmaskexpmet == 5) && senstype == 1); const bool previewcol = ((lp.showmaskcolmet == 5) && senstype == 0); const bool previewSH = ((lp.showmaskSHmet == 4) && senstype == 9); const bool previewtm = ((lp.showmasktmmet == 4) && senstype == 8); + const bool previewlc = ((lp.showmasklcmet == 4) && senstype == 10); float radius = 3.f / sk; @@ -6217,7 +6226,8 @@ void ImProcFunctions::transit_shapedetect2(int call, int senstype, const LabImag const bool usemaskcol = (lp.showmaskcolmet == 2 || lp.enaColorMask || lp.showmaskcolmet == 5) && senstype == 0; const bool usemaskSH = (lp.showmaskSHmet == 2 || lp.enaSHMask || lp.showmaskSHmet == 4) && senstype == 9; const bool usemasktm = (lp.showmasktmmet == 2 || lp.enatmMask || lp.showmasktmmet == 4) && senstype == 8; - const bool usemaskall = (usemaskexp || usemaskvib || usemaskcol || usemaskSH || usemasktm); + const bool usemasklc = (lp.showmasklcmet == 2 || lp.enalcMask || lp.showmasklcmet == 4) && senstype == 10; + const bool usemaskall = (usemaskexp || usemaskvib || usemaskcol || usemaskSH || usemasktm || usemasklc); //blur a little mask if (usemaskall) { @@ -6404,7 +6414,7 @@ void ImProcFunctions::transit_shapedetect2(int call, int senstype, const LabImag difb = factorx * realstrbdE; float maxdifab = max(fabs(difa), fabs(difb)); - if (expshow || vibshow || colshow || SHshow || tmshow) {//show modifications + if (expshow || vibshow || colshow || SHshow || tmshow || lcshow) {//show modifications if (diflc < 1000.f) {//if too low to be view use ab diflc += 0.5f * maxdifab; } @@ -6412,7 +6422,7 @@ void ImProcFunctions::transit_shapedetect2(int call, int senstype, const LabImag transformed->L[y + ystart][x + xstart] = CLIP(12000.f + diflc); transformed->a[y + ystart][x + xstart] = CLIPC(difa); transformed->b[y + ystart][x + xstart] = CLIPC(difb); - } else if (previewexp || previewvib || previewcol || previewSH || previewtm) {//show deltaE + } else if (previewexp || previewvib || previewcol || previewSH || previewtm || previewlc) {//show deltaE if (fabs(difb) < 500.f) {//if too low to be view use L if (difb < 0.f) { difb -= 0.5f * diflc; @@ -9041,6 +9051,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o LUTf & lmaskretilocalcurve, bool & localmaskretiutili, LUTf & lmaskcblocalcurve, bool & localmaskcbutili, LUTf & lmaskbllocalcurve, bool & localmaskblutili, + LUTf & lmasklclocalcurve, bool & localmasklcutili, const LocCCmaskCurve & locccmasCurve, bool & lcmasutili, const LocLLmaskCurve & locllmasCurve, bool & llmasutili, const LocHHmaskCurve & lochhmasCurve, bool & lhmasutili, const LocHHmaskCurve & lochhhmasCurve, bool & lhhmasutili, const LocCCmaskCurve & locccmasexpCurve, bool & lcmasexputili, const LocLLmaskCurve & locllmasexpCurve, bool & llmasexputili, const LocHHmaskCurve & lochhmasexpCurve, bool & lhmasexputili, const LocCCmaskCurve & locccmasSHCurve, bool & lcmasSHutili, const LocLLmaskCurve & locllmasSHCurve, bool & llmasSHutili, const LocHHmaskCurve & lochhmasSHCurve, bool & lhmasSHutili, @@ -9049,6 +9060,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o const LocCCmaskCurve & locccmasretiCurve, bool & lcmasretiutili, const LocLLmaskCurve & locllmasretiCurve, bool & llmasretiutili, const LocHHmaskCurve & lochhmasretiCurve, bool & lhmasretiutili, const LocCCmaskCurve & locccmastmCurve, bool & lcmastmutili, const LocLLmaskCurve & locllmastmCurve, bool & llmastmutili, const LocHHmaskCurve & lochhmastmCurve, bool & lhmastmutili, const LocCCmaskCurve & locccmasblCurve, bool & lcmasblutili, const LocLLmaskCurve & locllmasblCurve, bool & llmasblutili, const LocHHmaskCurve & lochhmasblCurve, bool & lhmasblutili, + const LocCCmaskCurve & locccmaslcCurve, bool & lcmaslcutili, const LocLLmaskCurve & locllmaslcCurve, bool & llmaslcutili, const LocHHmaskCurve & lochhmaslcCurve, bool & lhmaslcutili, const LocwavCurve & loclmasCurveblwav, bool & lmasutiliblwav, const LocwavCurve & loclmasCurvecolwav, bool & lmasutilicolwav, const LocwavCurve & locwavCurve, bool & locwavutili, @@ -9065,7 +9077,6 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o if (params->locallab.enabled) { BENCHFUN int complexsoft = options.complexity; - #ifdef _DEBUG // init variables to display Munsell corrections MunsellDebugInfo* MunsDebugInfo = new MunsellDebugInfo(); @@ -10116,7 +10127,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float slope = lp.slomacb; float blendm = lp.blendmacb; float lap = params->locallab.spots.at(sp).lapmaskcb; - float pde = params->locallab.spots.at(sp).laplac; + bool pde = params->locallab.spots.at(sp).laplac; LocwavCurve dummy; bool delt = params->locallab.spots.at(sp).deltae; int sco = params->locallab.spots.at(sp).scopemask; @@ -10341,7 +10352,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float slope = lp.slomavib; float blendm = lp.blendmavib; float lap = params->locallab.spots.at(sp).lapmaskvib; - float pde = params->locallab.spots.at(sp).laplac; + bool pde = params->locallab.spots.at(sp).laplac; LocwavCurve dummy; bool lmasutilicolwav = false; bool delt = params->locallab.spots.at(sp).deltae; @@ -10577,7 +10588,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float slope = lp.slomatm; float blendm = lp.blendmatm; float lap = params->locallab.spots.at(sp).lapmasktm; - float pde = params->locallab.spots.at(sp).laplac; + bool pde = params->locallab.spots.at(sp).laplac; int shortcu = 0; //lp.mergemet;// params->locallab.spots.at(sp).shortc; int lumask = params->locallab.spots.at(sp).lumask; @@ -10812,7 +10823,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float slope = lp.slomaSH; float blendm = lp.blendmaSH; float lap = params->locallab.spots.at(sp).lapmaskSH; - float pde = params->locallab.spots.at(sp).laplac; + bool pde = params->locallab.spots.at(sp).laplac; LocwavCurve dummy; bool lmasutilicolwav = false; bool delt = params->locallab.spots.at(sp).deltae; @@ -10971,7 +10982,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float slope = lp.slomaSH; float blendm = lp.blendmaSH; float lap = params->locallab.spots.at(sp).lapmaskSH; - float pde = params->locallab.spots.at(sp).laplac; + bool pde = params->locallab.spots.at(sp).laplac; LocwavCurve dummy; bool lmasutilicolwav = false; // bool delt = params->locallab.spots.at(sp).deltae; @@ -11160,7 +11171,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o } } - if ((lp.lcamount > 0.f || wavcurve || wavcurvelev || wavcurvecon || wavcurvecomp || params->locallab.spots.at(sp).residblur > 0.f || params->locallab.spots.at(sp).levelblur > 0.f || params->locallab.spots.at(sp).residcont != 0.f || params->locallab.spots.at(sp).clarilres != 0.f || params->locallab.spots.at(sp).claricres != 0.f) && call < 3 && lp.lcena) { + + if ((lp.lcamount > 0.f || wavcurve || lp.showmasklcmet == 2 || lp.enalcMask || lp.showmasklcmet == 3 || lp.showmasklcmet == 4 || wavcurvelev || wavcurvecon || wavcurvecomp || params->locallab.spots.at(sp).residblur > 0.f || params->locallab.spots.at(sp).levelblur > 0.f || params->locallab.spots.at(sp).residcont != 0.f || params->locallab.spots.at(sp).clarilres != 0.f || params->locallab.spots.at(sp).claricres != 0.f) && call < 3 && lp.lcena) { + 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); @@ -11178,6 +11191,16 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o optfft(N_fftwsize, bfh, bfw, bfhr, bfwr, reduH, reduW, lp, original->H, original->W, xstart, ystart, xend, yend, cx, cy); } + std::unique_ptr bufmaskblurlc; + std::unique_ptr originalmasklc; + std::unique_ptr bufmaskoriglc; + + if (lp.showmasklcmet == 2 || lp.enalcMask || lp.showmasklcmet == 3 || lp.showmasklcmet == 4) { + bufmaskblurlc.reset(new LabImage(bfw, bfh)); + originalmasklc.reset(new LabImage(bfw, bfh)); + bufmaskoriglc.reset(new LabImage(bfw, bfh)); + } + array2D buflight(bfw, bfh); JaggedArray bufchro(bfw, bfh); std::unique_ptr bufgb(new LabImage(bfw, bfh)); @@ -11207,273 +11230,356 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o } } - if (lp.locmet == 0) { - LocalContrastParams localContrastParams; - LocallabParams locallabparams; - localContrastParams.enabled = true; - localContrastParams.radius = params->locallab.spots.at(sp).lcradius; - localContrastParams.amount = params->locallab.spots.at(sp).lcamount; - localContrastParams.darkness = params->locallab.spots.at(sp).lcdarkness; - localContrastParams.lightness = params->locallab.spots.at(sp).lightness; - bool fftwlc = false; - - if (!lp.ftwlc) { // || (lp.ftwlc && call != 2)) { - ImProcFunctions::localContrast(tmp1.get(), tmp1->L, localContrastParams, fftwlc, sk); - } else { - std::unique_ptr tmpfftw(new LabImage(bfwr, bfhr)); #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) + #pragma omp parallel for schedule(dynamic,16) #endif - for (int y = 0; y < bfhr; y++) { - for (int x = 0; x < bfwr; x++) { - tmpfftw->L[y][x] = tmp1->L[y][x]; - tmpfftw->a[y][x] = tmp1->a[y][x]; - tmpfftw->b[y][x] = tmp1->b[y][x]; - } - } - - fftwlc = true; - ImProcFunctions::localContrast(tmpfftw.get(), tmpfftw->L, localContrastParams, fftwlc, sk); -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) -#endif - - for (int y = 0; y < bfhr; y++) { - for (int x = 0; x < bfwr; x++) { - tmp1->L[y][x] = tmpfftw->L[y][x]; - tmp1->a[y][x] = tmpfftw->a[y][x]; - tmp1->b[y][x] = tmpfftw->b[y][x]; - } - } - - } - } else if (lp.locmet == 1) { //wavelet - int wavelet_level = params->locallab.spots.at(sp).levelwav; - float mL = (float)(params->locallab.spots.at(sp).clarilres / 100.f); - float mC = (float)(params->locallab.spots.at(sp).claricres / 100.f); - float softr = (float)(params->locallab.spots.at(sp).clarisoft); - float mL0; - float mC0; -#ifdef _OPENMP - const int numThreads = omp_get_max_threads(); -#else - const int numThreads = 1; - -#endif - // adap maximum level wavelet to size of RT-spot - int minwin = min(bfw, bfh); - int maxlevelspot = 9; - - while ((1 << maxlevelspot) >= (minwin * sk) && maxlevelspot > 1) { - --maxlevelspot ; - } - - wavelet_level = min(wavelet_level, maxlevelspot); - - bool exec = false; - bool origlc = params->locallab.spots.at(sp).origlc; - - if (origlc) {//merge only with original - clarimerge(mL, mC, exec, tmpresid.get(), wavelet_level, sk, numThreads); - } - - int maxlvl; - const float contrast = params->locallab.spots.at(sp).residcont; - int level_bl = params->locallab.spots.at(sp).csthreshold.getBottomLeft(); - int level_hl = params->locallab.spots.at(sp).csthreshold.getTopLeft(); - int level_br = params->locallab.spots.at(sp).csthreshold.getBottomRight(); - int level_hr = params->locallab.spots.at(sp).csthreshold.getTopRight(); - const float radblur = (params->locallab.spots.at(sp).residblur) / sk; - const bool blurlc = params->locallab.spots.at(sp).blurlc; - const float radlevblur = (params->locallab.spots.at(sp).levelblur) / sk; - const float sigma = params->locallab.spots.at(sp).sigma; - const float fatdet = params->locallab.spots.at(sp).fatdet; - const float fatanch = params->locallab.spots.at(sp).fatanch; - const float fatres = params->locallab.spots.at(sp).fatres; - - wavcontrast4(tmp1->L, contrast, fatres, radblur, radlevblur, tmp1->W, tmp1->H, level_bl, level_hl, level_br, level_hr, sk, numThreads, locwavCurve, locwavutili, loclevwavCurve, loclevwavutili, wavcurvelev, locconwavCurve, locconwavutili, wavcurvecon, loccompwavCurve, loccompwavutili, wavcurvecomp, sigma, maxlvl, fatdet, fatanch); - - const float satur = params->locallab.spots.at(sp).residchro; - - if (satur != 0.f || radblur > 0.f) { - - wavelet_decomposition *wdspota = new wavelet_decomposition(tmp1->a[0], tmp1->W, tmp1->H, wavelet_level, 1, sk, numThreads, 6); - - if (wdspota->memoryAllocationFailed) { - return; - } - - float *wav_ab0a = wdspota->coeff0; - // int maxlvla = wdspota->maxlevel(); - int W_La = wdspota->level_W(0); - int H_La = wdspota->level_H(0); - - if (radblur > 0.f && !blurlc) { - array2D bufa(W_La, H_La); -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) -#endif - - for (int y = 0; y < H_La; y++) { - for (int x = 0; x < W_La; x++) { - bufa[y][x] = wav_ab0a [y * W_La + x]; - } - } - - #pragma omp parallel - { - gaussianBlur(bufa, bufa, W_La, H_La, radblur); - } - -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) -#endif - - for (int y = 0; y < H_La; y++) { - for (int x = 0; x < W_La; x++) { - wav_ab0a[y * W_La + x] = bufa[y][x]; - } - } - - } - - if (satur != 0.f) { -#ifdef _OPENMP - #pragma omp parallel for if (multiThread) -#endif - - for (int i = 0; i < W_La * H_La; i++) { - wav_ab0a[i] *= (1.f + sin(rtengine::RT_PI * (satur / 200.f)));//more progressive than linear - wav_ab0a[i] = CLIPC(wav_ab0a[i]); - } - } - - wdspota->reconstruct(tmp1->a[0], 1.f); - delete wdspota; - - wavelet_decomposition *wdspotb = new wavelet_decomposition(tmp1->b[0], tmp1->W, tmp1->H, wavelet_level, 1, sk, numThreads, 6); - - if (wdspotb->memoryAllocationFailed) { - return; - } - - float *wav_ab0b = wdspotb->coeff0; - // int maxlvlb = wdspotb->maxlevel(); - int W_Lb = wdspotb->level_W(0); - int H_Lb = wdspotb->level_H(0); - - if (radblur > 0.f && !blurlc) { - array2D bufb(W_Lb, H_Lb); -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) -#endif - - for (int y = 0; y < H_Lb; y++) { - for (int x = 0; x < W_Lb; x++) { - bufb[y][x] = wav_ab0b [y * W_Lb + x]; - } - } - - #pragma omp parallel - { - gaussianBlur(bufb, bufb, W_Lb, H_Lb, radblur); - } - - -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) -#endif - - for (int y = 0; y < H_Lb; y++) { - for (int x = 0; x < W_Lb; x++) { - wav_ab0b[y * W_Lb + x] = bufb[y][x]; - } - } - - } - - if (satur != 0.f) { - -#ifdef _OPENMP - #pragma omp parallel for if (multiThread) -#endif - - for (int i = 0; i < W_Lb * H_Lb; i++) { - wav_ab0b[i] *= (1.f + sin(rtengine::RT_PI * (satur / 200.f))); - wav_ab0b[i] = CLIPC(wav_ab0b[i]); - } - } - - wdspotb->reconstruct(tmp1->b[0], 1.f); - delete wdspotb; - - } - - if (!origlc) {//merge all files - exec = false; -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) -#endif - -//copy previous calculation in merge possibilities - for (int y = 0; y < bfhr; y++) { - for (int x = 0; x < bfwr; x++) { - tmpresid->L[y][x] = tmp1->L[y][x]; - tmpresid->a[y][x] = tmp1->a[y][x]; - tmpresid->b[y][x] = tmp1->b[y][x]; - } - } - - clarimerge(mL, mC, exec, tmpresid.get(), wavelet_level, sk, numThreads); - } - - float thr = 0.001f; - int flag = 0; - - if (maxlvl <= 4) { - mL0 = 0.f; - mC0 = 0.f; - mL = -1.5f * mL;//increase only for sharpen - mC = -mC; - thr = 1.f; - flag = 0; - - } else if (maxlvl > 4) { - mL0 = mL; - mC0 = mC; - thr = 1.f; - flag = 1; - } else { - mL0 = mL = mC0 = mC = 0.f; - } - - if (exec) { - bool origl = false; - // origlc = false; - LabImage *mergfile = origl ? tmpres.get() : tmp1.get(); - -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int x = 0; x < bfh; x++) - for (int y = 0; y < bfw; y++) { - tmp1->L[x][y] = CLIPLOC((1.f + mL0) * mergfile->L[x][y] - mL * tmpresid->L[x][y]); - tmp1->a[x][y] = CLIPC((1.f + mC0) * mergfile->a[x][y] - mC * tmpresid->a[x][y]); - tmp1->b[x][y] = CLIPC((1.f + mC0) * mergfile->b[x][y] - mC * tmpresid->b[x][y]); - } - - if (softr > 0.f && fabs(mL) > 0.001f) { - softproc(tmpres.get(), tmp1.get(), softr, bfh, bfw, 0.0001, 0.00001, thr, sk, multiThread, flag); - } + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + bufgb->L[y][x] = original->L[y + ystart][x + xstart]; } } + int inv = 0; + bool showmaske = false; + bool enaMask = false; + bool deltaE = false; + bool modmask = false; + bool zero = false; + bool modif = false; - transit_shapedetect2(call, 10, bufgb.get(), tmp1.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + if (lp.showmasklcmet == 3) { + showmaske = true; + } + + if (lp.enalcMask) { + enaMask = true; + } + + if (lp.showmasklcmet == 4) { + deltaE = true; + } + + if (lp.showmasklcmet == 2) { + modmask = true; + } + + if (lp.showmasklcmet == 1) { + modif = true; + } + + if (lp.showmasklcmet == 0) { + zero = true; + } + + + float chrom = lp.chromalc; + float rad = lp.radmalc; + float blendm = lp.blendmalc; + float gamma = 1.f; + float slope = 0.f; + float lap = 0.f; //params->locallab.spots.at(sp).lapmaskexp; + bool pde = false; //params->locallab.spots.at(sp).laplac; + LocwavCurve dummy; + bool lmasutilicolwav = false; + bool delt = params->locallab.spots.at(sp).deltae; + int sco = params->locallab.spots.at(sp).scopemask; + int shado = 0; + int shortcu = 0;//lp.mergemet; //params->locallab.spots.at(sp).shortc; + const 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; + int lumask = params->locallab.spots.at(sp).lumask; + LocHHmaskCurve lochhhmasCurve; + bool lhhmasutili = false; + maskcalccol(call, false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufgb.get(), bufmaskoriglc.get(), originalmasklc.get(), original, reserved, inv, lp, + 0.f, false, + locccmaslcCurve, lcmaslcutili, locllmaslcCurve, llmaslcutili, lochhmaslcCurve, lhmaslcutili, lochhhmasCurve, lhhmasutili, multiThread, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, amountcd, anchorcd, lmasklclocalcurve, localmasklcutili, dummy, lmasutilicolwav, 1, 1, 5, 5, + shortcu, delt, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco + ); + + if (lp.showmasklcmet == 3) { + showmask(lumask, lp, xstart, ystart, cx, cy, bfw, bfh, bufgb.get(), transformed, bufmaskoriglc.get(), 0); + + return; + } + + if (lp.showmasklcmet == 0 || lp.showmasklcmet == 1 || lp.showmasklcmet == 2 || lp.showmasklcmet == 4 || lp.enalcMask) { + + if (lp.locmet == 0) { + LocalContrastParams localContrastParams; + LocallabParams locallabparams; + localContrastParams.enabled = true; + localContrastParams.radius = params->locallab.spots.at(sp).lcradius; + localContrastParams.amount = params->locallab.spots.at(sp).lcamount; + localContrastParams.darkness = params->locallab.spots.at(sp).lcdarkness; + localContrastParams.lightness = params->locallab.spots.at(sp).lightness; + bool fftwlc = false; + + if (!lp.ftwlc) { // || (lp.ftwlc && call != 2)) { + ImProcFunctions::localContrast(tmp1.get(), tmp1->L, localContrastParams, fftwlc, sk); + } else { + std::unique_ptr tmpfftw(new LabImage(bfwr, bfhr)); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int y = 0; y < bfhr; y++) { + for (int x = 0; x < bfwr; x++) { + tmpfftw->L[y][x] = tmp1->L[y][x]; + tmpfftw->a[y][x] = tmp1->a[y][x]; + tmpfftw->b[y][x] = tmp1->b[y][x]; + } + } + + fftwlc = true; + ImProcFunctions::localContrast(tmpfftw.get(), tmpfftw->L, localContrastParams, fftwlc, sk); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int y = 0; y < bfhr; y++) { + for (int x = 0; x < bfwr; x++) { + tmp1->L[y][x] = tmpfftw->L[y][x]; + tmp1->a[y][x] = tmpfftw->a[y][x]; + tmp1->b[y][x] = tmpfftw->b[y][x]; + } + } + + } + } else if (lp.locmet == 1) { //wavelet + int wavelet_level = params->locallab.spots.at(sp).levelwav; + float mL = (float)(params->locallab.spots.at(sp).clarilres / 100.f); + float mC = (float)(params->locallab.spots.at(sp).claricres / 100.f); + float softr = (float)(params->locallab.spots.at(sp).clarisoft); + float mL0; + float mC0; +#ifdef _OPENMP + const int numThreads = omp_get_max_threads(); +#else + const int numThreads = 1; + +#endif + // adap maximum level wavelet to size of RT-spot + int minwin = min(bfw, bfh); + int maxlevelspot = 9; + + while ((1 << maxlevelspot) >= (minwin * sk) && maxlevelspot > 1) { + --maxlevelspot ; + } + + wavelet_level = min(wavelet_level, maxlevelspot); + + bool exec = false; + bool origlc = params->locallab.spots.at(sp).origlc; + + if (origlc) {//merge only with original + clarimerge(mL, mC, exec, tmpresid.get(), wavelet_level, sk, numThreads); + } + + int maxlvl; + const float contrast = params->locallab.spots.at(sp).residcont; + int level_bl = params->locallab.spots.at(sp).csthreshold.getBottomLeft(); + int level_hl = params->locallab.spots.at(sp).csthreshold.getTopLeft(); + int level_br = params->locallab.spots.at(sp).csthreshold.getBottomRight(); + int level_hr = params->locallab.spots.at(sp).csthreshold.getTopRight(); + const float radblur = (params->locallab.spots.at(sp).residblur) / sk; + const bool blurlc = params->locallab.spots.at(sp).blurlc; + const float radlevblur = (params->locallab.spots.at(sp).levelblur) / sk; + const float sigma = params->locallab.spots.at(sp).sigma; + const float fatdet = params->locallab.spots.at(sp).fatdet; + const float fatanch = params->locallab.spots.at(sp).fatanch; + const float fatres = params->locallab.spots.at(sp).fatres; + + wavcontrast4(tmp1->L, contrast, fatres, radblur, radlevblur, tmp1->W, tmp1->H, level_bl, level_hl, level_br, level_hr, sk, numThreads, locwavCurve, locwavutili, loclevwavCurve, loclevwavutili, wavcurvelev, locconwavCurve, locconwavutili, wavcurvecon, loccompwavCurve, loccompwavutili, wavcurvecomp, sigma, maxlvl, fatdet, fatanch); + + const float satur = params->locallab.spots.at(sp).residchro; + + if (satur != 0.f || radblur > 0.f) { + + wavelet_decomposition *wdspota = new wavelet_decomposition(tmp1->a[0], tmp1->W, tmp1->H, wavelet_level, 1, sk, numThreads, 6); + + if (wdspota->memoryAllocationFailed) { + return; + } + + float *wav_ab0a = wdspota->coeff0; + // int maxlvla = wdspota->maxlevel(); + int W_La = wdspota->level_W(0); + int H_La = wdspota->level_H(0); + + if (radblur > 0.f && !blurlc) { + array2D bufa(W_La, H_La); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int y = 0; y < H_La; y++) { + for (int x = 0; x < W_La; x++) { + bufa[y][x] = wav_ab0a [y * W_La + x]; + } + } + + #pragma omp parallel + { + gaussianBlur(bufa, bufa, W_La, H_La, radblur); + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int y = 0; y < H_La; y++) { + for (int x = 0; x < W_La; x++) { + wav_ab0a[y * W_La + x] = bufa[y][x]; + } + } + + } + + if (satur != 0.f) { +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + + for (int i = 0; i < W_La * H_La; i++) { + wav_ab0a[i] *= (1.f + sin(rtengine::RT_PI * (satur / 200.f)));//more progressive than linear + wav_ab0a[i] = CLIPC(wav_ab0a[i]); + } + } + + wdspota->reconstruct(tmp1->a[0], 1.f); + delete wdspota; + + wavelet_decomposition *wdspotb = new wavelet_decomposition(tmp1->b[0], tmp1->W, tmp1->H, wavelet_level, 1, sk, numThreads, 6); + + if (wdspotb->memoryAllocationFailed) { + return; + } + + float *wav_ab0b = wdspotb->coeff0; + // int maxlvlb = wdspotb->maxlevel(); + int W_Lb = wdspotb->level_W(0); + int H_Lb = wdspotb->level_H(0); + + if (radblur > 0.f && !blurlc) { + array2D bufb(W_Lb, H_Lb); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int y = 0; y < H_Lb; y++) { + for (int x = 0; x < W_Lb; x++) { + bufb[y][x] = wav_ab0b [y * W_Lb + x]; + } + } + + #pragma omp parallel + { + gaussianBlur(bufb, bufb, W_Lb, H_Lb, radblur); + } + + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int y = 0; y < H_Lb; y++) { + for (int x = 0; x < W_Lb; x++) { + wav_ab0b[y * W_Lb + x] = bufb[y][x]; + } + } + + } + + if (satur != 0.f) { + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + + for (int i = 0; i < W_Lb * H_Lb; i++) { + wav_ab0b[i] *= (1.f + sin(rtengine::RT_PI * (satur / 200.f))); + wav_ab0b[i] = CLIPC(wav_ab0b[i]); + } + } + + wdspotb->reconstruct(tmp1->b[0], 1.f); + delete wdspotb; + + } + + if (!origlc) {//merge all files + exec = false; +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + +//copy previous calculation in merge possibilities + for (int y = 0; y < bfhr; y++) { + for (int x = 0; x < bfwr; x++) { + tmpresid->L[y][x] = tmp1->L[y][x]; + tmpresid->a[y][x] = tmp1->a[y][x]; + tmpresid->b[y][x] = tmp1->b[y][x]; + } + } + + clarimerge(mL, mC, exec, tmpresid.get(), wavelet_level, sk, numThreads); + } + + float thr = 0.001f; + int flag = 0; + + if (maxlvl <= 4) { + mL0 = 0.f; + mC0 = 0.f; + mL = -1.5f * mL;//increase only for sharpen + mC = -mC; + thr = 1.f; + flag = 0; + + } else if (maxlvl > 4) { + mL0 = mL; + mC0 = mC; + thr = 1.f; + flag = 1; + } else { + mL0 = mL = mC0 = mC = 0.f; + } + + if (exec) { + bool origl = false; + // origlc = false; + LabImage *mergfile = origl ? tmpres.get() : tmp1.get(); + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int x = 0; x < bfh; x++) + for (int y = 0; y < bfw; y++) { + tmp1->L[x][y] = CLIPLOC((1.f + mL0) * mergfile->L[x][y] - mL * tmpresid->L[x][y]); + tmp1->a[x][y] = CLIPC((1.f + mC0) * mergfile->a[x][y] - mC * tmpresid->a[x][y]); + tmp1->b[x][y] = CLIPC((1.f + mC0) * mergfile->b[x][y] - mC * tmpresid->b[x][y]); + } + + if (softr > 0.f && fabs(mL) > 0.001f) { + softproc(tmpres.get(), tmp1.get(), softr, bfh, bfw, 0.0001, 0.00001, thr, sk, multiThread, flag); + } + } + } + + + transit_shapedetect2(call, 10, bufgb.get(), tmp1.get(), originalmasklc.get(), hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); // transit_shapedetect(10, tmp1.get(), nullptr, bufchro, false, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); - tmp1.reset(); + tmp1.reset(); + } if (params->locallab.spots.at(sp).recurs) { original->CopyFrom(transformed); @@ -11539,7 +11645,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o if (params->locallab.spots.at(sp).recurs) { original->CopyFrom(transformed); float avge; - calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge,locwavCurveden, locwavdenutili ); + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); } } @@ -12483,7 +12589,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float slope = lp.slomaexp; float blendm = lp.blendmaexp; float lap = params->locallab.spots.at(sp).lapmaskexp; - float pde = params->locallab.spots.at(sp).laplac; + bool pde = params->locallab.spots.at(sp).laplac; LocwavCurve dummy; bool lmasutilicolwav = false; bool delt = params->locallab.spots.at(sp).deltae; @@ -12671,7 +12777,6 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o } } - printf("OK 10\n"); //shadows with ipshadowshighlight if ((lp.expcomp != 0.f && lp.expcomp != 0.01f) || (exlocalcurve && localexutili)) { @@ -12781,7 +12886,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float slope = lp.slomaexp; float blendm = lp.blendmaexp; float lap = params->locallab.spots.at(sp).lapmaskexp; - float pde = params->locallab.spots.at(sp).laplac; + bool pde = params->locallab.spots.at(sp).laplac; LocwavCurve dummy; bool lmasutilicolwav = false; // bool delt = params->locallab.spots.at(sp).deltae; @@ -13085,7 +13190,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float slope = lp.slomacol; float blendm = lp.blendmacol; float lap = params->locallab.spots.at(sp).lapmaskcol; - float pde = params->locallab.spots.at(sp).laplac; + bool pde = params->locallab.spots.at(sp).laplac; int shado = params->locallab.spots.at(sp).shadmaskcol; bool delt = params->locallab.spots.at(sp).deltae; bool astool = params->locallab.spots.at(sp).toolcol; @@ -14409,7 +14514,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float slope = lp.slomacol; float blendm = lp.blendmacol; float lap = params->locallab.spots.at(sp).lapmaskcol; - float pde = params->locallab.spots.at(sp).laplac; + bool pde = params->locallab.spots.at(sp).laplac; int shado = params->locallab.spots.at(sp).shadmaskcol; int level_bl = params->locallab.spots.at(sp).csthresholdcol.getBottomLeft(); int level_hl = params->locallab.spots.at(sp).csthresholdcol.getTopLeft(); diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 1429cb3cd..953ab61da 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1101,6 +1101,9 @@ private: LocCCmaskCurve locccmasvibCurve; LocLLmaskCurve locllmasvibCurve; LocHHmaskCurve lochhmasvibCurve; + LocCCmaskCurve locccmaslcCurve; + LocLLmaskCurve locllmaslcCurve; + LocHHmaskCurve lochhmaslcCurve; LocCCmaskCurve locccmascbCurve; LocLLmaskCurve locllmascbCurve; LocHHmaskCurve lochhmascbCurve; @@ -1138,6 +1141,7 @@ private: LUTf lmaskretilocalcurve(65536, 0); LUTf lmaskcblocalcurve(65536, 0); LUTf lmaskbllocalcurve(65536, 0); + LUTf lmasklclocalcurve(65536, 0); // int maxspot = 1; float** shbuffer = nullptr; @@ -1172,6 +1176,7 @@ private: bool localmaskretiutili = false; bool localmaskcbutili = false; bool localmaskblutili = false; + bool localmasklcutili = false; bool lcmasexputili = false; bool lhmasexputili = false; bool llmasexputili = false; @@ -1181,6 +1186,9 @@ private: bool lcmasvibutili = false; bool lhmasvibutili = false; bool llmasvibutili = false; + bool lcmaslcutili = false; + bool lhmaslcutili = false; + bool llmaslcutili = false; bool lcmascbutili = false; bool lhmascbutili = false; bool llmascbutili = false; @@ -1251,6 +1259,7 @@ private: CurveFactory::curvemaskLocal(localmaskretiutili, params.locallab.spots.at(sp).Lmaskreticurve, lmaskretilocalcurve, 1); CurveFactory::curvemaskLocal(localmaskcbutili, params.locallab.spots.at(sp).Lmaskcbcurve, lmaskcblocalcurve, 1); CurveFactory::curvemaskLocal(localmaskblutili, params.locallab.spots.at(sp).Lmaskblcurve, lmaskbllocalcurve, 1); + CurveFactory::curvemaskLocal(localmasklcutili, params.locallab.spots.at(sp).Lmasklccurve, lmasklclocalcurve, 1); //provisory double ecomp = params.locallab.spots.at(sp).expcomp; double black = params.locallab.spots.at(sp).black; @@ -1298,6 +1307,7 @@ private: lmaskretilocalcurve, localmaskretiutili, lmaskcblocalcurve, localmaskcbutili, lmaskbllocalcurve, localmaskblutili, + lmasklclocalcurve, localmasklcutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, lochhhmasCurve, lhhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmasvibCurve, lcmasvibutili, locllmasvibCurve, llmasvibutili, lochhmasvibCurve, lhmasvibutili, @@ -1305,6 +1315,7 @@ private: locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili, locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili, + locccmaslcCurve, lcmaslcutili, locllmaslcCurve, llmaslcutili, lochhmaslcCurve, lhmaslcutili, loclmasCurveblwav,lmasutiliblwav, loclmasCurvecolwav,lmasutilicolwav, locwavCurve, locwavutili, diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 059a68abd..ddf882693 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -238,7 +238,7 @@ Locallab::Locallab(): expcurvcol(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_EXPCURV")))), expmaskexp(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWE")))), expmasksh(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWS")))), - expmasklc(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWCB")))), + expmasklc(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWLC")))), expmaskcb(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWCB")))), expmaskreti(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWR")))), expmasktm(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWT")))), @@ -3094,7 +3094,7 @@ pe(nullptr) // } expmasklc->add(*masklcBox, false); -// contrastBox->pack_start(*expmasklc, false, false); + contrastBox->pack_start(*expmasklc, false, false); expcontrast->add(*contrastBox, false); expcontrast->setLevel(2);