diff --git a/rtdata/languages/default b/rtdata/languages/default index 19706fad6..74552bfc9 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -899,6 +899,7 @@ HISTORY_MSG_645;Local - balance deltaE ab-L HISTORY_MSG_646;Local - Exp mask chroma HISTORY_MSG_647;Local - Exp mask gamma HISTORY_MSG_648;Local - Exp mask slope +HISTORY_MSG_649;Local - Exp soft radius HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2098,6 +2099,7 @@ TP_LOCALLAB_SHOWMASK;Show mask TP_LOCALLAB_SHOWSTRUC;Show structure TP_LOCALLAB_USEMASK;Use mask TP_LOCALLAB_SHADHIGH;Shadows Highlights +TP_LOCALLAB_SOFTRADIUSCOL;Soft radius TP_LOCALLAB_SOFT;Soft Light TP_LOCALLAB_STRENG;Strength TP_LOCALLAB_STRENGTH;Noise diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 049284274..aba15624e 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -150,6 +150,7 @@ struct local_params { float chromaexp; float gammaexp; float slomaexp; + float softradiusexp; float blendmaexp; float radmaSH; float blendmaSH; @@ -418,9 +419,6 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.enaColorMask = locallab.spots.at(sp).enaColorMask && llColorMask == 0 && llExpMask == 0 && llSHMask == 0; // Color & Light mask is deactivated if Exposure mask is visible lp.enaExpMask = locallab.spots.at(sp).enaExpMask && llExpMask == 0 && llColorMask == 0 && llSHMask == 0; // Exposure mask is deactivated if Color & Light mask is visible lp.enaSHMask = locallab.spots.at(sp).enaSHMask && llSHMask == 0 && llColorMask == 0 && llExpMask == 0; // SH mask is deactivated if Color & Light mask is visible -// lp.enaColorMask = locallab.spots.at(sp).enaColorMask && llColorMask == 0 && llExpMask == 0; // Color & Light mask is deactivated if Exposure mask is visible -// lp.enaExpMask = locallab.spots.at(sp).enaExpMask && llExpMask == 0 && llColorMask == 0; // Exposure mask is deactivated if Color & Light mask is visible -// lp.enaSHMask = locallab.spots.at(sp).enaSHMask && llSHMask == 0 && llColorMask == 0; // SH mask is deactivated if Color & Light mask is visible if (locallab.spots.at(sp).blurMethod == "norm") { @@ -489,6 +487,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall float chromaskexpo = ((float) locallab.spots.at(sp).chromaskexp); float gammaskexpo = ((float) locallab.spots.at(sp).gammaskexp); float slomaskexpo = ((float) locallab.spots.at(sp).slomaskexp); + float softradiusexpo = ((float) locallab.spots.at(sp).softradiusexp); float blendmaskSH = ((float) locallab.spots.at(sp).blendmaskSH) / 100.f ; float radmaskSH = ((float) locallab.spots.at(sp).radmaskSH); float structexpo = (float) locallab.spots.at(sp).structexp; @@ -545,6 +544,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.chromaexp = chromaskexpo; lp.gammaexp = gammaskexpo; lp.slomaexp = slomaskexpo; + lp.softradiusexp = softradiusexpo; lp.struexc = structexclude; lp.blendmaexp = blendmaskexpo; lp.blendmaSH = blendmaskSH; @@ -5113,7 +5113,6 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o int loy = cy + y; if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) { - // bufsob->L[loy - begy][lox - begx] = original->L[y][x];//fill square buffer with datas bufsob->L[loy - begy][lox - begx] = reserved->L[y][x];//fill square buffer with datas } @@ -6559,25 +6558,28 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o #pragma omp parallel for schedule(dynamic,16) #endif - for (int y = 0; y < transformed->H ; y++) //{ - for (int x = 0; x < transformed->W; x++) { - int lox = cx + x; - int loy = cy + y; + /* + for (int y = 0; y < transformed->H ; y++) //{ + for (int x = 0; x < transformed->W; x++) { + int lox = cx + x; + int loy = cy + y; + */ + // if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) { + for (int ir = 0; ir < bfh; ir++) //fill with 0 + for (int jr = 0; jr < bfw; jr++) { - if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) { + float rL; + rL = CLIPRET((bufexpfin->L[ir][jr] - bufexporig->L[ir][jr]) / 328.f); - float rL; - rL = CLIPRET((bufexpfin->L[loy - begy][lox - begx] - bufexporig->L[loy - begy][lox - begx]) / 328.f); - - buflight[loy - begy][lox - begx] = rL; + buflight[ir][jr] = rL; - float chp; - chp = CLIPRET((sqrt(SQR(bufexpfin->a[loy - begy][lox - begx]) + SQR(bufexpfin->b[loy - begy][lox - begx])) - sqrt(SQR(bufexporig->a[loy - begy][lox - begx]) + SQR(bufexporig->b[loy - begy][lox - begx]))) / 250.f); + float chp; + chp = CLIPRET((sqrt(SQR(bufexpfin->a[ir][jr]) + SQR(bufexpfin->b[ir][jr])) - sqrt(SQR(bufexporig->a[ir][jr]) + SQR(bufexporig->b[ir][jr]))) / 250.f); - bufl_ab[loy - begy][lox - begx] = chp; + bufl_ab[ir][jr] = chp; - } + // } } transit_shapedetect(2, bufexporig, nullptr, buflight, bufl_ab, nullptr, nullptr, nullptr, false, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); @@ -6931,81 +6933,85 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o } bufexporig->L[loy - begy][lox - begx] = original->L[y][x]; + } + } - float valLLexp = 0.f; - float valCC = 0.f; - float valHH = 0.f; - float kmaskLexp = 0; - float kmaskCa = 0; - float kmaskCb = 0; +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif - float kmaskHL = 0; - float kmaskHa = 0; - float kmaskHb = 0; + for (int ir = 0; ir < bfh; ir++) //fill with 0 + for (int jr = 0; jr < bfw; jr++) { + + float valLLexp = 0.f; + float valCC = 0.f; + float valHH = 0.f; + float kmaskLexp = 0; + float kmaskCa = 0; + float kmaskCb = 0; + + float kmaskHL = 0; + float kmaskHa = 0; + float kmaskHb = 0; - if (lp.showmaskSHmet == 2 || lp.enaSHMask || lp.showmaskSHmet == 3) { + if (lp.showmaskSHmet == 2 || lp.enaSHMask || lp.showmaskSHmet == 3) { - if (locllmasSHCurve && llmasSHutili) { - float ligh = (bufexporig->L[loy - begy][lox - begx]) / 32768.f; - valLLexp = (float)(locllmasSHCurve[500.f * ligh]); - valLLexp = LIM01(1.f - valLLexp); - kmaskLexp = 32768.f * valLLexp; - } - - if (locccmasSHCurve && lcmasSHutili) { - float chromask = 0.0001f + sqrt(SQR((bufexporig->a[loy - begy][lox - begx]) / fab) + SQR((bufexporig->b[loy - begy][lox - begx]) / fab)); - float chromaskr = chromask; - valCC = float (locccmasSHCurve[500.f * chromaskr]); - valCC = LIM01(1.f - valCC); - kmaskCa = valCC; - kmaskCb = valCC; - } - - - if (lochhmasSHCurve && lhmasSHutili) { - float huema = xatan2f(bufexporig->b[loy - begy][lox - begx], bufexporig->a[loy - begy][lox - begx]); - float h = Color::huelab_to_huehsv2(huema); - h += 1.f / 6.f; - - if (h > 1.f) { - h -= 1.f; - } - - valHH = float (lochhmasSHCurve[500.f * h]); - valHH = LIM01(1.f - valHH); - kmaskHa = valHH; - kmaskHb = valHH; - kmaskHL = 32768.f * valHH; - } - - bufmaskblurSH->L[loy - begy][lox - begx] = CLIPLOC(kmaskLexp + kmaskHL); - bufmaskblurSH->a[loy - begy][lox - begx] = (kmaskCa + kmaskHa); - bufmaskblurSH->b[loy - begy][lox - begx] = (kmaskCb + kmaskHb); - ble[loy - begy][lox - begx] = bufmaskblurSH->L[loy - begy][lox - begx] / 32768.f; - guid[loy - begy][lox - begx] = bufexporig->L[loy - begy][lox - begx] / 32768.f; + if (locllmasSHCurve && llmasSHutili) { + float ligh = (bufexporig->L[ir][jr]) / 32768.f; + valLLexp = (float)(locllmasSHCurve[500.f * ligh]); + valLLexp = LIM01(1.f - valLLexp); + kmaskLexp = 32768.f * valLLexp; } + if (locccmasSHCurve && lcmasSHutili) { + float chromask = 0.0001f + sqrt(SQR((bufexporig->a[ir][jr]) / fab) + SQR((bufexporig->b[ir][jr]) / fab)); + float chromaskr = chromask; + valCC = float (locccmasSHCurve[500.f * chromaskr]); + valCC = LIM01(1.f - valCC); + kmaskCa = valCC; + kmaskCb = valCC; + } + + + if (lochhmasSHCurve && lhmasSHutili) { + float huema = xatan2f(bufexporig->b[ir][jr], bufexporig->a[ir][jr]); + float h = Color::huelab_to_huehsv2(huema); + h += 1.f / 6.f; + + if (h > 1.f) { + h -= 1.f; + } + + valHH = float (lochhmasSHCurve[500.f * h]); + valHH = LIM01(1.f - valHH); + kmaskHa = valHH; + kmaskHb = valHH; + kmaskHL = 32768.f * valHH; + } + + bufmaskblurSH->L[ir][jr] = CLIPLOC(kmaskLexp + kmaskHL); + bufmaskblurSH->a[ir][jr] = (kmaskCa + kmaskHa); + bufmaskblurSH->b[ir][jr] = (kmaskCb + kmaskHb); + ble[ir][jr] = bufmaskblurSH->L[ir][jr] / 32768.f; + guid[ir][jr] = bufexporig->L[ir][jr] / 32768.f; } + + // } } if ((lp.showmaskSHmet == 2 || lp.enaSHMask || lp.showmaskSHmet == 3) && lp.radmaSH > 0.f) { - guidedFilter(guid, ble, ble, lp.radmaSH * 10.f / sk, 0.075, multiThread, 4); + guidedFilter(guid, ble, ble, lp.radmaSH * 10.f / sk, 0.001, multiThread, 4); //float maxsh = -100.f; #ifdef _OPENMP -// #pragma omp parallel for schedule(dynamic,16) + #pragma omp parallel for schedule(dynamic,16) #endif - for (int y = 0; y < transformed->H ; y++) //{ - for (int x = 0; x < transformed->W; x++) { - int lox = cx + x; - int loy = cy + y; + for (int ir = 0; ir < bfh; ir++) //fill with 0 + for (int jr = 0; jr < bfw; jr++) { - if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) { - bufmaskblurSH->L[loy - begy][lox - begx] = LIM01(ble[loy - begy][lox - begx]) * 32768.f; - // if(bufmaskblurSH->L[loy - begy][lox - begx] > maxsh) maxsh = bufmaskblurSH->L[loy - begy][lox - begx]; - } + bufmaskblurSH->L[ir][jr] = LIM01(ble[ir][jr]) * 32768.f; } // printf("maxsh=%f \n", maxsh); @@ -7071,25 +7077,20 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o #pragma omp parallel for schedule(dynamic,16) #endif - for (int y = 0; y < transformed->H ; y++) //{ - for (int x = 0; x < transformed->W; x++) { - int lox = cx + x; - int loy = cy + y; + for (int ir = 0; ir < bfh; ir++) //fill with 0 + for (int jr = 0; jr < bfw; jr++) { - if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) { + float rL; + rL = CLIPRET((bufexpfin->L[ir][jr] - bufexporig->L[ir][jr]) / 328.f); - float rL; - rL = CLIPRET((bufexpfin->L[loy - begy][lox - begx] - bufexporig->L[loy - begy][lox - begx]) / 328.f); - - buflight[loy - begy][lox - begx] = rL; + buflight[ir][jr] = rL; - float chp; - chp = CLIPRET((sqrt(SQR(bufexpfin->a[loy - begy][lox - begx]) + SQR(bufexpfin->b[loy - begy][lox - begx])) - sqrt(SQR(bufexporig->a[loy - begy][lox - begx]) + SQR(bufexporig->b[loy - begy][lox - begx]))) / 250.f); + float chp; + chp = CLIPRET((sqrt(SQR(bufexpfin->a[ir][jr]) + SQR(bufexpfin->b[ir][jr])) - sqrt(SQR(bufexporig->a[ir][jr]) + SQR(bufexporig->b[ir][jr]))) / 250.f); - bufl_ab[loy - begy][lox - begx] = chp; + bufl_ab[ir][jr] = chp; - } } } @@ -7185,25 +7186,20 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o #pragma omp parallel for schedule(dynamic,16) #endif - for (int y = 0; y < transformed->H ; y++) //{ - for (int x = 0; x < transformed->W; x++) { - int lox = cx + x; - int loy = cy + y; + for (int ir = 0; ir < bfh; ir++) //fill with 0 + for (int jr = 0; jr < bfw; jr++) { - if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) { + float rL; + rL = CLIPRET((bufexpfin->L[ir][jr] - bufexporig->L[ir][jr]) / 328.f); - float rL; - rL = CLIPRET((bufexpfin->L[loy - begy][lox - begx] - bufexporig->L[loy - begy][lox - begx]) / 328.f); - - buflight[loy - begy][lox - begx] = rL; + buflight[ir][jr] = rL; - float chp; - chp = CLIPRET((sqrt(SQR(bufexpfin->a[loy - begy][lox - begx]) + SQR(bufexpfin->b[loy - begy][lox - begx])) - sqrt(SQR(bufexporig->a[loy - begy][lox - begx]) + SQR(bufexporig->b[loy - begy][lox - begx]))) / 250.f); + float chp; + chp = CLIPRET((sqrt(SQR(bufexpfin->a[ir][jr]) + SQR(bufexpfin->b[ir][jr])) - sqrt(SQR(bufexporig->a[ir][jr]) + SQR(bufexporig->b[ir][jr]))) / 250.f); - bufl_ab[loy - begy][lox - begx] = chp; + bufl_ab[ir][jr] = chp; - } } transit_shapedetect(3, bufexporig, nullptr, buflight, bufl_ab, nullptr, nullptr, nullptr, false, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); @@ -7778,83 +7774,86 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o } bufexporig->L[loy - begy][lox - begx] = original->L[y][x]; + } + } - float valLLexp = 0.f; - float valCC = 0.f; - float valHH = 0.f; - float kmaskLexp = 0; - float kmaskCa = 0; - float kmaskCb = 0; +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif - float kmaskHL = 0; - float kmaskHa = 0; - float kmaskHb = 0; + for (int ir = 0; ir < bfh; ir++) //fill with 0 + for (int jr = 0; jr < bfw; jr++) { + + float valLLexp = 0.f; + float valCC = 0.f; + float valHH = 0.f; + float kmaskLexp = 0; + float kmaskCa = 0; + float kmaskCb = 0; + + float kmaskHL = 0; + float kmaskHa = 0; + float kmaskHb = 0; - if (lp.showmaskexpmet == 2 || lp.enaExpMask || lp.showmaskexpmet == 3) { + if (lp.showmaskexpmet == 2 || lp.enaExpMask || lp.showmaskexpmet == 3) { - if (locllmasexpCurve && llmasexputili) { - float ligh = (bufexporig->L[loy - begy][lox - begx]) / 32768.f; - valLLexp = (float)(locllmasexpCurve[500.f * ligh]); - valLLexp = LIM01(1.f - valLLexp); - kmaskLexp = 32768.f * valLLexp; - } - - if (locccmasexpCurve && lcmasexputili) { - float chromask = 0.0001f + sqrt(SQR((bufexporig->a[loy - begy][lox - begx]) / fab) + SQR((bufexporig->b[loy - begy][lox - begx]) / fab)); - float chromaskr = chromask; - valCC = float (locccmasexpCurve[500.f * chromaskr]); - valCC = LIM01(1.f - valCC); - kmaskCa = valCC; - kmaskCb = valCC; - } - - - if (lochhmasexpCurve && lhmasexputili) { - float huema = xatan2f(bufexporig->b[loy - begy][lox - begx], bufexporig->a[loy - begy][lox - begx]); - float h = Color::huelab_to_huehsv2(huema); - h += 1.f / 6.f; - - if (h > 1.f) { - h -= 1.f; - } - - valHH = float (lochhmasexpCurve[500.f * h]); - valHH = LIM01(1.f - valHH); - kmaskHa = valHH; - kmaskHb = valHH; - kmaskHL = 32768.f * valHH; - } - - bufmaskblurexp->L[loy - begy][lox - begx] = CLIPLOC(kmaskLexp + kmaskHL); - bufmaskblurexp->a[loy - begy][lox - begx] = (kmaskCa + kmaskHa); - bufmaskblurexp->b[loy - begy][lox - begx] = (kmaskCb + kmaskHb); - ble[loy - begy][lox - begx] = bufmaskblurexp->L[loy - begy][lox - begx] / 32768.f; - guid[loy - begy][lox - begx] = bufexporig->L[loy - begy][lox - begx] / 32768.f; + if (locllmasexpCurve && llmasexputili) { + float ligh = (bufexporig->L[ir][jr]) / 32768.f; + valLLexp = (float)(locllmasexpCurve[500.f * ligh]); + valLLexp = LIM01(1.f - valLLexp); + kmaskLexp = 32768.f * valLLexp; } + if (locccmasexpCurve && lcmasexputili) { + float chromask = 0.0001f + sqrt(SQR((bufexporig->a[ir][jr]) / fab) + SQR((bufexporig->b[ir][jr]) / fab)); + float chromaskr = chromask; + valCC = float (locccmasexpCurve[500.f * chromaskr]); + valCC = LIM01(1.f - valCC); + kmaskCa = valCC; + kmaskCb = valCC; + } + + + if (lochhmasexpCurve && lhmasexputili) { + float huema = xatan2f(bufexporig->b[ir][jr], bufexporig->a[ir][jr]); + float h = Color::huelab_to_huehsv2(huema); + h += 1.f / 6.f; + + if (h > 1.f) { + h -= 1.f; + } + + valHH = float (lochhmasexpCurve[500.f * h]); + valHH = LIM01(1.f - valHH); + kmaskHa = valHH; + kmaskHb = valHH; + kmaskHL = 32768.f * valHH; + } + + bufmaskblurexp->L[ir][jr] = CLIPLOC(kmaskLexp + kmaskHL); + bufmaskblurexp->a[ir][jr] = (kmaskCa + kmaskHa); + bufmaskblurexp->b[ir][jr] = (kmaskCb + kmaskHb); + ble[ir][jr] = LIM01(bufmaskblurexp->L[ir][jr] / 32768.f); + guid[ir][ir] = LIM01(bufexporig->L[ir][jr] / 32768.f); } + } if ((lp.showmaskexpmet == 2 || lp.enaExpMask || lp.showmaskexpmet == 3) && lp.radmaexp > 0.f) { - guidedFilter(guid, ble, ble, lp.radmaexp * 10.f / sk, 0.075, multiThread, 4); + guidedFilter(guid, ble, ble, lp.radmaexp * 10.f / sk, 0.001, multiThread, 4); #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) #endif - for (int y = 0; y < transformed->H ; y++) //{ - for (int x = 0; x < transformed->W; x++) { - int lox = cx + x; - int loy = cy + y; - - if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) { - float L_; - bufmaskblurexp->L[loy - begy][lox - begx] = LIM01(ble[loy - begy][lox - begx]) * 32768.f; - L_ = 2.f * bufmaskblurexp->L[loy - begy][lox - begx]; - bufmaskblurexp->L[loy - begy][lox - begx] = 0.5f * (*gammamask)[L_]; - } + for (int ir = 0; ir < bfh; ir++) //fill with 0 + for (int jr = 0; jr < bfw; jr++) { + float L_; + bufmaskblurexp->L[ir][jr] = LIM01(ble[ir][jr]) * 32768.f; + L_ = 2.f * bufmaskblurexp->L[ir][jr]; + bufmaskblurexp->L[ir][jr] = 0.5f * (*gammamask)[L_]; } } @@ -7920,19 +7919,14 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o #pragma omp parallel for schedule(dynamic,16) #endif - for (int y = 0; y < transformed->H ; y++) //{ - for (int x = 0; x < transformed->W; x++) { - int lox = cx + x; - int loy = cy + y; + for (int ir = 0; ir < bfh; ir++) //fill with 0 + for (int jr = 0; jr < bfw; jr++) { - if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) { + float lighn = bufexporig->L[ir][jr]; - float lighn = bufexporig->L[loy - begy][lox - begx]; - - float lh; - lh = 0.5f * exlocalcurve[2.f * lighn]; // / ((lighn) / 1.9f) / 3.61f; //lh between 0 and 0 50 or more - bufexptemp->L[loy - begy][lox - begx] = lh; - } + float lh; + lh = 0.5f * exlocalcurve[2.f * lighn]; // / ((lighn) / 1.9f) / 3.61f; //lh between 0 and 0 50 or more + bufexptemp->L[ir][jr] = lh; } if (lp.expcomp == 0.f) { @@ -7967,49 +7961,93 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o #pragma omp parallel for schedule(dynamic,16) #endif - for (int y = 0; y < transformed->H ; y++) //{ - for (int x = 0; x < transformed->W; x++) { - int lox = cx + x; - int loy = cy + y; + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { float epsi = 0.f; - if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) { - if (lp.expchroma != 0.f) { - float ch; - float ampli = 70.f; - ch = (1.f + 0.02f * lp.expchroma) ; + if (lp.expchroma != 0.f) { + float ch; + float ampli = 70.f; + ch = (1.f + 0.02f * lp.expchroma) ; - if (ch <= 1.f) {//convert data curve near values of slider -100 + 100, to be used after to detection shape - chprosl = 99.f * ch - 99.f; - } else { - chprosl = CLIPCHRO(ampli * ch - ampli); //ampli = 25.f arbitrary empirical coefficient between 5 and 50 - } - - if (bufexporig->L[loy - begy][lox - begx] == 0.f) { - epsi = 0.001f; - } - - float rapexp = bufcat02fin->L[loy - begy][lox - begx] / (bufexporig->L[loy - begy][lox - begx] + epsi); - bufl_ab[loy - begy][lox - begx] = chprosl * rapexp; + if (ch <= 1.f) {//convert data curve near values of slider -100 + 100, to be used after to detection shape + chprosl = 99.f * ch - 99.f; + } else { + chprosl = CLIPCHRO(ampli * ch - ampli); //ampli = 25.f arbitrary empirical coefficient between 5 and 50 } + if (bufexporig->L[ir][jr] == 0.f) { + epsi = 0.001f; + } - float rL; - rL = CLIPRET((bufcat02fin->L[loy - begy][lox - begx] - bufexporig->L[loy - begy][lox - begx]) / 328.f); - - buflight[loy - begy][lox - begx] = rL; - float rA; - rA = CLIPRET((bufcat02fin->a[loy - begy][lox - begx] - bufexporig->a[loy - begy][lox - begx]) / 328.f); - buf_a_cat[loy - begy][lox - begx] = rA; + float rapexp = bufcat02fin->L[ir][jr] / (bufexporig->L[ir][jr] + epsi); + bufl_ab[ir][jr] = chprosl * rapexp; + } - float rB; - rB = CLIPRET((bufcat02fin->b[loy - begy][lox - begx] - bufexporig->b[loy - begy][lox - begx]) / 328.f); - buf_b_cat[loy - begy][lox - begx] = rB; + float rL; + rL = CLIPRET((bufcat02fin->L[ir][jr] - bufexporig->L[ir][jr]) / 328.f); + buflight[ir][jr] = rL; + float rA; + rA = CLIPRET((bufcat02fin->a[ir][jr] - bufexporig->a[ir][jr]) / 328.f); + buf_a_cat[ir][jr] = rA; + + + float rB; + rB = CLIPRET((bufcat02fin->b[ir][jr] - bufexporig->b[ir][jr]) / 328.f); + buf_b_cat[ir][jr] = rB; + + + + } + + if (lp.softradiusexp > 0.f) { + float maxlig = -50000.f; + float minlig = 50000.f; + + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + if (buflight[ir][jr] > maxlig) { + maxlig = buflight[ir][jr]; + } + + if (buflight[ir][jr] < minlig) { + minlig = buflight[ir][jr]; + } + } + + // printf("maxlig=%f minlig=%f\n", maxlig, minlig); + + array2D blesoft(bfw, bfh); + array2D guidsoft(bfw, bfh); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + blesoft[ir][jr] = LIM01((buflight[ir][jr] - minlig) / (100.f - minlig)); + guidsoft[ir][jr] = ((bufexporig->L[ir][jr]) / 32768.f); } - } + + guidedFilter(guidsoft, blesoft, blesoft, lp.softradiusexp * 10.f / sk, 0.04, multiThread, 4); //lp.softradiusexp + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + buflight[ir][jr] = ((100.f - minlig) * blesoft[ir][jr]) + minlig; + } + + guidsoft(0, 0); + blesoft(0, 0); + + } } transit_shapedetect(1, bufexporig, originalmaskexp, buflight, bufl_ab, buf_a_cat, buf_b_cat, nullptr, false, hueref, chromaref, lumaref, sobelref, meansob, blend2, lp, original, transformed, cx, cy, sk); @@ -8145,7 +8183,6 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) { bufcolorig->L[loy - begy][lox - begx] = original->L[y][x]; - // buforigchro[loy - begy][lox - begx] = sqrt(SQR(original->a[y][x]) + SQR(original->b[y][x])); } } @@ -8222,77 +8259,82 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o } bufcolorig->L[loy - begy][lox - begx] = original->L[y][x]; - - float valLL = 0.f; - float valCC = 0.f; - float valHH = 0.f; - float kmaskL = 0; - float kmaskCa = 0; - float kmaskCb = 0; - - float kmaskHL = 0; - float kmaskHa = 0; - float kmaskHb = 0; - - if (lp.showmaskcolmet == 2 || lp.enaColorMask || lp.showmaskcolmet == 3) { - - if (locllmasCurve && llmasutili) { - float ligh = (bufcolorig->L[loy - begy][lox - begx]) / 32768.f; - valLL = (float)(locllmasCurve[500.f * ligh]); - valLL = LIM01(1.f - valLL); - kmaskL = 32768.f * valLL; - } - - if (locccmasCurve && lcmasutili) { - float chromask = 0.0001f + (sqrt(SQR(bufcolorig->a[loy - begy][lox - begx] / fab) + SQR(bufcolorig->b[loy - begy][lox - begx] / fab))); - float chromaskr = chromask;// / 45000.f; - valCC = float (locccmasCurve[500.f * chromaskr]); - valCC = LIM01(1.f - valCC); - kmaskCa = valCC; - kmaskCb = valCC; - } - - if (lochhmasCurve && lhmasutili) { - float huema = xatan2f(bufcolorig->b[loy - begy][lox - begx], bufcolorig->a[loy - begy][lox - begx]); - float h = Color::huelab_to_huehsv2(huema); - h += 1.f / 6.f; - - if (h > 1.f) { - h -= 1.f; - } - - valHH = float (lochhmasCurve[500.f * h]); - valHH = LIM01(1.f - valHH); - kmaskHa = valHH; - kmaskHb = valHH; - kmaskHL = 32768.f * valHH; - } - - bufmaskblurcol->L[loy - begy][lox - begx] = CLIPLOC(kmaskL + kmaskHL); - bufmaskblurcol->a[loy - begy][lox - begx] = CLIPC(kmaskCa + kmaskHa); - bufmaskblurcol->b[loy - begy][lox - begx] = CLIPC(kmaskCb + kmaskHb); - ble[loy - begy][lox - begx] = bufmaskblurcol->L[loy - begy][lox - begx] / 32768.f; - guid[loy - begy][lox - begx] = bufcolorig->L[loy - begy][lox - begx] / 32768.f; - } } } +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + + float valLL = 0.f; + float valCC = 0.f; + float valHH = 0.f; + float kmaskL = 0; + float kmaskCa = 0; + float kmaskCb = 0; + + float kmaskHL = 0; + float kmaskHa = 0; + float kmaskHb = 0; + + if (lp.showmaskcolmet == 2 || lp.enaColorMask || lp.showmaskcolmet == 3) { + + if (locllmasCurve && llmasutili) { + float ligh = (bufcolorig->L[ir][jr]) / 32768.f; + valLL = (float)(locllmasCurve[500.f * ligh]); + valLL = LIM01(1.f - valLL); + kmaskL = 32768.f * valLL; + } + + if (locccmasCurve && lcmasutili) { + float chromask = 0.0001f + (sqrt(SQR(bufcolorig->a[ir][jr] / fab) + SQR(bufcolorig->b[ir][jr] / fab))); + float chromaskr = chromask;// / 45000.f; + valCC = float (locccmasCurve[500.f * chromaskr]); + valCC = LIM01(1.f - valCC); + kmaskCa = valCC; + kmaskCb = valCC; + } + + if (lochhmasCurve && lhmasutili) { + float huema = xatan2f(bufcolorig->b[ir][jr], bufcolorig->a[ir][jr]); + float h = Color::huelab_to_huehsv2(huema); + h += 1.f / 6.f; + + if (h > 1.f) { + h -= 1.f; + } + + valHH = float (lochhmasCurve[500.f * h]); + valHH = LIM01(1.f - valHH); + kmaskHa = valHH; + kmaskHb = valHH; + kmaskHL = 32768.f * valHH; + } + + bufmaskblurcol->L[ir][jr] = CLIPLOC(kmaskL + kmaskHL); + bufmaskblurcol->a[ir][jr] = CLIPC(kmaskCa + kmaskHa); + bufmaskblurcol->b[ir][jr] = CLIPC(kmaskCb + kmaskHb); + ble[ir][jr] = bufmaskblurcol->L[ir][jr] / 32768.f; + guid[ir][jr] = bufcolorig->L[ir][jr] / 32768.f; + } + + // } + } + if ((lp.showmaskcolmet == 2 || lp.enaColorMask || lp.showmaskcolmet == 3) && lp.radmacol > 0.f) { - guidedFilter(guid, ble, ble, lp.radmacol * 10.f / sk, 0.075, multiThread, 4); + guidedFilter(guid, ble, ble, lp.radmacol * 10.f / sk, 0.001, multiThread, 4); #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) #endif - for (int y = 0; y < transformed->H ; y++) //{ - for (int x = 0; x < transformed->W; x++) { - int lox = cx + x; - int loy = cy + y; - - if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) { - bufmaskblurcol->L[loy - begy][lox - begx] = LIM01(ble[loy - begy][lox - begx]) * 32768.f; - } + for (int ir = 0; ir < bfh; ir++) //fill with 0 + for (int jr = 0; jr < bfw; jr++) { + bufmaskblurcol->L[ir][jr] = LIM01(ble[ir][jr]) * 32768.f; } } @@ -8334,117 +8376,113 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o #pragma omp parallel for schedule(dynamic,16) #endif - for (int y = 0; y < transformed->H ; y++) //{ - for (int x = 0; x < transformed->W; x++) { - int lox = cx + x; - int loy = cy + y; + for (int ir = 0; ir < bfh; ir++) //fill with 0 + for (int jr = 0; jr < bfw; jr++) { - if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) { - bufcolcalc->a[loy - begy][lox - begx] = bufcolorig->a[loy - begy][lox - begx]; - bufcolcalc->b[loy - begy][lox - begx] = bufcolorig->b[loy - begy][lox - begx]; - bufcolcalc->L[loy - begy][lox - begx] = bufcolorig->L[loy - begy][lox - begx]; + bufcolcalc->a[ir][jr] = bufcolorig->a[ir][jr]; + bufcolcalc->b[ir][jr] = bufcolorig->b[ir][jr]; + bufcolcalc->L[ir][jr] = bufcolorig->L[ir][jr]; - if (cclocalcurve && lp.qualcurvemet != 0 && localcutili) { // C=f(C) curve - float chromat = sqrt(SQR(bufcolcalc->a[loy - begy][lox - begx]) + SQR(bufcolcalc->b[loy - begy][lox - begx])); + if (cclocalcurve && lp.qualcurvemet != 0 && localcutili) { // C=f(C) curve + float chromat = sqrt(SQR(bufcolcalc->a[ir][jr]) + SQR(bufcolcalc->b[ir][jr])); - float ch; - float ampli = 25.f; - ch = (cclocalcurve[chromat * adjustr]) / ((chromat + 0.00001f) * adjustr); //ch between 0 and 0 50 or more - chprocu = CLIPCHRO(ampli * ch - ampli); //ampli = 25.f arbitrary empirical coefficient between 5 and 50 + float ch; + float ampli = 25.f; + ch = (cclocalcurve[chromat * adjustr]) / ((chromat + 0.00001f) * adjustr); //ch between 0 and 0 50 or more + chprocu = CLIPCHRO(ampli * ch - ampli); //ampli = 25.f arbitrary empirical coefficient between 5 and 50 + } + + if (lp.chro != 0.f) { + float ch; + float ampli = 70.f; + ch = (1.f + 0.01f * lp.chro) ; //* (chromat * adjustr) / ((chromat + 0.00001f) * adjustr); //ch between 0 and 0 50 or more + + if (ch <= 1.f) {//convert data curve near values of slider -100 + 100, to be used after to detection shape + chprosl = 99.f * ch - 99.f; + } else { + chprosl = CLIPCHRO(ampli * ch - ampli); //ampli = 25.f arbitrary empirical coefficient between 5 and 50 } + } - if (lp.chro != 0.f) { - float ch; - float ampli = 70.f; - ch = (1.f + 0.01f * lp.chro) ; //* (chromat * adjustr) / ((chromat + 0.00001f) * adjustr); //ch between 0 and 0 50 or more + bufchro[ir][jr] = chprosl + chprocu; - if (ch <= 1.f) {//convert data curve near values of slider -100 + 100, to be used after to detection shape - chprosl = 99.f * ch - 99.f; - } else { - chprosl = CLIPCHRO(ampli * ch - ampli); //ampli = 25.f arbitrary empirical coefficient between 5 and 50 - } - } + if (lochhCurve && HHutili && lp.qualcurvemet != 0) { + float hhforcurv = xatan2f(bufcolcalc->b[ir][jr], bufcolcalc->a[ir][jr]); - bufchro[loy - begy][lox - begx] = chprosl + chprocu; - - if (lochhCurve && HHutili && lp.qualcurvemet != 0) { - float hhforcurv = xatan2f(bufcolcalc->b[loy - begy][lox - begx], bufcolcalc->a[loy - begy][lox - begx]); - - float valparam = float ((lochhCurve[500.f * Color::huelab_to_huehsv2(hhforcurv)] - 0.5f)); //get H=f(H) 1.7 optimisation ! - float ddhue = CLIPRET(200.f * valparam); - bufhh[loy - begy][lox - begx] = ddhue;//valparamdh; // - } + float valparam = float ((lochhCurve[500.f * Color::huelab_to_huehsv2(hhforcurv)] - 0.5f)); //get H=f(H) 1.7 optimisation ! + float ddhue = CLIPRET(200.f * valparam); + bufhh[ir][jr] = ddhue;//valparamdh; // + } - if ((lp.ligh != 0.f || lp.cont != 0)) { - float lighLnew = 0.f; - float lighL = bufcolcalc->L[loy - begy][lox - begx]; - calclight(lighL, lp.ligh, lighLnew, lightCurveloc); //replace L-curve - bufcolcalc->L[loy - begy][lox - begx] = lighLnew; - } + if ((lp.ligh != 0.f || lp.cont != 0)) { + float lighLnew = 0.f; + float lighL = bufcolcalc->L[ir][jr]; + calclight(lighL, lp.ligh, lighLnew, lightCurveloc); //replace L-curve + bufcolcalc->L[ir][jr] = lighLnew; + } - if (lllocalcurve && locallutili && lp.qualcurvemet != 0) {// L=f(L) curve enhanced - float lh; - float lighn = bufcolcalc->L[loy - begy][lox - begx]; - lh = 0.5f * (lllocalcurve[lighn * 2.f]);// / ((lighn + 0.00001f) * 1.9f) ; // / ((lighn) / 1.9f) / 3.61f; //lh between 0 and 0 50 or more - bufcolcalc->L[loy - begy][lox - begx] = lh; - } + if (lllocalcurve && locallutili && lp.qualcurvemet != 0) {// L=f(L) curve enhanced + float lh; + float lighn = bufcolcalc->L[ir][jr]; + lh = 0.5f * (lllocalcurve[lighn * 2.f]);// / ((lighn + 0.00001f) * 1.9f) ; // / ((lighn) / 1.9f) / 3.61f; //lh between 0 and 0 50 or more + bufcolcalc->L[ir][jr] = lh; + } - if (loclhCurve && LHutili && lp.qualcurvemet != 0) { - float l_r;//Luminance Lab in 0..1 - float rhue = xatan2f(bufcolcalc->b[loy - begy][lox - begx], bufcolcalc->a[loy - begy][lox - begx]); - float lighn = bufcolcalc->L[loy - begy][lox - begx]; + if (loclhCurve && LHutili && lp.qualcurvemet != 0) { + float l_r;//Luminance Lab in 0..1 + float rhue = xatan2f(bufcolcalc->b[ir][jr], bufcolcalc->a[ir][jr]); + float lighn = bufcolcalc->L[ir][jr]; - l_r = lighn / 32768.f; + l_r = lighn / 32768.f; + { + float khu = 1.9f; //in reserve in case of! + + float valparam = float ((loclhCurve[500.f * Color::huelab_to_huehsv2(rhue)] - 0.5f)); //get l_r=f(H) + float valparamneg; + valparamneg = valparam; + + if (valparam > 0.f) { + l_r = (1.f - valparam) * l_r + valparam * (1.f - SQR(((SQR(1.f - min(l_r, 1.0f)))))); + } else + //for negative { - float khu = 1.9f; //in reserve in case of! - - float valparam = float ((loclhCurve[500.f * Color::huelab_to_huehsv2(rhue)] - 0.5f)); //get l_r=f(H) - float valparamneg; - valparamneg = valparam; - - if (valparam > 0.f) { - l_r = (1.f - valparam) * l_r + valparam * (1.f - SQR(((SQR(1.f - min(l_r, 1.0f)))))); - } else - //for negative - { - l_r *= (1.f + khu * valparamneg); - } + l_r *= (1.f + khu * valparamneg); } - - bufcolcalc->L[loy - begy][lox - begx] = l_r * 32768.f; - } - if (ctoning) { - if (lp.gridmet == 0) { - bufcolcalc->a[loy - begy][lox - begx] += bufcolcalc->L[loy - begy][lox - begx] * a_scale + a_base; - bufcolcalc->b[loy - begy][lox - begx] += bufcolcalc->L[loy - begy][lox - begx] * b_scale + b_base; - } else if (lp.gridmet == 1) { - bufcolcalc->a[loy - begy][lox - begx] += scaledirect * a_scale; - bufcolcalc->b[loy - begy][lox - begx] += scaledirect * b_scale; - } - - bufcolcalc->a[loy - begy][lox - begx] = CLIPC(bufcolcalc->a[loy - begy][lox - begx]); - bufcolcalc->b[loy - begy][lox - begx] = CLIPC(bufcolcalc->b[loy - begy][lox - begx]); - - } - - float rL; - rL = CLIPRET((bufcolcalc->L[loy - begy][lox - begx] - bufcolorig->L[loy - begy][lox - begx]) / 328.f); - buflight[loy - begy][lox - begx] = rL; - - float rA; - rA = CLIPRET((bufcolcalc->a[loy - begy][lox - begx] - bufcolorig->a[loy - begy][lox - begx]) / 328.f); - buf_a[loy - begy][lox - begx] = rA; - - - float rB; - rB = CLIPRET((bufcolcalc->b[loy - begy][lox - begx] - bufcolorig->b[loy - begy][lox - begx]) / 328.f); - buf_b[loy - begy][lox - begx] = rB; - + bufcolcalc->L[ir][jr] = l_r * 32768.f; } + + if (ctoning) { + if (lp.gridmet == 0) { + bufcolcalc->a[ir][jr] += bufcolcalc->L[ir][jr] * a_scale + a_base; + bufcolcalc->b[ir][jr] += bufcolcalc->L[ir][jr] * b_scale + b_base; + } else if (lp.gridmet == 1) { + bufcolcalc->a[ir][jr] += scaledirect * a_scale; + bufcolcalc->b[ir][jr] += scaledirect * b_scale; + } + + bufcolcalc->a[ir][jr] = CLIPC(bufcolcalc->a[ir][jr]); + bufcolcalc->b[ir][jr] = CLIPC(bufcolcalc->b[ir][jr]); + + } + + float rL; + rL = CLIPRET((bufcolcalc->L[ir][jr] - bufcolorig->L[ir][jr]) / 328.f); + buflight[ir][jr] = rL; + + float rA; + rA = CLIPRET((bufcolcalc->a[ir][jr] - bufcolorig->a[ir][jr]) / 328.f); + buf_a[ir][jr] = rA; + + + float rB; + rB = CLIPRET((bufcolcalc->b[ir][jr] - bufcolorig->b[ir][jr]) / 328.f); + buf_b[ir][jr] = rB; + + } delete bufcolcalc; @@ -8577,8 +8615,6 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o for (int x = 0; x < transformed->W; x++) { int lox = cx + x; - // int begx = int (lp.xc - lp.lxL); - // int begy = int (lp.yc - lp.lyT); int zone = 0; float localFactor = 1.f; diff --git a/rtengine/procevents.h b/rtengine/procevents.h index fbf6037c5..5e3ce7825 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -675,6 +675,7 @@ enum ProcEventCode { Evlocallabchromaskexp = 645, Evlocallabgammaskexp = 646, Evlocallabslomaskexp = 647, + Evlocallabsoftradiusexp = 648, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 879f3dc7a..95d36cf1f 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2408,6 +2408,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : chromaskexp(0.0), gammaskexp(1.0), slomaskexp(0.0), + softradiusexp(5.0), // Shadow highlight expshadhigh(false), highlights(0), @@ -2579,6 +2580,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && chromaskexp == other.chromaskexp && gammaskexp == other.gammaskexp && slomaskexp == other.slomaskexp + && softradiusexp == other.softradiusexp // Shadow highlight && expshadhigh == other.expshadhigh && highlights == other.highlights @@ -3707,6 +3709,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).chromaskexp, "Locallab", "Chromaskexp_" + std::to_string(i), spot.chromaskexp, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).gammaskexp, "Locallab", "Gammaskexp_" + std::to_string(i), spot.gammaskexp, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).slomaskexp, "Locallab", "Slomaskexp_" + std::to_string(i), spot.slomaskexp, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).softradiusexp, "Locallab", "Softradiusexp_" + std::to_string(i), spot.softradiusexp, keyFile); // Shadow highlight saveToKeyfile(!pedited || pedited->locallab.spots.at(i).expshadhigh, "Locallab", "Expshadhigh_" + std::to_string(i), spot.expshadhigh, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).highlights, "Locallab", "highlights_" + std::to_string(i), spot.highlights, keyFile); @@ -4963,6 +4966,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Chromaskexp_" + std::to_string(i), pedited, spot.chromaskexp, spotEdited.chromaskexp); assignFromKeyfile(keyFile, "Locallab", "Gammaskexp_" + std::to_string(i), pedited, spot.gammaskexp, spotEdited.gammaskexp); assignFromKeyfile(keyFile, "Locallab", "Slomaskexp_" + std::to_string(i), pedited, spot.slomaskexp, spotEdited.slomaskexp); + assignFromKeyfile(keyFile, "Locallab", "Softradiusexp_" + std::to_string(i), pedited, spot.softradiusexp, spotEdited.softradiusexp); // Shadow highlight assignFromKeyfile(keyFile, "Locallab", "Expshadhigh_" + std::to_string(i), pedited, spot.expshadhigh, spotEdited.expshadhigh); assignFromKeyfile(keyFile, "Locallab", "highlights_" + std::to_string(i), pedited, spot.highlights, spotEdited.highlights); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index ef9728bbc..30bf61d69 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1009,6 +1009,7 @@ struct LocallabParams { double chromaskexp; double gammaskexp; double slomaskexp; + double softradiusexp; // Shadow highlight bool expshadhigh; int highlights; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 68d371ec3..eee40d3c5 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -674,7 +674,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //EvLocallabSpotbalan LUMINANCECURVE, //EvLocallabchromaskexp LUMINANCECURVE, //EvLocallabgammaskexp - LUMINANCECURVE //EvLocallabslomaskexp + LUMINANCECURVE, //EvLocallabslomaskexp + LUMINANCECURVE //EvLocallabsoftradiusexp }; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 9a020066e..af97e6989 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -102,6 +102,7 @@ Locallab::Locallab(): chromaskexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), gammaskexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMMASKCOL"), 0.25, 4.0, 0.01, 1.))), slomaskexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOMASKCOL"), 0.0, 15.0, 0.1, 0.))), + softradiusexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOFTRADIUSCOL"), 0.0, 100.0, 0.1, 5.))), //Shadow hightlights highlights(Gtk::manage(new Adjuster(M("TP_SHADOWSHLIGHTS_HIGHLIGHTS"), 0, 100, 1, 0))), h_tonalwidth(Gtk::manage(new Adjuster(M("TP_SHADOWSHLIGHTS_HLTONALW"), 10, 100, 1, 70))), @@ -443,6 +444,7 @@ Locallab::Locallab(): chromaskexp->setAdjusterListener(this); gammaskexp->setAdjusterListener(this); slomaskexp->setAdjusterListener(this); + softradiusexp->setAdjusterListener(this); curveEditorG->setCurveListener(this); @@ -503,6 +505,7 @@ Locallab::Locallab(): exposeBox->pack_start(*sensiex); exposeBox->pack_start(*structexp); exposeBox->pack_start(*blurexpde); + exposeBox->pack_start(*softradiusexp); exposeBox->pack_start(*curveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor exposeBox->pack_start(*inversex); maskexpFrame->set_label_align(0.025, 0.5); @@ -1714,6 +1717,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).chromaskexp = chromaskexp->getValue(); pp->locallab.spots.at(pp->locallab.selspot).gammaskexp = gammaskexp->getValue(); pp->locallab.spots.at(pp->locallab.selspot).slomaskexp = slomaskexp->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).softradiusexp = softradiusexp->getValue(); // Shadow highlight pp->locallab.spots.at(pp->locallab.selspot).expshadhigh = expshadhigh->getEnabled(); pp->locallab.spots.at(pp->locallab.selspot).highlights = highlights->getIntValue(); @@ -1901,6 +1905,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pe->locallab.spots.at(pp->locallab.selspot).chromaskexp = pe->locallab.spots.at(pp->locallab.selspot).chromaskexp || chromaskexp->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).gammaskexp = pe->locallab.spots.at(pp->locallab.selspot).gammaskexp || gammaskexp->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).slomaskexp = pe->locallab.spots.at(pp->locallab.selspot).slomaskexp || slomaskexp->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).softradiusexp = pe->locallab.spots.at(pp->locallab.selspot).softradiusexp || softradiusexp->getEditedState(); // Shadow highlight pe->locallab.spots.at(pp->locallab.selspot).expshadhigh = pe->locallab.spots.at(pp->locallab.selspot).expshadhigh || !expshadhigh->get_inconsistent(); pe->locallab.spots.at(pp->locallab.selspot).highlights = pe->locallab.spots.at(pp->locallab.selspot).highlights || highlights->getEditedState(); @@ -2074,6 +2079,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).chromaskexp = pedited->locallab.spots.at(pp->locallab.selspot).chromaskexp || chromaskexp->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).gammaskexp = pedited->locallab.spots.at(pp->locallab.selspot).gammaskexp || gammaskexp->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).slomaskexp = pedited->locallab.spots.at(pp->locallab.selspot).slomaskexp || slomaskexp->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).softradiusexp = pedited->locallab.spots.at(pp->locallab.selspot).softradiusexp || softradiusexp->getEditedState(); // Shadow highlight pedited->locallab.spots.at(pp->locallab.selspot).expshadhigh = pedited->locallab.spots.at(pp->locallab.selspot).expshadhigh || !expshadhigh->get_inconsistent(); pedited->locallab.spots.at(pp->locallab.selspot).highlights = pedited->locallab.spots.at(pp->locallab.selspot).highlights || highlights->getEditedState(); @@ -2961,6 +2967,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chromaskexp->setDefault(defSpot->chromaskexp); gammaskexp->setDefault(defSpot->gammaskexp); slomaskexp->setDefault(defSpot->slomaskexp); + softradiusexp->setDefault(defSpot->softradiusexp); //Shadow highlight highlights->setDefault((double)defSpot->highlights); h_tonalwidth->setDefault((double)defSpot->h_tonalwidth); @@ -3061,6 +3068,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chromaskexp->setDefaultEditedState(Irrelevant); gammaskexp->setDefaultEditedState(Irrelevant); slomaskexp->setDefaultEditedState(Irrelevant); + softradiusexp->setDefaultEditedState(Irrelevant); //Shadow highlight highlights->setDefaultEditedState(Irrelevant); h_tonalwidth->setDefaultEditedState(Irrelevant); @@ -3165,6 +3173,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chromaskexp->setDefaultEditedState(defSpotState->chromaskexp ? Edited : UnEdited); gammaskexp->setDefaultEditedState(defSpotState->gammaskexp ? Edited : UnEdited); slomaskexp->setDefaultEditedState(defSpotState->slomaskexp ? Edited : UnEdited); + softradiusexp->setDefaultEditedState(defSpotState->softradiusexp ? Edited : UnEdited); //Shadow highlight highlights->setDefaultEditedState(defSpotState->highlights ? Edited : UnEdited); h_tonalwidth->setDefaultEditedState(defSpotState->h_tonalwidth ? Edited : UnEdited); @@ -3436,6 +3445,12 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + if (a == softradiusexp) { + if (listener) { + listener->panelChanged(Evlocallabsoftradiusexp, softradiusexp->getTextValue()); + } + } + } if (getEnabled() && expshadhigh->getEnabled()) { @@ -3890,6 +3905,7 @@ void Locallab::setBatchMode(bool batchMode) chromaskexp->showEditedCB(); gammaskexp->showEditedCB(); slomaskexp->showEditedCB(); + softradiusexp->showEditedCB(); //Shadow Highlight highlights->showEditedCB(); h_tonalwidth->showEditedCB(); @@ -4270,6 +4286,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con chromaskexp->setValue(pp->locallab.spots.at(index).chromaskexp); gammaskexp->setValue(pp->locallab.spots.at(index).gammaskexp); slomaskexp->setValue(pp->locallab.spots.at(index).slomaskexp); + softradiusexp->setValue(pp->locallab.spots.at(index).softradiusexp); // Shadow highlight expshadhigh->setEnabled(pp->locallab.spots.at(index).expshadhigh); highlights->setValue(pp->locallab.spots.at(index).highlights); @@ -4486,6 +4503,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con chromaskexp->setEditedState(spotState->chromaskexp ? Edited : UnEdited); gammaskexp->setEditedState(spotState->gammaskexp ? Edited : UnEdited); slomaskexp->setEditedState(spotState->slomaskexp ? Edited : UnEdited); + softradiusexp->setEditedState(spotState->softradiusexp ? Edited : UnEdited); // Shadow highlight expshadhigh->set_inconsistent(!spotState->expshadhigh); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index e0eb742ce..d191d4dae 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -120,6 +120,7 @@ private: Adjuster* const chromaskexp; Adjuster* const gammaskexp; Adjuster* const slomaskexp; + Adjuster* const softradiusexp; //Shadow highlight Adjuster* const highlights; Adjuster* const h_tonalwidth; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 3139bc7ca..cd29fc243 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -997,6 +997,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).chromaskexp = locallab.spots.at(j).chromaskexp && pSpot.chromaskexp == otherSpot.chromaskexp; locallab.spots.at(j).gammaskexp = locallab.spots.at(j).gammaskexp && pSpot.gammaskexp == otherSpot.gammaskexp; locallab.spots.at(j).slomaskexp = locallab.spots.at(j).slomaskexp && pSpot.slomaskexp == otherSpot.slomaskexp; + locallab.spots.at(j).softradiusexp = locallab.spots.at(j).softradiusexp && pSpot.softradiusexp == otherSpot.softradiusexp; // Shadow highlight locallab.spots.at(j).expshadhigh = locallab.spots.at(j).expshadhigh && pSpot.expshadhigh == otherSpot.expshadhigh; locallab.spots.at(j).highlights = locallab.spots.at(j).highlights && pSpot.highlights == otherSpot.highlights; @@ -2789,6 +2790,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).slomaskexp = mods.locallab.spots.at(i).slomaskexp; } + if (locallab.spots.at(i).softradiusexp) { + toEdit.locallab.spots.at(i).softradiusexp = mods.locallab.spots.at(i).softradiusexp; + } + // Shadow highlight if (locallab.spots.at(i).expshadhigh) { toEdit.locallab.spots.at(i).expshadhigh = mods.locallab.spots.at(i).expshadhigh; @@ -4141,6 +4146,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : chromaskexp(v), gammaskexp(v), slomaskexp(v), + softradiusexp(v), // Shadow highlight expshadhigh(v), highlights(v), @@ -4309,6 +4315,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) chromaskexp = v; gammaskexp = v; slomaskexp = v; + softradiusexp = v; // Shadow highlight expshadhigh = v; highlights = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index e7495b6f9..ed76a19b8 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -424,6 +424,7 @@ public: bool chromaskexp; bool gammaskexp; bool slomaskexp; + bool softradiusexp; // Shadow highlight bool expshadhigh; bool highlights;