From 0ffbc5251eed3ac5371b75fcea57b7d327a52a0e Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 10 Aug 2017 14:20:00 +0200 Subject: [PATCH] Add CAT02 viewing conditions --- rtengine/ciecam02.cc | 13 +- rtengine/ciecam02.h | 2 +- rtengine/dcrop.cc | 396 +++++++++++++++++----------------- rtengine/improccoordinator.cc | 6 +- rtengine/improcfun.cc | 9 +- rtengine/improcfun.h | 2 +- rtengine/procevents.h | 2 + rtengine/procparams.cc | 28 +++ rtengine/procparams.h | 2 + rtengine/refreshmap.cc | 4 +- rtengine/rtengine.h | 2 +- rtengine/rtthumbnail.cc | 4 +- rtengine/simpleprocess.cc | 8 +- rtgui/colorappearance.cc | 52 ++++- rtgui/colorappearance.h | 6 +- rtgui/paramsedited.cc | 12 ++ rtgui/paramsedited.h | 2 + 17 files changed, 336 insertions(+), 214 deletions(-) diff --git a/rtengine/ciecam02.cc b/rtengine/ciecam02.cc index 08a9b3145..c9053f8bd 100644 --- a/rtengine/ciecam02.cc +++ b/rtengine/ciecam02.cc @@ -728,6 +728,8 @@ void Ciecam02::initcam2(double gamu, double yb, double f, double la, double xw, double &cz, double &aw, double &fl) { n = yb / yw; + + d = d_factor( f, la ); fl = calculate_fl_from_la_ciecam02( la ); nbb = ncb = 0.725 * pow( 1.0 / n, 0.2 ); @@ -742,11 +744,18 @@ void Ciecam02::initcam2(double gamu, double yb, double f, double la, double xw, #endif } -void Ciecam02::initcam2float(float gamu, float yb, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, +void Ciecam02::initcam2float(float gamu, float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, float &cz, float &aw, float &fl) { n = yb / yw; - d = d_factorfloat( f, la ); + + if (pilotd == 2.0) { + d = d_factorfloat( f, la ); + } else { + d = pilotd; + } + + // d = d_factorfloat( f, la ); fl = calculate_fl_from_la_ciecam02float( la ); nbb = ncb = 0.725f * pow_F( 1.0f / n, 0.2f ); cz = 1.48f + sqrt( n ); diff --git a/rtengine/ciecam02.h b/rtengine/ciecam02.h index a551b2504..2e6e18295 100644 --- a/rtengine/ciecam02.h +++ b/rtengine/ciecam02.h @@ -108,7 +108,7 @@ public: static void initcam1float(float gamu, float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, float &cz, float &aw, float &wh, float &pfl, float &fl, float &c); - static void initcam2float(float gamu, float yb, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, + static void initcam2float(float gamu, float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, float &cz, float &aw, float &fl); static void xyz2jchqms_ciecam02( double &J, double &C, double &h, diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 53813f6e4..f4fc7f734 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -26,12 +26,12 @@ namespace { - // "ceil" rounding - template - constexpr T skips(T a, T b) - { - return a / b + static_cast(a % b); - } +// "ceil" rounding +template +constexpr T skips (T a, T b) +{ + return a / b + static_cast (a % b); +} } @@ -41,15 +41,15 @@ namespace rtengine extern const Settings* settings; Crop::Crop (ImProcCoordinator* parent, EditDataProvider *editDataProvider, bool isDetailWindow) - : PipetteBuffer(editDataProvider), origCrop(nullptr), laboCrop(nullptr), labnCrop(nullptr), - cropImg(nullptr), cbuf_real(nullptr), cshmap(nullptr), transCrop(nullptr), cieCrop(nullptr), cbuffer(nullptr), - updating(false), newUpdatePending(false), skip(10), - cropx(0), cropy(0), cropw(-1), croph(-1), - trafx(0), trafy(0), trafw(-1), trafh(-1), - rqcropx(0), rqcropy(0), rqcropw(-1), rqcroph(-1), - borderRequested(32), upperBorder(0), leftBorder(0), - cropAllocated(false), - cropImageListener(nullptr), parent(parent), isDetailWindow(isDetailWindow) + : PipetteBuffer (editDataProvider), origCrop (nullptr), laboCrop (nullptr), labnCrop (nullptr), + cropImg (nullptr), cbuf_real (nullptr), cshmap (nullptr), transCrop (nullptr), cieCrop (nullptr), cbuffer (nullptr), + updating (false), newUpdatePending (false), skip (10), + cropx (0), cropy (0), cropw (-1), croph (-1), + trafx (0), trafy (0), trafw (-1), trafh (-1), + rqcropx (0), rqcropy (0), rqcropw (-1), rqcroph (-1), + borderRequested (32), upperBorder (0), leftBorder (0), + cropAllocated (false), + cropImageListener (nullptr), parent (parent), isDetailWindow (isDetailWindow) { parent->crops.push_back (this); } @@ -57,7 +57,7 @@ Crop::Crop (ImProcCoordinator* parent, EditDataProvider *editDataProvider, bool Crop::~Crop () { - MyMutex::MyLock cropLock(cropMutex); + MyMutex::MyLock cropLock (cropMutex); std::vector::iterator i = std::find (parent->crops.begin(), parent->crops.end(), this); @@ -65,14 +65,14 @@ Crop::~Crop () parent->crops.erase (i); } - MyMutex::MyLock processingLock(parent->mProcessing); + MyMutex::MyLock processingLock (parent->mProcessing); freeAll (); } void Crop::destroy () { - MyMutex::MyLock lock(cropMutex); - MyMutex::MyLock processingLock(parent->mProcessing); + MyMutex::MyLock lock (cropMutex); + MyMutex::MyLock processingLock (parent->mProcessing); freeAll(); } @@ -80,7 +80,7 @@ void Crop::setListener (DetailedCropListener* il) { // We can make reads in the IF, because the mProcessing lock is only needed for change if (cropImageListener != il) { - MyMutex::MyLock lock(cropMutex); + MyMutex::MyLock lock (cropMutex); cropImageListener = il; } } @@ -95,9 +95,9 @@ EditUniqueID Crop::getCurrEditID() * Delete the edit image buffer if there's no subscriber anymore. * If allocation has to be done, it is deferred to Crop::update */ -void Crop::setEditSubscriber(EditSubscriber* newSubscriber) +void Crop::setEditSubscriber (EditSubscriber* newSubscriber) { - MyMutex::MyLock lock(cropMutex); + MyMutex::MyLock lock (cropMutex); // At this point, editCrop.dataProvider->currSubscriber is the old subscriber EditSubscriber *oldSubscriber = PipetteBuffer::dataProvider ? PipetteBuffer::dataProvider->getCurrSubscriber() : nullptr; @@ -123,13 +123,13 @@ void Crop::setEditSubscriber(EditSubscriber* newSubscriber) bool Crop::hasListener() { - MyMutex::MyLock cropLock(cropMutex); + MyMutex::MyLock cropLock (cropMutex); return cropImageListener; } void Crop::update (int todo) { - MyMutex::MyLock cropLock(cropMutex); + MyMutex::MyLock cropLock (cropMutex); ProcParams& params = parent->params; // CropGUIListener* cropgl; @@ -169,9 +169,9 @@ void Crop::update (int todo) bool needstransform = parent->ipf.needsTransform(); if (todo & (M_INIT | M_LINDENOISE)) { - MyMutex::MyLock lock(parent->minit); // Also used in improccoord + MyMutex::MyLock lock (parent->minit); // Also used in improccoord - int tr = getCoarseBitMask(params.coarse); + int tr = getCoarseBitMask (params.coarse); if (!needsinitupdate) { setCropSizes (rqcropx, rqcropy, rqcropw, rqcroph, skip, true); @@ -186,17 +186,17 @@ void Crop::update (int todo) float autoNR = (float) settings->nrauto;// float autoNRmax = (float) settings->nrautomax;// - params.dirpyrDenoise.getCurves(noiseLCurve, noiseCCurve); + params.dirpyrDenoise.getCurves (noiseLCurve, noiseCCurve); int tilesize; int overlap; - if(settings->leveldnti == 0) { + if (settings->leveldnti == 0) { tilesize = 1024; overlap = 128; } - if(settings->leveldnti == 1) { + if (settings->leveldnti == 1) { tilesize = 768; overlap = 96; } @@ -217,35 +217,35 @@ void Crop::update (int todo) int *centerTile_X = new int [numtiles_W]; int *centerTile_Y = new int [numtiles_H]; - for(int cX = 0; cX < numtiles_W; cX++) { + for (int cX = 0; cX < numtiles_W; cX++) { centerTile_X[cX] = tileWskip / 2 + tileWskip * cX; } - for(int cY = 0; cY < numtiles_H; cY++) { + for (int cY = 0; cY < numtiles_H; cY++) { centerTile_Y[cY] = tileHskip / 2 + tileHskip * cY; } - if(settings->leveldnautsimpl == 1) { - if(params.dirpyrDenoise.Cmethod == "MAN" || params.dirpyrDenoise.Cmethod == "PON" ) { + if (settings->leveldnautsimpl == 1) { + if (params.dirpyrDenoise.Cmethod == "MAN" || params.dirpyrDenoise.Cmethod == "PON" ) { PreviewProps pp (trafx, trafy, trafw * skip, trafh * skip, skip); parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.toneCurve, params.icm, params.raw ); } } else { - if(params.dirpyrDenoise.C2method == "MANU") { + if (params.dirpyrDenoise.C2method == "MANU") { PreviewProps pp (trafx, trafy, trafw * skip, trafh * skip, skip); parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.toneCurve, params.icm, params.raw ); } } - if((settings->leveldnautsimpl == 1 && params.dirpyrDenoise.Cmethod == "PRE") || (settings->leveldnautsimpl == 0 && params.dirpyrDenoise.C2method == "PREV")) { + if ((settings->leveldnautsimpl == 1 && params.dirpyrDenoise.Cmethod == "PRE") || (settings->leveldnautsimpl == 0 && params.dirpyrDenoise.C2method == "PREV")) { PreviewProps pp (trafx, trafy, trafw * skip, trafh * skip, skip); parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.toneCurve, params.icm, params.raw ); - if((!isDetailWindow) && parent->adnListener && skip == 1 && params.dirpyrDenoise.enabled) { + if ((!isDetailWindow) && parent->adnListener && skip == 1 && params.dirpyrDenoise.enabled) { float lowdenoise = 1.f; int levaut = settings->leveldnaut; - if(levaut == 1) { //Standard + if (levaut == 1) { //Standard lowdenoise = 0.7f; } @@ -256,16 +256,16 @@ void Crop::update (int todo) int poscenterX = 0; int poscenterY = 0; - for(int cc = 0; cc < numtiles_W; cc++) { - if(abs(centerTile_X[cc] - CenterPreview_X) < minimuX) { - minimuX = abs(centerTile_X[cc] - CenterPreview_X); + for (int cc = 0; cc < numtiles_W; cc++) { + if (abs (centerTile_X[cc] - CenterPreview_X) < minimuX) { + minimuX = abs (centerTile_X[cc] - CenterPreview_X); poscenterX = cc; } } - for(int cc = 0; cc < numtiles_H; cc++) { - if(abs(centerTile_Y[cc] - CenterPreview_Y) < minimuY) { - minimuY = abs(centerTile_Y[cc] - CenterPreview_Y); + for (int cc = 0; cc < numtiles_H; cc++) { + if (abs (centerTile_Y[cc] - CenterPreview_Y) < minimuY) { + minimuY = abs (centerTile_Y[cc] - CenterPreview_Y); poscenterY = cc; } } @@ -273,20 +273,20 @@ void Crop::update (int todo) // printf("TileCX=%d TileCY=%d prevX=%d prevY=%d \n",centerTile_X[poscenterX],centerTile_Y[poscenterY],CenterPreview_X,CenterPreview_Y); int crW; - if(settings->leveldnv == 0) { + if (settings->leveldnv == 0) { crW = 100; } - if(settings->leveldnv == 1) { + if (settings->leveldnv == 1) { crW = 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); + if (settings->leveldnv == 2) { + crW = int (tileWskip / 2); } - if(settings->leveldnv == 3) { + if (settings->leveldnv == 3) { crW = tileWskip - 10; } @@ -308,7 +308,7 @@ void Crop::update (int todo) adjustr = 1.f / 1.2f; } - if(parent->adnListener) { + if (parent->adnListener) { parent->adnListener->noiseTilePrev (centerTile_X[poscenterX], centerTile_Y[poscenterY], CenterPreview_X, CenterPreview_Y, crW, trafw * skip); } @@ -325,15 +325,15 @@ void Crop::update (int todo) int H = origCrop->getHeight(); Imagefloat *provicalc = new Imagefloat ((W + 1) / 2, (H + 1) / 2); //for denoise curves - for(int ii = 0; ii < H; ii += 2) { - for(int jj = 0; jj < W; jj += 2) { - provicalc->r(ii >> 1, jj >> 1) = origCrop->r(ii, jj); - provicalc->g(ii >> 1, jj >> 1) = origCrop->g(ii, jj); - provicalc->b(ii >> 1, jj >> 1) = origCrop->b(ii, jj); + for (int ii = 0; ii < H; ii += 2) { + for (int jj = 0; jj < W; jj += 2) { + provicalc->r (ii >> 1, jj >> 1) = origCrop->r (ii, jj); + provicalc->g (ii >> 1, jj >> 1) = origCrop->g (ii, jj); + provicalc->b (ii >> 1, jj >> 1) = origCrop->b (ii, jj); } } - parent->imgsrc->convertColorSpace(provicalc, params.icm, parent->currWB);//for denoise luminance curve + parent->imgsrc->convertColorSpace (provicalc, params.icm, parent->currWB); //for denoise luminance curve float maxr = 0.f; float maxb = 0.f; @@ -347,19 +347,19 @@ void Crop::update (int todo) maxblueaut = 0.f; minredaut = 0.f; minblueaut = 0.f; - LUTf gamcurve(65536, 0); + 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(origCrop, provicalc, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, parent->imgsrc->getDirPyrDenoiseExpComp(), chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc, true); + parent->ipf.RGB_denoise_infoGamCurve (params.dirpyrDenoise, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope); + parent->ipf.RGB_denoise_info (origCrop, provicalc, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, parent->imgsrc->getDirPyrDenoiseExpComp(), chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc, true); // 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()) { + 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 maxmax = max (maxredaut, maxblueaut); float delta; int mode = 0; // float redyel, skinc, nsknc; @@ -367,18 +367,18 @@ void Crop::update (int todo) parent->ipf.calcautodn_info (chaut, delta, Nb, levaut, maxmax, lumema, chromina, mode, lissage, redyel, skinc, nsknc); - if(maxredaut > maxblueaut) { + if (maxredaut > maxblueaut) { // maxr=(maxredaut-chaut)/((autoNRmax*multip*adjustr)/2.f); maxr = (delta) / ((autoNRmax * multip * adjustr * lowdenoise) / 2.f); - if(minblueaut <= minredaut && minblueaut < chaut) { + 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) { + if (minredaut <= minblueaut && minredaut < chaut) { maxr = (-chaut + minredaut) / (autoNRmax * multip * adjustr * lowdenoise); } }//maxb mxr - empirical evaluation red / blue @@ -387,31 +387,31 @@ void Crop::update (int todo) 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); + parent->adnListener->chromaChanged (params.dirpyrDenoise.chroma, params.dirpyrDenoise.redchro, params.dirpyrDenoise.bluechro); delete provicalc; } } - if(skip == 1 && params.dirpyrDenoise.enabled && !parent->denoiseInfoStore.valid && ((settings->leveldnautsimpl == 1 && params.dirpyrDenoise.Cmethod == "AUT") || (settings->leveldnautsimpl == 0 && params.dirpyrDenoise.C2method == "AUTO"))) { + if (skip == 1 && params.dirpyrDenoise.enabled && !parent->denoiseInfoStore.valid && ((settings->leveldnautsimpl == 1 && params.dirpyrDenoise.Cmethod == "AUT") || (settings->leveldnautsimpl == 0 && params.dirpyrDenoise.C2method == "AUTO"))) { MyTime t1aue, t2aue; t1aue.set(); int crW = 100; // settings->leveldnv == 0 int crH = 100; // settings->leveldnv == 0 - if(settings->leveldnv == 1) { + 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 == 2) { + crW = int (tileWskip / 2); + crH = int (tileHskip / 2); } - if(settings->leveldnv == 3) { + if (settings->leveldnv == 3) { crW = tileWskip - 10; crH = tileHskip - 10; } @@ -419,13 +419,13 @@ void Crop::update (int todo) float lowdenoise = 1.f; int levaut = settings->leveldnaut; - if(levaut == 1) { //Standard + if (levaut == 1) { //Standard lowdenoise = 0.7f; } - LUTf gamcurve(65536, 0); + 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_infoGamCurve (params.dirpyrDenoise, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope); int Nb[9]; #ifdef _OPENMP #pragma omp parallel @@ -448,26 +448,26 @@ void Crop::update (int todo) #pragma omp for schedule(dynamic) collapse(2) nowait #endif - for(int wcr = 0; wcr <= 2; wcr++) { - for(int hcr = 0; hcr <= 2; hcr++) { - PreviewProps ppP (coordW[wcr] , coordH[hcr], crW, crH, 1); + for (int wcr = 0; wcr <= 2; wcr++) { + for (int hcr = 0; hcr <= 2; hcr++) { + PreviewProps ppP (coordW[wcr], coordH[hcr], crW, crH, 1); parent->imgsrc->getImage (parent->currWB, tr, origCropPart, ppP, params.toneCurve, params.icm, params.raw ); // we only need image reduced to 1/4 here - for(int ii = 0; ii < crH; ii += 2) { - for(int jj = 0; jj < crW; jj += 2) { - provicalc->r(ii >> 1, jj >> 1) = origCropPart->r(ii, jj); - provicalc->g(ii >> 1, jj >> 1) = origCropPart->g(ii, jj); - provicalc->b(ii >> 1, jj >> 1) = origCropPart->b(ii, jj); + for (int ii = 0; ii < crH; ii += 2) { + for (int jj = 0; jj < crW; jj += 2) { + provicalc->r (ii >> 1, jj >> 1) = origCropPart->r (ii, jj); + provicalc->g (ii >> 1, jj >> 1) = origCropPart->g (ii, jj); + provicalc->b (ii >> 1, jj >> 1) = origCropPart->b (ii, jj); } } - parent->imgsrc->convertColorSpace(provicalc, params.icm, parent->currWB);//for denoise luminance curve + parent->imgsrc->convertColorSpace (provicalc, params.icm, parent->currWB); //for denoise luminance curve 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, 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; - parent->ipf.RGB_denoise_info(origCropPart, provicalc, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, parent->imgsrc->getDirPyrDenoiseExpComp(), chaut, nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc); + parent->ipf.RGB_denoise_info (origCropPart, provicalc, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, parent->imgsrc->getDirPyrDenoiseExpComp(), chaut, nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, 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; @@ -506,7 +506,7 @@ void Crop::update (int todo) float multip = 1.f; - if(!parent->imgsrc->isRAW()) { + if (!parent->imgsrc->isRAW()) { multip = 2.f; //take into account gamma for TIF / JPG approximate value...not good fot gamma=1 } @@ -533,15 +533,15 @@ void Crop::update (int todo) int lissage = settings->leveldnliss; for (int k = 0; k < 9; k++) { - float maxmax = max(parent->denoiseInfoStore.max_r[k], parent->denoiseInfoStore.max_b[k]); + float maxmax = max (parent->denoiseInfoStore.max_r[k], parent->denoiseInfoStore.max_b[k]); parent->ipf.calcautodn_info (parent->denoiseInfoStore.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++) { - if(parent->denoiseInfoStore.max_r[k] > parent->denoiseInfoStore.max_b[k]) { + if (parent->denoiseInfoStore.max_r[k] > parent->denoiseInfoStore.max_b[k]) { Max_R[k] = (delta[k]) / ((autoNRmax * multip * adjustr * lowdenoise) / 2.f); - Min_B[k] = -(parent->denoiseInfoStore.ch_M[k] - min_b[k]) / (autoNRmax * multip * adjustr * lowdenoise); + Min_B[k] = - (parent->denoiseInfoStore.ch_M[k] - min_b[k]) / (autoNRmax * multip * adjustr * lowdenoise); Max_B[k] = 0.f; Min_R[k] = 0.f; } else { @@ -560,19 +560,19 @@ void Crop::update (int todo) MinRMoy += Min_R[k]; MinBMoy += Min_B[k]; - if(Max_R[k] > MaxR) { + if (Max_R[k] > MaxR) { MaxR = Max_R[k]; } - if(Max_B[k] > MaxB) { + if (Max_B[k] > MaxB) { MaxB = Max_B[k]; } - if(Min_R[k] < MinR) { + if (Min_R[k] < MinR) { MinR = Min_R[k]; } - if(Min_B[k] < MinB) { + if (Min_B[k] < MinB) { MinB = Min_B[k]; } } @@ -583,7 +583,7 @@ void Crop::update (int todo) MinBMoy /= 9; MinRMoy /= 9; - if(MaxR > MaxB) { + if (MaxR > MaxB) { maxr = MaxRMoy + (MaxR - MaxRMoy) * 0.66f; //#std Dev //maxb=MinB; maxb = MinBMoy + (MinB - MinBMoy) * 0.66f; @@ -597,55 +597,56 @@ void Crop::update (int todo) params.dirpyrDenoise.redchro = maxr; params.dirpyrDenoise.bluechro = maxb; parent->denoiseInfoStore.valid = true; - 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(); - printf("Info denoise auto performed in %d usec:\n", t2aue.etime(t1aue)); + printf ("Info denoise auto performed in %d usec:\n", t2aue.etime (t1aue)); } //end evaluate noise } // if(params.dirpyrDenoise.Cmethod=="AUT" || params.dirpyrDenoise.Cmethod=="PON") {//reinit origCrop after Auto - if((settings->leveldnautsimpl == 1 && params.dirpyrDenoise.Cmethod == "AUT") || (settings->leveldnautsimpl == 0 && params.dirpyrDenoise.C2method == "AUTO")) { //reinit origCrop after Auto + if ((settings->leveldnautsimpl == 1 && params.dirpyrDenoise.Cmethod == "AUT") || (settings->leveldnautsimpl == 0 && params.dirpyrDenoise.C2method == "AUTO")) { //reinit origCrop after Auto PreviewProps pp (trafx, trafy, trafw * skip, trafh * skip, skip); parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.toneCurve, params.icm, params.raw ); } DirPyrDenoiseParams denoiseParams = params.dirpyrDenoise; - if(params.dirpyrDenoise.Lmethod == "CUR") { - if(noiseLCurve) { + if (params.dirpyrDenoise.Lmethod == "CUR") { + if (noiseLCurve) { denoiseParams.luma = 0.5f; //very small value to init process - select curve or slider } else { denoiseParams.luma = 0.0f; } - } else if(denoiseParams.Lmethod == "SLI") { + } else if (denoiseParams.Lmethod == "SLI") { noiseLCurve.Reset(); } - if((noiseLCurve || noiseCCurve ) && skip == 1 && denoiseParams.enabled) { //only allocate memory if enabled and skip + if ((noiseLCurve || noiseCCurve ) && skip == 1 && denoiseParams.enabled) { //only allocate memory if enabled and skip // we only need image reduced to 1/4 here int W = origCrop->getWidth(); int H = origCrop->getHeight(); calclum = new Imagefloat ((W + 1) / 2, (H + 1) / 2); //for denoise curves - for(int ii = 0; ii < H; ii += 2) { - for(int jj = 0; jj < W; jj += 2) { - calclum->r(ii >> 1, jj >> 1) = origCrop->r(ii, jj); - calclum->g(ii >> 1, jj >> 1) = origCrop->g(ii, jj); - calclum->b(ii >> 1, jj >> 1) = origCrop->b(ii, jj); + for (int ii = 0; ii < H; ii += 2) { + for (int jj = 0; jj < W; jj += 2) { + calclum->r (ii >> 1, jj >> 1) = origCrop->r (ii, jj); + calclum->g (ii >> 1, jj >> 1) = origCrop->g (ii, jj); + calclum->b (ii >> 1, jj >> 1) = origCrop->b (ii, jj); } } - parent->imgsrc->convertColorSpace(calclum, params.icm, parent->currWB);//for denoise luminance curve + parent->imgsrc->convertColorSpace (calclum, params.icm, parent->currWB); //for denoise luminance curve } - if(skip != 1) if(parent->adnListener) { - parent->adnListener->noiseChanged(0.f, 0.f); + if (skip != 1) if (parent->adnListener) { + parent->adnListener->noiseChanged (0.f, 0.f); } if (todo & M_LINDENOISE) { @@ -653,26 +654,26 @@ void Crop::update (int todo) int kall = 0; float chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi; - parent->ipf.RGB_denoise(kall, origCrop, origCrop, calclum, parent->denoiseInfoStore.ch_M, parent->denoiseInfoStore.max_r, parent->denoiseInfoStore.max_b, parent->imgsrc->isRAW(), /*Roffset,*/ denoiseParams, parent->imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, noiseCCurve, chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi); + parent->ipf.RGB_denoise (kall, origCrop, origCrop, calclum, parent->denoiseInfoStore.ch_M, parent->denoiseInfoStore.max_r, parent->denoiseInfoStore.max_b, parent->imgsrc->isRAW(), /*Roffset,*/ denoiseParams, parent->imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, noiseCCurve, chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi); if (parent->adnListener) { - parent->adnListener->noiseChanged(nresi, highresi); + parent->adnListener->noiseChanged (nresi, highresi); } if (settings->leveldnautsimpl == 1) { if ((denoiseParams.Cmethod == "AUT" || denoiseParams.Cmethod == "PRE") && (parent->adnListener)) { // force display value of sliders - parent->adnListener->chromaChanged(denoiseParams.chroma, denoiseParams.redchro, denoiseParams.bluechro); + parent->adnListener->chromaChanged (denoiseParams.chroma, denoiseParams.redchro, denoiseParams.bluechro); } } else { - if((denoiseParams.C2method == "AUTO" || denoiseParams.C2method == "PREV") && (parent->adnListener)) { // force display value of sliders - parent->adnListener->chromaChanged(denoiseParams.chroma, denoiseParams.redchro, denoiseParams.bluechro); + if ((denoiseParams.C2method == "AUTO" || denoiseParams.C2method == "PREV") && (parent->adnListener)) { // force display value of sliders + parent->adnListener->chromaChanged (denoiseParams.chroma, denoiseParams.redchro, denoiseParams.bluechro); } } } } - parent->imgsrc->convertColorSpace(origCrop, params.icm, parent->currWB); + parent->imgsrc->convertColorSpace (origCrop, params.icm, parent->currWB); delete [] min_r; delete [] min_b; @@ -687,7 +688,7 @@ void Crop::update (int todo) } // has to be called after setCropSizes! Tools prior to this point can't handle the Edit mechanism, but that shouldn't be a problem. - createBuffer(cropw, croph); + createBuffer (cropw, croph); // transform if (needstransform || ((todo & (M_TRANSFORM | M_RGBCURVE)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled)) { @@ -696,13 +697,14 @@ void Crop::update (int todo) } if (needstransform) - parent->ipf.transform (baseCrop, transCrop, cropx / skip, cropy / skip, trafx / skip, trafy / skip, skips(parent->fw, skip), skips(parent->fh, skip), parent->getFullWidth(), parent->getFullHeight(), + parent->ipf.transform (baseCrop, transCrop, cropx / skip, cropy / skip, trafx / skip, trafy / skip, skips (parent->fw, skip), skips (parent->fh, skip), parent->getFullWidth(), parent->getFullHeight(), parent->imgsrc->getMetaData()->getFocalLen(), parent->imgsrc->getMetaData()->getFocalLen35mm(), parent->imgsrc->getMetaData()->getFocusDist(), parent->imgsrc->getMetaData()->getFNumber(), parent->imgsrc->getRotateDegree(), false); - else - baseCrop->copyData(transCrop); + else { + baseCrop->copyData (transCrop); + } if (transCrop) { baseCrop = transCrop; @@ -719,29 +721,29 @@ void Crop::update (int todo) const int W = baseCrop->getWidth(); const int H = baseCrop->getHeight(); - LabImage labcbdl(W, H); - parent->ipf.rgb2lab(*baseCrop, labcbdl, params.icm.working); + LabImage labcbdl (W, H); + parent->ipf.rgb2lab (*baseCrop, labcbdl, params.icm.working); parent->ipf.dirpyrequalizer (&labcbdl, skip); - parent->ipf.lab2rgb(labcbdl, *baseCrop, params.icm.working); + parent->ipf.lab2rgb (labcbdl, *baseCrop, params.icm.working); } // blurmap for shadow & highlights if ((todo & M_BLURMAP) && params.sh.enabled) { - double radius = sqrt (double(skips(parent->fw, skip) * skips(parent->fw, skip) + skips(parent->fh, skip) * skips(parent->fh, skip))) / 2.0; + double radius = sqrt (double (skips (parent->fw, skip) * skips (parent->fw, skip) + skips (parent->fh, skip) * skips (parent->fh, skip))) / 2.0; double shradius = params.sh.radius; if (!params.sh.hq) { shradius *= radius / 1800.0; } - if(!cshmap) { + if (!cshmap) { cshmap = new SHMap (cropw, croph, true); } cshmap->update (baseCrop, shradius, parent->ipf.lumimul, params.sh.hq, skip); - if(parent->shmap->min_f < 65535.f) { // don't call forceStat with wrong values + if (parent->shmap->min_f < 65535.f) { // don't call forceStat with wrong values cshmap->forceStat (parent->shmap->max_f, parent->shmap->min_f, parent->shmap->avg); } } @@ -763,11 +765,11 @@ void Crop::update (int todo) if (todo & M_RGBCURVE) { double rrm, ggm, bbm; DCPProfile::ApplyState as; - DCPProfile *dcpProf = parent->imgsrc->getDCP(params.icm, parent->currWB, as); + DCPProfile *dcpProf = parent->imgsrc->getDCP (params.icm, parent->currWB, as); LUTu histToneCurve; parent->ipf.rgbProc (baseCrop, laboCrop, this, parent->hltonecurve, parent->shtonecurve, parent->tonecurve, cshmap, - params.toneCurve.saturation, parent->rCurve, parent->gCurve, parent->bCurve, parent->colourToningSatLimit , parent->colourToningSatLimitOpacity, parent->ctColorCurve, parent->ctOpacityCurve, parent->opautili, parent->clToningcurve, parent->cl2Toningcurve, + params.toneCurve.saturation, parent->rCurve, parent->gCurve, parent->bCurve, parent->colourToningSatLimit, parent->colourToningSatLimitOpacity, parent->ctColorCurve, parent->ctOpacityCurve, parent->opautili, parent->clToningcurve, parent->cl2Toningcurve, parent->customToneCurve1, parent->customToneCurve2, parent->beforeToneCurveBW, parent->afterToneCurveBW, rrm, ggm, bbm, parent->bwAutoR, parent->bwAutoG, parent->bwAutoB, dcpProf, as, histToneCurve); } @@ -791,7 +793,7 @@ void Crop::update (int todo) // apply luminance operations if (todo & (M_LUMINANCE + M_COLOR)) { //I made a little change here. Rather than have luminanceCurve (and others) use in/out lab images, we can do more if we copy right here. - labnCrop->CopyFrom(laboCrop); + labnCrop->CopyFrom (laboCrop); //parent->ipf.luminanceCurve (labnCrop, labnCrop, parent->lumacurve); @@ -808,24 +810,24 @@ void Crop::update (int todo) parent->ipf.chromiLuminanceCurve (this, 1, labnCrop, labnCrop, parent->chroma_acurve, parent->chroma_bcurve, parent->satcurve, parent->lhskcurve, parent->clcurve, parent->lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy); parent->ipf.vibrance (labnCrop); - if((params.colorappearance.enabled && !params.colorappearance.tonecie) || (!params.colorappearance.enabled)) { - parent->ipf.EPDToneMap(labnCrop, 5, skip); + if ((params.colorappearance.enabled && !params.colorappearance.tonecie) || (!params.colorappearance.enabled)) { + parent->ipf.EPDToneMap (labnCrop, 5, skip); } //parent->ipf.EPDToneMap(labnCrop, 5, 1); //Go with much fewer than normal iterates for fast redisplay. // for all treatments Defringe, Sharpening, Contrast detail , Microcontrast they are activated if "CIECAM" function are disabled if (skip == 1) { - if((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { + if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { parent->ipf.impulsedenoise (labnCrop); } - if((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled) ) { + if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled) ) { parent->ipf.defringe (labnCrop); } parent->ipf.MLsharpen (labnCrop); - if((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { + if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { parent->ipf.MLmicrocontrast (labnCrop); parent->ipf.sharpening (labnCrop, (float**)cbuffer, params.sharpening); } @@ -834,46 +836,46 @@ void Crop::update (int todo) // if (skip==1) { WaveletParams WaveParams = params.wavelet; - if(params.dirpyrequalizer.cbdlMethod == "aft") { - if(((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled))) { + if (params.dirpyrequalizer.cbdlMethod == "aft") { + if (((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled))) { parent->ipf.dirpyrequalizer (labnCrop, skip); // parent->ipf.Lanczoslab (labnCrop,labnCrop , 1.f/skip); } } int kall = 0; - int minwin = min(labnCrop->W, labnCrop->H); + int minwin = min (labnCrop->W, labnCrop->H); int maxlevelcrop = 10; // if(cp.mul[9]!=0)maxlevelcrop=10; // adap maximum level wavelet to size of crop - if(minwin * skip < 1024) { + if (minwin * skip < 1024) { maxlevelcrop = 9; //sampling wavelet 512 } - if(minwin * skip < 512) { + if (minwin * skip < 512) { maxlevelcrop = 8; //sampling wavelet 256 } - if(minwin * skip < 256) { + if (minwin * skip < 256) { maxlevelcrop = 7; //sampling 128 } - if(minwin * skip < 128) { + if (minwin * skip < 128) { maxlevelcrop = 6; } - if(minwin < 64) { + if (minwin < 64) { maxlevelcrop = 5; } int realtile; - if(params.wavelet.Tilesmethod == "big") { + if (params.wavelet.Tilesmethod == "big") { realtile = 22; } - if(params.wavelet.Tilesmethod == "lit") { + if (params.wavelet.Tilesmethod == "lit") { realtile = 12; } @@ -885,32 +887,32 @@ void Crop::update (int todo) parent->ipf.Tile_calc (tilesize, overlap, kall, labnCrop->W, labnCrop->H, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip); //now we have tile dimensions, overlaps //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - int minsizetile = min(tilewidth, tileheight); + int minsizetile = min (tilewidth, tileheight); int maxlev2 = 10; - if(minsizetile < 1024 && maxlevelcrop == 10) { + if (minsizetile < 1024 && maxlevelcrop == 10) { maxlev2 = 9; } - if(minsizetile < 512) { + if (minsizetile < 512) { maxlev2 = 8; } - if(minsizetile < 256) { + if (minsizetile < 256) { maxlev2 = 7; } - if(minsizetile < 128) { + if (minsizetile < 128) { maxlev2 = 6; } - int maxL = min(maxlev2, maxlevelcrop); + int maxL = min (maxlev2, maxlevelcrop); - if(parent->awavListener) { - parent->awavListener->wavChanged(float(maxL)); + if (parent->awavListener) { + parent->awavListener->wavChanged (float (maxL)); } - if((params.wavelet.enabled)) { + if ((params.wavelet.enabled)) { WavCurve wavCLVCurve; WavOpacityCurveRG waOpacityCurveRG; WavOpacityCurveBY waOpacityCurveBY; @@ -919,35 +921,35 @@ void Crop::update (int todo) LUTf wavclCurve; LUTu dummy; - params.wavelet.getCurves(wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); + params.wavelet.getCurves (wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); - parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, wavcontlutili, skip); + parent->ipf.ip_wavelet (labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, wavcontlutili, skip); } // } // } - if(params.colorappearance.enabled) { + if (params.colorappearance.enabled) { float fnum = parent->imgsrc->getMetaData()->getFNumber (); // F number float fiso = parent->imgsrc->getMetaData()->getISOSpeed () ; // ISO float fspeed = parent->imgsrc->getMetaData()->getShutterSpeed () ; // Speed double fcomp = parent->imgsrc->getMetaData()->getExpComp (); // Compensation +/- double adap; // Scene's luminosity adaptation factor - if(fnum < 0.3f || fiso < 5.f || fspeed < 0.00001f) { //if no exif data or wrong + if (fnum < 0.3f || fiso < 5.f || fspeed < 0.00001f) { //if no exif data or wrong adap = 2000.; } else { - double E_V = fcomp + log2 (double((fnum * fnum) / fspeed / (fiso / 100.f))); + double E_V = fcomp + log2 (double ((fnum * fnum) / fspeed / (fiso / 100.f))); E_V += params.toneCurve.expcomp;// exposure compensation in tonecurve ==> direct EV - E_V += log2(params.raw.expos);// exposure raw white point ; log2 ==> linear to EV - adap = pow(2., E_V - 3.); // cd / m2 + E_V += log2 (params.raw.expos); // exposure raw white point ; log2 ==> linear to EV + adap = pow (2., E_V - 3.); // cd / m2 // end calculation adaptation scene luminosity } int begh = 0, endh = labnCrop->H; bool execsharp = false; - if(skip == 1) { + if (skip == 1) { execsharp = true; } @@ -955,10 +957,10 @@ void Crop::update (int todo) cieCrop = new CieImage (cropw, croph); } - if(settings->ciecamfloat) { - float d; // not used after this block - parent->ipf.ciecam_02float (cieCrop, float(adap), begh, endh, 1, 2, labnCrop, ¶ms, parent->customColCurve1, parent->customColCurve2, parent->customColCurve3, - dummy, dummy, parent->CAMBrightCurveJ, parent->CAMBrightCurveQ, parent->CAMMean, 5, skip, execsharp, d, 1); + if (settings->ciecamfloat) { + float d, dj; // not used after this block + parent->ipf.ciecam_02float (cieCrop, float (adap), begh, endh, 1, 2, labnCrop, ¶ms, parent->customColCurve1, parent->customColCurve2, parent->customColCurve3, + dummy, dummy, parent->CAMBrightCurveJ, parent->CAMBrightCurveQ, parent->CAMMean, 5, skip, execsharp, d, dj, 1); } else { double dd; // not used after this block @@ -1074,13 +1076,15 @@ void Crop::freeAll () } -namespace { +namespace +{ -bool check_need_larger_crop_for_lcp_distortion(int fw, int fh, int x, int y, int w, int h, const ProcParams ¶ms) +bool check_need_larger_crop_for_lcp_distortion (int fw, int fh, int x, int y, int w, int h, const ProcParams ¶ms) { if (x == 0 && y == 0 && w == fw && h == fh) { return false; } + return (params.lensProf.lcpFile.length() > 0 && params.lensProf.useDist); } @@ -1110,12 +1114,12 @@ bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool inte rqcroph = rch; // store and set requested crop size - int rqx1 = LIM(rqcropx, 0, parent->fullw - 1); - int rqy1 = LIM(rqcropy, 0, parent->fullh - 1); + int rqx1 = LIM (rqcropx, 0, parent->fullw - 1); + int rqy1 = LIM (rqcropy, 0, parent->fullh - 1); int rqx2 = rqx1 + rqcropw - 1; int rqy2 = rqy1 + rqcroph - 1; - rqx2 = LIM(rqx2, 0, parent->fullw - 1); - rqy2 = LIM(rqy2, 0, parent->fullh - 1); + rqx2 = LIM (rqx2, 0, parent->fullw - 1); + rqy2 = LIM (rqy2, 0, parent->fullh - 1); this->skip = skip; @@ -1125,10 +1129,10 @@ bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool inte int bx2 = rqx2 + skip * borderRequested; int by2 = rqy2 + skip * borderRequested; // clip it to fit into image area - bx1 = LIM(bx1, 0, parent->fullw - 1); - by1 = LIM(by1, 0, parent->fullh - 1); - bx2 = LIM(bx2, 0, parent->fullw - 1); - by2 = LIM(by2, 0, parent->fullh - 1); + bx1 = LIM (bx1, 0, parent->fullw - 1); + by1 = LIM (by1, 0, parent->fullh - 1); + bx2 = LIM (bx2, 0, parent->fullw - 1); + by2 = LIM (by2, 0, parent->fullh - 1); int bw = bx2 - bx1 + 1; int bh = by2 - by1 + 1; @@ -1142,34 +1146,39 @@ bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool inte parent->ipf.transCoord (parent->fw, parent->fh, bx1, by1, bw, bh, orx, ory, orw, orh); - if (check_need_larger_crop_for_lcp_distortion(parent->fw, parent->fh, orx, ory, orw, orh, parent->params)) { + if (check_need_larger_crop_for_lcp_distortion (parent->fw, parent->fh, orx, ory, orw, orh, parent->params)) { // TODO - this is an estimate of the max distortion relative to the image size. ATM it is hardcoded to be 15%, which seems enough. If not, need to revise - int dW = int(double(parent->fw) * 0.15 / (2 * skip)); - int dH = int(double(parent->fh) * 0.15 / (2 * skip)); + int dW = int (double (parent->fw) * 0.15 / (2 * skip)); + int dH = int (double (parent->fh) * 0.15 / (2 * skip)); int x1 = orx - dW; int x2 = orx + orw + dW; int y1 = ory - dH; int y2 = ory + orh + dH; + if (x1 < 0) { x2 += -x1; x1 = 0; } + if (x2 > parent->fw) { x1 -= x2 - parent->fw; x2 = parent->fw; } + if (y1 < 0) { y2 += -y1; y1 = 0; } + if (y2 > parent->fh) { y1 -= y2 - parent->fh; y2 = parent->fh; } - orx = max(x1, 0); - ory = max(y1, 0); - orw = min(x2 - x1, parent->fw - orx); - orh = min(y2 - y1, parent->fh - ory); + + orx = max (x1, 0); + ory = max (y1, 0); + orw = min (x2 - x1, parent->fw - orx); + orh = min (y2 - y1, parent->fh - ory); } @@ -1180,17 +1189,18 @@ bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool inte trafx = orx; trafy = ory; - int cw = skips(bw, skip); - int ch = skips(bh, skip); + int cw = skips (bw, skip); + int ch = skips (bh, skip); - leftBorder = skips(rqx1 - bx1, skip); - upperBorder = skips(rqy1 - by1, skip); + leftBorder = skips (rqx1 - bx1, skip); + upperBorder = skips (rqy1 - by1, skip); if (settings->verbose) { printf ("setsizes starts (%d, %d, %d, %d, %d, %d)\n", orW, orH, trafw, trafh, cw, ch); } EditType editType = ET_PIPETTE; + if (const auto editProvider = PipetteBuffer::getDataProvider ()) { if (const auto editSubscriber = editProvider->getCurrSubscriber ()) { editType = editSubscriber->getEditingType (); @@ -1208,11 +1218,11 @@ bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool inte origCrop = new Imagefloat; } - origCrop->allocate(trafw, trafh); // Resizing the buffer (optimization) + origCrop->allocate (trafw, trafh); // Resizing the buffer (optimization) // if transCrop doesn't exist yet, it'll be created where necessary if (transCrop) { - transCrop->allocate(cropw, croph); + transCrop->allocate (cropw, croph); } if (laboCrop) { @@ -1231,7 +1241,7 @@ bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool inte cropImg = new Image8; } - cropImg->allocate(cropw, croph); // Resizing the buffer (optimization) + cropImg->allocate (cropw, croph); // Resizing the buffer (optimization) //cieCrop is only used in Crop::update, it is destroyed now but will be allocated on first use if (cieCrop) { @@ -1253,18 +1263,18 @@ bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool inte } cbuffer = new float*[croph]; - cbuf_real = new float[(croph + 2)*cropw]; + cbuf_real = new float[ (croph + 2)*cropw]; for (int i = 0; i < croph; i++) { cbuffer[i] = cbuf_real + cropw * i + cropw; } - if(params.sh.enabled) { + if (params.sh.enabled) { cshmap = new SHMap (cropw, croph, true); } if (editType == ET_PIPETTE) { - PipetteBuffer::resize(cropw, croph); + PipetteBuffer::resize (cropw, croph); } else if (PipetteBuffer::bufferCreated()) { PipetteBuffer::flush(); } @@ -1352,19 +1362,19 @@ void Crop::fullUpdate () int Crop::get_skip() { - MyMutex::MyLock lock(cropMutex); + MyMutex::MyLock lock (cropMutex); return skip; } int Crop::getLeftBorder() { - MyMutex::MyLock lock(cropMutex); + MyMutex::MyLock lock (cropMutex); return leftBorder; } int Crop::getUpperBorder() { - MyMutex::MyLock lock(cropMutex); + MyMutex::MyLock lock (cropMutex); return upperBorder; } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index e7a611f0b..e3ee91540 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -746,7 +746,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) int begh = 0; int endh = pH; - float d; + float d, dj; bool execsharp = false; if(!ncie) { @@ -766,10 +766,10 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) CAMBrightCurveJ.dirty = true; CAMBrightCurveQ.dirty = true; - ipf.ciecam_02float (ncie, float(adap), begh, endh, pW, 2, nprevl, ¶ms, customColCurve1, customColCurve2, customColCurve3, histLCAM, histCCAM, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, scale, execsharp, d, 1); + ipf.ciecam_02float (ncie, float(adap), begh, endh, pW, 2, nprevl, ¶ms, customColCurve1, customColCurve2, customColCurve3, histLCAM, histCCAM, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, scale, execsharp, d, dj, 1); if(params.colorappearance.autodegree && acListener && params.colorappearance.enabled) { - acListener->autoCamChanged(100.*(double)d); + acListener->autoCamChanged(100.*(double)d, 100.*(double)dj); } if(params.colorappearance.autoadapscen && acListener && params.colorappearance.enabled) { diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index b5e555a1f..d03ceca2c 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -1468,7 +1468,7 @@ void ImProcFunctions::ciecam_02 (CieImage* ncie, double adap, int begh, int endh // Copyright (c) 2012 Jacques Desmis void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int endh, int pW, int pwb, LabImage* lab, const ProcParams* params, const ColorAppearance & customColCurve1, const ColorAppearance & customColCurve2, const ColorAppearance & customColCurve3, - LUTu & histLCAM, LUTu & histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, float &d, int rtt) + LUTu & histLCAM, LUTu & histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, float &d, float &dj, int rtt) { if (params->colorappearance.enabled) { @@ -1630,6 +1630,9 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int const float deg = (params->colorappearance.degree) / 100.0f; const float pilot = params->colorappearance.autodegree ? 2.0f : deg; + const float degout = (params->colorappearance.degreeout) / 100.0f; + const float pilotout = params->colorappearance.autodegreeout ? 2.0f : degout; + //algoritm's params float chr = 0.f; @@ -1860,8 +1863,8 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int float cz, wh, pfl; Ciecam02::initcam1float (gamu, yb, pilot, f, la, xw, yw, zw, n, d, nbb, ncb, cz, aw, wh, pfl, fl, c); const float pow1 = pow_F ( 1.64f - pow_F ( 0.29f, n ), 0.73f ); - float nj, dj, nbbj, ncbj, czj, awj, flj; - Ciecam02::initcam2float (gamu, yb2, f2, la2, xw2, yw2, zw2, nj, dj, nbbj, ncbj, czj, awj, flj); + float nj, nbbj, ncbj, czj, awj, flj; + Ciecam02::initcam2float (gamu, yb2, pilotout, f2, la2, xw2, yw2, zw2, nj, dj, nbbj, ncbj, czj, awj, flj); const float reccmcz = 1.f / (c2 * czj); const float pow1n = pow_F ( 1.64f - pow_F ( 0.29f, nj ), 0.73f ); diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 9167af5be..6f8307141 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -226,7 +226,7 @@ public: void luminanceCurve (LabImage* lold, LabImage* lnew, LUTf &curve); void ciecam_02float (CieImage* ncie, float adap, int begh, int endh, int pW, int pwb, LabImage* lab, const ProcParams* params, const ColorAppearance & customColCurve1, const ColorAppearance & customColCurve, const ColorAppearance & customColCurve3, - LUTu &histLCAM, LUTu &histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, float &d, int rtt); + LUTu &histLCAM, LUTu &histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, float &d, float &dj, int rtt); void ciecam_02 (CieImage* ncie, double adap, int begh, int endh, int pW, int pwb, LabImage* lab, const ProcParams* params, const ColorAppearance & customColCurve1, const ColorAppearance & customColCurve, const ColorAppearance & customColCurve3, LUTu &histLCAM, LUTu &histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, double &d, int rtt); diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 9e515f55c..5070a9b0d 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -505,6 +505,8 @@ enum ProcEvent { EvCATtempout = 475, EvCATgreenout = 476, EvCATybout = 477, + EvCATDegreeout = 478, + EvCATAutoDegreeout = 479, NUMOFEVENTS diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 93571122f..a16703f5a 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1118,6 +1118,8 @@ void ProcParams::setDefaults () colorappearance.enabled = false; colorappearance.degree = 90; colorappearance.autodegree = true; + colorappearance.degreeout = 90; + colorappearance.autodegreeout = true; colorappearance.surround = "Average"; colorappearance.adaplum = 16; colorappearance.badpixsl = 0; @@ -2058,6 +2060,14 @@ int ProcParams::save (const Glib::ustring &fname, const Glib::ustring &fname2, b keyFile.set_boolean ("Color appearance", "AutoDegree", colorappearance.autodegree); } + if (!pedited || pedited->colorappearance.degreeout) { + keyFile.set_integer ("Color appearance", "Degreeout", colorappearance.degreeout); + } + + if (!pedited || pedited->colorappearance.autodegreeout) { + keyFile.set_boolean ("Color appearance", "AutoDegreeout", colorappearance.autodegreeout); + } + if (!pedited || pedited->colorappearance.surround) { keyFile.set_string ("Color appearance", "Surround", colorappearance.surround); } @@ -4937,6 +4947,22 @@ int ProcParams::load (const Glib::ustring &fname, ParamsEdited* pedited) } } + if (keyFile.has_key ("Color appearance", "Degreeout")) { + colorappearance.degreeout = keyFile.get_integer ("Color appearance", "Degreeout"); + + if (pedited) { + pedited->colorappearance.degreeout = true; + } + } + + if (keyFile.has_key ("Color appearance", "AutoDegreeout")) { + colorappearance.autodegreeout = keyFile.get_boolean ("Color appearance", "AutoDegreeout"); + + if (pedited) { + pedited->colorappearance.autodegreeout = true; + } + } + if (keyFile.has_key ("Color appearance", "Surround")) { colorappearance.surround = keyFile.get_string ("Color appearance", "Surround"); @@ -8211,6 +8237,8 @@ bool ProcParams::operator== (const ProcParams& other) && colorappearance.enabled == other.colorappearance.enabled && colorappearance.degree == other.colorappearance.degree && colorappearance.autodegree == other.colorappearance.autodegree + && colorappearance.degreeout == other.colorappearance.degreeout + && colorappearance.autodegreeout == other.colorappearance.autodegreeout && colorappearance.surround == other.colorappearance.surround && colorappearance.adapscen == other.colorappearance.adapscen && colorappearance.autoadapscen == other.colorappearance.autoadapscen diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 39f6eeaee..1ee5d16df 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -585,6 +585,8 @@ public: bool enabled; int degree; bool autodegree; + int degreeout; + bool autodegreeout; std::vector curve; std::vector curve2; std::vector curve3; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index af3dfafae..0a345d8ac 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -504,7 +504,9 @@ int refreshmap[rtengine::NUMOFEVENTS] = { DEMOSAIC, // EvPixelShiftEqualBrightChannel LUMINANCECURVE, // EvCATtempout LUMINANCECURVE, // EvCATgreenout - LUMINANCECURVE // EvCATybout + LUMINANCECURVE, // EvCATybout + LUMINANCECURVE, // EvCATDegreeout + LUMINANCECURVE // EvCATAutoDegreeout }; diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index 6ab12c026..fb93f8715 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -273,7 +273,7 @@ class AutoCamListener { public : virtual ~AutoCamListener() {} - virtual void autoCamChanged (double ccam) {} + virtual void autoCamChanged (double ccam, double ccamout) {} virtual void adapCamChanged (double cadap) {} }; diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index fd06e940f..41e52a16e 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -1260,7 +1260,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei 16); int begh = 0, endh = labView->H; bool execsharp = false; - float d; + float d, dj; float fnum = fnumber;// F number float fiso = iso;// ISO float fspeed = shutter;//speed @@ -1296,7 +1296,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei CAMMean = NAN; CAMBrightCurveJ.dirty = true; CAMBrightCurveQ.dirty = true; - ipf.ciecam_02float (cieView, adap, begh, endh, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, sk, execsharp, d, rtt); + ipf.ciecam_02float (cieView, adap, begh, endh, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, sk, execsharp, d, dj, rtt); delete cieView; } diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 2c5d5a10e..cc70823ff 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1122,16 +1122,16 @@ private: if (params.sharpening.enabled) { if(settings->ciecamfloat) { - float d; - ipf.ciecam_02float (cieView, float(adap), begh, endh, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, d, 1); + float d, dj; + ipf.ciecam_02float (cieView, float(adap), begh, endh, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, d, dj, 1); } else { double dd; ipf.ciecam_02 (cieView, adap, begh, endh, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, dd, 1); } } else { if(settings->ciecamfloat) { - float d; - ipf.ciecam_02float (cieView, float(adap), begh, endh, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, d, 1); + float d, dj; + ipf.ciecam_02float (cieView, float(adap), begh, endh, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, d, dj, 1); } else { double dd; ipf.ciecam_02 (cieView, adap, begh, endh, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, dd, 1); diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index af45d50b6..c01b7458f 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -450,6 +450,17 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" // Gtk::Image* iblueredL = Gtk::manage (new RTImage ("ajd-wb-bluered1.png")); // Gtk::Image* iblueredR = Gtk::manage (new RTImage ("ajd-wb-bluered2.png")); + degreeout = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CIECAT_DEGREE"), 0., 100., 1., 100.)); + + if (degreeout->delay < options.adjusterMaxDelay) { + degreeout->delay = options.adjusterMaxDelay; + } + + degreeout->throwOnButtonRelease(); + degreeout->addAutoButton (M ("TP_COLORAPP_DEGREE_AUTO_TOOLTIP")); + degreeout->set_tooltip_markup (M ("TP_COLORAPP_DEGREE_TOOLTIP")); + p3VBox->pack_start (*degreeout); + tempout = Gtk::manage (new Adjuster (M ("TP_WBALANCE_TEMPERATURE"), MINTEMP0, MAXTEMP0, 5, CENTERTEMP0, itempR, itempL, &wbSlider2Temp, &wbTemp2Slider)); greenout = Gtk::manage (new Adjuster (M ("TP_WBALANCE_GREEN"), MINGREEN0, MAXGREEN0, 0.001, 1.0, igreenR, igreenL)); ybout = Gtk::manage (new Adjuster (M ("TP_COLORAPP_YB"), 5, 50, 1, 18)); @@ -514,6 +525,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" surroundconn = surround->signal_changed().connect ( sigc::mem_fun (*this, &ColorAppearance::surroundChanged) ); degree->setAdjusterListener (this); + degreeout->setAdjusterListener (this); adapscen->setAdjusterListener (this); adaplum->setAdjusterListener (this); badpixsl->setAdjusterListener (this); @@ -572,6 +584,7 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) if (pedited) { degree->setEditedState (pedited->colorappearance.degree ? Edited : UnEdited); + degreeout->setEditedState (pedited->colorappearance.degreeout ? Edited : UnEdited); adapscen->setEditedState (pedited->colorappearance.adapscen ? Edited : UnEdited); adaplum->setEditedState (pedited->colorappearance.adaplum ? Edited : UnEdited); badpixsl->setEditedState (pedited->colorappearance.badpixsl ? Edited : UnEdited); @@ -595,6 +608,7 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) // sharpcie->set_inconsistent (!pedited->colorappearance.sharpcie); degree->setAutoInconsistent (multiImage && !pedited->colorappearance.autodegree); + degreeout->setAutoInconsistent (multiImage && !pedited->colorappearance.autodegreeout); adapscen->setAutoInconsistent (multiImage && !pedited->colorappearance.autoadapscen); set_inconsistent (multiImage && !pedited->colorappearance.enabled); @@ -697,11 +711,14 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) lastAutoDegree = pp->colorappearance.autodegree; lastAutoAdapscen = pp->colorappearance.autoadapscen; + lastAutoDegreeout = pp->colorappearance.autodegreeout; degree->setValue (pp->colorappearance.degree); degree->setAutoValue (pp->colorappearance.autodegree); adapscen->setValue (pp->colorappearance.adapscen); adapscen->setAutoValue (pp->colorappearance.autoadapscen); + degreeout->setValue (pp->colorappearance.degreeout); + degreeout->setAutoValue (pp->colorappearance.autodegreeout); adaplum->setValue (pp->colorappearance.adaplum); badpixsl->setValue (pp->colorappearance.badpixsl); @@ -737,6 +754,8 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) pp->colorappearance.degree = degree->getValue (); pp->colorappearance.autodegree = degree->getAutoValue (); + pp->colorappearance.degreeout = degreeout->getValue (); + pp->colorappearance.autodegreeout = degreeout->getAutoValue (); pp->colorappearance.enabled = getEnabled(); pp->colorappearance.adapscen = adapscen->getValue (); pp->colorappearance.autoadapscen = adapscen->getAutoValue (); @@ -792,6 +811,7 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) if (pedited) { pedited->colorappearance.degree = degree->getEditedState (); + pedited->colorappearance.degreeout = degreeout->getEditedState (); pedited->colorappearance.adapscen = adapscen->getEditedState (); pedited->colorappearance.adaplum = adaplum->getEditedState (); pedited->colorappearance.badpixsl = badpixsl->getEditedState (); @@ -805,6 +825,7 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) pedited->colorappearance.colorh = colorh->getEditedState (); pedited->colorappearance.rstprotection = rstprotection->getEditedState (); pedited->colorappearance.autodegree = !degree->getAutoInconsistent(); + pedited->colorappearance.autodegreeout = !degreeout->getAutoInconsistent(); pedited->colorappearance.autoadapscen = !adapscen->getAutoInconsistent(); pedited->colorappearance.enabled = !get_inconsistent(); pedited->colorappearance.surround = surround->get_active_text() != M ("GENERAL_UNCHANGED"); @@ -1084,6 +1105,7 @@ void ColorAppearance::setDefaults (const ProcParams* defParams, const ParamsEdit { degree->setDefault (defParams->colorappearance.degree); + degreeout->setDefault (defParams->colorappearance.degreeout); adapscen->setDefault (defParams->colorappearance.adapscen); adaplum->setDefault (defParams->colorappearance.adaplum); badpixsl->setDefault (defParams->colorappearance.badpixsl); @@ -1102,6 +1124,7 @@ void ColorAppearance::setDefaults (const ProcParams* defParams, const ParamsEdit if (pedited) { degree->setDefaultEditedState (pedited->colorappearance.degree ? Edited : UnEdited); + degreeout->setDefaultEditedState (pedited->colorappearance.degreeout ? Edited : UnEdited); adapscen->setDefaultEditedState (pedited->colorappearance.adapscen ? Edited : UnEdited); adaplum->setDefaultEditedState (pedited->colorappearance.adaplum ? Edited : UnEdited); badpixsl->setDefaultEditedState (pedited->colorappearance.badpixsl ? Edited : UnEdited); @@ -1120,6 +1143,7 @@ void ColorAppearance::setDefaults (const ProcParams* defParams, const ParamsEdit } else { degree->setDefaultEditedState (Irrelevant); + degreeout->setDefaultEditedState (Irrelevant); adapscen->setDefaultEditedState (Irrelevant); adaplum->setDefaultEditedState (Irrelevant); badpixsl->setDefaultEditedState (Irrelevant); @@ -1139,9 +1163,10 @@ void ColorAppearance::setDefaults (const ProcParams* defParams, const ParamsEdit } } -void ColorAppearance::autoCamChanged (double ccam) +void ColorAppearance::autoCamChanged (double ccam, double ccamout) { nextCcam = ccam; + nextCcamout = ccamout; const auto func = [] (gpointer data) -> gboolean { static_cast (data)->autoCamComputed_(); @@ -1157,6 +1182,7 @@ bool ColorAppearance::autoCamComputed_ () disableListener (); // degree->setEnabled (true); degree->setValue (nextCcam); + degreeout->setValue (nextCcamout); enableListener (); return false; @@ -1214,6 +1240,8 @@ void ColorAppearance::adjusterChanged (Adjuster* a, double newval) if (listener && (multiImage || getEnabled()) ) { if (a == degree) { listener->panelChanged (EvCATDegree, a->getTextValue()); + } else if (a == degreeout) { + listener->panelChanged (EvCATDegreeout, a->getTextValue()); } else if (a == adapscen) { listener->panelChanged (EvCATAdapscen, a->getTextValue()); } else if (a == adaplum) { @@ -1263,6 +1291,15 @@ void ColorAppearance::adjusterAutoToggled (Adjuster* a, bool newval) lastAutoDegree = degree->getAutoValue(); + if (degreeout->getAutoInconsistent()) { + degreeout->setAutoInconsistent (false); + degreeout->setAutoValue (false); + } else if (lastAutoDegreeout) { + degreeout->setAutoInconsistent (true); + } + + lastAutoDegreeout = degreeout->getAutoValue(); + if (adapscen->getAutoInconsistent()) { adapscen->setAutoInconsistent (false); adapscen->setAutoValue (false); @@ -1285,6 +1322,17 @@ void ColorAppearance::adjusterAutoToggled (Adjuster* a, bool newval) listener->panelChanged (EvCATAutoDegree, M ("GENERAL_DISABLED")); } } + + if (a == degreeout) { + if (degreeout->getAutoInconsistent()) { + listener->panelChanged (EvCATAutoDegreeout, M ("GENERAL_UNCHANGED")); + } else if (degreeout->getAutoValue()) { + listener->panelChanged (EvCATAutoDegreeout, M ("GENERAL_ENABLED")); + } else { + listener->panelChanged (EvCATAutoDegreeout, M ("GENERAL_DISABLED")); + } + } + if (a == adapscen) { if (adapscen->getAutoInconsistent()) { @@ -1410,6 +1458,7 @@ void ColorAppearance::setBatchMode (bool batchMode) ToolPanel::setBatchMode (batchMode); degree->showEditedCB (); + degreeout->showEditedCB (); adapscen->showEditedCB (); adaplum->showEditedCB (); badpixsl->showEditedCB (); @@ -1469,6 +1518,7 @@ void ColorAppearance::trimValues (rtengine::procparams::ProcParams* pp) { degree->trimValue (pp->colorappearance.degree); + degreeout->trimValue (pp->colorappearance.degreeout); adapscen->trimValue (pp->colorappearance.adapscen); adaplum->trimValue (pp->colorappearance.adaplum); badpixsl->trimValue (pp->colorappearance.badpixsl); diff --git a/rtgui/colorappearance.h b/rtgui/colorappearance.h index 5f433b556..261d8f9bd 100644 --- a/rtgui/colorappearance.h +++ b/rtgui/colorappearance.h @@ -57,7 +57,7 @@ public: void datacie_toggled (); void tonecie_toggled (); // void sharpcie_toggled (); - void autoCamChanged (double ccam); + void autoCamChanged (double ccam, double ccamout); bool autoCamComputed_ (); void adapCamChanged (double cadap); bool adapCamComputed_ (); @@ -91,6 +91,7 @@ private: Adjuster* degree; Adjuster* adapscen; Adjuster* adaplum; + Adjuster* degreeout; Adjuster* badpixsl; Adjuster* jlight; Adjuster* qbright; @@ -133,9 +134,10 @@ private: DiagonalCurveEditor* shape; DiagonalCurveEditor* shape2; DiagonalCurveEditor* shape3; - double nextCcam, nextCadap; + double nextCcam, nextCcamout, nextCadap; bool lastAutoDegree; bool lastAutoAdapscen; + bool lastAutoDegreeout; bool lastsurr; bool lastgamut; bool lastdatacie; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index e09b30b24..7b7942203 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -175,6 +175,8 @@ void ParamsEdited::set (bool v) colorappearance.enabled = v; colorappearance.degree = v; colorappearance.autodegree = v; + colorappearance.degreeout = v; + colorappearance.autodegreeout = v; colorappearance.surround = v; colorappearance.adapscen = v; colorappearance.autoadapscen = v; @@ -699,6 +701,8 @@ void ParamsEdited::initFrom (const std::vector colorappearance.enabled = colorappearance.enabled && p.colorappearance.enabled == other.colorappearance.enabled; colorappearance.degree = colorappearance.degree && p.colorappearance.degree == other.colorappearance.degree; colorappearance.autodegree = colorappearance.autodegree && p.colorappearance.autodegree == other.colorappearance.autodegree; + colorappearance.degreeout = colorappearance.degreeout && p.colorappearance.degreeout == other.colorappearance.degreeout; + colorappearance.autodegreeout = colorappearance.autodegreeout && p.colorappearance.autodegreeout == other.colorappearance.autodegreeout; colorappearance.surround = colorappearance.surround && p.colorappearance.surround == other.colorappearance.surround; colorappearance.adapscen = colorappearance.adapscen && p.colorappearance.adapscen == other.colorappearance.adapscen; colorappearance.autoadapscen = colorappearance.autoadapscen && p.colorappearance.autoadapscen == other.colorappearance.autoadapscen; @@ -1711,6 +1715,14 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.colorappearance.autodegree = mods.colorappearance.autodegree; } + if (colorappearance.degreeout) { + toEdit.colorappearance.degreeout = mods.colorappearance.degreeout; + } + + if (colorappearance.autodegreeout) { + toEdit.colorappearance.autodegreeout = mods.colorappearance.autodegreeout; + } + if (colorappearance.surround) { toEdit.colorappearance.surround = mods.colorappearance.surround; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 1ec6bac6c..7d0ce7fde 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -289,6 +289,8 @@ public: bool enabled; bool degree; bool autodegree; + bool degreeout; + bool autodegreeout; bool autoadapscen; bool surround; bool adapscen;