diff --git a/rtdata/languages/default b/rtdata/languages/default
index 455063652..c4a5513e9 100644
--- a/rtdata/languages/default
+++ b/rtdata/languages/default
@@ -235,7 +235,7 @@ HISTORY_MSG_15;L*a*b* - Contrast
HISTORY_MSG_16;-
HISTORY_MSG_17;-
HISTORY_MSG_18;-
-HISTORY_MSG_19;L* curve
+HISTORY_MSG_19;L*a*b* - L* curve
HISTORY_MSG_20;Sharpening
HISTORY_MSG_21;USM - Radius
HISTORY_MSG_22;USM - Amount
@@ -312,8 +312,8 @@ HISTORY_MSG_92;NR - Gamma
HISTORY_MSG_93;CbDL - Value
HISTORY_MSG_94;Contrast by Detail Levels
HISTORY_MSG_95;L*a*b* - Chromaticity
-HISTORY_MSG_96;a* curve
-HISTORY_MSG_97;b* curve
+HISTORY_MSG_96;L*a*b* - a* curve
+HISTORY_MSG_97;L*a*b* - b* curve
HISTORY_MSG_98;Demosaicing method
HISTORY_MSG_99;Hot pixel filter
HISTORY_MSG_100;RGB Saturation
@@ -461,9 +461,9 @@ HISTORY_MSG_242;VF - Roundness
HISTORY_MSG_243;VC - Radius
HISTORY_MSG_244;VC - Strength
HISTORY_MSG_245;VC - Center
-HISTORY_MSG_246;CL curve
-HISTORY_MSG_247;LH curve
-HISTORY_MSG_248;HH curve
+HISTORY_MSG_246;L*a*b* - CL curve
+HISTORY_MSG_247;L*a*b* - LH curve
+HISTORY_MSG_248;L*a*b* - HH curve
HISTORY_MSG_249;CbDL - Threshold
HISTORY_MSG_250;NR - Enhanced
HISTORY_MSG_251;B&W - Algorithm
@@ -473,33 +473,33 @@ HISTORY_MSG_254;CbDL - Skin hue
HISTORY_MSG_255;NR - Median filter
HISTORY_MSG_256;NR - Median type
HISTORY_MSG_257;Color Toning
-HISTORY_MSG_258;Color Toning - Color
-HISTORY_MSG_259;Color Toning - Opacity
-HISTORY_MSG_260;Color Toning - a*[b*] opacity
-HISTORY_MSG_261;Color Toning - Method
-HISTORY_MSG_262;Color Toning - b* opacity
-HISTORY_MSG_263;Color Toning - Shadows - Red
-HISTORY_MSG_264;Color Toning - Shadows - Green
-HISTORY_MSG_265;Color Toning - Shadows - Blue
-HISTORY_MSG_266;Color Toning - Mid - Red
-HISTORY_MSG_267;Color Toning - Mid - Green
-HISTORY_MSG_268;Color Toning - Mid - Blue
-HISTORY_MSG_269;Color Toning - High - Red
-HISTORY_MSG_270;Color Toning - High - Green
-HISTORY_MSG_271;Color Toning - High - Blue
-HISTORY_MSG_272;Color Toning - Balance
-HISTORY_MSG_273;Color Toning - Reset
-HISTORY_MSG_274;Color Toning - Sat. Shadows
-HISTORY_MSG_275;Color Toning - Sat. Highlights
-HISTORY_MSG_276;Color Toning - Opacity
+HISTORY_MSG_258;CT - Color curve
+HISTORY_MSG_259;CT - Opacity curve
+HISTORY_MSG_260;CT - a*[b*] opacity
+HISTORY_MSG_261;CT - Method
+HISTORY_MSG_262;CT - b* opacity
+HISTORY_MSG_263;CT - Shadows - Red
+HISTORY_MSG_264;CT - Shadows - Green
+HISTORY_MSG_265;CT - Shadows - Blue
+HISTORY_MSG_266;CT - Mid - Red
+HISTORY_MSG_267;CT - Mid - Green
+HISTORY_MSG_268;CT - Mid - Blue
+HISTORY_MSG_269;CT - High - Red
+HISTORY_MSG_270;CT - High - Green
+HISTORY_MSG_271;CT - High - Blue
+HISTORY_MSG_272;CT - Balance
+HISTORY_MSG_273;CT - Reset
+HISTORY_MSG_274;CT - Sat. Shadows
+HISTORY_MSG_275;CT - Sat. Highlights
+HISTORY_MSG_276;CT - Opacity
HISTORY_MSG_277;--unused--
-HISTORY_MSG_278;Color Toning - Preserve luminance
-HISTORY_MSG_279;Color Toning - Shadows
-HISTORY_MSG_280;Color Toning - Highlights
-HISTORY_MSG_281;Color Toning - Sat. strength
-HISTORY_MSG_282;Color Toning - Sat. threshold
-HISTORY_MSG_283;Color Toning - Strength
-HISTORY_MSG_284;Color Toning - Auto sat. protection
+HISTORY_MSG_278;CT - Preserve luminance
+HISTORY_MSG_279;CT - Shadows
+HISTORY_MSG_280;CT - Highlights
+HISTORY_MSG_281;CT - Sat. strength
+HISTORY_MSG_282;CT - Sat. threshold
+HISTORY_MSG_283;CT - Strength
+HISTORY_MSG_284;CT - Auto sat. protection
HISTORY_MSG_285;NR - Median - Method
HISTORY_MSG_286;NR - Median - Type
HISTORY_MSG_287;NR - Median - Iterations
@@ -511,14 +511,14 @@ HISTORY_MSG_292;Black Level - Blue
HISTORY_MSG_293;Film Simulation
HISTORY_MSG_294;Film Simulation - Strength
HISTORY_MSG_295;Film Simulation - Film
-HISTORY_MSG_296;NR - Modulate luminance
+HISTORY_MSG_296;NR - Luminance curve
HISTORY_MSG_297;NR - Quality
HISTORY_MSG_298;Dead pixel filter
HISTORY_MSG_299;NR - Chrominance curve
HISTORY_MSG_300;-
HISTORY_MSG_301;NR - Luma control
HISTORY_MSG_302;NR - Chroma method
-HISTORY_MSG_303;-
+HISTORY_MSG_303;NR - Chroma method
HISTORY_NEWSNAPSHOT;Add
HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
HISTORY_SNAPSHOTS;Snapshots
@@ -1171,7 +1171,6 @@ TP_DIRPYRDENOISE_77;7×7 (slow)
TP_DIRPYRDENOISE_99;9x9 (very slow)
TP_DIRPYRDENOISE_ABM;Chroma only
TP_DIRPYRDENOISE_AUTO;Automatic global
-TP_DIRPYRDENOISE_AUTO;Auto chroma
TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective !
TP_DIRPYRDENOISE_AUT;Automatic global
TP_DIRPYRDENOISE_BLUE;Chrominance - Blue-Yellow
@@ -1197,7 +1196,7 @@ TP_DIRPYRDENOISE_LCURVE;Luminance curve
TP_DIRPYRDENOISE_LDETAIL;Luminance - Detail
TP_DIRPYRDENOISE_LM;Luminance only
TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal)
-TP_DIRPYRDENOISE_LTYPE;Luminance type
+TP_DIRPYRDENOISE_LTYPE;Luminance control
TP_DIRPYRDENOISE_LUMAFR;Luminance
TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail
TP_DIRPYRDENOISE_LUMA;Luminance
diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc
index 01b84df17..53a0615a2 100644
--- a/rtengine/FTblockDN.cc
+++ b/rtengine/FTblockDN.cc
@@ -247,12 +247,25 @@ void ImProcFunctions::Tile_calc (int tilesize, int overlap, int kall, int imwidt
// printf("Nw=%d NH=%d tileW=%d tileH=%d\n",numtiles_W,numtiles_H,tileWskip,tileHskip);
}
- void ImProcFunctions::RGB_denoise(int kall, int trafx, int trafy, int trafw, int trafh, int widIm, int heiIm, Imagefloat * src, Imagefloat * dst,Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const procparams::DefringeParams & defringe, const double expcomp, const NoisCurve & dnNoisCurve, bool lldenoiseutili, const NoisCCcurve & dnNoisCCcurve, bool ccdenoiseutili, float &chaut, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &nresi, float &highresi)
+ void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagefloat * dst,Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const procparams::DefringeParams & defringe, const double expcomp, const NoisCurve & dnNoisCurve, bool lldenoiseutili, const NoisCCcurve & dnNoisCCcurve, bool ccdenoiseutili, float &chaut, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &nresi, float &highresi)
{
//#ifdef _DEBUG
MyTime t1e,t2e;
t1e.set();
//#endif
+
+
+ if (dnparams.luma==0 && dnparams.chroma==0 && !dnparams.median && !dnNoisCurve && !dnNoisCCcurve) {
+ //nothing to do; copy src to dst or do nothing in case src == dst
+ if(src != dst)
+ memcpy(dst->data,src->data,dst->width*dst->height*3*sizeof(float));
+ if(calclum) {
+ delete calclum;
+ calclum = NULL;
+ }
+
+ return;
+ }
static MyMutex FftwMutex;
MyMutex::MyLock lock(FftwMutex);
int hei,wid;
@@ -317,12 +330,6 @@ void ImProcFunctions::Tile_calc (int tilesize, int overlap, int kall, int imwidt
const short int imheight=src->height, imwidth=src->width;
// printf("imW=%d imH=%d\n",imwidth,imheight);
// printf("Chroma=%f\n", dnparams.chroma);
- if (dnparams.luma==0 && dnparams.chroma==0 && !dnparams.median ) {
- //nothing to do; copy src to dst or do nothing in case src == dst
- if(src != dst)
- memcpy(dst->data,src->data,dst->width*dst->height*3*sizeof(float));
- return;
- }
Qhigh=1.0f;
if(dnparams.smethod=="shalbi") Qhigh=1.f/(float) settings->nrhigh;
if (dnparams.luma!=0 || dnparams.chroma!=0 || dnparams.methodmed=="Lab" || dnparams.methodmed=="Lonly" ) {
@@ -2574,13 +2581,21 @@ SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_L, float **
}
// printf("chro=%f maxc=%f sigma=%f max2sigma=%f lum=%f\n",chro/(nc),maxchro, sqrt(dev/nc), (chro/(nc))+ 2.f*sqrt(dev/nc), lume/nL);
- chromina=chro/nc;
- sigma=sqrt(dev/nc);
- lumema=lume/nL;
- sigma_L=sqrt(devL/nL);
- redyel=red_yel/nry;
- nsknc=(float)nsk/(float)nc;
- skinc=skin_c/nsk;
+ if(nc>0) {
+ chromina=chro/nc;
+ sigma=sqrt(dev/nc);
+ nsknc=(float)nsk/(float)nc;
+ } else {
+ nsknc=(float)nsk;
+ }
+ if(nL>0) {
+ lumema=lume/nL;
+ sigma_L=sqrt(devL/nL);
+ }
+ if(nry>0)
+ redyel=red_yel/nry;
+ if(nsk>0)
+ skinc=skin_c/nsk;
// printf("redy=%f ski=%f nsk=%d nc=%d pcsk=%f\n",red_yel/nry,skinc,nsk, nc, (float)nsk/(float)nc );
@@ -2776,6 +2791,13 @@ void ImProcFunctions::calcautodn_info (float &chaut, float &delta, int Nb, int l
void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat * dst,Imagefloat * provicalc, bool isRAW, LUTf &gamcurve, float gam, float gamthresh, float gamslope, const procparams::DirPyrDenoiseParams & dnparams, const procparams::DefringeParams & defringe, const double expcomp, const NoisCurve & dnNoisCurve, bool lldenoiseutili, const NoisCCcurve & dnNoisCCcurve, bool ccdenoiseutili, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, float &nresi, float &highresi, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc)
{
// StopWatch Stop1("RGB_denoise_info");
+
+ if (dnparams.luma==0 && dnparams.chroma==0 && !dnparams.median ) {
+ //nothing to do; copy src to dst or do nothing in case src == dst
+ return;
+ }
+
+
int hei,wid;
// float LLum,AAum,BBum;
float** lumcalc;
@@ -2822,12 +2844,6 @@ void ImProcFunctions::calcautodn_info (float &chaut, float &delta, int Nb, int l
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
const short int imheight=src->height, imwidth=src->width;
- if (dnparams.luma==0 && dnparams.chroma==0 && !dnparams.median ) {
- //nothing to do; copy src to dst or do nothing in case src == dst
- if(src != dst)
- memcpy(dst->data,src->data,dst->width*dst->height*3*sizeof(float));
- return;
- }
if (dnparams.luma!=0 || dnparams.chroma!=0 || dnparams.methodmed=="Lab" || dnparams.methodmed=="Lonly" ) {
perf=false;
diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc
index b1915b654..2b9359d05 100644
--- a/rtengine/dcrop.cc
+++ b/rtengine/dcrop.cc
@@ -32,7 +32,7 @@ namespace rtengine {
extern const Settings* settings;
-Crop::Crop (ImProcCoordinator* parent, EditDataProvider *editDataProvider)
+Crop::Crop (ImProcCoordinator* parent, EditDataProvider *editDataProvider, bool isDetailWindow)
: EditBuffer(editDataProvider), origCrop(NULL), laboCrop(NULL), labnCrop(NULL),
cropImg(NULL), cbuf_real(NULL), cshmap(NULL), transCrop(NULL), cieCrop(NULL), cbuffer(NULL),
updating(false), newUpdatePending(false), skip(10),
@@ -41,7 +41,7 @@ Crop::Crop (ImProcCoordinator* parent, EditDataProvider *editDataProvider)
rqcropx(0), rqcropy(0), rqcropw(-1), rqcroph(-1),
borderRequested(32), upperBorder(0), leftBorder(0),
cropAllocated(false),
- cropImageListener(NULL), parent(parent)
+ cropImageListener(NULL), parent(parent), isDetailWindow(isDetailWindow)
{
parent->crops.push_back (this);
}
@@ -161,7 +161,7 @@ void Crop::update (int todo) {
int skipP=1;//force Skip for noise evaluation
- Imagefloat *calclum;//for Luminance denoise curve
+ Imagefloat *calclum = NULL;//for Luminance denoise curve
NoisCurve dnNoisCurve;
NoisCCcurve dnNoisCCcurve;
bool lldenoiseutili=false;
@@ -171,7 +171,7 @@ void Crop::update (int todo) {
float autohigh = (float) settings->nrhigh;//
params.dirpyrDenoise.getCurves(dnNoisCurve, dnNoisCCcurve, lldenoiseutili, ccdenoiseutili);
-
+
int tilesize;
int overlap;
if(settings->leveldnti ==0) {
@@ -286,104 +286,105 @@ void Crop::update (int todo) {
PreviewProps pp (trafx, trafy, trafw*skip, trafh*skip, skip);
parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.toneCurve, params.icm, params.raw );
- float lowdenoise=1.f;
- int levaut=settings->leveldnaut;
- if(levaut==1) //Standard
- lowdenoise=0.7f;
- int CenterPreview_X=trafx+(trafw*skip)/2;
- int CenterPreview_Y=trafy+(trafh*skip)/2;
- int minimuX=20000;
- int minimuY=20000;
- int poscenterX;
- int poscenterY;
- for(int cc=0;ccleveldnv ==0) {crW=100;crH=100;}
- if(settings->leveldnv ==1) {crW=250;crH=250;}
- // if(settings->leveldnv ==2) {crW=int(tileWskip/2);crH=int((tileWskip/2));}//adapted to scale of preview
- if(settings->leveldnv ==2) {crW=int(tileWskip/2);crH=int(tileHskip/2);}
- if(settings->leveldnv ==3) {crW=tileWskip-10;crH=tileHskip-10;}
+ if((!isDetailWindow) && parent->adnListener && skip==1 && params.dirpyrDenoise.enabled) {
+ float lowdenoise=1.f;
+ int levaut=settings->leveldnaut;
+ if(levaut==1) //Standard
+ lowdenoise=0.7f;
+ int CenterPreview_X=trafx+(trafw*skip)/2;
+ int CenterPreview_Y=trafy+(trafh*skip)/2;
+ int minimuX=20000;
+ int minimuY=20000;
+ int poscenterX;
+ int poscenterY;
+ for(int cc=0;ccleveldnv ==0) {crW=100;crH=100;}
+ if(settings->leveldnv ==1) {crW=250;crH=250;}
+ // if(settings->leveldnv ==2) {crW=int(tileWskip/2);crH=int((tileWskip/2));}//adapted to scale of preview
+ if(settings->leveldnv ==2) {crW=int(tileWskip/2);crH=int(tileHskip/2);}
+ if(settings->leveldnv ==3) {crW=tileWskip-10;crH=tileHskip-10;}
- if (skip==1 && params.dirpyrDenoise.enabled) {
- float adjustr=1.f;
- if (params.icm.working=="ProPhoto") {adjustr =1.f;}
- else if (params.icm.working=="Adobe RGB") {adjustr = 1.f/1.3f;}
- else if (params.icm.working=="sRGB") {adjustr = 1.f/1.3f;}
- else if (params.icm.working=="WideGamut") {adjustr =1.f/1.1f;}
- else if (params.icm.working=="Beta RGB") {adjustr =1.f/1.2f;}
- else if (params.icm.working=="BestRGB") {adjustr =1.f/1.2f;}
- else if (params.icm.working=="BruceRGB") {adjustr =1.f/1.2f;}
- if(parent->adnListener) parent->adnListener->noiseTilePrev (centerTile_X[poscenterX], centerTile_Y[poscenterY],CenterPreview_X,CenterPreview_Y,crW, trafw*skip);
- // I have tried "blind" some solutions..to move review ...but GUI is not my truc !
- // int W,H;
- // cropgl->cropMoved (centerTile_X[poscenterX],centerTile_Y[poscenterY] , W, H);
- // cropImageListener->setPosition (int x, int y, bool update=true);
- // bool update;
- // cropImageListener->setPosition (centerTile_X[poscenterX],centerTile_Y[poscenterY] , true);
- //setCropSizes (centerTile_X[poscenterX], centerTile_Y[poscenterY], trafw*skip,trafh*skip , skip, true);
+ if (skip==1 && params.dirpyrDenoise.enabled) {
+ float adjustr=1.f;
+ if (params.icm.working=="ProPhoto") {adjustr =1.f;}
+ else if (params.icm.working=="Adobe RGB") {adjustr = 1.f/1.3f;}
+ else if (params.icm.working=="sRGB") {adjustr = 1.f/1.3f;}
+ else if (params.icm.working=="WideGamut") {adjustr =1.f/1.1f;}
+ else if (params.icm.working=="Beta RGB") {adjustr =1.f/1.2f;}
+ else if (params.icm.working=="BestRGB") {adjustr =1.f/1.2f;}
+ else if (params.icm.working=="BruceRGB") {adjustr =1.f/1.2f;}
+ if(parent->adnListener) parent->adnListener->noiseTilePrev (centerTile_X[poscenterX], centerTile_Y[poscenterY],CenterPreview_X,CenterPreview_Y,crW, trafw*skip);
+ // I have tried "blind" some solutions..to move review ...but GUI is not my truc !
+ // int W,H;
+ // cropgl->cropMoved (centerTile_X[poscenterX],centerTile_Y[poscenterY] , W, H);
+ // cropImageListener->setPosition (int x, int y, bool update=true);
+ // bool update;
+ // cropImageListener->setPosition (centerTile_X[poscenterX],centerTile_Y[poscenterY] , true);
+ //setCropSizes (centerTile_X[poscenterX], centerTile_Y[poscenterY], trafw*skip,trafh*skip , skip, true);
- Imagefloat *provi;
- Imagefloat *provicalc;
- provi = new Imagefloat (cropw, croph);//
- if(origCrop != provi)
- origCrop->copyData(provi);
- provicalc = new Imagefloat (cropw, croph);//for Luminance denoise curve
- if(origCrop != provicalc)
- origCrop->copyData(provicalc);
-
- parent->imgsrc->convertColorSpace(provicalc, params.icm, parent->currWB, params.raw);//for denoise luminance curve
-
- float maxr=0.f;
- float maxb=0.f;
- float chaut, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, nresi, highresi, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc;
- int Nb;
-
- chaut=0.f;redaut=0.f; blueaut=0.f; maxredaut=0.f; maxblueaut=0.f;minredaut=0.f; minblueaut=0.f;
- LUTf gamcurve(65536,0);
- float gam, gamthresh, gamslope;
- parent->ipf.RGB_denoise_infoGamCurve(params.dirpyrDenoise, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope);
-
- parent->ipf.RGB_denoise_info(provi, provi, provicalc, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, params.defringe, parent->imgsrc->getDirPyrDenoiseExpComp(), dnNoisCurve,lldenoiseutili, dnNoisCCcurve,ccdenoiseutili, chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut,nresi, highresi, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc);
- printf("redy=%f skin=%f pcskin=%f\n",redyel, skinc,nsknc);
- printf("DCROP skip=%d cha=%4.0f Nb=%d red=%4.0f bl=%4.0f redM=%4.0f bluM=%4.0f L=%4.0f sigL=%4.0f Ch=%4.0f Si=%4.0f\n",skip, chaut,Nb, redaut,blueaut, maxredaut, maxblueaut, lumema, sigma_L, chromina, sigma);
- float multip=1.f;
- if(!parent->imgsrc->isRAW()) multip=2.f;//take into account gamma for TIF / JPG approximate value...not good for gamma=1
-
- float maxmax=max(maxredaut,maxblueaut);
- float delta;
- int mode=0;
- // float redyel, skinc, nsknc;
- int lissage=settings->leveldnliss;
- parent->ipf.calcautodn_info (chaut, delta, Nb, levaut, maxmax, lumema, chromina, mode, lissage, redyel, skinc, nsknc);
-
-
- if(maxredaut > maxblueaut) {
- // maxr=(maxredaut-chaut)/((autoNRmax*multip*adjustr)/2.f);
- maxr=(delta)/((autoNRmax*multip*adjustr*lowdenoise)/2.f);
- if(minblueaut <= minredaut && minblueaut < chaut) maxb=(-chaut+minblueaut)/(autoNRmax*multip*adjustr*lowdenoise);
- }
- else {
- // maxb=(maxblueaut-chaut)/((autoNRmax*multip*adjustr)/2.f);
- maxb=(delta)/((autoNRmax*multip*adjustr*lowdenoise)/2.f);
- if(minredaut <= minblueaut && minredaut < chaut) maxr=(-chaut+minredaut)/(autoNRmax*multip*adjustr*lowdenoise);
- }//maxb mxr - empirical evaluation red / blue
-
+ Imagefloat *provi;
+ Imagefloat *provicalc;
+ provi = new Imagefloat (cropw, croph);//
+ if(origCrop != provi)
+ origCrop->copyData(provi);
+ provicalc = new Imagefloat (cropw, croph);//for Luminance denoise curve
+ if(origCrop != provicalc)
+ origCrop->copyData(provicalc);
- params.dirpyrDenoise.chroma=chaut/(autoNR*multip*adjustr*lowdenoise);
- params.dirpyrDenoise.redchro=maxr;
- params.dirpyrDenoise.bluechro=maxb;
- if(parent->adnListener) parent->adnListener->chromaChanged(params.dirpyrDenoise.chroma, params.dirpyrDenoise.redchro, params.dirpyrDenoise.bluechro);
-
- delete provi;
- }
+ parent->imgsrc->convertColorSpace(provicalc, params.icm, parent->currWB, params.raw);//for denoise luminance curve
+ float maxr=0.f;
+ float maxb=0.f;
+ float chaut, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, nresi, highresi, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc;
+ int Nb;
+
+ chaut=0.f;redaut=0.f; blueaut=0.f; maxredaut=0.f; maxblueaut=0.f;minredaut=0.f; minblueaut=0.f;
+ LUTf gamcurve(65536,0);
+ float gam, gamthresh, gamslope;
+ parent->ipf.RGB_denoise_infoGamCurve(params.dirpyrDenoise, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope);
+
+ parent->ipf.RGB_denoise_info(provi, provi, provicalc, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, params.defringe, parent->imgsrc->getDirPyrDenoiseExpComp(), dnNoisCurve,lldenoiseutili, dnNoisCCcurve,ccdenoiseutili, chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut,nresi, highresi, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc);
+// printf("redy=%f skin=%f pcskin=%f\n",redyel, skinc,nsknc);
+// printf("DCROP skip=%d cha=%4.0f Nb=%d red=%4.0f bl=%4.0f redM=%4.0f bluM=%4.0f L=%4.0f sigL=%4.0f Ch=%4.0f Si=%4.0f\n",skip, chaut,Nb, redaut,blueaut, maxredaut, maxblueaut, lumema, sigma_L, chromina, sigma);
+ float multip=1.f;
+ if(!parent->imgsrc->isRAW()) multip=2.f;//take into account gamma for TIF / JPG approximate value...not good for gamma=1
+
+ float maxmax=max(maxredaut,maxblueaut);
+ float delta;
+ int mode=0;
+ // float redyel, skinc, nsknc;
+ int lissage=settings->leveldnliss;
+ parent->ipf.calcautodn_info (chaut, delta, Nb, levaut, maxmax, lumema, chromina, mode, lissage, redyel, skinc, nsknc);
+
+
+ if(maxredaut > maxblueaut) {
+ // maxr=(maxredaut-chaut)/((autoNRmax*multip*adjustr)/2.f);
+ maxr=(delta)/((autoNRmax*multip*adjustr*lowdenoise)/2.f);
+ if(minblueaut <= minredaut && minblueaut < chaut) maxb=(-chaut+minblueaut)/(autoNRmax*multip*adjustr*lowdenoise);
+ }
+ else {
+ // maxb=(maxblueaut-chaut)/((autoNRmax*multip*adjustr)/2.f);
+ maxb=(delta)/((autoNRmax*multip*adjustr*lowdenoise)/2.f);
+ if(minredaut <= minblueaut && minredaut < chaut) maxr=(-chaut+minredaut)/(autoNRmax*multip*adjustr*lowdenoise);
+ }//maxb mxr - empirical evaluation red / blue
+
+
+ params.dirpyrDenoise.chroma=chaut/(autoNR*multip*adjustr*lowdenoise);
+ params.dirpyrDenoise.redchro=maxr;
+ params.dirpyrDenoise.bluechro=maxb;
+ parent->adnListener->chromaChanged(params.dirpyrDenoise.chroma, params.dirpyrDenoise.redchro, params.dirpyrDenoise.bluechro);
+
+ delete provi;
+ }
+ }
}
if((settings->leveldnautsimpl==1 && params.dirpyrDenoise.Cmethod=="AUT") || (settings->leveldnautsimpl==0 && params.dirpyrDenoise.C2method=="AUTO")) {
@@ -408,7 +409,7 @@ void Crop::update (int todo) {
LUTf gamcurve(65536,0);
float gam, gamthresh, gamslope;
parent->ipf.RGB_denoise_infoGamCurve(params.dirpyrDenoise, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope);
- int Nb;
+ int Nb[9];
#pragma omp parallel
{
@@ -428,23 +429,25 @@ void Crop::update (int todo) {
#pragma omp for schedule(dynamic) collapse(2) nowait
for(int wcr=0;wcr<=2;wcr++) {
for(int hcr=0;hcr<=2;hcr++) {
- PreviewProps ppP (coordW[wcr] , coordH[hcr], crW, crH, skipP);
- parent->imgsrc->getImage (parent->currWB, tr, origCropPart, ppP, params.toneCurve, params.icm, params.raw );
+ PreviewProps ppP (coordW[wcr] , coordH[hcr], crW, crH, skipP);
+ parent->imgsrc->getImage (parent->currWB, tr, origCropPart, ppP, params.toneCurve, params.icm, params.raw );
if(origCropPart != provi)
origCropPart->copyData(provi);
if(origCropPart != provicalc)
origCropPart->copyData(provicalc);
- parent->imgsrc->convertColorSpace(provicalc, params.icm, parent->currWB, params.raw);//for denoise luminance curve
- //float maxr=0.f;
- //float maxb=0.f;
- float pondcorrec=1.0f;
- float chaut, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, nresi, highresi, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc;
- chaut=0.f;redaut=0.f; blueaut=0.f; maxredaut=0.f; maxblueaut=0.f;chromina=0.f; sigma=0.f;
- parent->ipf.RGB_denoise_info(provi, provi, provicalc, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, params.defringe, parent->imgsrc->getDirPyrDenoiseExpComp(), dnNoisCurve,lldenoiseutili, dnNoisCCcurve,ccdenoiseutili, chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, nresi, highresi, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc);
+ parent->imgsrc->convertColorSpace(provicalc, params.icm, parent->currWB, params.raw);//for denoise luminance curve
+ //float maxr=0.f;
+ //float maxb=0.f;
+ float pondcorrec=1.0f;
+ float chaut=0.f, redaut=0.f, blueaut=0.f, maxredaut=0.f, maxblueaut=0.f, minredaut=0.f, minblueaut=0.f, nresi=0.f, highresi=0.f, chromina=0.f, sigma=0.f, lumema=0.f, sigma_L=0.f, redyel=0.f, skinc=0.f, nsknc=0.f;
+ int nb=0;
+// chaut=0.f;redaut=0.f; blueaut=0.f; maxredaut=0.f; maxblueaut=0.f; chromina=0.f; sigma=0.f;
+ parent->ipf.RGB_denoise_info(provi, provi, provicalc, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, params.defringe, parent->imgsrc->getDirPyrDenoiseExpComp(), dnNoisCurve,lldenoiseutili, dnNoisCCcurve,ccdenoiseutili, chaut, nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, nresi, highresi, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc);
//printf("DCROP skip=%d cha=%f red=%f bl=%f redM=%f bluM=%f chrom=%f sigm=%f lum=%f\n",skip, chaut,redaut,blueaut, maxredaut, maxblueaut, chromina, sigma, lumema);
+ Nb[hcr*3 + wcr] = nb;
ch_M[hcr*3 + wcr]=pondcorrec*chaut;
max_r[hcr*3 + wcr]=pondcorrec*maxredaut;
max_b[hcr*3 + wcr]=pondcorrec*maxblueaut;
@@ -497,7 +500,7 @@ void Crop::update (int todo) {
int lissage=settings->leveldnliss;
for(int k=0;k<9;k++) {
maxmax=max(max_r[k],max_b[k]);
- parent->ipf.calcautodn_info (ch_M[k], delta[k], Nb, levaut, maxmax,lumL[k],chromC[k], mode, lissage, ry[k], sk[k], pcsk[k]);
+ parent->ipf.calcautodn_info (ch_M[k], delta[k], Nb[k], levaut, maxmax,lumL[k],chromC[k], mode, lissage, ry[k], sk[k], pcsk[k]);
// printf("ch_M=%f delta=%f\n",ch_M[k], delta[k]);
}
for(int k=0;k<9;k++) {
@@ -549,11 +552,13 @@ void Crop::update (int todo) {
maxr=MinRMoy + (MinR-MinRMoy)*0.66f;
}
- printf("DCROP skip=%d cha=%f red=%f bl=%f \n",skip, chM,maxr,maxb);
+// printf("DCROP skip=%d cha=%f red=%f bl=%f \n",skip, chM,maxr,maxb);
params.dirpyrDenoise.chroma=chM/(autoNR*multip*adjustr);
params.dirpyrDenoise.redchro=maxr;
params.dirpyrDenoise.bluechro=maxb;
- if(parent->adnListener) parent->adnListener->chromaChanged(params.dirpyrDenoise.chroma, params.dirpyrDenoise.redchro, params.dirpyrDenoise.bluechro);
+ if(parent->adnListener) {
+ parent->adnListener->chromaChanged(params.dirpyrDenoise.chroma, params.dirpyrDenoise.redchro, params.dirpyrDenoise.bluechro);
+ }
}
if (settings->verbose) {
t2aue.set();
@@ -571,6 +576,12 @@ void Crop::update (int todo) {
if(params.dirpyrDenoise.Lmethod=="CUR") params.dirpyrDenoise.luma=0.5f;//very small value to init process - select curve or slider
if(params.dirpyrDenoise.Lmethod=="SLI") lldenoiseutili=false;
+ if(!lldenoiseutili)
+ dnNoisCurve.Reset();
+ if(!ccdenoiseutili)
+ dnNoisCCcurve.Reset();
+
+
if((lldenoiseutili || ccdenoiseutili ) && skip==1 && params.dirpyrDenoise.enabled) {//only allocate memory if enabled and skip
calclum = new Imagefloat (cropw, croph);//for Luminance denoise curve
if(origCrop != calclum)
@@ -585,7 +596,7 @@ void Crop::update (int todo) {
int kall=0;
float chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi;
- parent->ipf.RGB_denoise(kall, trafx, trafy, trafw, trafh, widIm, heiIm, origCrop, origCrop, calclum, ch_M, max_r, max_b, parent->imgsrc->isRAW(), /*Roffset,*/ params.dirpyrDenoise, params.defringe, parent->imgsrc->getDirPyrDenoiseExpComp(), dnNoisCurve,lldenoiseutili, dnNoisCCcurve,ccdenoiseutili, chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi);
+ parent->ipf.RGB_denoise(kall, origCrop, origCrop, calclum, ch_M, max_r, max_b, parent->imgsrc->isRAW(), /*Roffset,*/ params.dirpyrDenoise, params.defringe, parent->imgsrc->getDirPyrDenoiseExpComp(), dnNoisCurve,lldenoiseutili, dnNoisCCcurve,ccdenoiseutili, chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi);
if(parent->adnListener) parent->adnListener->noiseChanged(nresi, highresi);
if(settings->leveldnautsimpl==1) {
if((params.dirpyrDenoise.Cmethod=="AUT" || params.dirpyrDenoise.Cmethod=="PRE") && (parent->adnListener)) // force display value of sliders
@@ -759,7 +770,7 @@ void Crop::update (int todo) {
if (!cieCrop)
{ cieCrop = new CieImage (cropw, croph); }
- if(settings->leveldnautsimpl==1) {
+ if(settings->ciecamfloat) {
float d; // not used after this block
skip2=skip;
parent->ipf.ciecam_02float (cieCrop, float(adap), begh, endh, 1, 2, labnCrop, ¶ms, parent->customColCurve1, parent->customColCurve2, parent->customColCurve3,
diff --git a/rtengine/dcrop.h b/rtengine/dcrop.h
index 391832103..23c9ebf8f 100644
--- a/rtengine/dcrop.h
+++ b/rtengine/dcrop.h
@@ -66,13 +66,13 @@ class Crop : public DetailedCrop, public EditBuffer {
MyMutex cropMutex;
ImProcCoordinator* parent;
-
+ bool isDetailWindow;
EditUniqueID getCurrEditID();
bool setCropSizes (int cx, int cy, int cw, int ch, int skip, bool internal);
void freeAll ();
public:
- Crop (ImProcCoordinator* parent, EditDataProvider *editDataProvider);
+ Crop (ImProcCoordinator* parent, EditDataProvider *editDataProvider, bool isDetailWindow);
virtual ~Crop ();
int skip2;
diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc
index 68cfb0a02..e43fcbaaf 100644
--- a/rtengine/improccoordinator.cc
+++ b/rtengine/improccoordinator.cc
@@ -112,9 +112,9 @@ ImProcCoordinator::~ImProcCoordinator () {
updaterThreadStart.unlock ();
}
-DetailedCrop* ImProcCoordinator::createCrop (::EditDataProvider *editDataProvider) {
+DetailedCrop* ImProcCoordinator::createCrop (::EditDataProvider *editDataProvider, bool isDetailWindow) {
- return new Crop (this, editDataProvider);
+ return new Crop (this, editDataProvider, isDetailWindow);
}
@@ -270,7 +270,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) {
imgsrc->getImage (currWB, tr, orig_prev, pp, params.toneCurve, params.icm, params.raw);
//ColorTemp::CAT02 (orig_prev, ¶ms) ;
- Imagefloat *calclum ;
+ Imagefloat *calclum = NULL ;
lldenoiseutili=false;
ccdenoiseutili=false;
params.dirpyrDenoise.getCurves(dnNoisCurve,dnNoisCCcurve,lldenoiseutili, ccdenoiseutili);
@@ -284,6 +284,11 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) {
if(params.dirpyrDenoise.Lmethod=="CUR") params.dirpyrDenoise.luma=0.5f;
if(params.dirpyrDenoise.Lmethod=="SLI") lldenoiseutili=false;
+ if(!lldenoiseutili)
+ dnNoisCurve.Reset();
+ if(!ccdenoiseutili)
+ dnNoisCCcurve.Reset();
+
if((lldenoiseutili || ccdenoiseutili) && params.dirpyrDenoise.enabled && (scale==1)){//only allocate memory if enabled and scale=1
calclum = new Imagefloat (pW, pH);//for Luminance denoise curve
if(orig_prev != calclum)
@@ -296,8 +301,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) {
if (params.dirpyrDenoise.enabled && (scale==1)) {
printf("IMPROC\n");
int kall=1;
- int trafx, trafy, trafw, trafh, widIm, heiIm;
- ipf.RGB_denoise(kall, trafx, trafy, trafw, trafh, widIm, heiIm, orig_prev, orig_prev, calclum, ch_M, max_r, max_b, imgsrc->isRAW(), params.dirpyrDenoise, params.defringe, imgsrc->getDirPyrDenoiseExpComp(), dnNoisCurve, lldenoiseutili, dnNoisCCcurve,ccdenoiseutili, chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi);
+ ipf.RGB_denoise(kall, orig_prev, orig_prev, calclum, ch_M, max_r, max_b, imgsrc->isRAW(), params.dirpyrDenoise, params.defringe, imgsrc->getDirPyrDenoiseExpComp(), dnNoisCurve, lldenoiseutili, dnNoisCCcurve,ccdenoiseutili, chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi);
}
}
// delete calclum;
diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h
index 67f3bc737..95d8b35e0 100644
--- a/rtengine/improccoordinator.h
+++ b/rtengine/improccoordinator.h
@@ -208,7 +208,7 @@ class ImProcCoordinator : public StagedImageProcessor {
int getPreviewWidth () { return pW; }
int getPreviewHeight () { return pH; }
- DetailedCrop* createCrop (::EditDataProvider *editDataProvider);
+ DetailedCrop* createCrop (::EditDataProvider *editDataProvider, bool isDetailWindow);
bool getAutoWB (double& temp, double& green, double equal);
void getCamWB (double& temp, double& green);
diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h
index b2df211b1..a35262e4a 100644
--- a/rtengine/improcfun.h
+++ b/rtengine/improcfun.h
@@ -278,7 +278,7 @@ class ImProcFunctions {
//void output_tile_row (float *Lbloxrow, float ** Lhipassdn, float ** tilemask, int height, int width, int top, int blkrad );
void Tile_calc (int tilesize, int overlap, int kall, int imwidth, int imheight, int &numtiles_W, int &numtiles_H, int &tilewidth, int &tileheight, int &tileWskip, int &tileHskip);
- void RGB_denoise(int kall, int trafx, int trafy, int trafw, int trafh, int widIm, int heiIm, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const procparams::DefringeParams & defringe, const double expcomp,const NoisCurve & ctNoisCurve , bool lldenoiseutili, const NoisCCcurve & ctNoisCCcurve , bool ccdenoiseutili, float &chaut, float &redaut, float &blueaut, float &maxredaut, float & maxblueaut, float &nresi, float &highresi);
+ void RGB_denoise(int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const procparams::DefringeParams & defringe, const double expcomp,const NoisCurve & ctNoisCurve , bool lldenoiseutili, const NoisCCcurve & ctNoisCCcurve , bool ccdenoiseutili, float &chaut, float &redaut, float &blueaut, float &maxredaut, float & maxblueaut, float &nresi, float &highresi);
void RGB_denoise_infoGamCurve(const procparams::DirPyrDenoiseParams & dnparams, bool isRAW, LUTf &gamcurve, float &gam, float &gamthresh, float &gamslope);
void RGB_denoise_info(Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, bool isRAW, LUTf &gamcurve, float gam, float gamthresh, float gamslope, const procparams::DirPyrDenoiseParams & dnparams, const procparams::DefringeParams & defringe, const double expcomp,const NoisCurve & ctNoisCurve , bool lldenoiseutili, const NoisCCcurve & ctNoisCCcurve , bool ccdenoiseutili, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float & maxblueaut, float &minredaut, float & minblueaut,float &nresi, float &highresi, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel,float &skinc, float &nsknc);
void RGBtile_denoise (float * fLblox, int hblproc, float noisevar_L, float * nbrwt, float * blurbuffer ); //for DCT
diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h
index b78a744fb..5ce79c3ae 100644
--- a/rtengine/rtengine.h
+++ b/rtengine/rtengine.h
@@ -354,7 +354,7 @@ namespace rtengine {
/** Creates and returns a Crop instance that acts as a window on the image
* @param editDataProvider pointer to the EditDataProvider that communicates with the EditSubscriber
* @return a pointer to the Crop object that handles the image data trough its own pipeline */
- virtual DetailedCrop* createCrop (::EditDataProvider *editDataProvider) =0;
+ virtual DetailedCrop* createCrop (::EditDataProvider *editDataProvider, bool isDetailWindow) =0;
virtual bool getAutoWB (double& temp, double& green, double equal) =0;
virtual void getCamWB (double& temp, double& green) =0;
diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc
index f907cd6b7..e6068de85 100644
--- a/rtengine/simpleprocess.cc
+++ b/rtengine/simpleprocess.cc
@@ -129,7 +129,7 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p
bool lldenoiseutili=false;
bool ccdenoiseutili=false;
NoisCCcurve dnNoisCCcurve;
- Imagefloat *calclum ;
+ Imagefloat *calclum = NULL ;
params.dirpyrDenoise.getCurves(dnNoisCurve, dnNoisCCcurve, lldenoiseutili, ccdenoiseutili);
float autoNR = (float) settings->nrauto;//
float autoNRmax = (float) settings->nrautomax;//
@@ -184,8 +184,8 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p
// int crW=tileWskip-10;//crop noise width
// int crH=tileHskip-10;//crop noise height
- Imagefloat *origCropPart;//init auto noise
- origCropPart = new Imagefloat (crW, crH);//allocate memory
+// Imagefloat *origCropPart;//init auto noise
+// origCropPart = new Imagefloat (crW, crH);//allocate memory
StopWatch Stop1("denoise info tiled");
if (params.dirpyrDenoise.enabled) {//evaluate Noise
LUTf gamcurve(65536,0);
@@ -345,7 +345,7 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p
LUTf gamcurve(65536,0);
float gam, gamthresh, gamslope;
ipf.RGB_denoise_infoGamCurve(params.dirpyrDenoise, imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope);
- int Nb;
+ int Nb[9];
#pragma omp parallel
{
Imagefloat *origCropPart;//init auto noise
@@ -377,21 +377,21 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p
float maxr=0.f;
float maxb=0.f;
float pondcorrec=1.0f;
-
- float chaut, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, nresi, highresi, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc;
- chaut=0.f;redaut=0.f; blueaut=0.f; maxredaut=0.f; maxblueaut=0.f;chromina=0.f; sigma=0.f;sigma_L=0.f;
- ipf.RGB_denoise_info(provi, provi, provicalc, imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise,params.defringe, imgsrc->getDirPyrDenoiseExpComp(), dnNoisCurve,lldenoiseutili, dnNoisCCcurve,ccdenoiseutili, chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, nresi, highresi, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc);
-
- ch_M[hcr*3 + wcr]=pondcorrec*chaut;
- max_r[hcr*3 + wcr]=pondcorrec*maxredaut;
- max_b[hcr*3 + wcr]=pondcorrec*maxblueaut;
- min_r[hcr*3 + wcr]=pondcorrec*minredaut;
- min_b[hcr*3 + wcr]=pondcorrec*minblueaut;
- lumL[hcr*3 + wcr]=lumema;
- chromC[hcr*3 + wcr]=chromina;
- ry[hcr*3 + wcr]=redyel;
- sk[hcr*3 + wcr]=skinc;
- pcsk[hcr*3 + wcr]=nsknc;
+ int nb = 0;
+ float chaut=0.f, redaut=0.f, blueaut=0.f, maxredaut=0.f, maxblueaut=0.f, minredaut=0.f, minblueaut=0.f, nresi=0.f, highresi=0.f, chromina=0.f, sigma=0.f, lumema=0.f, sigma_L=0.f, redyel=0.f, skinc=0.f, nsknc=0.f;
+ ipf.RGB_denoise_info(provi, provi, provicalc, imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise,params.defringe, imgsrc->getDirPyrDenoiseExpComp(), dnNoisCurve,lldenoiseutili, dnNoisCCcurve,ccdenoiseutili, chaut, nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, nresi, highresi, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc);
+
+ Nb[hcr*3 + wcr] = nb;
+ ch_M[hcr*3 + wcr]=pondcorrec*chaut;
+ max_r[hcr*3 + wcr]=pondcorrec*maxredaut;
+ max_b[hcr*3 + wcr]=pondcorrec*maxblueaut;
+ min_r[hcr*3 + wcr]=pondcorrec*minredaut;
+ min_b[hcr*3 + wcr]=pondcorrec*minblueaut;
+ lumL[hcr*3 + wcr]=lumema;
+ chromC[hcr*3 + wcr]=chromina;
+ ry[hcr*3 + wcr]=redyel;
+ sk[hcr*3 + wcr]=skinc;
+ pcsk[hcr*3 + wcr]=nsknc;
}
}
@@ -435,7 +435,7 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p
float redyel, skinc, nsknc;
for(int k=0;k<9;k++) {
maxmax=max(max_r[k],max_b[k]);
- ipf.calcautodn_info (ch_M[k], delta[k], Nb, levaut, maxmax, lumL[k], chromC[k], mode, lissage,ry[k], sk[k], pcsk[k] );
+ ipf.calcautodn_info (ch_M[k], delta[k], Nb[k], levaut, maxmax, lumL[k], chromC[k], mode, lissage,ry[k], sk[k], pcsk[k] );
// printf("ch_M=%f delta=%f\n",ch_M[k], delta[k]);
}
for(int k=0;k<9;k++) {
@@ -543,7 +543,11 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p
// if (params.dirpyrDenoise.enabled && lldenoiseutili) {
if(params.dirpyrDenoise.Lmethod=="CUR") params.dirpyrDenoise.luma=0.5f;
if(params.dirpyrDenoise.Lmethod=="SLI") lldenoiseutili=false;
-
+ if(!lldenoiseutili)
+ dnNoisCurve.Reset();
+ if(!ccdenoiseutili)
+ dnNoisCCcurve.Reset();
+
if (params.dirpyrDenoise.enabled && (lldenoiseutili || ccdenoiseutili )) {
calclum = new Imagefloat (fw, fh);//for luminance denoise curve
@@ -557,8 +561,7 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p
// ipf.RGB_denoise(baseImg, baseImg, calclum, imgsrc->isRAW(), params.dirpyrDenoise, params.defringe, imgsrc->getDirPyrDenoiseExpComp(), dnNoisCurve, lldenoiseutili);
float chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc;
int kall=2;
- int trafx, trafy, trafw, trafh, widIm, heiIm;
- ipf.RGB_denoise(kall, trafx, trafy, trafw, trafh, widIm, heiIm, baseImg, baseImg, calclum, ch_M, max_r, max_b, imgsrc->isRAW(), params.dirpyrDenoise, params.defringe, imgsrc->getDirPyrDenoiseExpComp(), dnNoisCurve, lldenoiseutili, dnNoisCCcurve,ccdenoiseutili, chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi);
+ ipf.RGB_denoise(kall, baseImg, baseImg, calclum, ch_M, max_r, max_b, imgsrc->isRAW(), params.dirpyrDenoise, params.defringe, imgsrc->getDirPyrDenoiseExpComp(), dnNoisCurve, lldenoiseutili, dnNoisCCcurve,ccdenoiseutili, chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi);
}
// delete calclum;
diff --git a/rtgui/crophandler.cc b/rtgui/crophandler.cc
index aad8c7f28..00feccd34 100644
--- a/rtgui/crophandler.cc
+++ b/rtgui/crophandler.cc
@@ -61,7 +61,7 @@ void CropHandler::setEditSubscriber (EditSubscriber* newSubscriber) {
(static_cast(crop))->setEditSubscriber(newSubscriber);
}
-void CropHandler::newImage (StagedImageProcessor* ipc_) {
+void CropHandler::newImage (StagedImageProcessor* ipc_, bool isDetailWindow) {
ipc = ipc_;
cx = 0;
@@ -74,7 +74,7 @@ void CropHandler::newImage (StagedImageProcessor* ipc_) {
CropWindow *cropWin = listener ? static_cast(listener) : NULL;
if (cropWin)
editDataProvider = cropWin->getImageArea();
- crop = ipc->createCrop (editDataProvider);
+ crop = ipc->createCrop (editDataProvider, isDetailWindow);
ipc->setSizeListener (this);
crop->setListener (enabled ? this : NULL);
initial = true;
diff --git a/rtgui/crophandler.h b/rtgui/crophandler.h
index 395e3034d..6711c6f2b 100644
--- a/rtgui/crophandler.h
+++ b/rtgui/crophandler.h
@@ -82,7 +82,7 @@ class CropHandler : public rtengine::DetailedCropListener, public rtengine::Size
void setCropHandlerListener (CropHandlerListener* l) { listener = l; }
void setEditSubscriber (EditSubscriber* newSubscriber);
- void newImage (rtengine::StagedImageProcessor* ipc_);
+ void newImage (rtengine::StagedImageProcessor* ipc_, bool isDetailWindow);
void setZoom (int z, int centerx=-1, int centery=-1);
double getFitZoom ();
void setWSize (int w, int h);
diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc
index 805446ea0..917debc24 100755
--- a/rtgui/cropwindow.cc
+++ b/rtgui/cropwindow.cc
@@ -62,13 +62,12 @@ ZoomStep zoomSteps[] = {
#define MAXZOOMSTEPS 20
#define ZOOM11INDEX 13
-CropWindow::CropWindow (ImageArea* parent, rtengine::StagedImageProcessor* ipc_, bool isLowUpdatePriority_)
+CropWindow::CropWindow (ImageArea* parent, rtengine::StagedImageProcessor* ipc_, bool isLowUpdatePriority_, bool isDetailWindow)
: onResizeArea(false), deleted(false), fitZoomEnabled(true), fitZoom(false), isLowUpdatePriority(isLowUpdatePriority_),
backColor(options.bgcolor), decorated(true), titleHeight(30),
sideBorderWidth(3), lowerBorderWidth(3), upperBorderWidth(1), sepWidth(2),
xpos(30), ypos(30), imgX(0), imgY(0), imgW(1), imgH(1), iarea(parent),
cropZoom(0), cropgl(NULL), pmlistener(NULL), observedCropWin(NULL), ipc(ipc_), isFlawnOver(false) {
-
Glib::RefPtr context = parent->get_pango_context () ;
Pango::FontDescription fontd = context->get_font_description ();
fontd.set_weight (Pango::WEIGHT_BOLD);
@@ -106,7 +105,7 @@ CropWindow::CropWindow (ImageArea* parent, rtengine::StagedImageProcessor* ipc_,
minWidth = bsw + iw + 2*sideBorderWidth;
cropHandler.setCropHandlerListener (this);
- cropHandler.newImage (ipc_);
+ cropHandler.newImage (ipc_, isDetailWindow);
state = SNormal;
}
diff --git a/rtgui/cropwindow.h b/rtgui/cropwindow.h
index 8e331b083..8facdabfb 100755
--- a/rtgui/cropwindow.h
+++ b/rtgui/cropwindow.h
@@ -98,7 +98,7 @@ class CropWindow : public LWButtonListener, public CropHandlerListener, public E
public:
CropHandler cropHandler;
- CropWindow (ImageArea* parent, rtengine::StagedImageProcessor* ipc_, bool isLowUpdatePriority_);
+ CropWindow (ImageArea* parent, rtengine::StagedImageProcessor* ipc_, bool isLowUpdatePriority_, bool isDetailWindow);
void setDecorated (bool decorated) { this->decorated = decorated; }
void setFitZoomEnabled (bool fze) { fitZoomEnabled = fze; }
diff --git a/rtgui/dirpyrdenoise.cc b/rtgui/dirpyrdenoise.cc
index 833005608..c4b388e2e 100644
--- a/rtgui/dirpyrdenoise.cc
+++ b/rtgui/dirpyrdenoise.cc
@@ -1027,10 +1027,8 @@ void DirPyrDenoise::enabledChanged () {
}
if (listener) {
- if (enabled->get_active ()) {autochromaChanged ();
-
+ if (enabled->get_active ())
listener->panelChanged (EvDPDNEnabled, M("GENERAL_ENABLED"));
- }
else
listener->panelChanged (EvDPDNEnabled, M("GENERAL_DISABLED"));
}
diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc
index a9cf1d950..ed197b165 100755
--- a/rtgui/editorpanel.cc
+++ b/rtgui/editorpanel.cc
@@ -493,7 +493,7 @@ void EditorPanel::open (Thumbnail* tmb, rtengine::InitialImage* isrc) {
// since there was no resize event
if (iareapanel->imageArea->mainCropWindow)
{
- iareapanel->imageArea->mainCropWindow->cropHandler.newImage(ipc);
+ iareapanel->imageArea->mainCropWindow->cropHandler.newImage(ipc, false);
iareapanel->imageArea->mainCropWindow->initialImageArrived();
// In single tab mode, the image is not always updated between switches
@@ -1101,7 +1101,7 @@ bool EditorPanel::idle_saveImage (ProgressConnector *pc, Gl
msgd.run ();
saveimgas->set_sensitive(true);
- sendtogimp->set_sensitive(true);
+ sendtogimp->set_sensitive(true);
isProcessing = false;
}
@@ -1138,8 +1138,8 @@ bool EditorPanel::idle_imageSaved(ProgressConnector *pc,rtengine::IImage16*
setProgressState(false);
- delete pc;
- SoundManager::playSoundAsync(options.sndBatchQueueDone);
+ delete pc;
+ SoundManager::playSoundAsync(options.sndBatchQueueDone);
isProcessing = false;
return false;
}
@@ -1220,7 +1220,7 @@ void EditorPanel::saveAsPressed () {
fnameOK = confirmOverwrite (*saveAsDialog, fnameOut);
}
- if (fnameOK) {
+ if (fnameOK) {
isProcessing = true;
// save image
rtengine::procparams::ProcParams pparams;
diff --git a/rtgui/imagearea.cc b/rtgui/imagearea.cc
index 04b89012b..f0c885861 100644
--- a/rtgui/imagearea.cc
+++ b/rtgui/imagearea.cc
@@ -83,7 +83,7 @@ void ImageArea::on_realize()
void ImageArea::on_resized (Gtk::Allocation& req) {
if (ipc && get_width()>1) { // sometimes on_resize is called in some init state, causing wrong sizes
if (!mainCropWindow) {
- mainCropWindow = new CropWindow (this, ipc, false);
+ mainCropWindow = new CropWindow (this, ipc, false, false);
mainCropWindow->setDecorated (false);
mainCropWindow->setFitZoomEnabled (true);
mainCropWindow->addCropWindowListener (this);
@@ -348,7 +348,7 @@ void ImageArea::addCropWindow () {
if (!mainCropWindow)
return; // if called but no image is loaded, it would crash
- CropWindow* cw = new CropWindow (this, ipc, true);
+ CropWindow* cw = new CropWindow (this, ipc, true, true);
cw->zoom11();
cw->setCropGUIListener (cropgl);
cw->setPointerMotionListener (pmlistener);