From 7a826a586d8934fa4b04f29a0bbfb1b89e1b2f75 Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 18 Dec 2017 08:50:49 +0100 Subject: [PATCH] Add simplified Scope to local denoise --- rtdata/languages/default | 2 + rtengine/dcrop.cc | 11 +- rtengine/dcrop.h | 24 +-- rtengine/improccoordinator.cc | 50 ++++- rtengine/improccoordinator.h | 4 +- rtengine/improcfun.h | 9 +- rtengine/iplocallab.cc | 371 +++++++++++++++++++++++++++------- rtengine/procevents.h | 2 + rtengine/procparams.cc | 8 + rtengine/procparams.h | 2 + rtengine/refreshmap.cc | 4 +- rtengine/simpleprocess.cc | 15 +- rtgui/locallab.cc | 49 ++++- rtgui/locallab.h | 4 +- rtgui/paramsedited.cc | 12 ++ rtgui/paramsedited.h | 2 + 16 files changed, 460 insertions(+), 109 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 30c463ec1..881f7ae77 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -841,6 +841,7 @@ HISTORY_MSG_591;Local - Spot Excluding struc HISTORY_MSG_592;Local - Warm Cool HISTORY_MSG_593;Local - Noise lum detail HISTORY_MSG_594;Local - Noise chro detail +HISTORY_MSG_595;Local - Noise Scope HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -1844,6 +1845,7 @@ TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To be active, you must check button 'Enable curves' TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) has the same algorithm than slider lightness.\n'Super' the curve L=f(L) has an new improved algorithm, which can leeds in some cases to artifacts. TP_LOCALLAB_EXCLUF;Excluding +TP_LOCALLAB_SENSIDEN;Scope TP_LOCALLAB_SENSIEXCLU;Scope TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust color to include in exclusion! TP_LOCALLAB_STRUC;Structure diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index d407e25f6..4f367d7a8 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -1149,6 +1149,7 @@ void Crop::update(int todo) params.locallab.warm = parent->warms[sp]; params.locallab.noiselumdetail = parent->noiselumdetails[sp]; params.locallab.noisechrodetail = parent->noisechrodetails[sp]; + params.locallab.sensiden = parent->sensidens[sp]; std::vector cretie; @@ -1238,14 +1239,14 @@ void Crop::update(int todo) parent->lhist16, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, sca); + params.locallab.huerefblur = (parent->huerefblurs[sp]) / 100.f; params.locallab.hueref = (parent->huerefs[sp]) / 100.f; params.locallab.chromaref = parent->chromarefs[sp]; params.locallab.lumaref = parent->lumarefs[sp]; params.locallab.sobelref = parent->sobelrefs[sp]; - parent->ipf.Lab_Local(1, (float**)shbuffer, labnCrop, labnCrop, reservCrop, cropx / skip, cropy / skip, skips(parent->fw, skip), skips(parent->fh, skip), skip, locRETgainCurve, lllocalcurve2, - loclhCurve, lochhCurve, LHutili, HHutili, cclocalcurve2, localskutili, sklocalcurve2, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, params.locallab.hueref, params.locallab.chromaref, params.locallab.lumaref, params.locallab.sobelref); + loclhCurve, lochhCurve, LHutili, HHutili, cclocalcurve2, localskutili, sklocalcurve2, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, params.locallab.huerefblur, params.locallab.hueref, params.locallab.chromaref, params.locallab.lumaref, params.locallab.sobelref); lllocalcurve2.clear(); cclocalcurve2.clear(); sklocalcurve2.clear(); @@ -1530,6 +1531,7 @@ void Crop::update(int todo) parent->warms[sp] = params.locallab.warm = parent->warms[0]; parent->noiselumdetails[sp] = params.locallab.noiselumdetail = parent->noiselumdetails[0]; parent->noisechrodetails[sp] = params.locallab.noisechrodetail = parent->noisechrodetails[0]; + parent->sensidens[sp] = params.locallab.sensiden = parent->sensidens[0]; std::vector ccret; @@ -1628,12 +1630,13 @@ void Crop::update(int todo) parent->lhist16, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, sca); + params.locallab.huerefblur = (parent->huerefblurs[sp]) / 100.f; params.locallab.hueref = (parent->huerefs[sp]) / 100.f; params.locallab.chromaref = parent->chromarefs[sp]; params.locallab.lumaref = parent->lumarefs[sp]; params.locallab.sobelref = parent->sobelrefs[sp]; parent->ipf.Lab_Local(1, (float**)shbuffer, labnCrop, labnCrop, reservCrop, cropx / skip, cropy / skip, skips(parent->fw, skip), skips(parent->fh, skip), skip, locRETgainCurve, lllocalcurve2, loclhCurve, lochhCurve, - LHutili, HHutili, cclocalcurve2, localskutili, sklocalcurve2, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, params.locallab.hueref, params.locallab.chromaref, params.locallab.lumaref, params.locallab.sobelref); + LHutili, HHutili, cclocalcurve2, localskutili, sklocalcurve2, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, params.locallab.huerefblur, params.locallab.hueref, params.locallab.chromaref, params.locallab.lumaref, params.locallab.sobelref); lllocalcurve2.clear(); cclocalcurve2.clear(); @@ -1889,6 +1892,7 @@ void Crop::freeAll() reservCrop = nullptr; } + /* if (lablocCrop ) { delete lablocCrop; lablocCrop = NULL; @@ -2099,6 +2103,7 @@ bool Crop::setCropSizes(int rcx, int rcy, int rcw, int rch, int skip, bool inter reservCrop = new LabImage(cropw, croph); + /* if (lablocCrop) { delete lablocCrop; // labnCrop can't be resized } diff --git a/rtengine/dcrop.h b/rtengine/dcrop.h index d7f69be23..defec852d 100644 --- a/rtengine/dcrop.h +++ b/rtengine/dcrop.h @@ -72,30 +72,30 @@ protected: ImProcCoordinator* const parent; const bool isDetailWindow; EditUniqueID getCurrEditID(); - bool setCropSizes (int cropX, int cropY, int cropW, int cropH, int skip, bool internal); - void freeAll (); + bool setCropSizes(int cropX, int cropY, int cropW, int cropH, int skip, bool internal); + void freeAll(); public: - Crop (ImProcCoordinator* parent, EditDataProvider *editDataProvider, bool isDetailWindow); - virtual ~Crop (); + Crop(ImProcCoordinator* parent, EditDataProvider *editDataProvider, bool isDetailWindow); + virtual ~Crop(); // MyMutex* locMutex; - void setEditSubscriber (EditSubscriber* newSubscriber); + void setEditSubscriber(EditSubscriber* newSubscriber); bool hasListener(); - void update (int todo); - void setWindow (int cropX, int cropY, int cropW, int cropH, int skip) + void update(int todo); + void setWindow(int cropX, int cropY, int cropW, int cropH, int skip) { - setCropSizes (cropX, cropY, cropW, cropH, skip, false); + setCropSizes(cropX, cropY, cropW, cropH, skip, false); } /** @brief Synchronously look out if a full update is necessary * First try, only make fullUpdate if this returns false */ - bool tryUpdate (); + bool tryUpdate(); /** @brief Asynchronously reprocess the detailed crop */ - void fullUpdate (); // called via thread + void fullUpdate(); // called via thread - void setListener (DetailedCropListener* il); - void destroy (); + void setListener(DetailedCropListener* il); + void destroy(); int get_skip(); int getLeftBorder(); int getUpperBorder(); diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index bbc61398b..819d14288 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -157,6 +157,7 @@ ImProcCoordinator::ImProcCoordinator() noiselumcs(500, -10000), noiselumdetails(500, -10000), noisechrodetails(500, -10000), + sensidens(500, -10000), noisechrofs(500, -10000), noisechrocs(500, -10000), mult0s(500, -10000), @@ -203,11 +204,13 @@ ImProcCoordinator::ImProcCoordinator() strucs(500, -1000), warms(500, -1000), huerefs(500, -100000.f), + huerefblurs(500, -100000.f), chromarefs(500, -100000.f), lumarefs(500, -100000.f), sobelrefs(500, -100000.f), huer(0), + huerblu(0), chromar(0), lumar(0), sobeler(0), @@ -859,7 +862,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) }; - int maxdata = 88;//87 10016 //86 10017 //85 10016;// 82 10015//78;//73 for 10011 + int maxdata = 90;//88 10019//87 10018 //86 10017 //85 10016;// 82 10015//78;//73 for 10011 if (fic0) { //find current version mip @@ -903,7 +906,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) //initilize newues when first utilisation of Locallab. Prepare creation of Mip files for (int sp = 1; sp < maxspot; sp++) { // spots default int t_sp = sp; - int t_mipversion = 10019;//new value for each change + int t_mipversion = 10020;//new value for each change int t_circrad = 18; int t_locX = 250; int t_locY = 250; @@ -1028,6 +1031,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) int t_noiselumdetail = 0; //10019 int t_noisechrodetail = 0; + //10019 + int t_sensiden = 30; //all variables except locRETgainCurve 'coomon for all) fic << "Mipversion=" << t_mipversion << '@' << endl; @@ -1123,6 +1128,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) fic << "Warm=" << t_warm << '@' << endl; fic << "Noiselumdetail=" << t_noiselumdetail << '@' << endl; fic << "Noisechrodetail=" << t_noisechrodetail << '@' << endl; + fic << "Sensiden=" << t_sensiden << '@' << endl; fic << "curveReti=" << t_curvret << '@' << endl; fic << "curveLL=" << t_curvll << '@' << endl; @@ -1377,6 +1383,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) dataspot[81][0] = warms[0] = params.locallab.warm; dataspot[82][0] = noiselumdetails[0] = params.locallab.noiselumdetail; dataspot[83][0] = noisechrodetails[0] = params.locallab.noisechrodetail; + dataspot[84][0] = sensidens[0] = params.locallab.sensiden; // for all curves work around - I do not know how to do with params curves... //curve Reti local @@ -1671,6 +1678,10 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) maxind = 82; } + if (versionmip == 10019) { + maxind = 83; + } + while (getline(fich, line)) { spotline = line; std::size_t pos = spotline.find("="); @@ -1904,6 +1915,12 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) } } + if (versionmip <= 10019) {// + for (int sp = 1; sp < maxspot; sp++) { // spots default + dataspot[84][sp] = 30; + } + } + //here we change the number of spot if (ns < (maxspot - 1)) { @@ -1912,7 +1929,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) for (int sp = ns + 1 ; sp < maxspot; sp++) { // spots default int t_sp = sp; - int t_mipversion = 10019; + int t_mipversion = 10020; int t_circrad = 18; int t_locX = 250; int t_locY = 250; @@ -2029,6 +2046,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) int t_noiselumdetail = 0; //10019 int t_noisechrodetail = 0; + //10020 + int t_sensiden = 30; fic << "Mipversion=" << t_mipversion << '@' << endl; fic << "Spot=" << t_sp << '@' << endl; @@ -2120,6 +2139,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) fic << "Warm=" << t_warm << '@' << endl; fic << "Noiselumdetail=" << t_noiselumdetail << '@' << endl; fic << "Noisechrodetail=" << t_noisechrodetail << '@' << endl; + fic << "Sensiden=" << t_sensiden << '@' << endl; fic << "curveReti=" << t_curvret << '@' << endl; fic << "curveLL=" << t_curvll << '@' << endl; @@ -2221,6 +2241,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) //main algorithm for all spots for (int sp = 1; sp < maxspot; sp++) { //spots default + params.locallab.huerefblur = dataspot[maxdata - 5][sp] / 100.; params.locallab.hueref = dataspot[maxdata - 4][sp] / 100.; params.locallab.chromaref = dataspot[maxdata - 3][sp]; params.locallab.lumaref = dataspot[maxdata - 2][sp]; @@ -2471,6 +2492,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) params.locallab.warm = warms[sp] = dataspot[81][sp]; params.locallab.noiselumdetail = noiselumdetails[sp] = dataspot[82][sp]; params.locallab.noisechrodetail = noisechrodetails[sp] = dataspot[83][sp]; + params.locallab.sensiden = sensidens[sp] = dataspot[84][sp]; int *s_datc; @@ -2681,25 +2703,29 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) lhist16, hltonecurveloc, shtonecurveloc, tonecurveloc, sca); - double huere, chromare, lumare; + double huere, chromare, lumare, huerefblu; double sobelre; - ipf.calc_ref(nprevl, nprevl, 0, 0, pW, pH, scale, huere, chromare, lumare, sobelre); + + ipf.calc_ref(nprevl, nprevl, 0, 0, pW, pH, scale, huerefblu, huere, chromare, lumare, sobelre); + huerblu = huerefblu; huer = huere; chromar = chromare; lumar = lumare ; sobeler = sobelre; + params.locallab.huerefblur = huerblu; params.locallab.hueref = huer; params.locallab.chromaref = chromar; params.locallab.lumaref = lumar; params.locallab.sobelref = sobeler; + dataspot[maxdata - 5][sp] = huerefblurs[sp] = 100.f * params.locallab.huerefblur; dataspot[maxdata - 4][sp] = huerefs[sp] = 100.f * params.locallab.hueref; dataspot[maxdata - 3][sp] = chromarefs[sp] = params.locallab.chromaref; dataspot[maxdata - 2][sp] = lumarefs[sp] = params.locallab.lumaref; dataspot[maxdata - 1][sp] = sobelrefs[sp] = params.locallab.sobelref; //printf("sp=%i huerefsp=%f\n", sp, huerefs[sp]); ipf.Lab_Local(3, (float**)shbuffer, nprevl, nprevl, reserv, 0, 0, pW, pH, scale, locRETgainCurve, lllocalcurve, loclhCurve, lochhCurve, - LHutili, HHutili, cclocalcurve, localskutili, sklocalcurve, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, params.locallab.hueref, params.locallab.chromaref, params.locallab.lumaref, params.locallab.sobelref); + LHutili, HHutili, cclocalcurve, localskutili, sklocalcurve, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, params.locallab.huerefblur, params.locallab.hueref, params.locallab.chromaref, params.locallab.lumaref, params.locallab.sobelref); lllocalcurve.clear(); cclocalcurve.clear(); sklocalcurve.clear(); @@ -2720,6 +2746,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) } + params.locallab.huerefblur = INFINITY; params.locallab.hueref = INFINITY; params.locallab.chromaref = INFINITY; params.locallab.lumaref = INFINITY; @@ -3014,6 +3041,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) dataspot[81][sp] = warms[sp] = params.locallab.warm = dataspot[81][0]; dataspot[82][sp] = noiselumdetails[sp] = params.locallab.noiselumdetail = dataspot[82][0]; dataspot[83][sp] = noisechrodetails[sp] = params.locallab.noisechrodetail = dataspot[83][0]; + dataspot[84][sp] = sensidens[sp] = params.locallab.sensiden = dataspot[84][0]; int *s_datc; @@ -3234,13 +3262,13 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) CurveFactory::curveskLocal(localskutili, params.locallab.skintonescurve, sklocalcurve, sca); CurveFactory::curveexLocal(localexutili, params.locallab.excurve, exlocalcurve, sca); + params.locallab.huerefblur = huerefblurs[sp] / 100.; params.locallab.hueref = huerefs[sp] / 100.; params.locallab.chromaref = chromarefs[sp]; params.locallab.lumaref = lumarefs[sp]; params.locallab.sobelref = sobelrefs[sp]; - ipf.Lab_Local(3, (float**)shbuffer, nprevl, nprevl, reserv, 0, 0, pW, pH, scale, locRETgainCurve, lllocalcurve, loclhCurve, lochhCurve, LHutili, HHutili, cclocalcurve, - localskutili, sklocalcurve, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, params.locallab.hueref, params.locallab.chromaref, params.locallab.lumaref, params.locallab.sobelref); + localskutili, sklocalcurve, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, params.locallab.huerefblur, params.locallab.hueref, params.locallab.chromaref, params.locallab.lumaref, params.locallab.sobelref); lllocalcurve.clear(); cclocalcurve.clear(); sklocalcurve.clear(); @@ -3255,7 +3283,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) for (int spe = 1; spe < maxspot; spe++) { int t_sp = spe; - int t_mipversion = 10019; + int t_mipversion = 10020; int t_circrad = dataspot[2][spe]; int t_locX = dataspot[3][spe]; int t_locY = dataspot[4][spe]; @@ -3345,7 +3373,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) int t_warm = dataspot[81][spe]; int t_noiselumdetail = dataspot[82][spe]; int t_noisechrodetail = dataspot[83][spe]; + int t_sensiden = dataspot[84][spe]; + int t_huerefblur = dataspot[maxdata - 5][spe]; int t_hueref = dataspot[maxdata - 4][spe]; int t_chromaref = dataspot[maxdata - 3][spe]; int t_lumaref = dataspot[maxdata - 2][spe]; @@ -3453,7 +3483,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) fou << "Warm=" << t_warm << '@' << endl; fou << "Noiselumdetail=" << t_noiselumdetail << '@' << endl; fou << "Noisechrodetail=" << t_noisechrodetail << '@' << endl; + fou << "Sensiden=" << t_sensiden << '@' << endl; + fou << "huerefblur=" << t_huerefblur << '@' << endl; fou << "hueref=" << t_hueref << '@' << endl; fou << "chromaref=" << t_chromaref << '@' << endl; fou << "lumaref=" << t_lumaref << '@' << endl; diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index ce27d1158..8018c93bd 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -308,6 +308,7 @@ protected: LUTi noiselumcs; LUTi noiselumdetails; LUTi noisechrodetails; + LUTi sensidens; LUTi noisechrofs; LUTi noisechrocs; LUTi mult0s; @@ -358,11 +359,12 @@ protected: LUTi warms; LUTf huerefs; + LUTf huerefblurs; LUTf chromarefs; LUTf lumarefs; LUTf sobelrefs; - double huer, chromar, lumar, sobeler; + double huer, huerblu, chromar, lumar, sobeler; void startProcessing(); void process(); float colourToningSatLimit; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 0ab0669f0..84c211bed 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -292,10 +292,10 @@ public: //locallab void MSRLocal(float** luminance, float** templ, const float* const *originalLuminance, const int width, const int height, const LocallabParams &loc, const int skip, const LocretigainCurve &locRETgainCcurve, const int chrome, const int scall, const float krad, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax); // void calc_ref (LabImage* original, LabImage* transformed, int cx, int cy, int oW, int oH, int sk, double &huere, double &chromare, double &lumare, double &sobelref); - void calc_ref(LabImage* original, LabImage* transformed, int cx, int cy, int oW, int oH, int sk, double &huere, double &chromare, double &lumare, double &sobelref); + void calc_ref(LabImage* original, LabImage* transformed, int cx, int cy, int oW, int oH, int sk, double &huerefblur, double &huere, double &chromare, double &lumare, double &sobelref); void copy_ref(LabImage* spotbuffer, LabImage* original, LabImage* transformed, int cx, int cy, int sk, const struct local_params & lp, double &huerefspot, double &chromarefspot, double &lumarefspot); void paste_ref(LabImage* spotbuffer, LabImage* transformed, int cx, int cy, int sk, const struct local_params & lp); - void Lab_Local(int call, float** shbuffer, LabImage* original, LabImage* transformed, LabImage* reserved, int cx, int cy, int oW, int oH, int sk, const LocretigainCurve & locRETgainCcurve, LUTf & lllocalcurve, const LocLHCurve & loclhCurve, const LocHHCurve & lochhCurve, bool &LHutili, bool &HHutili, LUTf & cclocalcurve, bool & localskutili, LUTf & sklocalcurve, bool & localexutili, LUTf & exlocalcurve, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, double &hueref, double &chromaref, double &lumaref, double &sobelref); + void Lab_Local(int call, float** shbuffer, LabImage* original, LabImage* transformed, LabImage* reserved, int cx, int cy, int oW, int oH, int sk, const LocretigainCurve & locRETgainCcurve, LUTf & lllocalcurve, const LocLHCurve & loclhCurve, const LocHHCurve & lochhCurve, bool &LHutili, bool &HHutili, LUTf & cclocalcurve, bool & localskutili, LUTf & sklocalcurve, bool & localexutili, LUTf & exlocalcurve, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, double & huerefblur, double &hueref, double &chromaref, double &lumaref, double &sobelref); void addGaNoise(LabImage *lab, LabImage *dst, const float mean, const float variance, const int sk); void BlurNoise_Localold(int call, const struct local_params& lp, LabImage* original, LabImage* transformed, const LabImage* const tmp1, int cx, int cy); void InverseBlurNoise_Local(const struct local_params& lp, LabImage* original, LabImage* transformed, const LabImage* const tmp1, int cx, int cy); @@ -313,12 +313,13 @@ public: void exlabLocal(const local_params& lp, int bfh, int bfw, LabImage* bufexporig, LabImage* lab, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve); void Exclude_Local(int sen, float **deltaso, float **buflight, float **bufchro, const float hueplus, const float huemoins, const float hueref, const float dhue, const float chromaref, const float lumaref, const struct local_params & lp, LabImage * original, LabImage * transformed, LabImage * rsv, int cx, int cy); - void DeNoise_Local(int call, const struct local_params& lp, LabImage* original, LabImage* transformed, const LabImage &tmp1, int cx, int cy); + //void DeNoise_Local(int call, const struct local_params& lp, LabImage* original, LabImage* transformed, const LabImage &tmp1, int cx, int cy); // void ColorLight_Local(int call, LabImage * bufcolorig, float **buflight, float **bufchro, float **bufchroslid, float ** bufhh, float ** buflightslid, bool &LHutili, bool &HHutili, const float hueplus, const float huemoins, const float hueref, const float dhue, const float chromaref, const float lumaref, LUTf & lllocalcurve, const LocLHCurve & loclhCurve, const LocHHCurve & lochhCurve, const local_params& lp, LabImage* original, LabImage* transformed, int cx, int cy); + void DeNoise_Local(int call, const struct local_params& lp, int levred, float hueplus, float huemoins, float hueref, float dhueden, LabImage* original, LabImage* transformed, const LabImage &tmp1, int cx, int cy); void ColorLight_Local(int call, LabImage * bufcolorig, float **buflight, float **bufchro, float **bufchroslid, float ** bufhh, float ** buflightslid, bool &LHutili, bool &HHutili, const float hueplus, const float huemoins, const float hueref, const float dhue, const float chromaref, const float lumaref, LUTf & lllocalcurve, const LocLHCurve & loclhCurve, const LocHHCurve & lochhCurve, const local_params& lp, LabImage* original, LabImage* transformed, int cx, int cy); void InverseColorLight_Local(const struct local_params& lp, LabImage* original, LabImage* transformed, int cx, int cy, const float hueplus, const float huemoins, const float hueref, const float dhue, const float chromaref, const float lumaref); - void cat02_Local(float **buflightcat, float **buf_a_cat, float ** buf_b_cat, const float hueplus, const float huemoins, const float hueref, const float dhue, const float chromaref, const float lumaref, const struct local_params & lp, LabImage * original, LabImage * transformed, const LabImage * const tmp1, int cx, int cy); + void cat02_Local(float **buflightcat, float **buf_a_cat, float ** buf_b_cat, const float hueplus, const float huemoins, const float hueref, const float dhue, const float chromaref, const float lumaref, const struct local_params & lp, LabImage * original, LabImage * transformed, const LabImage * const tmp1, int cx, int cy); void Sharp_Local(int call, float **loctemp, const float hueplus, const float huemoins, const float hueref, const float dhue, const float chromaref, const local_params& lp, LabImage* original, LabImage* transformed, int cx, int cy); void InverseSharp_Local(float **loctemp, const float hueplus, const float huemoins, const float hueref, const float dhue, const float chromaref, const local_params& lp, LabImage* original, LabImage* transformed, int cx, int cy); diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index d23b2b86b..41408a56c 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -125,7 +125,7 @@ struct local_params { int cir; float thr; int prox; - int chro, cont, sens, sensh, senscb, sensbn, senstm, sensex, sensexclu; + int chro, cont, sens, sensh, senscb, sensbn, senstm, sensex, sensexclu, sensden; float ligh; int shamo, shdamp, shiter, senssha, sensv; double shrad; @@ -381,6 +381,8 @@ static void calcLocalParams(int oW, int oH, const LocallabParams& locallab, stru float local_noiselc = locallab.noiselumc; float local_noiseldetail = locallab.noiselumdetail; float local_noisechrodetail = locallab.noisechrodetail; + int local_sensiden = locallab.sensiden; + float local_noisecf = locallab.noisechrof; float local_noisecc = locallab.noisechroc; float multi[5]; @@ -468,6 +470,7 @@ static void calcLocalParams(int oW, int oH, const LocallabParams& locallab, stru lp.noiselc = local_noiselc; lp.noisecf = local_noisecf; lp.noisecc = local_noisecc; + lp.sensden = local_sensiden; lp.strengt = streng; @@ -1861,99 +1864,240 @@ void ImProcFunctions::addGaNoise(LabImage *lab, LabImage *dst, const float mean, } } -void ImProcFunctions::DeNoise_Local(int call, const struct local_params& lp, LabImage* original, LabImage* transformed, const LabImage &tmp1, int cx, int cy) +void ImProcFunctions::DeNoise_Local(int call, const struct local_params& lp, int levred, float hueplus, float huemoins, float hueref, float dhueden, LabImage* original, LabImage* transformed, const LabImage &tmp1, int cx, int cy) { // local denoise //simple algo , perhaps we can improve as the others, but noise is here and not good for hue detection // BENCHFUN const float ach = (float)lp.trans / 100.f; + constexpr float delhu = 0.1f; //between 0.05 and 0.2 - #pragma omp parallel for schedule(dynamic,16) if (multiThread) - for (int y = 0; y < transformed->H; y++) { - const int loy = cy + y; - const bool isZone0 = loy > lp.yc + lp.ly || loy < lp.yc - lp.lyT; // whole line is zone 0 => we can skip a lot of processing - float factnoise1 = 1.f + (lp.noisecf) / 200.f; - float factnoise2 = 1.f + (lp.noisecc) / 100.f; + float factnoise1 = 1.f + (lp.noisecf) / 500.f; + float factnoise2 = 1.f + (lp.noisecc) / 500.f; - if (isZone0) { // outside selection and outside transition zone => no effect, keep original values - for (int x = 0; x < transformed->W; x++) { - transformed->L[y][x] = original->L[y][x]; - transformed->a[y][x] = original->a[y][x]; - transformed->b[y][x] = original->b[y][x]; - } + constexpr float apl = (-1.f) / delhu; + const float bpl = - apl * hueplus; + constexpr float amo = 1.f / delhu; + const float bmo = - amo * huemoins; + /* + constexpr float pb = 4.f; + constexpr float pa = (1.f - pb) / 40.f; + */ + int GW = transformed->W; + int GH = transformed->H; - continue; - } + LabImage *origblur = nullptr; - for (int x = 0; x < transformed->W; x++) { - int lox = cx + x; + origblur = new LabImage(GW, GH); - int zone; - float localFactor; - calcTransition(lox, loy, ach, lp, zone, localFactor); - int begx = int (lp.xc - lp.lxL); - int begy = int (lp.yc - lp.lyT); + float radius = 2.f; +#ifdef _OPENMP + #pragma omp parallel +#endif + { + gaussianBlur(original->L, origblur->L, GW, GH, radius); + gaussianBlur(original->a, origblur->a, GW, GH, radius); + gaussianBlur(original->b, origblur->b, GW, GH, radius); - switch (zone) { - case 0: { // outside selection and outside transition zone => no effect, keep original values + } + + /* + const float ahu = 1.f / (2.8f * lp.sensden - 280.f); + const float bhu = 1.f - ahu * 2.8f * lp.sensden; + */ +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { +#ifdef __SSE2__ + float atan2Buffer[transformed->W] ALIGNED16; + float sqrtBuffer[transformed->W] ALIGNED16; + vfloat c327d68v = F2V(327.68f); +#endif + +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + + for (int y = 0; y < transformed->H; y++) { + const int loy = cy + y; + + const bool isZone0 = loy > lp.yc + lp.ly || loy < lp.yc - lp.lyT; // whole line is zone 0 => we can skip a lot of processing + + if (isZone0) { // outside selection and outside transition zone => no effect, keep original values + for (int x = 0; x < transformed->W; x++) { transformed->L[y][x] = original->L[y][x]; transformed->a[y][x] = original->a[y][x]; transformed->b[y][x] = original->b[y][x]; - break; } - case 1: { // inside transition zone - float factorx = localFactor; - float difL, difa, difb; + continue; + } - if (call == 2) { //simpleprocess - difL = tmp1.L[loy - begy][lox - begx] - original->L[y][x]; - difa = tmp1.a[loy - begy][lox - begx] - original->a[y][x]; - difb = tmp1.b[loy - begy][lox - begx] - original->b[y][x]; - } else { //dcrop - difL = tmp1.L[y][x] - original->L[y][x]; - difa = tmp1.a[y][x] - original->a[y][x]; - difb = tmp1.b[y][x] - original->b[y][x]; +#ifdef __SSE2__ + int i = 0; + + for (; i < transformed->W - 3; i += 4) { + vfloat av = LVFU(origblur->a[y][i]); + vfloat bv = LVFU(origblur->b[y][i]); + STVF(atan2Buffer[i], xatan2f(bv, av)); + STVF(sqrtBuffer[i], _mm_sqrt_ps(SQRV(bv) + SQRV(av)) / c327d68v); + } + + for (; i < transformed->W; i++) { + atan2Buffer[i] = xatan2f(origblur->b[y][i], origblur->a[y][i]); + sqrtBuffer[i] = sqrt(SQR(origblur->b[y][i]) + SQR(origblur->a[y][i])) / 327.68f; + } + +#endif + + for (int x = 0, lox = cx + x; x < transformed->W; x++, lox++) { + int zone = 0; + // int lox = cx + x; + int begx = int (lp.xc - lp.lxL); + int begy = int (lp.yc - lp.lyT); + + float localFactor = 1.f; + calcTransition(lox, loy, ach, lp, zone, localFactor); + + if (zone == 0) { // outside selection and outside transition zone => no effect, keep original values + transformed->L[y][x] = original->L[y][x]; + transformed->a[y][x] = original->a[y][x]; + transformed->b[y][x] = original->b[y][x]; + continue; + } + +#ifdef __SSE2__ + const float rhue = atan2Buffer[x]; + // const float rchro = sqrtBuffer[x]; +#else + const float rhue = xatan2f(origblur->b[y][x], origblur->a[y][x]); + // const float rchro = sqrt(SQR(origblur->b[y][x]) + SQR(origblur->a[y][x])) / 327.68f; +#endif + + // float rL = original->L[y][x] / 327.68f; + + float khu = 0.f; + // bool kzon = false; + + // algo with detection of hue ==> artifacts for noisy images ==> denoise before + if (levred == 7 && lp.sensden < 90.f) { // after 90 plein effect + //hue detection + if ((hueref + dhueden) < rtengine::RT_PI && rhue < hueplus && rhue > huemoins) { //transition are good + if (rhue >= hueplus - delhu) { + khu = apl * rhue + bpl; + } else if (rhue < huemoins + delhu) { + khu = amo * rhue + bmo; + } else { + khu = 1.f; + } + + // kzon = true; + + } else if ((hueref + dhueden) >= rtengine::RT_PI && (rhue > huemoins || rhue < hueplus)) { + if (rhue >= hueplus - delhu && rhue < hueplus) { + khu = apl * rhue + bpl; + } else if (rhue >= huemoins && rhue < huemoins + delhu) { + khu = amo * rhue + bmo; + } else { + khu = 1.f; + } + + // kzon = true; } - difL *= factorx; - difa *= factorx; - difb *= factorx ; - transformed->L[y][x] = original->L[y][x] + difL; - transformed->a[y][x] = (original->a[y][x] + difa) * factnoise1 * factnoise2; - transformed->b[y][x] = (original->b[y][x] + difb) * factnoise1 * factnoise2 ; - break; - } + if ((hueref - dhueden) > -rtengine::RT_PI && rhue < hueplus && rhue > huemoins) { + if (rhue >= hueplus - delhu && rhue < hueplus) { + khu = apl * rhue + bpl; + } else if (rhue >= huemoins && rhue < huemoins + delhu) { + khu = amo * rhue + bmo; + } else { + khu = 1.f; + } - case 2: { // inside selection => full effect, no transition - float difL, difa, difb; + // kzon = true; - if (call == 2) { //simpleprocess - difL = tmp1.L[loy - begy][lox - begx] - original->L[y][x]; - difa = tmp1.a[loy - begy][lox - begx] - original->a[y][x]; - difb = tmp1.b[loy - begy][lox - begx] - original->b[y][x]; - } else { //dcrop - difL = tmp1.L[y][x] - original->L[y][x]; - difa = tmp1.a[y][x] - original->a[y][x]; - difb = tmp1.b[y][x] - original->b[y][x]; + } else if ((hueref - dhueden) <= -rtengine::RT_PI && (rhue > huemoins || rhue < hueplus)) { + if (rhue >= hueplus - delhu && rhue < hueplus) { + khu = apl * rhue + bpl; + } else if (rhue >= huemoins && rhue < huemoins + delhu) { + khu = amo * rhue + bmo; + } else { + khu = 1.f; + } + + // kzon = true; } - - transformed->L[y][x] = original->L[y][x] + difL; - transformed->a[y][x] = (original->a[y][x] + difa) * factnoise1 * factnoise2; - transformed->b[y][x] = (original->b[y][x] + difb) * factnoise1 * factnoise2; + } else { + khu = 1.f; } + + switch (zone) { + case 0: { // outside selection and outside transition zone => no effect, keep original values + transformed->L[y][x] = original->L[y][x]; + transformed->a[y][x] = original->a[y][x]; + transformed->b[y][x] = original->b[y][x]; + break; + } + + case 1: { // inside transition zone + float factorx = localFactor; + float difL, difa, difb; + + if (call == 2) { //simpleprocess + difL = tmp1.L[loy - begy][lox - begx] - original->L[y][x]; + difa = tmp1.a[loy - begy][lox - begx] - original->a[y][x]; + difb = tmp1.b[loy - begy][lox - begx] - original->b[y][x]; + } else { //dcrop + difL = tmp1.L[y][x] - original->L[y][x]; + difa = tmp1.a[y][x] - original->a[y][x]; + difb = tmp1.b[y][x] - original->b[y][x]; + + } + + difL *= factorx * khu; + difa *= factorx * khu; + difb *= factorx * khu; + transformed->L[y][x] = original->L[y][x] + difL; + transformed->a[y][x] = (original->a[y][x] + difa) * factnoise1 * factnoise2; + transformed->b[y][x] = (original->b[y][x] + difb) * factnoise1 * factnoise2 ; + break; + } + + case 2: { // inside selection => full effect, no transition + float difL, difa, difb; + + if (call == 2) { //simpleprocess + difL = tmp1.L[loy - begy][lox - begx] - original->L[y][x]; + difa = tmp1.a[loy - begy][lox - begx] - original->a[y][x]; + difb = tmp1.b[loy - begy][lox - begx] - original->b[y][x]; + } else { //dcrop + difL = tmp1.L[y][x] - original->L[y][x]; + difa = tmp1.a[y][x] - original->a[y][x]; + difb = tmp1.b[y][x] - original->b[y][x]; + + } + + difL *= khu; + difa *= khu; + difb *= khu; + + transformed->L[y][x] = original->L[y][x] + difL; + transformed->a[y][x] = (original->a[y][x] + difa) * factnoise1 * factnoise2; + transformed->b[y][x] = (original->b[y][x] + difb) * factnoise1 * factnoise2; + } + } + } } } - - + delete origblur; } - void ImProcFunctions::cat02_Local(float **buflightcat, float **buf_a_cat, float ** buf_b_cat, const float hueplus, const float huemoins, const float hueref, const float dhue, const float chromaref, const float lumaref, const struct local_params & lp, LabImage * original, LabImage * transformed, const LabImage * const tmp1, int cx, int cy) { @@ -6271,6 +6415,8 @@ void ImProcFunctions::ColorLight_Local(int call, LabImage * bufcolorig, float ** kzon = true; } +//printf("khu=%f ", khu); + // realhh = hhro; //detection of deltaE and deltaL @@ -7153,7 +7299,7 @@ void ImProcFunctions::InverseColorLight_Local(const struct local_params & lp, La } -void ImProcFunctions::calc_ref(LabImage * original, LabImage * transformed, int cx, int cy, int oW, int oH, int sk, double & hueref, double & chromaref, double & lumaref, double & sobelref) +void ImProcFunctions::calc_ref(LabImage * original, LabImage * transformed, int cx, int cy, int oW, int oH, int sk, double & huerefblur, double & hueref, double & chromaref, double & lumaref, double & sobelref) { if (params->locallab.enabled) { //always calculate hueref, chromaref, lumaref before others operations use in normal mode for all modules exceprt denoise @@ -7165,10 +7311,15 @@ void ImProcFunctions::calc_ref(LabImage * original, LabImage * transformed, int double aveB = 0.; double aveL = 0.; double aveChro = 0.; + double aveAblur = 0.; + double aveBblur = 0.; + float avAblur, avBblur; + double avesobel = 0.; // int precision for the counters int nab = 0; int nso = 0; + int nsb = 0; // single precision for the result float avA, avB, avL; int spotSize = 0.88623f * max(1, lp.cir / sk); //18 @@ -7182,6 +7333,9 @@ void ImProcFunctions::calc_ref(LabImage * original, LabImage * transformed, int LabImage *sobelL; LabImage *deltasobelL; LabImage *origsob; + LabImage *origblur = nullptr; + LabImage *blurorig = nullptr; + int spotSi = 1 + 2 * max(1, lp.cir / sk); if (spotSi < 5) { @@ -7189,9 +7343,54 @@ void ImProcFunctions::calc_ref(LabImage * original, LabImage * transformed, int } spotSise2 = (spotSi - 1) / 2; + + origsob = new LabImage(spotSi, spotSi); sobelL = new LabImage(spotSi, spotSi); deltasobelL = new LabImage(spotSi, spotSi); + bool isdenoise = false; + + if ((lp.noiself > 0.f || lp.noiselc > 0.f || lp.noisecf > 0.f || lp.noisecc > 0.f) && lp.denoiena) { + isdenoise = true; + } + + if (isdenoise) { + origblur = new LabImage(spotSi, spotSi); + blurorig = new LabImage(spotSi, spotSi); + + for (int y = max(cy, (int)(lp.yc - spotSise2)); y < min(transformed->H + cy, (int)(lp.yc + spotSise2 + 1)); y++) { + for (int x = max(cx, (int)(lp.xc - spotSise2)); x < min(transformed->W + cx, (int)(lp.xc + spotSise2 + 1)); x++) { + int yb = max(cy, (int)(lp.yc - spotSise2)); + + int xb = max(cx, (int)(lp.xc - spotSise2)); + + int z = y - yb; + int u = x - xb; + origblur->L[z][u] = original->L[y - cy][x - cx]; + origblur->a[z][u] = original->a[y - cy][x - cx]; + origblur->b[z][u] = original->b[y - cy][x - cx]; + + } + } + + float radius = 2.f; + { + //No omp + gaussianBlur(origblur->L, blurorig->L, spotSi, spotSi, radius); + gaussianBlur(origblur->a, blurorig->a, spotSi, spotSi, radius); + gaussianBlur(origblur->b, blurorig->b, spotSi, spotSi, radius); + + } + + for (int y = 0; y < spotSi; y++) { + for (int x = 0; x < spotSi; x++) { + aveAblur += blurorig->a[y][x]; + aveBblur += blurorig->b[y][x]; + nsb++; + + } + } + } //ref for luma, chroma, hue for (int y = max(cy, (int)(lp.yc - spotSize)); y < min(transformed->H + cy, (int)(lp.yc + spotSize + 1)); y++) { @@ -7250,9 +7449,30 @@ void ImProcFunctions::calc_ref(LabImage * original, LabImage * transformed, int avB = aveB / 327.68f; avL = aveL / 327.68f; hueref = xatan2f(avB, avA); //mean hue + + if (isdenoise) { + + aveAblur = aveAblur / nsb; + aveBblur = aveBblur / nsb; + avAblur = aveAblur / 327.68f; + avBblur = aveBblur / 327.68f; + } + + if (isdenoise) { + huerefblur = xatan2f(avBblur, avAblur); + } else { + huerefblur = 0.f; + } + + // printf("hueblur=%f hue=%f\n", huerefblur, hueref); chromaref = aveChro; lumaref = avL; + if (isdenoise) { + delete origblur; + delete blurorig; + } + if (lumaref > 95.f) {//to avoid crash lumaref = 95.f; } @@ -7352,7 +7572,7 @@ void ImProcFunctions::paste_ref(LabImage * spotbuffer, LabImage * transformed, i void ImProcFunctions::Lab_Local(int call, float** shbuffer, LabImage * original, LabImage * transformed, LabImage * reserved, int cx, int cy, int oW, int oH, int sk, const LocretigainCurve & locRETgainCcurve, LUTf & lllocalcurve, const LocLHCurve & loclhCurve, const LocHHCurve & lochhCurve, - bool & LHutili, bool & HHutili, LUTf & cclocalcurve, bool & localskutili, LUTf & sklocalcurve, bool & localexutili, LUTf & exlocalcurve, LUTf & hltonecurveloc, LUTf & shtonecurveloc, LUTf & tonecurveloc, double & hueref, double & chromaref, double & lumaref, double & sobelref) + bool & LHutili, bool & HHutili, LUTf & cclocalcurve, bool & localskutili, LUTf & sklocalcurve, bool & localexutili, LUTf & exlocalcurve, LUTf & hltonecurveloc, LUTf & shtonecurveloc, LUTf & tonecurveloc, double & huerefblur, double & hueref, double & chromaref, double & lumaref, double & sobelref) { //general call of others functions : important return hueref, chromaref, lumaref if (params->locallab.enabled) { @@ -7438,8 +7658,7 @@ void ImProcFunctions::Lab_Local(int call, float** shbuffer, LabImage * original, constexpr float ared = (rtengine::RT_PI - 0.05f) / 100.f; constexpr float bred = 0.05f; - - float dhue = ared * lp.sens + bred; //delta hue lght chroma + float dhue = ared * lp.sens + bred; //delta hue vibr float dhuev = ared * lp.sensv + bred; //delta hue vibr @@ -7457,6 +7676,9 @@ void ImProcFunctions::Lab_Local(int call, float** shbuffer, LabImage * original, float dhueexclu = ared * lp.sensexclu + bred; //delta hue exclude + float dhueden = ared * lp.sensden + bred; //delta hue lght chroma + + constexpr float maxh = 3.5f; // 3.5 amplification contrast above mean constexpr float maxl = 2.5f; // 3 reductio contrast under mean @@ -8499,6 +8721,17 @@ void ImProcFunctions::Lab_Local(int call, float** shbuffer, LabImage * original, levred = 7; } + float hueplus = huerefblur + dhueden; + float huemoins = huerefblur - dhueden; + + if (hueplus > rtengine::RT_PI) { + hueplus = huerefblur + dhueden - 2.f * rtengine::RT_PI; + } + + if (huemoins < -rtengine::RT_PI) { + huemoins = huerefblur - dhueden + 2.f * rtengine::RT_PI; + } + #ifdef _OPENMP const int numThreads = omp_get_max_threads(); #else @@ -9373,8 +9606,8 @@ void ImProcFunctions::Lab_Local(int call, float** shbuffer, LabImage * original, fftwf_cleanup(); - - DeNoise_Local(call, lp, original, transformed, tmp1, cx, cy); + // printf("huere=%f dhueden=%f huplus=%f huemoin=%f\n", hueref, dhueden, hueplus, huemoins); + DeNoise_Local(call, lp, levred, hueplus, huemoins, huerefblur, dhueden, original, transformed, tmp1, cx, cy); } else if (call == 2) { //simpleprocess @@ -10250,7 +10483,7 @@ void ImProcFunctions::Lab_Local(int call, float** shbuffer, LabImage * original, fftwf_cleanup(); - DeNoise_Local(call, lp, original, transformed, bufwv, cx, cy); + DeNoise_Local(call, lp, levred, hueplus, huemoins, huerefblur, dhueden, original, transformed, bufwv, cx, cy); } } diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 8b0146b73..adea58686 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -621,6 +621,8 @@ enum ProcEvent { Evlocallabwarm = 591, Evlocallabnoiselumdetail = 592, Evlocallabnoisechrodetail = 593, + Evlocallabsensiden = 594, + Evlocallabhuerefblur = 595, NUMOFEVENTS diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index b2db01b33..97e089d4a 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2376,6 +2376,7 @@ noiselumf(0), noiselumc(0), noiselumdetail(0), noisechrodetail(0), +sensiden(30), noisechrof(0), noisechroc(0), sharradius(40), @@ -2415,6 +2416,7 @@ inversrad(false), inversret(false), inverssha(false), hueref(1.), +huerefblur(1.), chromaref(50.), lumaref(50.), sobelref(0.), @@ -2510,6 +2512,7 @@ bool LocallabParams::operator ==(const LocallabParams& other) const && noiselumc == other.noiselumc && noiselumdetail == other.noiselumdetail && noisechrodetail == other.noisechrodetail + && sensiden == other.sensiden && noisechrof == other.noisechrof && noisechroc == other.noisechroc && sharradius == other.sharradius @@ -2540,6 +2543,7 @@ bool LocallabParams::operator ==(const LocallabParams& other) const && nbspot == other.nbspot && anbspot == other.anbspot && hueref == other.hueref + && huerefblur == other.huerefblur && chromaref == other.chromaref && lumaref == other.lumaref && sobelref == other.sobelref @@ -3486,6 +3490,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.noiselumc, "Locallab", "noiselumc", locallab.noiselumc, keyFile); saveToKeyfile(!pedited || pedited->locallab.noiselumdetail, "Locallab", "noiselumdetail", locallab.noiselumdetail, keyFile); saveToKeyfile(!pedited || pedited->locallab.noisechrodetail, "Locallab", "noisechrodetail", locallab.noisechrodetail, keyFile); + saveToKeyfile(!pedited || pedited->locallab.sensiden, "Locallab", "Sensiden", locallab.sensiden, keyFile); saveToKeyfile(!pedited || pedited->locallab.noisechrof, "Locallab", "noisechrof", locallab.noisechrof, keyFile); saveToKeyfile(!pedited || pedited->locallab.noisechroc, "Locallab", "noisechroc", locallab.noisechroc, keyFile); saveToKeyfile(!pedited || pedited->locallab.sharradius, "Locallab", "Sharradius", locallab.sharradius, keyFile); @@ -3509,6 +3514,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.nbspot, "Locallab", "Nbspot", locallab.nbspot, keyFile); saveToKeyfile(!pedited || pedited->locallab.anbspot, "Locallab", "ANbspot", locallab.anbspot, keyFile); saveToKeyfile(!pedited || pedited->locallab.hueref, "Locallab", "Hueref", locallab.hueref, keyFile); + saveToKeyfile(!pedited || pedited->locallab.huerefblur, "Locallab", "Huerefblur", locallab.huerefblur, keyFile); saveToKeyfile(!pedited || pedited->locallab.chromaref, "Locallab", "Chromaref", locallab.chromaref, keyFile); saveToKeyfile(!pedited || pedited->locallab.lumaref, "Locallab", "Lumaref", locallab.lumaref, keyFile); saveToKeyfile(!pedited || pedited->locallab.sobelref, "Locallab", "Sobelref", locallab.sobelref, keyFile); @@ -4541,6 +4547,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "noiselumc", pedited, locallab.noiselumc, pedited->locallab.noiselumc); assignFromKeyfile(keyFile, "Locallab", "noiselumdetail", pedited, locallab.noiselumdetail, pedited->locallab.noiselumdetail); assignFromKeyfile(keyFile, "Locallab", "noisechrodetail", pedited, locallab.noisechrodetail, pedited->locallab.noisechrodetail); + assignFromKeyfile(keyFile, "Locallab", "Sensiden", pedited, locallab.sensiden, pedited->locallab.sensiden); assignFromKeyfile(keyFile, "Locallab", "noisechrof", pedited, locallab.noisechrof, pedited->locallab.noisechrof); assignFromKeyfile(keyFile, "Locallab", "noisechroc", pedited, locallab.noisechroc, pedited->locallab.noisechroc); assignFromKeyfile(keyFile, "Locallab", "Sharradius", pedited, locallab.sharradius, pedited->locallab.sharradius); @@ -4565,6 +4572,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Nbspot", pedited, locallab.nbspot, pedited->locallab.nbspot); assignFromKeyfile(keyFile, "Locallab", "ANbspot", pedited, locallab.anbspot, pedited->locallab.anbspot); assignFromKeyfile(keyFile, "Locallab", "Hueref", pedited, locallab.hueref, pedited->locallab.hueref); + assignFromKeyfile(keyFile, "Locallab", "Huerefblur", pedited, locallab.huerefblur, pedited->locallab.huerefblur); assignFromKeyfile(keyFile, "Locallab", "Chromaref", pedited, locallab.chromaref, pedited->locallab.chromaref); assignFromKeyfile(keyFile, "Locallab", "Lumaref", pedited, locallab.lumaref, pedited->locallab.lumaref); assignFromKeyfile(keyFile, "Locallab", "Sobelref", pedited, locallab.sobelref, pedited->locallab.sobelref); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 8193319c0..949b66740 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -916,6 +916,7 @@ struct LocallabParams { int noiselumc; int noiselumdetail; int noisechrodetail; + int sensiden; int noisechrof; int noisechroc; int sharradius; @@ -955,6 +956,7 @@ struct LocallabParams { bool inversret; bool inverssha; double hueref; + double huerefblur; double chromaref; double lumaref; double sobelref; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 9010dd19f..7eb8bdcac 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -620,7 +620,9 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, // Evlocallabstruc LUMINANCECURVE, // Evlocallabwarm LUMINANCECURVE, // Evlocallabnoiselumdetail - LUMINANCECURVE // Evlocallabnoisechrodetail + LUMINANCECURVE, // Evlocallabnoisechrodetail + LUMINANCECURVE, // Evlocallabsensiden + LUMINANCECURVE // Evlocallabhuerefblur }; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index c38250b56..280ec2919 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1103,7 +1103,7 @@ private: } ifstream fich(datalab, ios::in); - int maxdata = 88; //87 10018//86 10017//85 10016 //82;//78;//73 10011 + int maxdata = 90; //88 10019 //87 10018//86 10017//85 10016 //82;//78;//73 10011 if (fich && versionmip != 0) { std::string inser; @@ -1340,7 +1340,9 @@ private: dataspots[81][0] = params.locallab.warm; dataspots[82][0] = params.locallab.noiselumdetail; dataspots[83][0] = params.locallab.noisechrodetail; + dataspots[84][0] = params.locallab.sensiden; + dataspots[maxdata - 5][0] = 100.f * params.locallab.huerefblur; dataspots[maxdata - 4][0] = 100.f * params.locallab.hueref; dataspots[maxdata - 3][0] = params.locallab.chromaref; dataspots[maxdata - 2][0] = params.locallab.lumaref; @@ -1607,6 +1609,7 @@ private: for (int sp = 1; sp < maxspot; sp++) { //spots default + params.locallab.huerefblur = INFINITY; params.locallab.hueref = INFINITY; params.locallab.chromaref = INFINITY; params.locallab.lumaref = INFINITY; @@ -1811,7 +1814,9 @@ private: params.locallab.warm = dataspots[81][sp]; params.locallab.noiselumdetail = dataspots[82][sp]; params.locallab.noisechrodetail = dataspots[83][sp]; + params.locallab.sensiden = dataspots[84][sp]; + params.locallab.huerefblur = ((float) dataspots[maxdata - 5][sp]) / 100.f; params.locallab.hueref = ((float) dataspots[maxdata - 4][sp]) / 100.f; params.locallab.chromaref = dataspots[maxdata - 3][sp]; params.locallab.lumaref = dataspots[maxdata - 2][sp]; @@ -1992,17 +1997,19 @@ private: hist16, hltonecurveloc, shtonecurveloc, tonecurveloc, 1); - double huere, chromare, lumare; + double huere, chromare, lumare, huerefblu; double sobelre; - ipf.calc_ref(labView, labView, 0, 0, fw, fh, 1, huere, chromare, lumare, sobelre); + ipf.calc_ref(labView, labView, 0, 0, fw, fh, 1, huerefblu, huere, chromare, lumare, sobelre); + + params.locallab.huerefblur = huerefblu; params.locallab.hueref = huere; params.locallab.chromaref = chromare; params.locallab.lumaref = lumare; params.locallab.sobelref = sobelre; ipf.Lab_Local(2, (float**)shbuffer, labView, labView, reservView, 0, 0, fw, fh, 1, locRETgainCurve, lllocalcurve, loclhCurve, lochhCurve, - LHutili, HHutili, cclocalcurve, localskutili, sklocalcurve, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, params.locallab.hueref, params.locallab.chromaref, params.locallab.lumaref, params.locallab.sobelref); + LHutili, HHutili, cclocalcurve, localskutili, sklocalcurve, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, params.locallab.huerefblur, params.locallab.hueref, params.locallab.chromaref, params.locallab.lumaref, params.locallab.sobelref); lllocalcurve.clear(); cclocalcurve.clear(); sklocalcurve.clear(); diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 25d228cc8..6e1e44798 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -108,9 +108,11 @@ Locallab::Locallab(): noiselumc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELUMCOARSE"), 0, 100, 1, 0))), noiselumdetail(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELUMDETAIL"), 0, 100, 1, 50))), noisechrodetail(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISECHRODETAIL"), 0, 100, 1, 50))), + sensiden(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSIDEN"), 0, 100, 1, 30))), noisechrof(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISECHROFINE"), 0, 100, 1, 0))), noisechroc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISECHROCOARSE"), 0, 100, 1, 0))), hueref(Gtk::manage(new Adjuster(M("TP_LOCALLAB_HUEREF"), -3.15, 3.15, 0.01, 0))), + huerefblur(Gtk::manage(new Adjuster(M("TP_LOCALLAB_HUEREFBLUR"), -3.15, 3.15, 0.01, 0))), chromaref(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMAREF"), 0, 200, 0.01, 0))), lumaref(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LUMAMAREF"), 0, 100, 0.01, 0))), sobelref(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOBELREF"), 0, 100, 0.01, 0))), @@ -508,17 +510,20 @@ Locallab::Locallab(): pack_start(*anbspot); hueref->setAdjusterListener(this); + huerefblur->setAdjusterListener(this); chromaref->setAdjusterListener(this); lumaref->setAdjusterListener(this); sobelref->setAdjusterListener(this); pack_start(*hueref); + pack_start(*huerefblur); pack_start(*chromaref); pack_start(*lumaref); pack_start(*sobelref); anbspot->hide();//keep anbspot - i used it to test diffrent algo... hueref->hide(); + huerefblur->hide(); chromaref->hide(); lumaref->hide(); sobelref->hide(); @@ -644,6 +649,7 @@ Locallab::Locallab(): noiselumc->setAdjusterListener(this); noiselumdetail->setAdjusterListener(this); noisechrodetail->setAdjusterListener(this); + sensiden->setAdjusterListener(this); noisechrof->setAdjusterListener(this); @@ -656,6 +662,7 @@ Locallab::Locallab(): denoisBox->pack_start(*noisechrof); denoisBox->pack_start(*noisechroc); denoisBox->pack_start(*noisechrodetail); + denoisBox->pack_start(*sensiden); neutrHBox1 = Gtk::manage(new Gtk::HBox()); @@ -1311,6 +1318,7 @@ void Locallab::neutral_pressed() noisechrof->resetValue(false); noisechroc->resetValue(false); noisechrodetail->resetValue(false); + sensiden->resetValue(false); } @@ -1816,12 +1824,16 @@ bool Locallab::localComputed_() warm->setValue(nextdatasp[81]); noiselumdetail->setValue(nextdatasp[82]); noisechrodetail->setValue(nextdatasp[83]); + sensiden->setValue(nextdatasp[84]); - double intermed = 0.01 * (double) nextdatasp[84]; + double intermedblur = 0.01 * (double) nextdatasp[85]; + huerefblur->setValue(intermedblur); + double intermed = 0.01 * (double) nextdatasp[86]; hueref->setValue(intermed); - chromaref->setValue(nextdatasp[85]); - lumaref->setValue(nextdatasp[86]); - sobelref->setValue(nextdatasp[87]); + + chromaref->setValue(nextdatasp[87]); + lumaref->setValue(nextdatasp[88]); + sobelref->setValue(nextdatasp[89]); int *s_datc; s_datc = new int[70]; @@ -2105,7 +2117,7 @@ bool Locallab::localComputed_() void Locallab::localChanged(int **datasp, std::string datastr, std::string ll_str, std::string lh_str, std::string cc_str, std::string hh_str, std::string sk_str, std::string ps_str, std::string ex_str, int sp, int maxdat) { - for (int i = 2; i < 88; i++) { + for (int i = 2; i < 90; i++) { nextdatasp[i] = datasp[i][sp]; } @@ -2142,6 +2154,7 @@ void Locallab::read(const ProcParams* pp, const ParamsEdited* pedited) { anbspot->hide(); hueref->hide(); + huerefblur->hide(); chromaref->hide(); lumaref->hide(); sobelref->hide(); @@ -2195,6 +2208,7 @@ void Locallab::read(const ProcParams* pp, const ParamsEdited* pedited) noisechrof->setEditedState(pedited->locallab.noisechrof ? Edited : UnEdited); noisechroc->setEditedState(pedited->locallab.noisechroc ? Edited : UnEdited); noisechrodetail->setEditedState(pedited->locallab.noisechrodetail ? Edited : UnEdited); + sensiden->setEditedState(pedited->locallab.sensiden ? Edited : UnEdited); pastels->setEditedState(pedited->locallab.pastels ? Edited : UnEdited); saturated->setEditedState(pedited->locallab.saturated ? Edited : UnEdited); @@ -2231,6 +2245,7 @@ void Locallab::read(const ProcParams* pp, const ParamsEdited* pedited) nbspot->setEditedState(pedited->locallab.nbspot ? Edited : UnEdited); anbspot->setEditedState(pedited->locallab.anbspot ? Edited : UnEdited); hueref->setEditedState(pedited->locallab.hueref ? Edited : UnEdited); + huerefblur->setEditedState(pedited->locallab.huerefblur ? Edited : UnEdited); chromaref->setEditedState(pedited->locallab.chromaref ? Edited : UnEdited); lumaref->setEditedState(pedited->locallab.lumaref ? Edited : UnEdited); sobelref->setEditedState(pedited->locallab.sobelref ? Edited : UnEdited); @@ -2386,6 +2401,7 @@ void Locallab::read(const ProcParams* pp, const ParamsEdited* pedited) nbspot->setValue(pp->locallab.nbspot); anbspot->setValue(pp->locallab.anbspot); hueref->setValue(pp->locallab.hueref); + huerefblur->setValue(pp->locallab.huerefblur); chromaref->setValue(pp->locallab.chromaref); lumaref->setValue(pp->locallab.lumaref); sobelref->setValue(pp->locallab.sobelref); @@ -2406,6 +2422,7 @@ void Locallab::read(const ProcParams* pp, const ParamsEdited* pedited) noisechrof->setValue(pp->locallab.noisechrof); noisechroc->setValue(pp->locallab.noisechroc); noisechrodetail->setValue(pp->locallab.noisechrodetail); + sensiden->setValue(pp->locallab.sensiden); expcolor->setEnabled(pp->locallab.expcolor); expexpose->setEnabled(pp->locallab.expexpose); expvibrance->setEnabled(pp->locallab.expvibrance); @@ -2557,6 +2574,7 @@ void Locallab::read(const ProcParams* pp, const ParamsEdited* pedited) anbspot->hide(); hueref->hide(); + huerefblur->hide(); chromaref->hide(); lumaref->hide(); sobelref->hide(); @@ -2831,6 +2849,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.noiselumc = noiselumc->getIntValue(); pp->locallab.noiselumdetail = noiselumdetail->getIntValue(); pp->locallab.noisechrodetail = noisechrodetail->getIntValue(); + pp->locallab.sensiden = sensiden->getIntValue(); pp->locallab.noiselumf = noiselumf->getIntValue(); pp->locallab.noisechrof = noisechrof->getIntValue(); pp->locallab.noisechroc = noisechroc->getIntValue(); @@ -2871,6 +2890,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.nbspot = nbspot->getIntValue(); pp->locallab.anbspot = anbspot->getIntValue(); pp->locallab.hueref = hueref->getValue(); + pp->locallab.huerefblur = huerefblur->getValue(); pp->locallab.chromaref = chromaref->getValue(); pp->locallab.lumaref = lumaref->getValue(); pp->locallab.sobelref = sobelref->getValue(); @@ -2945,6 +2965,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.noiselumc = noiselumc->getEditedState(); pedited->locallab.noiselumdetail = noiselumdetail->getEditedState(); pedited->locallab.noisechrodetail = noisechrodetail->getEditedState(); + pedited->locallab.sensiden = sensiden->getEditedState(); pedited->locallab.noisechrof = noisechrof->getEditedState(); pedited->locallab.noisechroc = noisechroc->getEditedState(); pedited->locallab.sharradius = sharradius->getEditedState(); @@ -2984,6 +3005,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.nbspot = nbspot->getEditedState(); pedited->locallab.anbspot = anbspot->getEditedState(); pedited->locallab.hueref = hueref->getEditedState(); + pedited->locallab.huerefblur = huerefblur->getEditedState(); pedited->locallab.chromaref = chromaref->getEditedState(); pedited->locallab.lumaref = lumaref->getEditedState(); pedited->locallab.sobelref = sobelref->getEditedState(); @@ -3718,6 +3740,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe noiselumc->setDefault(defParams->locallab.noiselumc); noiselumdetail->setDefault(defParams->locallab.noiselumdetail); noisechrodetail->setDefault(defParams->locallab.noisechrodetail); + sensiden->setDefault(defParams->locallab.sensiden); noisechrof->setDefault(defParams->locallab.noisechrof); noisechroc->setDefault(defParams->locallab.noisechroc); sharradius->setDefault(defParams->locallab.sharradius); @@ -3747,6 +3770,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe nbspot->setDefault(defParams->locallab.nbspot); anbspot->setDefault(defParams->locallab.anbspot); hueref->setDefault(defParams->locallab.hueref); + huerefblur->setDefault(defParams->locallab.huerefblur); chromaref->setDefault(defParams->locallab.chromaref); lumaref->setDefault(defParams->locallab.lumaref); sobelref->setDefault(defParams->locallab.sobelref); @@ -3794,6 +3818,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe noiselumc->setDefaultEditedState(pedited->locallab.noiselumc ? Edited : UnEdited); noiselumdetail->setDefaultEditedState(pedited->locallab.noiselumdetail ? Edited : UnEdited); noisechrodetail->setDefaultEditedState(pedited->locallab.noisechrodetail ? Edited : UnEdited); + sensiden->setDefaultEditedState(pedited->locallab.sensiden ? Edited : UnEdited); noisechrof->setDefaultEditedState(pedited->locallab.noisechrof ? Edited : UnEdited); noisechroc->setDefaultEditedState(pedited->locallab.noisechroc ? Edited : UnEdited); sharradius->setDefaultEditedState(pedited->locallab.sharradius ? Edited : UnEdited); @@ -3823,6 +3848,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe nbspot->setDefaultEditedState(pedited->locallab.nbspot ? Edited : UnEdited); anbspot->setDefaultEditedState(pedited->locallab.anbspot ? Edited : UnEdited); hueref->setDefaultEditedState(pedited->locallab.hueref ? Edited : UnEdited); + huerefblur->setDefaultEditedState(pedited->locallab.huerefblur ? Edited : UnEdited); chromaref->setDefaultEditedState(pedited->locallab.chromaref ? Edited : UnEdited); lumaref->setDefaultEditedState(pedited->locallab.lumaref ? Edited : UnEdited); sobelref->setDefaultEditedState(pedited->locallab.sobelref ? Edited : UnEdited); @@ -3869,6 +3895,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe noiselumc->setDefaultEditedState(Irrelevant); noiselumdetail->setDefaultEditedState(Irrelevant); noisechrodetail->setDefaultEditedState(Irrelevant); + sensiden->setDefaultEditedState(Irrelevant); noisechrof->setDefaultEditedState(Irrelevant); noisechroc->setDefaultEditedState(Irrelevant); sharradius->setDefaultEditedState(Irrelevant); @@ -3898,6 +3925,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe nbspot->setDefaultEditedState(Irrelevant); anbspot->setDefaultEditedState(Irrelevant); hueref->setDefaultEditedState(Irrelevant); + huerefblur->setDefaultEditedState(Irrelevant); chromaref->setDefaultEditedState(Irrelevant); lumaref->setDefaultEditedState(Irrelevant); sobelref->setDefaultEditedState(Irrelevant); @@ -3933,6 +3961,7 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) updateGeometry(int (centerX->getValue()), int (centerY->getValue()), int (circrad->getValue()), (int)locY->getValue(), degree->getValue(), (int)locX->getValue(), (int)locYT->getValue(), (int)locXL->getValue()); anbspot->hide(); hueref->hide(); + huerefblur->hide(); chromaref->hide(); lumaref->hide(); sobelref->hide(); @@ -4046,6 +4075,8 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) listener->panelChanged(Evlocallabnoiselumdetail, noiselumdetail->getTextValue()); } else if (a == noisechrodetail) { listener->panelChanged(Evlocallabnoisechrodetail, noisechrodetail->getTextValue()); + } else if (a == sensiden) { + listener->panelChanged(Evlocallabsensiden, sensiden->getTextValue()); } else if (a == noisechrof) { listener->panelChanged(Evlocallabnoisechrof, noisechrof->getTextValue()); } else if (a == noisechroc) { @@ -4094,6 +4125,8 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) listener->panelChanged(Evlocallabanbspot, ""); //anbspot->getTextValue()); } else if (a == hueref) { listener->panelChanged(Evlocallabhueref, ""); //anbspot->getTextValue()); + } else if (a == huerefblur) { + listener->panelChanged(Evlocallabhuerefblur, ""); //anbspot->getTextValue()); } else if (a == chromaref) { listener->panelChanged(Evlocallabchromaref, ""); //anbspot->getTextValue()); } else if (a == lumaref) { @@ -4146,6 +4179,7 @@ void Locallab::enabledChanged() { anbspot->hide(); hueref->hide(); + huerefblur->hide(); chromaref->hide(); lumaref->hide(); sobelref->hide(); @@ -4234,6 +4268,7 @@ void Locallab::trimValues(rtengine::procparams::ProcParams * pp) noiselumc->trimValue(pp->locallab.noiselumc); noiselumdetail->trimValue(pp->locallab.noiselumdetail); noisechrodetail->trimValue(pp->locallab.noisechrodetail); + sensiden->trimValue(pp->locallab.sensiden); noisechrof->trimValue(pp->locallab.noisechrof); noisechroc->trimValue(pp->locallab.noisechroc); sharradius->trimValue(pp->locallab.sharradius); @@ -4263,6 +4298,7 @@ void Locallab::trimValues(rtengine::procparams::ProcParams * pp) nbspot->trimValue(pp->locallab.nbspot); anbspot->trimValue(pp->locallab.anbspot); hueref->trimValue(pp->locallab.hueref); + huerefblur->trimValue(pp->locallab.huerefblur); chromaref->trimValue(pp->locallab.chromaref); lumaref->trimValue(pp->locallab.lumaref); sobelref->trimValue(pp->locallab.sobelref); @@ -4289,6 +4325,7 @@ void Locallab::setBatchMode(bool batchMode) ToolPanel::setBatchMode(batchMode); hueref->hide(); + huerefblur->hide(); chromaref->hide(); lumaref->hide(); sobelref->hide(); @@ -4320,6 +4357,7 @@ void Locallab::setBatchMode(bool batchMode) noiselumc->showEditedCB(); noiselumdetail->showEditedCB(); noisechrodetail->showEditedCB(); + sensiden->showEditedCB(); noisechroc->showEditedCB(); noiselumf->showEditedCB(); sharradius->showEditedCB(); @@ -4350,6 +4388,7 @@ void Locallab::setBatchMode(bool batchMode) nbspot->showEditedCB(); anbspot->showEditedCB(); hueref->showEditedCB(); + huerefblur->showEditedCB(); chromaref->showEditedCB(); lumaref->showEditedCB(); sobelref->showEditedCB(); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 5a23cf5ce..21d1b390f 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -117,10 +117,12 @@ private: Adjuster* const noiselumc; Adjuster* const noiselumdetail; Adjuster* const noisechrodetail; + Adjuster* const sensiden; Adjuster* const noisechrof; Adjuster* const noisechroc; Adjuster* const hueref; + Adjuster* const huerefblur; Adjuster* const chromaref; Adjuster* const lumaref; Adjuster* const sobelref; @@ -234,7 +236,7 @@ private: - int nextdatasp[88]; + int nextdatasp[90]; int nextlength; std::string nextstr; std::string nextstr2; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 6b1c30dc1..57c9d489c 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -349,6 +349,7 @@ void ParamsEdited::set(bool v) locallab.noiselumc = v; locallab.noiselumdetail = v; locallab.noisechrodetail = v; + locallab.sensiden = v; locallab.noisechrof = v; locallab.noisechroc = v; locallab.sharradius = v; @@ -393,6 +394,7 @@ void ParamsEdited::set(bool v) locallab.nbspot = v; locallab.anbspot = v; locallab.hueref = v; + locallab.huerefblur = v; locallab.chromaref = v; locallab.lumaref = v; locallab.sobelref = v; @@ -1014,6 +1016,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.noiselumc = locallab.noiselumc && p.locallab.noiselumc == other.locallab.noiselumc; locallab.noiselumdetail = locallab.noiselumdetail && p.locallab.noiselumdetail == other.locallab.noiselumdetail; locallab.noisechrodetail = locallab.noisechrodetail && p.locallab.noisechrodetail == other.locallab.noisechrodetail; + locallab.sensiden = locallab.sensiden && p.locallab.sensiden == other.locallab.sensiden; locallab.noisechrof = locallab.noisechrof && p.locallab.noisechrof == other.locallab.noisechrof; locallab.noisechroc = locallab.noisechroc && p.locallab.noisechroc == other.locallab.noisechroc; locallab.sharradius = locallab.sharradius && p.locallab.sharradius == other.locallab.sharradius; @@ -1043,6 +1046,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.nbspot = locallab.nbspot && p.locallab.nbspot == other.locallab.nbspot; locallab.anbspot = locallab.anbspot && p.locallab.anbspot == other.locallab.anbspot; locallab.hueref = locallab.hueref && p.locallab.hueref == other.locallab.hueref; + locallab.huerefblur = locallab.huerefblur && p.locallab.huerefblur == other.locallab.huerefblur; locallab.chromaref = locallab.chromaref && p.locallab.chromaref == other.locallab.chromaref; locallab.lumaref = locallab.lumaref && p.locallab.lumaref == other.locallab.lumaref; locallab.sobelref = locallab.sobelref && p.locallab.sobelref == other.locallab.sobelref; @@ -2628,6 +2632,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.noisechrodetail = mods.locallab.noisechrodetail; } + if (locallab.sensiden) { + toEdit.locallab.sensiden = mods.locallab.sensiden; + } + if (locallab.noisechrof) { toEdit.locallab.noisechrof = mods.locallab.noisechrof; } @@ -2744,6 +2752,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.hueref = mods.locallab.hueref; } + if (locallab.huerefblur) { + toEdit.locallab.huerefblur = mods.locallab.huerefblur; + } + if (locallab.chromaref) { toEdit.locallab.chromaref = mods.locallab.chromaref; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index be3c83712..67388825f 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -468,6 +468,7 @@ public: bool noiselumc; bool noiselumdetail; bool noisechrodetail; + bool sensiden; bool noisechrof; bool noisechroc; bool sharradius; @@ -503,6 +504,7 @@ public: bool nbspot; bool anbspot; bool hueref; + bool huerefblur; bool chromaref; bool lumaref; bool sobelref;