Added Wavelet sub-tool enable/disable buttons, and some bug fixes. Issue 2831

This commit is contained in:
jdc 2015-07-14 20:44:27 +02:00
parent 8c471a1f6f
commit a1ca02fd67
10 changed files with 304 additions and 68 deletions

View File

@ -625,6 +625,13 @@ HISTORY_MSG_392;W - Residual - CB Reset
HISTORY_MSG_393;Use DCP's look table HISTORY_MSG_393;Use DCP's look table
HISTORY_MSG_394;Use DCP's baseline exposure offset HISTORY_MSG_394;Use DCP's baseline exposure offset
HISTORY_MSG_395;Use DCP's base table HISTORY_MSG_395;Use DCP's base table
HISTORY_MSG_396;W - Contrast sub-tool
HISTORY_MSG_397;W - Chroma sub-tool
HISTORY_MSG_398;W - ES sub-tool
HISTORY_MSG_399;W - Residual sub-tool
HISTORY_MSG_400;W - Final sub-tool
HISTORY_MSG_401;W - Toning sub-tool
HISTORY_MSG_402;W - Denoise sub-tool
HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT;Add
HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: <b>Alt-s</b> HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: <b>Alt-s</b>
HISTORY_SNAPSHOTS;Snapshots HISTORY_SNAPSHOTS;Snapshots

View File

@ -142,6 +142,13 @@ struct cont_params {
float bllow; float bllow;
float grlow; float grlow;
bool cbena; bool cbena;
bool contena;
bool chromena;
bool edgeena;
bool resena;
bool finena;
bool toningena;
bool noiseena;
}; };
@ -192,6 +199,20 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int
cp.tmstrength=params->wavelet.tmrs; cp.tmstrength=params->wavelet.tmrs;
//cp.tonemap = params->wavelet.tmr; //cp.tonemap = params->wavelet.tmr;
cp.contena=true;
cp.contena=params->wavelet.expcontrast;
cp.chromena=true;
cp.chromena=params->wavelet.expchroma;
cp.edgeena=true;
cp.edgeena=params->wavelet.expedge;
cp.resena=true;
cp.resena=params->wavelet.expresid;
cp.finena=true;
cp.finena=params->wavelet.expfinal;
cp.toningena=true;
cp.toningena=params->wavelet.exptoning;
cp.noiseena=true;
cp.noiseena=params->wavelet.expnoise;
if(params->wavelet.Backmethod=="black") cp.backm= 0; if(params->wavelet.Backmethod=="black") cp.backm= 0;
if(params->wavelet.Backmethod=="grey") cp.backm = 1; if(params->wavelet.Backmethod=="grey") cp.backm = 1;
@ -620,7 +641,7 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int
int levwavL = levwav; int levwavL = levwav;
bool ref0=false; bool ref0=false;
if(cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f) ref0=true; if((cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f) && cp.noiseena) ref0=true;
// printf("LevwavL before: %d\n",levwavL); // printf("LevwavL before: %d\n",levwavL);
if(cp.contrast == 0.f && cp.tonemap==false && cp.conres == 0.f && cp.conresH == 0.f && cp.val ==0 && !ref0 && params->wavelet.CLmethod=="all") { // no processing of residual L or edge=> we probably can reduce the number of levels if(cp.contrast == 0.f && cp.tonemap==false && cp.conres == 0.f && cp.conresH == 0.f && cp.val ==0 && !ref0 && params->wavelet.CLmethod=="all") { // no processing of residual L or edge=> we probably can reduce the number of levels
@ -650,7 +671,7 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int
} }
int ind=0; int ind=0;
bool ref=false; bool ref=false;
if(cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f) ref=true; if((cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f) && cp.noiseena) ref=true;
bool contr=false; bool contr=false;
for(int f=0;f<levwavL;f++) { for(int f=0;f<levwavL;f++) {
if(cp.mul[f]!=0.f) contr=true; if(cp.mul[f]!=0.f) contr=true;
@ -665,7 +686,7 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int
vari[1]=8.f*SQR((cp.lev1n/125.0)*(1.0+ cp.lev1n/25.0)); vari[1]=8.f*SQR((cp.lev1n/125.0)*(1.0+ cp.lev1n/25.0));
vari[2]=8.f*SQR((cp.lev2n/125.0)*(1.0+ cp.lev2n/25.0)); vari[2]=8.f*SQR((cp.lev2n/125.0)*(1.0+ cp.lev2n/25.0));
int edge=1; int edge=1;
if(cp.lev0n > 0.1f || cp.lev1n > 0.1f || cp.lev2n > 0.1f) { if((cp.lev0n > 0.1f || cp.lev1n > 0.1f || cp.lev2n > 0.1f) && cp.noiseena) {
vari[0] = max(0.0001f,vari[0]); vari[0] = max(0.0001f,vari[0]);
vari[1] = max(0.0001f,vari[1]); vari[1] = max(0.0001f,vari[1]);
vari[2] = max(0.0001f,vari[2]); vari[2] = max(0.0001f,vari[2]);
@ -864,7 +885,7 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int
L = labco->L[i1][j1]; L = labco->L[i1][j1];
const float Lin=labco->L[i1][j1]; const float Lin=labco->L[i1][j1];
if(wavclCurve) {labco->L[i1][j1] =(0.5f*Lin + 1.5f*wavclCurve[Lin])/2.f;}//apply contrast curve if(wavclCurve && cp.finena) {labco->L[i1][j1] =(0.5f*Lin + 1.5f*wavclCurve[Lin])/2.f;}//apply contrast curve
L = labco->L[i1][j1]; L = labco->L[i1][j1];
float Lprov1=L/327.68f; float Lprov1=L/327.68f;
@ -904,7 +925,7 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int
L = labco->L[i1][j1]; L = labco->L[i1][j1];
const float Lin=labco->L[i1][j1]; const float Lin=labco->L[i1][j1];
if(wavclCurve) {labco->L[i1][j1] = (0.5f*Lin + 1.5f*wavclCurve[Lin])/2.f;}//apply contrast curve if(wavclCurve && cp.finena) {labco->L[i1][j1] = (0.5f*Lin + 1.5f*wavclCurve[Lin])/2.f;}//apply contrast curve
L = labco->L[i1][j1]; L = labco->L[i1][j1];
a = labco->a[i1][j1]; a = labco->a[i1][j1];
b = labco->b[i1][j1]; b = labco->b[i1][j1];
@ -1346,7 +1367,7 @@ void ImProcFunctions::WaveletcontAllLfinal(LabImage * labco, float ** varhue, fl
float max0 = 0.f; float max0 = 0.f;
float min0 = FLT_MAX; float min0 = FLT_MAX;
if(contrast != 0.f || cp.tonemap) { // contrast = 0.f means that all will be multiplied by 1.f, so we can skip this step if(contrast != 0.f || cp.tonemap && cp.resena) { // contrast = 0.f means that all will be multiplied by 1.f, so we can skip this step
#ifdef _RT_NESTED_OPENMP #ifdef _RT_NESTED_OPENMP
#pragma omp parallel for reduction(+:avedbl) num_threads(wavNestedLevels) if(wavNestedLevels>1) #pragma omp parallel for reduction(+:avedbl) num_threads(wavNestedLevels) if(wavNestedLevels>1)
#endif #endif
@ -1383,7 +1404,7 @@ void ImProcFunctions::WaveletcontAllLfinal(LabImage * labco, float ** varhue, fl
// printf("MAXmax0=%f MINmin0=%f\n",max0,min0); // printf("MAXmax0=%f MINmin0=%f\n",max0,min0);
//tone mapping //tone mapping
if(cp.tonemap && cp.contmet==2) { if(cp.tonemap && cp.contmet==2 && cp.resena) {
//iterate = 5 //iterate = 5
EPDToneMapResid(WavCoeffs_L0, 5, skip, cp, W_L, H_L, max0, min0); EPDToneMapResid(WavCoeffs_L0, 5, skip, cp, W_L, H_L, max0, min0);
@ -1421,7 +1442,7 @@ if(cp.tonemap && cp.contmet==2) {
#pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1)
#endif #endif
{ {
if(contrast != 0.f) { // contrast = 0.f means that all will be multiplied by 1.f, so we can skip this step if(contrast != 0.f && cp.resena) { // contrast = 0.f means that all will be multiplied by 1.f, so we can skip this step
{ {
#ifdef _RT_NESTED_OPENMP #ifdef _RT_NESTED_OPENMP
#pragma omp for #pragma omp for
@ -1446,7 +1467,7 @@ if(cp.tonemap && cp.contmet==2) {
} }
} }
if(cp.tonemap && cp.contmet==1) { if(cp.tonemap && cp.contmet==1 && cp.resena) {
float maxp=max0*256.f; float maxp=max0*256.f;
float minp=min0*256.f; float minp=min0*256.f;
#ifdef _RT_NESTED_OPENMP #ifdef _RT_NESTED_OPENMP
@ -1458,7 +1479,7 @@ if(cp.tonemap && cp.contmet==1) {
#pragma omp barrier #pragma omp barrier
#endif #endif
if(cp.conres != 0.f || cp.conresH != 0.f) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step if((cp.conres != 0.f || cp.conresH != 0.f) && cp.resena) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step
#ifdef _RT_NESTED_OPENMP #ifdef _RT_NESTED_OPENMP
#pragma omp for nowait #pragma omp for nowait
#endif #endif
@ -1545,9 +1566,10 @@ if(cp.detectedge && lipschitz==true) { //enabled Lipschitz control...more memory
// interm /= 1.732f;//interm = pseudo variance koeLi // interm /= 1.732f;//interm = pseudo variance koeLi
interm *= 0.57736721f; interm *= 0.57736721f;
float kampli = 1.f; float kampli = 1.f;
float eps=0.0001f;
// I think this double ratio (alph, beta) is better than arctg // I think this double ratio (alph, beta) is better than arctg
float alph = koeLi[lvl*3][i*W_L + j] / koeLi[lvl*3 + 1][i*W_L + j];//ratio between horizontal and vertical float alph = koeLi[lvl*3][i*W_L + j] / (koeLi[lvl*3 + 1][i*W_L + j]+eps);//ratio between horizontal and vertical
float beta = koeLi[lvl*3+2][i*W_L + j] / koeLi[lvl*3 + 1][i*W_L + j];//ratio between diagonal and horizontal float beta = koeLi[lvl*3+2][i*W_L + j] / (koeLi[lvl*3 + 1][i*W_L + j]+eps);//ratio between diagonal and horizontal
float alipinfl=(eddlipampl-1.f)/(1.f-eddlipinfl); float alipinfl=(eddlipampl-1.f)/(1.f-eddlipinfl);
float blipinfl=eddlipampl-alipinfl; float blipinfl=eddlipampl-alipinfl;
@ -1618,7 +1640,7 @@ if(cp.detectedge && lipschitz==true) { //enabled Lipschitz control...more memory
void ImProcFunctions::WaveletAandBAllAB(LabImage * labco, float ** varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_a, wavelet_decomposition &WaveletCoeffs_b, void ImProcFunctions::WaveletAandBAllAB(LabImage * labco, float ** varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_a, wavelet_decomposition &WaveletCoeffs_b,
struct cont_params cp, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* hhCurve, bool hhutili){ struct cont_params cp, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* hhCurve, bool hhutili){
// StopWatch Stop1("WaveletAandBAllAB"); // StopWatch Stop1("WaveletAandBAllAB");
if (hhutili) { // H=f(H) if (hhutili && cp.resena) { // H=f(H)
int W_L = WaveletCoeffs_a.level_W(0); int W_L = WaveletCoeffs_a.level_W(0);
int H_L = WaveletCoeffs_a.level_H(0); int H_L = WaveletCoeffs_a.level_H(0);
@ -1690,7 +1712,7 @@ if(cp.detectedge && lipschitz==true) { //enabled Lipschitz control...more memory
#pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1)
#endif #endif
{ {
if(cp.chrores != 0.f) { // cp.chrores == 0.f means all will be multiplied by 1.f, so we can skip the processing of residual if(cp.chrores != 0.f && cp.resena) { // cp.chrores == 0.f means all will be multiplied by 1.f, so we can skip the processing of residual
#ifdef _RT_NESTED_OPENMP #ifdef _RT_NESTED_OPENMP
#pragma omp for nowait #pragma omp for nowait
@ -1739,7 +1761,7 @@ if(cp.detectedge && lipschitz==true) { //enabled Lipschitz control...more memory
} }
} }
if(cp.cbena) {//if user select Toning and color balance if(cp.cbena && cp.resena) {//if user select Toning and color balance
#ifdef _RT_NESTED_OPENMP #ifdef _RT_NESTED_OPENMP
#pragma omp for nowait #pragma omp for nowait
@ -1974,7 +1996,7 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, struct cont_params cp, floa
bool lipschitz=true; bool lipschitz=true;
float edge=1.f; float edge=1.f;
bool curvdiag=true; bool curvdiag=true;
if(curvdiag) {//curve if(curvdiag && cp.finena) {//curve
float insigma=0.666f;//SD float insigma=0.666f;//SD
float logmax=log(MaxP[level]);//log Max float logmax=log(MaxP[level]);//log Max
float rapX=(mean[level]+sigma[level])/MaxP[level];//rapport between sD / max float rapX=(mean[level]+sigma[level])/MaxP[level];//rapport between sD / max
@ -2115,7 +2137,7 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, struct cont_params cp, floa
bool refi=false; bool refi=false;
// if(cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f) refi=true; // if(cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f) refi=true;
// if(cp.val > 0 || refi) {//edge // if(cp.val > 0 || refi) {//edge
if(cp.val > 0) {//edge if(cp.val > 0 && cp.edgeena) {
float * koe; float * koe;
float maxkoe=0.f; float maxkoe=0.f;
if(lipschitz==false) { if(lipschitz==false) {
@ -2205,7 +2227,7 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, struct cont_params cp, floa
// edge = 1.f + value * exp (expkoef);//estimate edge "pseudo variance" // edge = 1.f + value * exp (expkoef);//estimate edge "pseudo variance"
//take into account local contrast //take into account local contrast
float refin= value * exp (expkoef); float refin= value * exp (expkoef);
if(cp.link==true){//combi if(cp.link==true && cp.noiseena){//combi
{ {
if(level==0) refin *= (1.f + cp.lev0s/50.f);// we can change this sensibility! if(level==0) refin *= (1.f + cp.lev0s/50.f);// we can change this sensibility!
if(level==1) refin *= (1.f + cp.lev1s/50.f); if(level==1) refin *= (1.f + cp.lev1s/50.f);
@ -2228,32 +2250,36 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, struct cont_params cp, floa
float absciss; float absciss;
float kinterm; float kinterm;
float kmul; float kmul;
for (int i=0; i<W_L*H_L; i++) { // for (int i=0; i<W_L*H_L; i++) {
int borderL = 1;
for(int i = borderL; i < H_L-borderL; i++ ) {
for(int j = borderL; j < W_L-borderL; j++) {
int k=i*W_L + j;
if(cp.detectedge) { if(cp.detectedge) {
if(lipschitz==false) { if(lipschitz==false) {
if(cp.eddet > 10.f) edge=(aedstr*cp.eddet+bedstr)*(edgePrecalc*(1.f+koe[i]))/(1.f+0.9f*maxkoe); if(cp.eddet > 10.f) edge=(aedstr*cp.eddet+bedstr)*(edgePrecalc*(1.f+koe[k]))/(1.f+0.9f*maxkoe);
else edge=(edgePrecalc*(1.f+koe[i]))/(1.f+0.9f*maxkoe); else edge=(edgePrecalc*(1.f+koe[k]))/(1.f+0.9f*maxkoe);
} }
if(lipschitz==true) { if(lipschitz==true) {
if(level < 3) edge = 1.f +(edgePrecalc-1.f)*(koeLi[level*3][i])/(1.f+0.9f*maxkoeLi[level*3+ dir-1]); if(level < 3) edge = 1.f +(edgePrecalc-1.f)*(koeLi[level*3][k])/(1.f+0.9f*maxkoeLi[level*3+ dir-1]);
else edge = edgePrecalc; else edge = edgePrecalc;
} }
} }
else edge = edgePrecalc; else edge = edgePrecalc;
if(cp.edgcurv) { if(cp.edgcurv) {
if(fabs(WavCoeffs_L[dir][i])>= (mean[level]+sigma[level])){//for max if(fabs(WavCoeffs_L[dir][k])>= (mean[level]+sigma[level])){//for max
float valcour=log(fabs(WavCoeffs_L[dir][i])); float valcour=log(fabs(WavCoeffs_L[dir][k]));
float valc=valcour-logmax; float valc=valcour-logmax;
float vald=valc*rap; float vald=valc*rap;
absciss=exp(vald); absciss=exp(vald);
} }
else if(fabs(WavCoeffs_L[dir][i])>=mean[level] && fabs(WavCoeffs_L[dir][i]) < (mean[level]+sigma[level])){ else if(fabs(WavCoeffs_L[dir][k])>=mean[level] && fabs(WavCoeffs_L[dir][k]) < (mean[level]+sigma[level])){
absciss=asig*fabs(WavCoeffs_L[dir][i])+bsig; absciss=asig*fabs(WavCoeffs_L[dir][k])+bsig;
} }
else if(fabs(WavCoeffs_L[dir][i]) < mean[level]){ else if(fabs(WavCoeffs_L[dir][k]) < mean[level]){
absciss=amean*fabs(WavCoeffs_L[dir][i]); absciss=amean*fabs(WavCoeffs_L[dir][k]);
} }
// Threshold adjuster settings==> approximative for curve // Threshold adjuster settings==> approximative for curve
//kmul about average cbrt(3--40 / 10)==>1.5 to 2.5 //kmul about average cbrt(3--40 / 10)==>1.5 to 2.5
@ -2288,7 +2314,8 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, struct cont_params cp, floa
if(edge < 1.f) if(edge < 1.f)
edge=1.f; edge=1.f;
} }
WavCoeffs_L[dir][i] *= edge; WavCoeffs_L[dir][k] *= edge;
}
} }
} }
else if(cp.EDmet==1) {//threshold adjuster else if(cp.EDmet==1) {//threshold adjuster
@ -2306,15 +2333,19 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, struct cont_params cp, floa
float edgeMaxFactor = SQR(cp.edg_max/b_r); float edgeMaxFactor = SQR(cp.edg_max/b_r);
float edgMaxFsup=(cp.edg_max/b_r);//reduce increase of effect for high values contrast..if slider > b_r float edgMaxFsup=(cp.edg_max/b_r);//reduce increase of effect for high values contrast..if slider > b_r
for (int i=0; i<W_L*H_L; i++) { //for (int i=0; i<W_L*H_L; i++) {
int borderL = 1;
for(int i = borderL; i < H_L-borderL; i++ ) {
for(int j = borderL; j < W_L-borderL; j++) {
int k=i*W_L + j;
if(cp.detectedge) { if(cp.detectedge) {
if(lipschitz==false) { if(lipschitz==false) {
if(cp.eddet > 10.f) edge=(aedstr*cp.eddet+bedstr)*(edgePrecalc*(1.f+koe[i]))/(1.f+0.9f*maxkoe); if(cp.eddet > 10.f) edge=(aedstr*cp.eddet+bedstr)*(edgePrecalc*(1.f+koe[k]))/(1.f+0.9f*maxkoe);
else edge=(edgePrecalc*(1.f+koe[i]))/(1.f+0.9f*maxkoe); else edge=(edgePrecalc*(1.f+koe[k]))/(1.f+0.9f*maxkoe);
} }
if(lipschitz==true) { if(lipschitz==true) {
if(level < 3) edge = 1.f +(edgePrecalc-1.f)*(koeLi[level*3][i])/(1.f+0.9f*maxkoeLi[level*3+ dir-1]); if(level < 3) edge = 1.f +(edgePrecalc-1.f)*(koeLi[level*3][k])/(1.f+0.9f*maxkoeLi[level*3+ dir-1]);
else edge = edgePrecalc; else edge = edgePrecalc;
} }
} }
@ -2331,46 +2362,47 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, struct cont_params cp, floa
// if we move sliders to the right local contrast is increased // if we move sliders to the right local contrast is increased
// MaxP, MaxN, mean, sigma are calculated if necessary (val > 0) by evaluate2(), eval2(), aver() , sigma() // MaxP, MaxN, mean, sigma are calculated if necessary (val > 0) by evaluate2(), eval2(), aver() , sigma()
if(b_r < 100.f && cp.edg_max/b_r > 1.f) {//in case of b_r < 100 and slider move to right if(b_r < 100.f && cp.edg_max/b_r > 1.f) {//in case of b_r < 100 and slider move to right
if (WavCoeffs_L[dir][i] > MaxPCompare*cp.edg_max/b_r) { if (WavCoeffs_L[dir][k] > MaxPCompare*cp.edg_max/b_r) {
edge *= edgMaxFsup; edge *= edgMaxFsup;
if(edge < 1.f) if(edge < 1.f)
edge=1.f; edge=1.f;
} }
else if (WavCoeffs_L[dir][i] < MaxNCompare*cp.edg_max/b_r) { else if (WavCoeffs_L[dir][k] < MaxNCompare*cp.edg_max/b_r) {
edge *= edgMaxFsup; edge *= edgMaxFsup;
if(edge < 1.f) if(edge < 1.f)
edge=1.f; edge=1.f;
} }
} }
if (WavCoeffs_L[dir][i] > MaxPCompare) { if (WavCoeffs_L[dir][k] > MaxPCompare) {
edge *= edgeMaxFactor; edge *= edgeMaxFactor;
if(edge < 1.f) if(edge < 1.f)
edge=1.f; edge=1.f;
}//reduce edge if > new max }//reduce edge if > new max
else if (WavCoeffs_L[dir][i] < MaxNCompare) { else if (WavCoeffs_L[dir][k] < MaxNCompare) {
edge *= edgeMaxFactor; edge *= edgeMaxFactor;
if(edge < 1.f) if(edge < 1.f)
edge=1.f; edge=1.f;
} }
if (fabs(WavCoeffs_L[dir][i]) >= edgeMeanCompare && fabs(WavCoeffs_L[dir][i]) < edgeSdCompare) { if (fabs(WavCoeffs_L[dir][k]) >= edgeMeanCompare && fabs(WavCoeffs_L[dir][k]) < edgeSdCompare) {
//if (fabs(WavCoeffs_L[dir][i]) > edgeSdCompare) { //if (fabs(WavCoeffs_L[dir][i]) > edgeSdCompare) {
edge *= edgeSdFactor; edge *= edgeSdFactor;
if(edge < 1.f) if(edge < 1.f)
edge=1.f; edge=1.f;
}//mofify effect if sd change }//mofify effect if sd change
if (fabs(WavCoeffs_L[dir][i]) < edgeMeanCompare) { if (fabs(WavCoeffs_L[dir][k]) < edgeMeanCompare) {
edge *= edgeMeanFactor; edge *= edgeMeanFactor;
if(edge < 1.f) if(edge < 1.f)
edge=1.f; edge=1.f;
} // modify effect if mean change } // modify effect if mean change
if (fabs(WavCoeffs_L[dir][i]) < edgeLowCompare) { if (fabs(WavCoeffs_L[dir][k]) < edgeLowCompare) {
edge *= edgeLowFactor; edge *= edgeLowFactor;
if(edge < 1.f) if(edge < 1.f)
edge=1.f; edge=1.f;
} }
WavCoeffs_L[dir][i] *= edge; WavCoeffs_L[dir][k] *= edge;
}
} }
} }
if(lipschitz==false) { if(lipschitz==false) {
@ -2379,7 +2411,7 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, struct cont_params cp, floa
} }
if(cp.link==false) { //used both with denoise 1 2 3 if(cp.link==false && cp.noiseena) { //used both with denoise 1 2 3
float refine=0.f; float refine=0.f;
for (int i=0; i<W_L*H_L; i++) { for (int i=0; i<W_L*H_L; i++) {
if(level==0) refine = cp.lev0s/40.f; if(level==0) refine = cp.lev0s/40.f;
@ -2391,7 +2423,7 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, struct cont_params cp, floa
float cpMul = cp.mul[level]; float cpMul = cp.mul[level];
if(cpMul != 0.f) { // cpMul == 0.f means all will be multiplied by 1.f, so we can skip this if(cpMul != 0.f && cp.contena) { // cpMul == 0.f means all will be multiplied by 1.f, so we can skip this
const float skinprot = params->wavelet.skinprotect; const float skinprot = params->wavelet.skinprotect;
const float skinprotneg = -skinprot; const float skinprotneg = -skinprot;
@ -2489,7 +2521,7 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, struct cont_params cp, floa
} }
*/ */
float alpha = (1024.f + 15.f *(float) cpMul*scale*scale2*beta*diagacc)/1024.f ; float alpha = (1024.f + 15.f *(float) cpMul*scale*scale2*beta*diagacc)/1024.f ;
if(cp.HSmet){ if(cp.HSmet && cp.chromena){
float aaal=(1.f-alpha)/((cp.b_lhl-cp.t_lhl)*kH[level]); float aaal=(1.f-alpha)/((cp.b_lhl-cp.t_lhl)*kH[level]);
float bbal=1.f-aaal*cp.b_lhl*kH[level]; float bbal=1.f-aaal*cp.b_lhl*kH[level];
float aaar=(alpha-1.f)/(cp.t_rhl-cp.b_rhl)*kH[level]; float aaar=(alpha-1.f)/(cp.t_rhl-cp.b_rhl)*kH[level];
@ -2520,7 +2552,7 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, struct cont_params cp, floa
} }
if(waOpacityCurveW) cp.opaW=true; if(waOpacityCurveW) cp.opaW=true;
if(cp.bam) { if(cp.bam && cp.finena) {
if(cp.opaW && cp.BAmet==2){ if(cp.opaW && cp.BAmet==2){
int iteration = cp.ite; int iteration = cp.ite;
int itplus=7+iteration; int itplus=7+iteration;
@ -2605,7 +2637,7 @@ if(cp.BAmet==1){
int W_ab, int H_ab, const bool useChannelA) int W_ab, int H_ab, const bool useChannelA)
{ {
float cpMul = cp.mul[level]; float cpMul = cp.mul[level];
if(cpMul != 0.f && cp.CHmet==2 && cp.chro != 0.f) { // cpMul == 0.f or cp.chro = 0.f means all will be multiplied by 1.f, so we can skip this if(cpMul != 0.f && cp.CHmet==2 && cp.chro != 0.f && cp.chromena) { // cpMul == 0.f or cp.chro = 0.f means all will be multiplied by 1.f, so we can skip this
const float skinprot = params->wavelet.skinprotect; const float skinprot = params->wavelet.skinprotect;
const float skinprotneg = -skinprot; const float skinprotneg = -skinprot;
const float factorHard = (1.f - skinprotneg/100.f); const float factorHard = (1.f - skinprotneg/100.f);
@ -2638,7 +2670,7 @@ if(cp.BAmet==1){
float cpMulC = cp.mulC[level]; float cpMulC = cp.mulC[level];
// if( (cp.curv || cp.CHSLmet==1) && cp.CHmet!=2 && level < 9 && cpMulC != 0.f) { // cpMulC == 0.f means all will be multiplied by 1.f, so we can skip // if( (cp.curv || cp.CHSLmet==1) && cp.CHmet!=2 && level < 9 && cpMulC != 0.f) { // cpMulC == 0.f means all will be multiplied by 1.f, so we can skip
if( cp.CHmet!=2 && level < 9 && cpMulC != 0.f) { // cpMulC == 0.f means all will be multiplied by 1.f, so we can skip if( cp.CHmet!=2 && level < 9 && cpMulC != 0.f && cp.chromena) { // cpMulC == 0.f means all will be multiplied by 1.f, so we can skip
float modchro, modhue, kClev; float modchro, modhue, kClev;
const float skinprot = params->wavelet.skinprotect; const float skinprot = params->wavelet.skinprotect;
const float skinprotneg = -skinprot; const float skinprotneg = -skinprot;
@ -2718,7 +2750,7 @@ if(cp.BAmet==1){
mulOpacity = cp.mulopaBY[level]; mulOpacity = cp.mulopaBY[level];
} }
if(useOpacity && level < 9 && mulOpacity != 0.f) { //toning if((useOpacity && level < 9 && mulOpacity != 0.f) && cp.toningena) { //toning
float beta = (1024.f + 20.f * mulOpacity)/1024.f ; float beta = (1024.f + 20.f * mulOpacity)/1024.f ;
//float beta = (1000.f * mulOpacity); //float beta = (1000.f * mulOpacity);

View File

@ -420,6 +420,13 @@ enum ProcEvent {
EvDCPApplyLookTable=392, EvDCPApplyLookTable=392,
EvDCPApplyBaselineExposureOffset=393, EvDCPApplyBaselineExposureOffset=393,
EvDCPApplyHueSatMap=394, EvDCPApplyHueSatMap=394,
EvWavenacont=395,
EvWavenachrom=396,
EvWavenaedge=397,
EvWavenares=398,
EvWavenafin=399,
EvWavenatoning=400,
EvWavenanoise=401,
NUMOFEVENTS NUMOFEVENTS
}; };

View File

@ -554,6 +554,13 @@ void WaveletParams::setDefaults() {
hhcurve.push_back(FCT_Linear); hhcurve.push_back(FCT_Linear);
Chcurve.clear (); Chcurve.clear ();
Chcurve.push_back(FCT_Linear); Chcurve.push_back(FCT_Linear);
expcontrast=true;
expchroma=true;
expedge=true;
expresid=true;
expfinal=true;
exptoning=true;
expnoise=true;
for(int i = 0; i < 9; i ++) for(int i = 0; i < 9; i ++)
{ {
@ -1640,6 +1647,13 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, bool fnameAbsol
if (!pedited || pedited->wavelet.bluehigh) keyFile.set_integer ("Wavelet", "CBbluehigh", wavelet.bluehigh); if (!pedited || pedited->wavelet.bluehigh) keyFile.set_integer ("Wavelet", "CBbluehigh", wavelet.bluehigh);
if (!pedited || pedited->wavelet.bluemed) keyFile.set_integer ("Wavelet", "CBbluemed", wavelet.bluemed); if (!pedited || pedited->wavelet.bluemed) keyFile.set_integer ("Wavelet", "CBbluemed", wavelet.bluemed);
if (!pedited || pedited->wavelet.bluelow) keyFile.set_integer ("Wavelet", "CBbluelow", wavelet.bluelow); if (!pedited || pedited->wavelet.bluelow) keyFile.set_integer ("Wavelet", "CBbluelow", wavelet.bluelow);
if (!pedited || pedited->wavelet.expcontrast) keyFile.set_boolean ("Wavelet", "Expcontrast", wavelet.expcontrast);
if (!pedited || pedited->wavelet.expchroma) keyFile.set_boolean ("Wavelet", "Expchroma", wavelet.expchroma);
if (!pedited || pedited->wavelet.expedge) keyFile.set_boolean ("Wavelet", "Expedge", wavelet.expedge);
if (!pedited || pedited->wavelet.expresid) keyFile.set_boolean ("Wavelet", "Expresid", wavelet.expresid);
if (!pedited || pedited->wavelet.expfinal) keyFile.set_boolean ("Wavelet", "Expfinal", wavelet.expfinal);
if (!pedited || pedited->wavelet.exptoning) keyFile.set_boolean ("Wavelet", "Exptoning", wavelet.exptoning);
if (!pedited || pedited->wavelet.expnoise) keyFile.set_boolean ("Wavelet", "Expnoise", wavelet.expnoise);
for(int i = 0; i < 9; i++) for(int i = 0; i < 9; i++)
{ {
@ -2637,6 +2651,8 @@ if (keyFile.has_group ("Wavelet")) {
if(keyFile.has_key ("Wavelet", "Skinprotect")) { wavelet.skinprotect = keyFile.get_double ("Wavelet", "Skinprotect"); if (pedited) pedited->wavelet.skinprotect = true; } if(keyFile.has_key ("Wavelet", "Skinprotect")) { wavelet.skinprotect = keyFile.get_double ("Wavelet", "Skinprotect"); if (pedited) pedited->wavelet.skinprotect = true; }
if (keyFile.has_key ("Wavelet", "Expcontrast")) {wavelet.expcontrast = keyFile.get_boolean ("Wavelet", "Expcontrast");if (pedited) pedited->wavelet.expcontrast = true;}
if (keyFile.has_key ("Wavelet", "Expchroma")) {wavelet.expchroma = keyFile.get_boolean ("Wavelet", "Expchroma");if (pedited) pedited->wavelet.expchroma = true;}
for(int i = 0; i < 9; i ++) for(int i = 0; i < 9; i ++)
{ {
std::stringstream ss; std::stringstream ss;
@ -2649,6 +2665,12 @@ if (keyFile.has_group ("Wavelet")) {
ss << "Chroma" << (i+1); ss << "Chroma" << (i+1);
if(keyFile.has_key ("Wavelet", ss.str())) {wavelet.ch[i] = keyFile.get_integer ("Wavelet", ss.str()); if (pedited) pedited->wavelet.ch[i] = true;} if(keyFile.has_key ("Wavelet", ss.str())) {wavelet.ch[i] = keyFile.get_integer ("Wavelet", ss.str()); if (pedited) pedited->wavelet.ch[i] = true;}
} }
if (keyFile.has_key ("Wavelet", "Expedge")) {wavelet.expedge = keyFile.get_boolean ("Wavelet", "Expedge");if (pedited) pedited->wavelet.expedge = true;}
if (keyFile.has_key ("Wavelet", "Expresid")) {wavelet.expresid = keyFile.get_boolean ("Wavelet", "Expresid");if (pedited) pedited->wavelet.expresid = true;}
if (keyFile.has_key ("Wavelet", "Expfinal")) {wavelet.expfinal = keyFile.get_boolean ("Wavelet", "Expfinal");if (pedited) pedited->wavelet.expfinal = true;}
if (keyFile.has_key ("Wavelet", "Exptoning")) {wavelet.exptoning = keyFile.get_boolean ("Wavelet", "Exptoning");if (pedited) pedited->wavelet.exptoning = true;}
if (keyFile.has_key ("Wavelet", "Expnoise")) {wavelet.expnoise = keyFile.get_boolean ("Wavelet", "Expnoise");if (pedited) pedited->wavelet.expnoise = true;}
} }
@ -3222,6 +3244,13 @@ bool ProcParams::operator== (const ProcParams& other) {
&& wavelet.tmr == other.wavelet.tmr && wavelet.tmr == other.wavelet.tmr
&& wavelet.contrast == other.wavelet.contrast && wavelet.contrast == other.wavelet.contrast
&& wavelet.median == other.wavelet.median && wavelet.median == other.wavelet.median
&& wavelet.expcontrast == other.wavelet.expcontrast
&& wavelet.expchroma == other.wavelet.expchroma
&& wavelet.expedge == other.wavelet.expedge
&& wavelet.expresid == other.wavelet.expresid
&& wavelet.expfinal == other.wavelet.expfinal
&& wavelet.exptoning == other.wavelet.exptoning
&& wavelet.expnoise == other.wavelet.expnoise
&& wavelet.medianlev == other.wavelet.medianlev && wavelet.medianlev == other.wavelet.medianlev
&& wavelet.linkedg == other.wavelet.linkedg && wavelet.linkedg == other.wavelet.linkedg
&& wavelet.cbenab == other.wavelet.cbenab && wavelet.cbenab == other.wavelet.cbenab

View File

@ -889,8 +889,15 @@ class WaveletParams {
int strength; int strength;
int balance; int balance;
int iter; int iter;
bool expcontrast;
bool expchroma;
int c[9]; int c[9];
int ch[9]; int ch[9];
bool expedge;
bool expresid;
bool expfinal;
bool exptoning;
bool expnoise;
Glib::ustring Lmethod; Glib::ustring Lmethod;
Glib::ustring CLmethod; Glib::ustring CLmethod;

View File

@ -416,7 +416,14 @@ DIRPYREQUALIZER, // EvWavbluelow
DIRPYREQUALIZER, // EvWavNeutral DIRPYREQUALIZER, // EvWavNeutral
RGBCURVE, // EvDCPApplyLookTable, RGBCURVE, // EvDCPApplyLookTable,
RGBCURVE, // EvDCPApplyBaselineExposureOffset, RGBCURVE, // EvDCPApplyBaselineExposureOffset,
ALL // EvDCPApplyHueSatMap ALL, // EvDCPApplyHueSatMap
DIRPYREQUALIZER, // EvWavenacont
DIRPYREQUALIZER, // EvWavenachrom
DIRPYREQUALIZER, // EvWavenaedge
DIRPYREQUALIZER, // EvWavenares
DIRPYREQUALIZER, // EvWavenafin
DIRPYREQUALIZER, // EvWavenatoning
DIRPYREQUALIZER // EvWavenanoise
}; };

View File

@ -424,6 +424,17 @@ void ParamsEdited::set (bool v) {
wavelet.pastlev = v; wavelet.pastlev = v;
wavelet.satlev = v; wavelet.satlev = v;
// wavelet.enacont = v;
// wavelet.enachrom = v;
// wavelet.enaedge = v;
// wavelet.enares = v;
wavelet.expfinal = v;
wavelet.expcontrast = v;
wavelet.expchroma = v;
wavelet.expedge = v;
wavelet.expresid = v;
wavelet.exptoning = v;
wavelet.expnoise = v;
for(int i = 0; i < 9; i++) { for(int i = 0; i < 9; i++) {
wavelet.c[i] = v; wavelet.c[i] = v;
@ -857,6 +868,15 @@ void ParamsEdited::initFrom (const std::vector<rtengine::procparams::ProcParams>
wavelet.hhcurve = wavelet.hhcurve && p.wavelet.hhcurve == other.wavelet.hhcurve; wavelet.hhcurve = wavelet.hhcurve && p.wavelet.hhcurve == other.wavelet.hhcurve;
wavelet.Chcurve = wavelet.Chcurve && p.wavelet.Chcurve == other.wavelet.Chcurve; wavelet.Chcurve = wavelet.Chcurve && p.wavelet.Chcurve == other.wavelet.Chcurve;
wavelet.skinprotect = wavelet.skinprotect && p.wavelet.skinprotect == other.wavelet.skinprotect; wavelet.skinprotect = wavelet.skinprotect && p.wavelet.skinprotect == other.wavelet.skinprotect;
// wavelet.enacont = wavelet.enacont && p.wavelet.enacont == other.wavelet.enacont;
wavelet.expcontrast = wavelet.expcontrast && p.wavelet.expcontrast == other.wavelet.expcontrast;
wavelet.expchroma = wavelet.expchroma && p.wavelet.expchroma == other.wavelet.expchroma;
wavelet.expedge = wavelet.expedge && p.wavelet.expedge == other.wavelet.expedge;
wavelet.expresid = wavelet.expresid && p.wavelet.expresid == other.wavelet.expresid;
wavelet.expfinal = wavelet.expfinal && p.wavelet.expfinal == other.wavelet.expfinal;
wavelet.exptoning = wavelet.exptoning && p.wavelet.exptoning == other.wavelet.exptoning;
wavelet.expnoise = wavelet.expnoise && p.wavelet.expnoise == other.wavelet.expnoise;
for(int i = 0; i < 9; i++) { for(int i = 0; i < 9; i++) {
wavelet.c[i] = wavelet.c[i] && p.wavelet.c[i] == other.wavelet.c[i]; wavelet.c[i] = wavelet.c[i] && p.wavelet.c[i] == other.wavelet.c[i];
} }
@ -1276,6 +1296,15 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
if (wavelet.hhcurve) toEdit.wavelet.hhcurve = mods.wavelet.hhcurve; if (wavelet.hhcurve) toEdit.wavelet.hhcurve = mods.wavelet.hhcurve;
if (wavelet.Chcurve) toEdit.wavelet.Chcurve = mods.wavelet.Chcurve; if (wavelet.Chcurve) toEdit.wavelet.Chcurve = mods.wavelet.Chcurve;
if (wavelet.wavclCurve) toEdit.wavelet.wavclCurve = mods.wavelet.wavclCurve; if (wavelet.wavclCurve) toEdit.wavelet.wavclCurve = mods.wavelet.wavclCurve;
//if (wavelet.enacont) toEdit.wavelet.enacont = mods.wavelet.enacont;
if (wavelet.expcontrast) toEdit.wavelet.expcontrast = mods.wavelet.expcontrast;
if (wavelet.expchroma) toEdit.wavelet.expchroma = mods.wavelet.expchroma;
if (wavelet.expedge) toEdit.wavelet.expedge = mods.wavelet.expedge;
if (wavelet.expresid) toEdit.wavelet.expresid = mods.wavelet.expresid;
if (wavelet.expfinal) toEdit.wavelet.expfinal = mods.wavelet.expfinal;
if (wavelet.exptoning) toEdit.wavelet.exptoning = mods.wavelet.exptoning;
if (wavelet.expnoise) toEdit.wavelet.expnoise = mods.wavelet.expnoise;
for(int i = 0; i < 9; i++) { for(int i = 0; i < 9; i++) {
if(wavelet.c[i]) toEdit.wavelet.c[i] = dontforceSet && options.baBehav[ADDSET_WA] ? toEdit.wavelet.c[i] + mods.wavelet.c[i] : mods.wavelet.c[i]; if(wavelet.c[i]) toEdit.wavelet.c[i] = dontforceSet && options.baBehav[ADDSET_WA] ? toEdit.wavelet.c[i] + mods.wavelet.c[i] : mods.wavelet.c[i];
} }

View File

@ -551,6 +551,14 @@ class WaveletParamsEdited {
bool bluemed; bool bluemed;
bool greenhigh; bool greenhigh;
bool bluehigh; bool bluehigh;
bool enacont;
bool expcontrast;
bool expchroma;
bool expedge;
bool expresid;
bool expfinal;
bool exptoning;
bool expnoise;
}; };

View File

@ -56,21 +56,21 @@ Wavelet::Wavelet () : FoldableToolPanel(this, "wavelet", M("TP_WAVELET_LABEL"),
expsettings = new MyExpander (false, M("TP_WAVELET_SETTINGS")); expsettings = new MyExpander (false, M("TP_WAVELET_SETTINGS"));
expsettings->signal_button_release_event().connect_notify( sigc::mem_fun(this, &Wavelet::foldAllButSettings) ); expsettings->signal_button_release_event().connect_notify( sigc::mem_fun(this, &Wavelet::foldAllButSettings) );
expcontrast = new MyExpander (false, M("TP_WAVELET_LEVF")); expcontrast = new MyExpander (true, M("TP_WAVELET_LEVF"));
expcontrast->signal_button_release_event().connect_notify( sigc::mem_fun(this, &Wavelet::foldAllButContrast) ); expcontrast->signal_button_release_event().connect_notify( sigc::mem_fun(this, &Wavelet::foldAllButContrast) );
expchroma = new MyExpander (false, M("TP_WAVELET_LEVCH")); expchroma = new MyExpander (true, M("TP_WAVELET_LEVCH"));
expchroma->signal_button_release_event().connect_notify( sigc::mem_fun(this, &Wavelet::foldAllButChroma) ); expchroma->signal_button_release_event().connect_notify( sigc::mem_fun(this, &Wavelet::foldAllButChroma) );
exptoning = new MyExpander (false,M("TP_WAVELET_TON")); exptoning = new MyExpander (true,M("TP_WAVELET_TON"));
exptoning->signal_button_release_event().connect_notify( sigc::mem_fun(this, &Wavelet::foldAllButToning) ); exptoning->signal_button_release_event().connect_notify( sigc::mem_fun(this, &Wavelet::foldAllButToning) );
expnoise = new MyExpander (false, M("TP_WAVELET_NOISE")); expnoise = new MyExpander (true, M("TP_WAVELET_NOISE"));
expnoise->signal_button_release_event().connect_notify( sigc::mem_fun(this, &Wavelet::foldAllButNoise) ); expnoise->signal_button_release_event().connect_notify( sigc::mem_fun(this, &Wavelet::foldAllButNoise) );
expedge = new MyExpander (false, M("TP_WAVELET_EDGE")); expedge = new MyExpander (true, M("TP_WAVELET_EDGE"));
expedge->signal_button_release_event().connect_notify( sigc::mem_fun(this, &Wavelet::foldAllButEdge) ); expedge->signal_button_release_event().connect_notify( sigc::mem_fun(this, &Wavelet::foldAllButEdge) );
expgamut = new MyExpander (false, M("TP_WAVELET_CONTR")); expgamut = new MyExpander (false, M("TP_WAVELET_CONTR"));
expgamut->signal_button_release_event().connect_notify( sigc::mem_fun(this, &Wavelet::foldAllButGamut) ); expgamut->signal_button_release_event().connect_notify( sigc::mem_fun(this, &Wavelet::foldAllButGamut) );
expresid = new MyExpander (false, M("TP_WAVELET_RESID")); expresid = new MyExpander (true, M("TP_WAVELET_RESID"));
expresid->signal_button_release_event().connect_notify( sigc::mem_fun(this, &Wavelet::foldAllButResid) ); expresid->signal_button_release_event().connect_notify( sigc::mem_fun(this, &Wavelet::foldAllButResid) );
expfinal = new MyExpander (false, M("TP_WAVELET_FINAL")); expfinal = new MyExpander (true, M("TP_WAVELET_FINAL"));
expfinal->signal_button_release_event().connect_notify( sigc::mem_fun(this, &Wavelet::foldAllButFinal) ); expfinal->signal_button_release_event().connect_notify( sigc::mem_fun(this, &Wavelet::foldAllButFinal) );
// Wavelet Settings // Wavelet Settings
@ -172,6 +172,7 @@ Wavelet::Wavelet () : FoldableToolPanel(this, "wavelet", M("TP_WAVELET_LABEL"),
levBox->set_border_width(4); levBox->set_border_width(4);
levBox->set_spacing(2); levBox->set_spacing(2);
Gtk::HBox * buttonBox = Gtk::manage (new Gtk::HBox(true, 10)); Gtk::HBox * buttonBox = Gtk::manage (new Gtk::HBox(true, 10));
wavLabels = Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER)); wavLabels = Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER));
levBox->pack_start(*buttonBox, Gtk::PACK_SHRINK, 2); levBox->pack_start(*buttonBox, Gtk::PACK_SHRINK, 2);
@ -527,7 +528,7 @@ Wavelet::Wavelet () : FoldableToolPanel(this, "wavelet", M("TP_WAVELET_LABEL"),
Gtk::VBox * resBox = Gtk::manage (new Gtk::VBox()); Gtk::VBox * resBox = Gtk::manage (new Gtk::VBox());
resBox->set_border_width(4); resBox->set_border_width(4);
resBox->set_spacing(2); resBox->set_spacing(2);
rescon = Gtk::manage (new Adjuster (M("TP_WAVELET_RESCON"), -100, 100, 1, 0)); rescon = Gtk::manage (new Adjuster (M("TP_WAVELET_RESCON"), -100, 100, 1, 0));
rescon->setAdjusterListener (this); rescon->setAdjusterListener (this);
resBox->pack_start(*rescon, Gtk::PACK_SHRINK); resBox->pack_start(*rescon, Gtk::PACK_SHRINK);
@ -694,17 +695,26 @@ Wavelet::Wavelet () : FoldableToolPanel(this, "wavelet", M("TP_WAVELET_LABEL"),
resBox->pack_start (*neutrHBox); resBox->pack_start (*neutrHBox);
// Final Touchup // Final Touchup
ctboxBA = Gtk::manage (new Gtk::HBox ()); Gtk::VBox * ctboxBA = Gtk::manage (new Gtk::VBox());
labmBA = Gtk::manage (new Gtk::Label (M("TP_WAVELET_BATYPE")+":"));
ctboxBA->pack_start (*labmBA, Gtk::PACK_SHRINK, 1);
ctboxBA->set_border_width(4);
ctboxBA->set_spacing(2);
//Gtk::HSeparator *separatorfin = Gtk::manage (new Gtk::HSeparator());
//ctboxBA->pack_start(*separatorfin, Gtk::PACK_SHRINK, 2);
ctboxFI = Gtk::manage (new Gtk::HBox());
labmBA = Gtk::manage (new Gtk::Label (M("TP_WAVELET_BATYPE")+":"));
ctboxFI->pack_start (*labmBA, Gtk::PACK_SHRINK, 1);
BAmethod = Gtk::manage (new MyComboBoxText ()); BAmethod = Gtk::manage (new MyComboBoxText ());
BAmethod->append_text (M("TP_WAVELET_BANONE")); BAmethod->append_text (M("TP_WAVELET_BANONE"));
BAmethod->append_text (M("TP_WAVELET_BASLI")); BAmethod->append_text (M("TP_WAVELET_BASLI"));
BAmethod->append_text (M("TP_WAVELET_BACUR")); BAmethod->append_text (M("TP_WAVELET_BACUR"));
BAmethodconn = BAmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::BAmethodChanged) ); BAmethodconn = BAmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::BAmethodChanged) );
ctboxBA->pack_start(*BAmethod); ctboxFI->pack_start(*BAmethod);
ctboxBA->pack_start(*ctboxFI);
balance = Gtk::manage (new Adjuster (M("TP_WAVELET_BALANCE"), -30, 100, 1, 0)); balance = Gtk::manage (new Adjuster (M("TP_WAVELET_BALANCE"), -30, 100, 1, 0));
balance->setAdjusterListener (this); balance->setAdjusterListener (this);
balance->set_tooltip_text (M("TP_WAVELET_BALANCE_TOOLTIP")); balance->set_tooltip_text (M("TP_WAVELET_BALANCE_TOOLTIP"));
@ -1036,8 +1046,17 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) {
if (!pedited->wavelet.Medgreinf) if (!pedited->wavelet.Medgreinf)
Medgreinf->set_active (2); Medgreinf->set_active (2);
set_inconsistent (multiImage && !pedited->wavelet.enabled); set_inconsistent (multiImage && !pedited->wavelet.enabled);
ccshape->setUnChanged (!pedited->wavelet.ccwcurve); ccshape->setUnChanged (!pedited->wavelet.ccwcurve);
expcontrast->set_inconsistent (!pedited->wavelet.expcontrast);
expchroma->set_inconsistent (!pedited->wavelet.expchroma);
expedge->set_inconsistent (!pedited->wavelet.expedge);
expresid->set_inconsistent (!pedited->wavelet.expresid);
expfinal->set_inconsistent (!pedited->wavelet.expfinal);
exptoning->set_inconsistent (!pedited->wavelet.exptoning);
expnoise->set_inconsistent (!pedited->wavelet.expnoise);
opacityShapeRG->setCurve (pp->wavelet.opacityCurveRG); opacityShapeRG->setCurve (pp->wavelet.opacityCurveRG);
opacityShapeBY->setCurve (pp->wavelet.opacityCurveBY); opacityShapeBY->setCurve (pp->wavelet.opacityCurveBY);
opacityShape->setCurve (pp->wavelet.opacityCurveW); opacityShape->setCurve (pp->wavelet.opacityCurveW);
@ -1104,6 +1123,8 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) {
for(int i = 0; i < 9; i++) { for(int i = 0; i < 9; i++) {
correctionch[i]->setEditedState (pedited->wavelet.ch[i] ? Edited : UnEdited); correctionch[i]->setEditedState (pedited->wavelet.ch[i] ? Edited : UnEdited);
} }
} }
ccshape->setCurve (pp->wavelet.ccwcurve); ccshape->setCurve (pp->wavelet.ccwcurve);
opacityShapeRG->setCurve (pp->wavelet.opacityCurveRG); opacityShapeRG->setCurve (pp->wavelet.opacityCurveRG);
@ -1113,6 +1134,13 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) {
hhshape->setCurve (pp->wavelet.hhcurve); hhshape->setCurve (pp->wavelet.hhcurve);
Chshape->setCurve (pp->wavelet.Chcurve); Chshape->setCurve (pp->wavelet.Chcurve);
clshape->setCurve (pp->wavelet.wavclCurve); clshape->setCurve (pp->wavelet.wavclCurve);
expcontrast->setEnabled (pp->wavelet.expcontrast);
expchroma->setEnabled (pp->wavelet.expchroma);
expedge->setEnabled (pp->wavelet.expedge);
expresid->setEnabled (pp->wavelet.expresid);
expfinal->setEnabled (pp->wavelet.expfinal);
exptoning->setEnabled (pp->wavelet.exptoning);
expnoise->setEnabled (pp->wavelet.expnoise);
setEnabled(pp->wavelet.enabled); setEnabled(pp->wavelet.enabled);
avoidConn.block (true); avoidConn.block (true);
@ -1194,9 +1222,11 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) {
for (int i = 0; i < 9; i++) { for (int i = 0; i < 9; i++) {
correction[i]->setValue(pp->wavelet.c[i]); correction[i]->setValue(pp->wavelet.c[i]);
} }
for (int i = 0; i < 9; i++) { for (int i = 0; i < 9; i++) {
correctionch[i]->setValue(pp->wavelet.ch[i]); correctionch[i]->setValue(pp->wavelet.ch[i]);
} }
int y; int y;
y=thres->getValue(); y=thres->getValue();
int z; int z;
@ -1317,6 +1347,13 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) {
pp->wavelet.bluemed = bluemed->getValue (); pp->wavelet.bluemed = bluemed->getValue ();
pp->wavelet.greenhigh = greenhigh->getValue (); pp->wavelet.greenhigh = greenhigh->getValue ();
pp->wavelet.bluehigh = bluehigh->getValue (); pp->wavelet.bluehigh = bluehigh->getValue ();
pp->wavelet.expcontrast = expcontrast->getEnabled();
pp->wavelet.expchroma = expchroma->getEnabled();
pp->wavelet.expedge = expedge->getEnabled();
pp->wavelet.expresid = expresid->getEnabled();
pp->wavelet.expfinal = expfinal->getEnabled();
pp->wavelet.exptoning = exptoning->getEnabled();
pp->wavelet.expnoise = expnoise->getEnabled();
pp->wavelet.iter = (int) iter->getValue(); pp->wavelet.iter = (int) iter->getValue();
pp->wavelet.wavclCurve = clshape->getCurve (); pp->wavelet.wavclCurve = clshape->getCurve ();
@ -1400,6 +1437,13 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) {
pedited->wavelet.balance = balance->getEditedState (); pedited->wavelet.balance = balance->getEditedState ();
pedited->wavelet.iter = iter->getEditedState (); pedited->wavelet.iter = iter->getEditedState ();
pedited->wavelet.wavclCurve = !clshape->isUnChanged (); pedited->wavelet.wavclCurve = !clshape->isUnChanged ();
pedited->wavelet.expcontrast = !expcontrast->get_inconsistent();
pedited->wavelet.expchroma = !expchroma->get_inconsistent();
pedited->wavelet.expedge = !expedge->get_inconsistent();
pedited->wavelet.expresid = !expresid->get_inconsistent();
pedited->wavelet.expfinal = !expfinal->get_inconsistent();
pedited->wavelet.exptoning = !exptoning->get_inconsistent();
pedited->wavelet.expnoise = !expnoise->get_inconsistent();
for(int i = 0; i < 9; i++) { for(int i = 0; i < 9; i++) {
pedited->wavelet.c[i] = correction[i]->getEditedState(); pedited->wavelet.c[i] = correction[i]->getEditedState();
@ -1501,6 +1545,7 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) {
} }
void Wavelet::curveChanged (CurveEditor* ce) { void Wavelet::curveChanged (CurveEditor* ce) {
if (listener && getEnabled()) { if (listener && getEnabled()) {
@ -2229,11 +2274,11 @@ void Wavelet::adjusterChanged (Adjuster* a, double newval) {
listener->panelChanged (EvWavbluelow, listener->panelChanged (EvWavbluelow,
Glib::ustring::compose("%1", Glib::ustring::compose("%1",
Glib::ustring::format(std::fixed, std::setprecision(0), bluelow->getValue())) Glib::ustring::format(std::fixed, std::setprecision(0), bluelow->getValue()))
); );
} }
else if (a == correction[0] || a == correction[1] || a == correction[2] || a == correction[3] || a == correction[4] || a == correction[5] || a == correction[6] || a == correction[7] || a == correction[8] ) { if ((a == correction[0] || a == correction[1] || a == correction[2] || a == correction[3] || a == correction[4] || a == correction[5] || a == correction[6] || a == correction[7] || a == correction[8])) {
listener->panelChanged (EvWavelet, listener->panelChanged (EvWavelet,
Glib::ustring::compose("%1, %2, %3, %4, %5, %6, %7, %8, %9", Glib::ustring::compose("%1, %2, %3, %4, %5, %6, %7, %8, %9",
Glib::ustring::format(std::fixed, std::setprecision(0), correction[0]->getValue()), Glib::ustring::format(std::fixed, std::setprecision(0), correction[0]->getValue()),
Glib::ustring::format(std::fixed, std::setprecision(0), correction[1]->getValue()), Glib::ustring::format(std::fixed, std::setprecision(0), correction[1]->getValue()),
@ -2638,31 +2683,78 @@ void Wavelet::foldAllButSettings (GdkEventButton* event) {
void Wavelet::foldAllButContrast (GdkEventButton* event) { void Wavelet::foldAllButContrast (GdkEventButton* event) {
if (event->button == 3) { if (event->button == 3) {
foldAllButOne(expcontrast); foldAllButOne(expcontrast);
} }
if (listener) {
if (expcontrast->getEnabled ())
{ listener->panelChanged (EvWavenacont, M("GENERAL_ENABLED"));
}
else
{ listener->panelChanged (EvWavenacont, M("GENERAL_DISABLED"));
}
}
} }
void Wavelet::foldAllButChroma (GdkEventButton* event) { void Wavelet::foldAllButChroma (GdkEventButton* event) {
if (event->button == 3) { if (event->button == 3) {
foldAllButOne(expchroma); foldAllButOne(expchroma);
} }
if (listener) {
if (expchroma->getEnabled ())
{ listener->panelChanged (EvWavenachrom, M("GENERAL_ENABLED"));
}
else
{ listener->panelChanged (EvWavenachrom, M("GENERAL_DISABLED"));
}
}
} }
void Wavelet::foldAllButToning (GdkEventButton* event) { void Wavelet::foldAllButToning (GdkEventButton* event) {
if (event->button == 3) { if (event->button == 3) {
foldAllButOne(exptoning); foldAllButOne(exptoning);
} }
if (listener) {
if (exptoning->getEnabled ())
{ listener->panelChanged (EvWavenatoning, M("GENERAL_ENABLED"));
}
else
{ listener->panelChanged (EvWavenatoning, M("GENERAL_DISABLED"));
}
}
} }
void Wavelet::foldAllButNoise (GdkEventButton* event) { void Wavelet::foldAllButNoise (GdkEventButton* event) {
if (event->button == 3) { if (event->button == 3) {
foldAllButOne(expnoise); foldAllButOne(expnoise);
} }
if (listener) {
if (expnoise->getEnabled ())
{ listener->panelChanged (EvWavenanoise, M("GENERAL_ENABLED"));
}
else
{ listener->panelChanged (EvWavenanoise, M("GENERAL_DISABLED"));
}
}
} }
void Wavelet::foldAllButEdge (GdkEventButton* event) { void Wavelet::foldAllButEdge (GdkEventButton* event) {
if (event->button == 3) { if (event->button == 3) {
foldAllButOne(expedge); foldAllButOne(expedge);
} }
if (listener) {
if (expedge->getEnabled ())
{ listener->panelChanged (EvWavenaedge, M("GENERAL_ENABLED"));
}
else
{ listener->panelChanged (EvWavenaedge, M("GENERAL_DISABLED"));
}
}
} }
void Wavelet::foldAllButGamut (GdkEventButton* event) { void Wavelet::foldAllButGamut (GdkEventButton* event) {
@ -2675,12 +2767,31 @@ void Wavelet::foldAllButResid (GdkEventButton* event) {
if (event->button == 3) { if (event->button == 3) {
foldAllButOne(expresid); foldAllButOne(expresid);
} }
if (listener) {
if (expresid->getEnabled ())
{ listener->panelChanged (EvWavenares, M("GENERAL_ENABLED"));
}
else
{ listener->panelChanged (EvWavenares, M("GENERAL_DISABLED"));
}
}
} }
void Wavelet::foldAllButFinal (GdkEventButton* event) { void Wavelet::foldAllButFinal (GdkEventButton* event) {
if (event->button == 3) { if (event->button == 3) {
foldAllButOne(expfinal); foldAllButOne(expfinal);
} }
if (listener) {
if (expfinal->getEnabled ())
{ listener->panelChanged (EvWavenafin, M("GENERAL_ENABLED"));
}
else
{ listener->panelChanged (EvWavenafin, M("GENERAL_DISABLED"));
}
}
} }
void Wavelet::foldAllButOne (MyExpander * whichOne) { void Wavelet::foldAllButOne (MyExpander * whichOne) {

View File

@ -75,7 +75,6 @@ protected:
Gtk::CheckButton * tmr; Gtk::CheckButton * tmr;
Gtk::Button * neutralchButton; Gtk::Button * neutralchButton;
Adjuster* correction[9]; Adjuster* correction[9];
Adjuster* correctionch[9]; Adjuster* correctionch[9];
Adjuster* rescon; Adjuster* rescon;
@ -197,7 +196,7 @@ protected:
Gtk::HBox* levdirSubHBox; Gtk::HBox* levdirSubHBox;
Gtk::HBox* tilesizeHBox; Gtk::HBox* tilesizeHBox;
Gtk::HBox* ctboxBA; Gtk::HBox* ctboxFI;
Gtk::HBox* ctboxch; Gtk::HBox* ctboxch;
Gtk::HBox* edbox; Gtk::HBox* edbox;
Gtk::HBox* ednoisbox; Gtk::HBox* ednoisbox;