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);