diff --git a/rtdata/languages/default b/rtdata/languages/default index 62701b85f..4d9cbe78c 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1936,6 +1936,7 @@ TP_SHARPENEDGE_LABEL;Edges TP_SHARPENEDGE_PASSES;Iterations TP_SHARPENEDGE_THREE;Luminance only TP_SHARPENING_AMOUNT;Amount +TP_SHARPENING_CONTRAST;Contrast threshold TP_SHARPENING_EDRADIUS;Radius TP_SHARPENING_EDTOLERANCE;Edge tolerance TP_SHARPENING_HALOCONTROL;Halo control diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index ae6e3bcaa..cdfdb7b74 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -61,7 +61,6 @@ class ImProcFunctions void sharpenHaloCtrl (float** luminance, float** blurmap, float** base, int W, int H, const SharpeningParams &sharpenParam); void sharpenHaloCtrl (LabImage* lab, float** blurmap, float** base, int W, int H, SharpeningParams &sharpenParam); void sharpenHaloCtrlcam (CieImage* ncie, float** blurmap, float** base, int W, int H); - void dcdamping (float** aI, float** aO, float damping, int W, int H); bool needsCA (); bool needsDistortion (); diff --git a/rtengine/ipsharpen.cc b/rtengine/ipsharpen.cc index 32c4924a4..26d5e608c 100644 --- a/rtengine/ipsharpen.cc +++ b/rtengine/ipsharpen.cc @@ -20,6 +20,7 @@ #include "improcfun.h" #include "gauss.h" #include "bilateral2.h" +#include "jaggedarray.h" #include "rt_math.h" #include "sleef.c" #include "opthelper.h" @@ -45,16 +46,61 @@ vfloat calcBlendFactor(vfloat valv, vfloat thresholdv) { return vself(vmaskf_eq(thresholdv, ZEROV), onev, resultv); } #endif -} -namespace rtengine + +void buildBlendMask(float** luminance, rtengine::JaggedArray &blend, int W, int H, float contrastThreshold) { + // upper border + for(int j = 0; j < 2; j++) + for(int i = 0; i < W; ++i) { + blend[j][i] = 0.f; + } + +#ifdef _OPENMP + #pragma omp parallel +#endif { +#ifdef __SSE2__ + vfloat contrastThresholdv = F2V(contrastThreshold); + vfloat scalev = F2V(0.0625f / 327.68f); +#endif +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) nowait +#endif -#undef ABS + for(int j = 2; j < H - 2; ++j) { + blend[j][0] = blend[j][1] = 0.f; + int i = 2; +#ifdef __SSE2__ + for(; i < W - 5; i += 4) { -#define ABS(a) ((a)<0?-(a):(a)) + vfloat contrastv = vsqrtf(SQRV(LVFU(luminance[j][i+1]) - LVFU(luminance[j][i-1])) + SQRV(LVFU(luminance[j+1][i]) - LVFU(luminance[j-1][i])) + + SQRV(LVFU(luminance[j][i+2]) - LVFU(luminance[j][i-2])) + SQRV(LVFU(luminance[j+2][i]) - LVFU(luminance[j-2][i]))) * scalev; -extern const Settings* settings; -void ImProcFunctions::dcdamping (float** aI, float** aO, float damping, int W, int H) + STVFU(blend[j][i], calcBlendFactor(contrastv, contrastThresholdv)); + } +#endif + for(; i < W - 2; ++i) { + + float contrast = sqrtf(SQR(luminance[j][i+1] - luminance[j][i-1]) + SQR(luminance[j+1][i] - luminance[j-1][i]) + + SQR(luminance[j][i+2] - luminance[j][i-2]) + SQR(luminance[j+2][i] - luminance[j-2][i])) * 0.0625f / 327.68f; + + blend[j][i] = calcBlendFactor(contrast, contrastThreshold); + } + blend[j][W - 2] = blend[j][W - 1] = 0.f; + } +#ifdef _OPENMP + #pragma omp single +#endif + { + // lower border + for(int j = H - 2; j < H; ++j) + for(int i = 0; i < W; ++i) { + blend[j][i] = 0.f; + } + } +} +} + +void dcdamping (float** aI, float** aO, float damping, int W, int H) { const float dampingFac = -2.0 / (damping * damping); @@ -103,35 +149,35 @@ void ImProcFunctions::dcdamping (float** aI, float** aO, float damping, int W, i } float U = (O * xlogf(I / O) - I + O) * dampingFac; - U = min(U, 1.0f); + U = rtengine::min(U, 1.0f); U = U * U * U * U * (5.f - U * 4.f); aI[i][j] = (O - I) / I * U + 1.f; } } } +} +namespace rtengine +{ + +#undef ABS + +#define ABS(a) ((a)<0?-(a):(a)) + +extern const Settings* settings; + void ImProcFunctions::deconvsharpening (float** luminance, float** tmp, int W, int H, const SharpeningParams &sharpenParam) { if (sharpenParam.deconvamount < 1) { return; } BENCHFUN - float *tmpI[H] ALIGNED16; - - tmpI[0] = new float[W * H]; - - for (int i = 1; i < H; i++) { - tmpI[i] = tmpI[i - 1] + W; - } - - float *tmpII[H] ALIGNED16; - - tmpII[0] = new float[W * H]; - - for (int i = 1; i < H; i++) { - tmpII[i] = tmpII[i - 1] + W; - } + JaggedArray tmpI(W, H); + JaggedArray tmpII(W, H); +#ifdef _OPENMP + #pragma omp parallel for +#endif for (int i = 0; i < H; i++) { for(int j = 0; j < W; j++) { tmpI[i][j] = max(luminance[i][j], 0.f); @@ -140,63 +186,11 @@ BENCHFUN } // calculate contrast based blend factors to reduce sharpening in regions with low contrast - const float contrastThreshold = sharpenParam.deconvdamping / 100.f; - float *blend = new float[W * H]; //allocation for blend factor map - - // upper border - for(int j = 0; j < 2; j++) - for(int i = 0, offset = j * W + i; i < W; i++, offset++) { - blend[offset] = 0.f; - } - -#ifdef _OPENMP - #pragma omp parallel -#endif -{ -#ifdef __SSE2__ - vfloat contrastThresholdv = F2V(contrastThreshold); - vfloat scalev = F2V(0.0625f / 327.68f); -#endif -#ifdef _OPENMP - #pragma omp for schedule(dynamic,16) nowait -#endif - - for(int j = 2; j < H - 2; j++) { - blend[j * W] = blend[j * W + 1] = 0.f; - int i = 2; - int offset = j * W + i; -#ifdef __SSE2__ - for(; i < W - 5; i += 4, offset += 4) { - - vfloat contrastv = vsqrtf(SQRV(LVFU(luminance[j][i+1]) - LVFU(luminance[j][i-1])) + SQRV(LVFU(luminance[j+1][i]) - LVFU(luminance[j-1][i])) + - SQRV(LVFU(luminance[j][i+2]) - LVFU(luminance[j][i-2])) + SQRV(LVFU(luminance[j+2][i]) - LVFU(luminance[j-2][i]))) * scalev; - - STVFU(blend[offset], calcBlendFactor(contrastv, contrastThresholdv)); - } -#endif - for(; i < W - 2; i++, offset++) { - - float contrast = sqrtf(SQR(luminance[j][i+1] - luminance[j][i-1]) + SQR(luminance[j+1][i] - luminance[j-1][i]) + - SQR(luminance[j][i+2] - luminance[j][i-2]) + SQR(luminance[j+2][i] - luminance[j-2][i])) * 0.0625f / 327.68f; - - blend[offset] = calcBlendFactor(contrast, contrastThreshold); - } - blend[j * W + W - 2] = blend[j * W + W - 1] = 0.f; - } -#ifdef _OPENMP - #pragma omp single -#endif - { - // lower border - for(int j = H - 2; j < H; j++) - for(int i = 0, offset = j * W + i; i < W; i++, offset++) { - blend[offset] = 0.f; - } - } -} + JaggedArray blend(W, H); + buildBlendMask(luminance, blend, W, H, sharpenParam.contrast / 100.f); float damping = sharpenParam.deconvdamping / 5.0; - bool needdamp = false; //sharpenParam.deconvdamping > 0; + bool needdamp = sharpenParam.deconvdamping > 0; double sigma = sharpenParam.deconvradius / scale; #ifdef _OPENMP @@ -206,22 +200,22 @@ BENCHFUN for (int k = 0; k < sharpenParam.deconviter; k++) { if (!needdamp) { // apply gaussian blur and divide luminance by result of gaussian blur - gaussianBlur (tmpI, tmp, W, H, sigma, nullptr, GAUSS_DIV, luminance); + gaussianBlur(tmpI, tmp, W, H, sigma, nullptr, GAUSS_DIV, luminance); #ifdef _OPENMP #pragma omp for #endif - for (int i = 0; i < H; i++) { - for(int j = 0; j < W; j++) { + for (int i = 0; i < H; ++i) { + for(int j = 0; j < W; ++j) { tmp[i][j] = max(tmp[i][j], 0.f); } } } else { // apply gaussian blur + damping - gaussianBlur (tmpI, tmp, W, H, sigma); - dcdamping (tmp, luminance, damping, W, H); + gaussianBlur(tmpI, tmp, W, H, sigma); + dcdamping(tmp, luminance, damping, W, H); } - gaussianBlur (tmp, tmpI, W, H, sigma, nullptr, GAUSS_MULT); + gaussianBlur(tmp, tmpI, W, H, sigma, nullptr, GAUSS_MULT); } // end for @@ -232,21 +226,17 @@ BENCHFUN #pragma omp for #endif - for (int i = 0; i < H; i++) - for (int j = 0, offset = i * W + j; j < W; j++, offset++) { - luminance[i][j] = intp(blend[offset], luminance[i][j] * p1 + max(tmpI[i][j], 0.0f) * p2, tmpII[i][j]); + for (int i = 0; i < H; ++i) + for (int j = 0; j < W; ++j) { + luminance[i][j] = intp(blend[i][j], luminance[i][j] * p1 + max(tmpI[i][j], 0.0f) * p2, tmpII[i][j]); } } // end parallel - delete [] blend; - delete [] tmpI[0]; - delete [] tmpII[0]; - } void ImProcFunctions::sharpening (LabImage* lab, float** b2, SharpeningParams &sharpenParam) { - if (!sharpenParam.enabled) { + if ((!sharpenParam.enabled) || sharpenParam.amount < 1 || lab->W < 8 || lab->H < 8) { return; } @@ -255,11 +245,6 @@ void ImProcFunctions::sharpening (LabImage* lab, float** b2, SharpeningParams &s return; } - if ((!sharpenParam.enabled) || sharpenParam.amount < 1 || lab->W < 8 || lab->H < 8) { - return; - } - - // Rest is UNSHARP MASK int W = lab->W, H = lab->H; float** b3 = nullptr; @@ -272,6 +257,10 @@ void ImProcFunctions::sharpening (LabImage* lab, float** b2, SharpeningParams &s } } + // calculate contrast based blend factors to reduce sharpening in regions with low contrast + JaggedArray blend(W, H); + buildBlendMask(lab->L, blend, W, H, sharpenParam.contrast / 100.f); + #ifdef _OPENMP #pragma omp parallel #endif @@ -303,18 +292,12 @@ void ImProcFunctions::sharpening (LabImage* lab, float** b2, SharpeningParams &s min(ABS(diff), upperBound), // X axis value = absolute value of the difference, truncated to the max value of this field sharpenParam.amount * diff * 0.01f // Y axis max value ); - lab->L[i][j] = lab->L[i][j] + delta; + lab->L[i][j] = intp(blend[i][j], lab->L[i][j] + delta, lab->L[i][j]); } } else { - float** labCopy = nullptr; - if (!sharpenParam.edgesonly) { // make a deep copy of lab->L - labCopy = new float*[H]; - - for( int i = 0; i < H; i++ ) { - labCopy[i] = new float[W]; - } + JaggedArray labCopy(W, H); #ifdef _OPENMP #pragma omp parallel for @@ -325,18 +308,11 @@ void ImProcFunctions::sharpening (LabImage* lab, float** b2, SharpeningParams &s labCopy[i][j] = lab->L[i][j]; } - base = labCopy; + sharpenHaloCtrl (lab->L, b2, labCopy, W, H, sharpenParam); + } else { + sharpenHaloCtrl (lab->L, b2, base, W, H, sharpenParam); } - sharpenHaloCtrl (lab->L, b2, base, W, H, sharpenParam); - - if (labCopy) { - for( int i = 0; i < H; i++ ) { - delete[] labCopy[i]; - } - - delete[] labCopy; - } } if (sharpenParam.edgesonly) { diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index db671a8ab..c14dcf886 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1007,6 +1007,7 @@ void ColorToningParams::getCurves(ColorGradientCurve& colorCurveLUT, OpacityCurv SharpeningParams::SharpeningParams() : enabled(false), + contrast(0.0), radius(0.5), amount(200), threshold(20, 80, 2000, 1200, false), @@ -1027,6 +1028,7 @@ bool SharpeningParams::operator ==(const SharpeningParams& other) const { return enabled == other.enabled + && contrast == other.contrast && radius == other.radius && amount == other.amount && threshold == other.threshold @@ -2853,6 +2855,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo // Sharpening saveToKeyfile(!pedited || pedited->sharpening.enabled, "Sharpening", "Enabled", sharpening.enabled, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.contrast, "Sharpening", "Contrast", sharpening.contrast, keyFile); saveToKeyfile(!pedited || pedited->sharpening.method, "Sharpening", "Method", sharpening.method, keyFile); saveToKeyfile(!pedited || pedited->sharpening.radius, "Sharpening", "Radius", sharpening.radius, keyFile); saveToKeyfile(!pedited || pedited->sharpening.amount, "Sharpening", "Amount", sharpening.amount, keyFile); @@ -3670,6 +3673,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) if (keyFile.has_group ("Sharpening")) { assignFromKeyfile(keyFile, "Sharpening", "Enabled", pedited, sharpening.enabled, pedited->sharpening.enabled); + assignFromKeyfile(keyFile, "Sharpening", "Contrast", pedited, sharpening.contrast, pedited->sharpening.contrast); assignFromKeyfile(keyFile, "Sharpening", "Radius", pedited, sharpening.radius, pedited->sharpening.radius); assignFromKeyfile(keyFile, "Sharpening", "Amount", pedited, sharpening.amount, pedited->sharpening.amount); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index bc2a9d97c..467ecf1e3 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -473,6 +473,7 @@ struct ColorToningParams { */ struct SharpeningParams { bool enabled; + double contrast; double radius; int amount; Threshold threshold; diff --git a/rtgui/addsetids.h b/rtgui/addsetids.h index e0e0b20dd..c5913a6e2 100644 --- a/rtgui/addsetids.h +++ b/rtgui/addsetids.h @@ -135,6 +135,7 @@ enum { ADDSET_LOCALCONTRAST_LIGHTNESS, ADDSET_FATTAL_ANCHOR, ADDSET_SHARPENMICRO_CONTRAST, + ADDSET_SHARP_CONTRAST, ADDSET_PARAM_NUM // THIS IS USED AS A DELIMITER!! }; diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index 99c7a089d..ede983324 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -146,7 +146,7 @@ void BatchToolPanelCoordinator::initSession () gradient->setAdjusterBehavior (false, false, false, false); pcvignette->setAdjusterBehavior (false, false, false); cacorrection->setAdjusterBehavior (false); - sharpening->setAdjusterBehavior (false, false, false, false, false, false); + sharpening->setAdjusterBehavior (false, false, false, false, false, false, false); prsharpening->setAdjusterBehavior (false, false, false, false, false, false); sharpenEdge->setAdjusterBehavior (false, false); sharpenMicro->setAdjusterBehavior (false, false, false); @@ -189,7 +189,7 @@ void BatchToolPanelCoordinator::initSession () gradient->setAdjusterBehavior (options.baBehav[ADDSET_GRADIENT_DEGREE], options.baBehav[ADDSET_GRADIENT_FEATHER], options.baBehav[ADDSET_GRADIENT_STRENGTH], options.baBehav[ADDSET_GRADIENT_CENTER]); pcvignette->setAdjusterBehavior (options.baBehav[ADDSET_PCVIGNETTE_STRENGTH], options.baBehav[ADDSET_PCVIGNETTE_FEATHER], options.baBehav[ADDSET_PCVIGNETTE_ROUNDNESS]); cacorrection->setAdjusterBehavior (options.baBehav[ADDSET_CA]); - sharpening->setAdjusterBehavior (options.baBehav[ADDSET_SHARP_RADIUS], options.baBehav[ADDSET_SHARP_AMOUNT], options.baBehav[ADDSET_SHARP_DAMPING], options.baBehav[ADDSET_SHARP_ITER], options.baBehav[ADDSET_SHARP_EDGETOL], options.baBehav[ADDSET_SHARP_HALOCTRL]); + sharpening->setAdjusterBehavior (options.baBehav[ADDSET_SHARP_CONTRAST], options.baBehav[ADDSET_SHARP_RADIUS], options.baBehav[ADDSET_SHARP_AMOUNT], options.baBehav[ADDSET_SHARP_DAMPING], options.baBehav[ADDSET_SHARP_ITER], options.baBehav[ADDSET_SHARP_EDGETOL], options.baBehav[ADDSET_SHARP_HALOCTRL]); prsharpening->setAdjusterBehavior (options.baBehav[ADDSET_SHARP_RADIUS], options.baBehav[ADDSET_SHARP_AMOUNT], options.baBehav[ADDSET_SHARP_DAMPING], options.baBehav[ADDSET_SHARP_ITER], options.baBehav[ADDSET_SHARP_EDGETOL], options.baBehav[ADDSET_SHARP_HALOCTRL]); epd->setAdjusterBehavior (options.baBehav[ADDSET_EPD_STRENGTH], options.baBehav[ADDSET_EPD_GAMMA], options.baBehav[ADDSET_EPD_EDGESTOPPING], options.baBehav[ADDSET_EPD_SCALE], options.baBehav[ADDSET_EPD_REWEIGHTINGITERATES]); fattal->setAdjusterBehavior (options.baBehav[ADDSET_FATTAL_AMOUNT], options.baBehav[ADDSET_FATTAL_THRESHOLD], options.baBehav[ADDSET_FATTAL_ANCHOR]); diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 0d3ee8f22..258410773 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -142,6 +142,7 @@ void ParamsEdited::set (bool v) colorToning.labgridBHigh = v; sharpening.enabled = v; + sharpening.contrast = v; sharpening.radius = v; sharpening.amount = v; sharpening.threshold = v; @@ -695,6 +696,7 @@ void ParamsEdited::initFrom (const std::vector sharpenMicro.contrast = sharpenMicro.contrast && p.sharpenMicro.contrast == other.sharpenMicro.contrast; sharpenMicro.uniformity = sharpenMicro.uniformity && p.sharpenMicro.uniformity == other.sharpenMicro.uniformity; sharpening.enabled = sharpening.enabled && p.sharpening.enabled == other.sharpening.enabled; + sharpening.contrast = sharpening.contrast && p.sharpening.contrast == other.sharpening.contrast; sharpening.radius = sharpening.radius && p.sharpening.radius == other.sharpening.radius; sharpening.amount = sharpening.amount && p.sharpening.amount == other.sharpening.amount; sharpening.threshold = sharpening.threshold && p.sharpening.threshold == other.sharpening.threshold; @@ -1578,6 +1580,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.sharpening.enabled = mods.sharpening.enabled; } + if (sharpening.contrast) { + toEdit.sharpening.contrast = dontforceSet && options.baBehav[ADDSET_SHARP_CONTRAST] ? toEdit.sharpening.contrast + mods.sharpening.contrast : mods.sharpening.contrast; + } + if (sharpening.radius) { toEdit.sharpening.radius = dontforceSet && options.baBehav[ADDSET_SHARP_RADIUS] ? toEdit.sharpening.radius + mods.sharpening.radius : mods.sharpening.radius; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index e11eb1814..47fb70ef0 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -204,6 +204,7 @@ class SharpeningParamsEdited public: bool enabled; + bool contrast; bool radius; bool amount; bool threshold; diff --git a/rtgui/sharpening.cc b/rtgui/sharpening.cc index 9abfc6de8..005d2dd8f 100644 --- a/rtgui/sharpening.cc +++ b/rtgui/sharpening.cc @@ -16,17 +16,29 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "sharpening.h" #include +#include "eventmapper.h" +#include "sharpening.h" using namespace rtengine; using namespace rtengine::procparams; Sharpening::Sharpening () : FoldableToolPanel(this, "sharpening", M("TP_SHARPENING_LABEL"), true, true) { + auto m = ProcEventMapper::getInstance(); + EvSharpenContrast = m->newEvent(SHARPENING, "HISTORY_MSG_MICROCONTRAST_CONTRAST"); Gtk::HBox* hb = Gtk::manage (new Gtk::HBox ()); hb->show (); + contrast = Gtk::manage(new Adjuster (M("TP_SHARPENMICRO_CONTRAST"), 0, 100, 1, 0)); + contrast->setAdjusterListener (this); + pack_start(*contrast); + if (contrast->delay < options.adjusterMaxDelay) { + contrast->delay = options.adjusterMaxDelay; + } + + contrast->show(); + Gtk::Label* ml = Gtk::manage (new Gtk::Label (M("TP_SHARPENING_METHOD") + ":")); ml->show (); method = Gtk::manage (new MyComboBoxText ()); @@ -144,6 +156,7 @@ void Sharpening::read (const ProcParams* pp, const ParamsEdited* pedited) disableListener (); if (pedited) { + contrast->setEditedState (pedited->sharpening.contrast ? Edited : UnEdited); amount->setEditedState (pedited->sharpening.amount ? Edited : UnEdited); radius->setEditedState (pedited->sharpening.radius ? Edited : UnEdited); threshold->setEditedState (pedited->sharpening.threshold ? Edited : UnEdited); @@ -172,6 +185,7 @@ void Sharpening::read (const ProcParams* pp, const ParamsEdited* pedited) hcConn.block (false); lastHaloControl = pp->sharpening.halocontrol; + contrast->setValue (pp->sharpening.contrast); amount->setValue (pp->sharpening.amount); radius->setValue (pp->sharpening.radius); threshold->setValue(pp->sharpening.threshold); @@ -213,6 +227,7 @@ void Sharpening::read (const ProcParams* pp, const ParamsEdited* pedited) void Sharpening::write (ProcParams* pp, ParamsEdited* pedited) { + pp->sharpening.contrast = contrast->getValue (); pp->sharpening.amount = (int)amount->getValue(); pp->sharpening.enabled = getEnabled (); pp->sharpening.radius = radius->getValue (); @@ -234,6 +249,7 @@ void Sharpening::write (ProcParams* pp, ParamsEdited* pedited) } if (pedited) { + pedited->sharpening.contrast = contrast->getEditedState (); pedited->sharpening.amount = amount->getEditedState (); pedited->sharpening.radius = radius->getEditedState (); pedited->sharpening.threshold = threshold->getEditedState (); @@ -253,7 +269,7 @@ void Sharpening::write (ProcParams* pp, ParamsEdited* pedited) void Sharpening::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) { - + contrast->setDefault (defParams->sharpening.contrast); amount->setDefault (defParams->sharpening.amount); radius->setDefault (defParams->sharpening.radius); threshold->setDefault (defParams->sharpening.threshold); @@ -266,6 +282,7 @@ void Sharpening::setDefaults (const ProcParams* defParams, const ParamsEdited* p ddamping->setDefault (defParams->sharpening.deconvdamping); if (pedited) { + contrast->setDefaultEditedState (pedited->sharpening.contrast ? Edited : UnEdited); amount->setDefaultEditedState (pedited->sharpening.amount ? Edited : UnEdited); radius->setDefaultEditedState (pedited->sharpening.radius ? Edited : UnEdited); threshold->setDefaultEditedState (pedited->sharpening.threshold ? Edited : UnEdited); @@ -277,6 +294,7 @@ void Sharpening::setDefaults (const ProcParams* defParams, const ParamsEdited* p diter->setDefaultEditedState (pedited->sharpening.deconviter ? Edited : UnEdited); ddamping->setDefaultEditedState (pedited->sharpening.deconvdamping ? Edited : UnEdited); } else { + contrast->setDefaultEditedState (Irrelevant); amount->setDefaultEditedState (Irrelevant); radius->setDefaultEditedState (Irrelevant); threshold->setDefaultEditedState (Irrelevant); @@ -305,7 +323,9 @@ void Sharpening::adjusterChanged (Adjuster* a, double newval) costr = Glib::ustring::format ((int)a->getValue()); } - if (a == amount) { + if (a == contrast) { + listener->panelChanged (EvSharpenContrast, costr); + } else if (a == amount) { listener->panelChanged (EvShrAmount, costr); } else if (a == radius) { listener->panelChanged (EvShrRadius, costr); @@ -451,6 +471,7 @@ void Sharpening::setBatchMode (bool batchMode) edgebin->pack_start (*edgebox); pack_start (*rld); + contrast->showEditedCB (); radius->showEditedCB (); amount->showEditedCB (); threshold->showEditedCB (); @@ -464,9 +485,10 @@ void Sharpening::setBatchMode (bool batchMode) method->append (M("GENERAL_UNCHANGED")); } -void Sharpening::setAdjusterBehavior (bool radiusadd, bool amountadd, bool dampingadd, bool iteradd, bool edgetoladd, bool haloctrladd) +void Sharpening::setAdjusterBehavior (bool contrastadd, bool radiusadd, bool amountadd, bool dampingadd, bool iteradd, bool edgetoladd, bool haloctrladd) { + contrast->setAddMode(contrastadd); radius->setAddMode(radiusadd); dradius->setAddMode(radiusadd); amount->setAddMode(amountadd); @@ -480,7 +502,7 @@ void Sharpening::setAdjusterBehavior (bool radiusadd, bool amountadd, bool dampi void Sharpening::trimValues (rtengine::procparams::ProcParams* pp) { - + contrast->trimValue(pp->sharpening.contrast); radius->trimValue(pp->sharpening.radius); dradius->trimValue(pp->sharpening.deconvradius); amount->trimValue(pp->sharpening.amount); diff --git a/rtgui/sharpening.h b/rtgui/sharpening.h index 2901036f5..9bcbbbc20 100644 --- a/rtgui/sharpening.h +++ b/rtgui/sharpening.h @@ -28,6 +28,7 @@ class Sharpening : public ToolParamBlock, public ThresholdAdjusterListener, publ { protected: + Adjuster* contrast; MyComboBoxText* method; Adjuster* dradius; Adjuster* damount; @@ -53,6 +54,7 @@ protected: bool lastHaloControl; sigc::connection hcConn; + rtengine::ProcEvent EvSharpenContrast; public: Sharpening (); @@ -70,7 +72,7 @@ public: void halocontrol_toggled (); void method_changed (); - void setAdjusterBehavior (bool radiusadd, bool amountadd, bool dampingadd, bool iteradd, bool edgetoladd, bool haloctrladd); + void setAdjusterBehavior (bool contrastadd, bool radiusadd, bool amountadd, bool dampingadd, bool iteradd, bool edgetoladd, bool haloctrladd); void trimValues (rtengine::procparams::ProcParams* pp); };