Added contrast threshold adjuster for sharpening tool, #4551
This commit is contained in:
parent
528167e578
commit
1a5545c461
@ -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
|
||||
|
@ -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 ();
|
||||
|
@ -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<float> &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<float> tmpI(W, H);
|
||||
JaggedArray<float> 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<float> 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<float> 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<float> 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) {
|
||||
|
@ -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);
|
||||
|
||||
|
@ -473,6 +473,7 @@ struct ColorToningParams {
|
||||
*/
|
||||
struct SharpeningParams {
|
||||
bool enabled;
|
||||
double contrast;
|
||||
double radius;
|
||||
int amount;
|
||||
Threshold<int> threshold;
|
||||
|
@ -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!!
|
||||
};
|
||||
|
@ -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]);
|
||||
|
@ -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<rtengine::procparams::ProcParams>
|
||||
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;
|
||||
}
|
||||
|
@ -204,6 +204,7 @@ class SharpeningParamsEdited
|
||||
|
||||
public:
|
||||
bool enabled;
|
||||
bool contrast;
|
||||
bool radius;
|
||||
bool amount;
|
||||
bool threshold;
|
||||
|
@ -16,17 +16,29 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "sharpening.h"
|
||||
#include <cmath>
|
||||
#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<int>(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<int> (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);
|
||||
|
@ -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);
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user