diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 422158da6..3a803c25b 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -1171,6 +1171,10 @@ void Crop::update(int todo) bool cclutili = parent->cclutili; LUTu dummy; + if (params.localContrast.enabled) { + // Alberto's local contrast + parent->ipf.localContrast(labnCrop, labnCrop->L, params.localContrast, false, skip); + } parent->ipf.chromiLuminanceCurve(this, 1, labnCrop, labnCrop, parent->chroma_acurve, parent->chroma_bcurve, parent->satcurve, parent->lhskcurve, parent->clcurve, parent->lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy); parent->ipf.vibrance(labnCrop, params.vibrance, params.toneCurve.hrenabled, params.icm.workingProfile); parent->ipf.labColorCorrectionRegions(labnCrop); diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 240c3da2a..04158a50e 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1287,6 +1287,10 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) histCCurve.clear(); histLCurve.clear(); + if (params->localContrast.enabled) { + // Alberto's local contrast + ipf.localContrast(nprevl, nprevl->L, params->localContrast, false, scale); + } ipf.chromiLuminanceCurve(nullptr, pW, nprevl, nprevl, chroma_acurve, chroma_bcurve, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, histCCurve, histLCurve); ipf.vibrance(nprevl, params->vibrance, params->toneCurve.hrenabled, params->icm.workingProfile); ipf.labColorCorrectionRegions(nprevl); diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index bf6234350..82a03712b 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -3591,11 +3591,12 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer // shadowsHighlights(lab); shadowsHighlights(lab, params->sh.enabled, params->sh.lab,params->sh.highlights ,params->sh.shadows, params->sh.radius, scale, params->sh.htonalwidth, params->sh.stonalwidth); - +/* if (params->localContrast.enabled) { // Alberto's local contrast localContrast(lab, lab->L, params->localContrast, false, scale); } + */ } /** diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 5f9eb046b..778d26ebb 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -435,6 +435,7 @@ struct local_params { float balanceh; int colorde; int cir; + bool recur; float thr; float stru; int chro, cont, sens, sensh, senscb, sensbn, senstm, sensex, sensexclu, sensden, senslc, senssf, senshs, senscolor; @@ -772,6 +773,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall int w = oW; int h = oH; int circr = locallab.spots.at(sp).circrad; + bool recur = locallab.spots.at(sp).recurs; float streng = ((float)locallab.spots.at(sp).stren); float gam = ((float)locallab.spots.at(sp).gamma); float est = ((float)locallab.spots.at(sp).estop); @@ -1355,6 +1357,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.deltaem = locallab.spots.at(sp).deltae; lp.scalereti = scaleret; lp.cir = circr; + lp.recur = recur; lp.actsp = acti; lp.xc = w * local_center_x; lp.yc = h * local_center_y; @@ -11469,7 +11472,7 @@ void ImProcFunctions::Lab_Local( transit_shapedetect2(call, 11, bufexporig.get(), bufexpfin.get(), originalmasklog.get(), hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); } - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -12152,7 +12155,7 @@ void ImProcFunctions::Lab_Local( BlurNoise_Local(tmp1.get(), original, hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); } - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -12165,7 +12168,7 @@ void ImProcFunctions::Lab_Local( InverseBlurNoise_Local(original, lp, hueref, chromaref, lumaref, original, transformed, tmp1.get(), cx, cy, sk); } - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -12217,7 +12220,7 @@ void ImProcFunctions::Lab_Local( DeNoise_Local(call, lp, originalmaskbl.get(), levred, huerefblur, lumarefblur, chromarefblur, original, transformed, *(bufwv.get()), cx, cy, sk); - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -12232,7 +12235,7 @@ void ImProcFunctions::Lab_Local( constexpr int aut = 0; DeNoise(call, slidL, slida, slidb, aut, noiscfactiv, lp, originalmaskbl.get(), bufmaskblurbl.get(), levred, huerefblur, lumarefblur, chromarefblur, original, transformed, cx, cy, sk, locwavCurvehue, locwavhueutili); - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -12447,7 +12450,7 @@ void ImProcFunctions::Lab_Local( transit_shapedetect(7, loctemp.get(), nullptr, bufchrom, false, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); bufsh.free(); - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -12673,7 +12676,7 @@ void ImProcFunctions::Lab_Local( } - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -12898,7 +12901,7 @@ void ImProcFunctions::Lab_Local( // transit_shapedetect(8, tmp1.get(), originalmasktm.get(), bufchro, false, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); bufgb.reset(); - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -13101,7 +13104,7 @@ void ImProcFunctions::Lab_Local( transit_shapedetect2(call, 9, bufexporig.get(), bufexpfin.get(), originalmaskSH.get(), hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -13186,7 +13189,7 @@ void ImProcFunctions::Lab_Local( float adjustr = 2.f; InverseColorLight_Local(tonequ, tonecurv, sp, 2, lp, originalmaskSH.get(), lightCurveloc, hltonecurveloc, shtonecurveloc, tonecurveloc, exlocalcurve, cclocalcurve, adjustr, localcutili, lllocalcurve, locallutili, original, transformed, cx, cy, hueref, chromaref, lumaref, sk); - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -13264,7 +13267,7 @@ void ImProcFunctions::Lab_Local( transit_shapedetect2(call, 3, bufexporig.get(), bufexpfin.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -13729,7 +13732,7 @@ void ImProcFunctions::Lab_Local( tmp1.reset(); } - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -13780,7 +13783,7 @@ void ImProcFunctions::Lab_Local( //sharpen ellipse and transition Sharp_Local(call, loctemp, 0, hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -13795,7 +13798,7 @@ void ImProcFunctions::Lab_Local( InverseSharp_Local(loctemp, hueref, lumaref, chromaref, lp, original, transformed, cx, cy, sk); - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -13841,7 +13844,7 @@ void ImProcFunctions::Lab_Local( transit_shapedetect2(call, 30, bufexporig.get(), bufexpfin.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -14041,7 +14044,7 @@ void ImProcFunctions::Lab_Local( transit_shapedetect_retinex(call, 4, bufreti, tmpl, bufmask, buforigmas, buflight, bufchro, hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -14143,7 +14146,7 @@ void ImProcFunctions::Lab_Local( transit_shapedetect_retinex(call, 5, tmpl, tmpl, bufmask, buforigmas, buflight, bufchro, hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -14382,7 +14385,7 @@ void ImProcFunctions::Lab_Local( transit_shapedetect_retinex(call, 4, bufreti, tmpl, bufmask, buforigmas, buflight, bufchro, hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -14479,7 +14482,7 @@ void ImProcFunctions::Lab_Local( if (!lp.invret) { transit_shapedetect_retinex(call, 5, tmpl, tmpl, bufmask, buforigmas, buflight, bufchro, hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -14862,7 +14865,7 @@ void ImProcFunctions::Lab_Local( transit_shapedetect2(call, 1, bufexporig.get(), bufexpfin.get(), originalmaskexp.get(), hueref, chromaref, lumaref, sobelref, meansob, blend2, lp, original, transformed, cx, cy, sk); } - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -14948,7 +14951,7 @@ void ImProcFunctions::Lab_Local( InverseColorLight_Local(false, false, sp, 1, lp, originalmaskexp.get(), lightCurveloc, hltonecurveloc, shtonecurveloc, tonecurveloc, exlocalcurve, cclocalcurve, adjustr, localcutili, lllocalcurve, locallutili, original, transformed, cx, cy, hueref, chromaref, lumaref, sk); - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -16010,7 +16013,7 @@ void ImProcFunctions::Lab_Local( } - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -16109,7 +16112,7 @@ void ImProcFunctions::Lab_Local( if (lp.showmaskcolmetinv == 0 || lp.enaColorMaskinv) { InverseColorLight_Local(false, false, sp, 0, lp, originalmaskcol.get(), lightCurveloc, hltonecurveloc, shtonecurveloc, tonecurveloc, exlocalcurve, cclocalcurve, adjustr, localcutili, lllocalcurve, locallutili, original, transformed, cx, cy, hueref, chromaref, lumaref, sk); - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); @@ -16278,7 +16281,7 @@ void ImProcFunctions::Lab_Local( delete origsav; origsav = NULL; - if (params->locallab.spots.at(sp).recurs) { + if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index b724992ff..c526a7d1a 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -1438,12 +1438,16 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT CurveFactory::complexsgnCurve (autili, butili, ccutili, cclutili, params.labCurve.acurve, params.labCurve.bcurve, params.labCurve.cccurve, params.labCurve.lccurve, curve1, curve2, satcurve, lhskcurve, 16); - - ipf.chromiLuminanceCurve (nullptr, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy); + if (params.localContrast.enabled) { + // Alberto's local contrast + ipf.localContrast(labView, labView->L, params.localContrast, false, 16); + } + ipf.chromiLuminanceCurve (nullptr, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy); ipf.vibrance (labView, params.vibrance, params.toneCurve.hrenabled, params.icm.workingProfile); ipf.labColorCorrectionRegions(labView); + if ((params.colorappearance.enabled && !params.colorappearance.tonecie) || !params.colorappearance.enabled) { ipf.EPDToneMap (labView, 5, 6); } diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 2c8f05b45..147bba408 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1346,6 +1346,10 @@ private: bool ccutili, cclutili; CurveFactory::complexsgnCurve(autili, butili, ccutili, cclutili, params.labCurve.acurve, params.labCurve.bcurve, params.labCurve.cccurve, params.labCurve.lccurve, curve1, curve2, satcurve, lhskcurve, 1); + if (params.localContrast.enabled) { + // Alberto's local contrast + ipf.localContrast(labView, labView->L, params.localContrast, false, 1);//scale); + } ipf.chromiLuminanceCurve(nullptr, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy); diff --git a/rtgui/localcontrast.cc b/rtgui/localcontrast.cc index d91642b6c..6b668a1eb 100644 --- a/rtgui/localcontrast.cc +++ b/rtgui/localcontrast.cc @@ -32,11 +32,17 @@ using namespace rtengine::procparams; LocalContrast::LocalContrast(): FoldableToolPanel(this, "localcontrast", M("TP_LOCALCONTRAST_LABEL"), false, true) { auto m = ProcEventMapper::getInstance(); - EvLocalContrastEnabled = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_ENABLED"); +/* EvLocalContrastEnabled = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_ENABLED"); EvLocalContrastRadius = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_RADIUS"); EvLocalContrastAmount = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_AMOUNT"); EvLocalContrastDarkness = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_DARKNESS"); EvLocalContrastLightness = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_LIGHTNESS"); +*/ + EvLocalContrastEnabled = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_LOCALCONTRAST_ENABLED"); + EvLocalContrastRadius = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_LOCALCONTRAST_RADIUS"); + EvLocalContrastAmount = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_LOCALCONTRAST_AMOUNT"); + EvLocalContrastDarkness = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_LOCALCONTRAST_DARKNESS"); + EvLocalContrastLightness = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_LOCALCONTRAST_LIGHTNESS"); radius = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_RADIUS"), 20., 200., 1., 80.)); amount = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_AMOUNT"), 0., 1., 0.01, 0.2));