From 48d30e50c729d20be14036089d136eb4c5726339 Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 22 Mar 2019 18:20:00 +0100 Subject: [PATCH 001/154] Wavelet Clarity and Unsharp mask --- rtdata/languages/default | 17 + rtengine/dcrop.cc | 112 +- rtengine/improccoordinator.cc | 152 ++- rtengine/ipwavelet.cc | 949 ++++++++------- rtengine/procparams.cc | 24 + rtengine/procparams.h | 6 + rtengine/simpleprocess.cc | 561 +++++---- rtgui/paramsedited.cc | 38 +- rtgui/paramsedited.h | 6 + rtgui/wavelet.cc | 2115 ++++++++++++++++++--------------- rtgui/wavelet.h | 21 +- 11 files changed, 2327 insertions(+), 1674 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 09f6fe9c1..432da3054 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -780,6 +780,12 @@ HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor +HISTORY_MSG_WAVCLARI;Clarity +HISTORY_MSG_WAVUSHAMET;Clarity method +HISTORY_MSG_WAVMERGEL;Merge L +HISTORY_MSG_WAVMERGEC;Merge C +HISTORY_MSG_WAVSOFTRAD;Soft radius clarity +HISTORY_MSG_WAVSOFTRADEND;Soft radius final HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -2129,6 +2135,7 @@ TP_WAVELET_CHRO_TOOLTIP;Sets the wavelet level which will be the threshold betwe TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of "contrast levels" and "chroma-contrast link strength" TP_WAVELET_CHSL;Sliders TP_WAVELET_CHTYPE;Chrominance method +TP_WAVELET_CLARI;Clarity - Usharp Mask TP_WAVELET_COLORT;Opacity Red-Green TP_WAVELET_COMPCONT;Contrast TP_WAVELET_COMPGAMMA;Compression gamma @@ -2211,6 +2218,8 @@ TP_WAVELET_MEDGREINF;First level TP_WAVELET_MEDI;Reduce artifacts in blue sky TP_WAVELET_MEDILEV;Edge detection TP_WAVELET_MEDILEV_TOOLTIP;When you enable Edge Detection, it is recommanded:\n- to disabled low contrast levels to avoid artifacts,\n- to use high values of gradient sensitivity.\n\nYou can modulate the strength with 'refine' from Denoise and Refine. +TP_WAVELET_MERGEL;Merge Luma +TP_WAVELET_MERGEC;Merge Chroma TP_WAVELET_NEUTRAL;Neutral TP_WAVELET_NOIS;Denoise TP_WAVELET_NOISE;Denoise and Refine @@ -2238,6 +2247,7 @@ TP_WAVELET_SKIN;Skin targetting/protection TP_WAVELET_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected. TP_WAVELET_SKY;Sky targetting/protection TP_WAVELET_SKY_TOOLTIP;At -100 sky-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 sky-tones are protected while all other tones are affected. +TP_WAVELET_SOFTRAD;Soft Radius TP_WAVELET_STREN;Strength TP_WAVELET_STRENGTH;Strength TP_WAVELET_SUPE;Extra @@ -2256,6 +2266,13 @@ TP_WAVELET_TMSTRENGTH;Compression strength TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out. TP_WAVELET_TMTYPE;Compression method TP_WAVELET_TON;Toning +TP_WAVELET_USHARP;Clarity method +TP_WAVELET_USH;None +TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, wavelet settings will be automatically positioned :\nBackground=black, Process=below, level=3...you can change level\nIf you select Clarity, wavelet settings will be automatically positioned :\nBackground=residual, Process=above, level=7..you can change level and wavelet levels +TP_WAVELET_SHA;Sharp mask +TP_WAVELET_CLA;Clarity +TP_WAVELET_USHARP;Sharp method +TP_WAVELET_USHARP_TOOLTIP;Origin : the source file is the file before Wavelet.\nWavelet : the source file is the file including wavelet threatment TP_WBALANCE_AUTO;Auto TP_WBALANCE_CAMERA;Camera TP_WBALANCE_CLOUDY;Cloudy diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 0872049d8..695fd9056 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -23,6 +23,7 @@ #include "procparams.h" #include "refreshmap.h" #include "rt_math.h" +#include "guidedfilter.h" namespace { @@ -43,7 +44,7 @@ extern const Settings* settings; Crop::Crop(ImProcCoordinator* parent, EditDataProvider *editDataProvider, bool isDetailWindow) : PipetteBuffer(editDataProvider), origCrop(nullptr), laboCrop(nullptr), labnCrop(nullptr), - cropImg (nullptr), transCrop (nullptr), cieCrop (nullptr), + cropImg(nullptr), transCrop(nullptr), cieCrop(nullptr), updating(false), newUpdatePending(false), skip(10), cropx(0), cropy(0), cropw(-1), croph(-1), trafx(0), trafy(0), trafw(-1), trafh(-1), @@ -825,15 +826,17 @@ void Crop::update(int todo) parent->ipf.workingtrc(workingCrop, workingCrop, cw, ch, 5, params.icm.workingProfile, params.icm.workingTRCGamma, params.icm.workingTRCSlope, parent->getCustomTransformOut(), false, true, true); } } + double rrm, ggm, bbm; DCPProfile::ApplyState as; DCPProfile *dcpProf = parent->imgsrc->getDCP(params.icm, as); LUTu histToneCurve; - parent->ipf.rgbProc (workingCrop, laboCrop, this, parent->hltonecurve, parent->shtonecurve, parent->tonecurve, + parent->ipf.rgbProc(workingCrop, laboCrop, this, parent->hltonecurve, parent->shtonecurve, parent->tonecurve, 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); + if (workingCrop != baseCrop) { delete workingCrop; } @@ -893,8 +896,8 @@ void Crop::update(int todo) parent->ipf.MLsharpen(labnCrop); if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { - parent->ipf.MLmicrocontrast (labnCrop); - parent->ipf.sharpening (labnCrop, params.sharpening, parent->sharpMask); + parent->ipf.MLmicrocontrast(labnCrop); + parent->ipf.sharpening(labnCrop, params.sharpening, parent->sharpMask); } } @@ -938,7 +941,7 @@ void Crop::update(int todo) if (params.wavelet.Tilesmethod == "big") { realtile = 22; - } else /*if (params.wavelet.Tilesmethod == "lit")*/ { + } else { /*if (params.wavelet.Tilesmethod == "lit")*/ realtile = 12; } @@ -985,15 +988,106 @@ void Crop::update(int todo) LUTu dummy; params.wavelet.getCurves(wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); + LabImage *unshar = nullptr; + Glib::ustring provis; + LabImage *provradius = nullptr; + + if (WaveParams.softrad > 0.f) { + provradius = new LabImage(labnCrop->W, labnCrop->H); + provradius->CopyFrom(labnCrop); + } + + + + if (WaveParams.ushamethod != "none" && WaveParams.expclari && WaveParams.CLmethod != "all") { + + unshar = new LabImage(labnCrop->W, labnCrop->H); + provis = params.wavelet.CLmethod; + params.wavelet.CLmethod = "all"; + parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); + unshar->CopyFrom(labnCrop); + + params.wavelet.CLmethod = provis; + + } parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); + + if (WaveParams.ushamethod != "none" && WaveParams.expclari && WaveParams.CLmethod != "all") { + + float mL = (float)(WaveParams.mergeL / 100.f); + float mC = (float)(WaveParams.mergeC / 100.f); + float mL0; + float mC0; + + if ((WaveParams.CLmethod == "one" || WaveParams.CLmethod == "inf") && WaveParams.Backmethod == "black") { + mL0 = mC0 = 0.f; + mL = -mL; + mC = -mC; + } else if (WaveParams.CLmethod == "sup" && WaveParams.Backmethod == "resid") { + mL0 = mL; + mC0 = mC; + } else { + mL0 = mL = mC0 = mC = 0.f; + } + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int x = 0; x < labnCrop->H; x++) + for (int y = 0; y < labnCrop->W; y++) { + labnCrop->L[x][y] = (1.f + mL0) * (unshar->L[x][y]) - mL * labnCrop->L[x][y]; + labnCrop->a[x][y] = (1.f + mC0) * (unshar->a[x][y]) - mC * labnCrop->a[x][y]; + labnCrop->b[x][y] = (1.f + mC0) * (unshar->b[x][y]) - mC * labnCrop->b[x][y]; + } + + delete unshar; + unshar = NULL; + + if (WaveParams.softrad > 0.f) { + array2D ble(labnCrop->W, labnCrop->H); + array2D guid(labnCrop->W, labnCrop->H); + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < labnCrop->H ; ir++) + for (int jr = 0; jr < labnCrop->W; jr++) { + ble[ir][jr] = (labnCrop->L[ir][jr] - provradius->L[ir][jr]) / 32768.f; + guid[ir][jr] = provradius->L[ir][jr] / 32768.f; + } + + float blur = 10.f / skip * (0.1f + 0.8f * WaveParams.softrad); + rtengine::guidedFilter(guid, ble, ble, blur, 0.001, false); + + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < labnCrop->H; ir++) + for (int jr = 0; jr < labnCrop->W; jr++) { + labnCrop->L[ir][jr] = provradius->L[ir][jr] + 32768.f * ble[ir][jr]; + } + } + + if (WaveParams.softrad > 0.f) { + delete provradius; + provradius = NULL; + } + + + } + + } - parent->ipf.softLight(labnCrop); + parent->ipf.softLight(labnCrop); - // } - - // } if (params.colorappearance.enabled) { float fnum = parent->imgsrc->getMetaData()->getFNumber(); // F number float fiso = parent->imgsrc->getMetaData()->getISOSpeed() ; // ISO diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index ec047f853..c6207964f 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -28,6 +28,7 @@ #include #include #include +#include "guidedfilter.h" #include "color.h" #ifdef _OPENMP #include @@ -45,11 +46,11 @@ ImProcCoordinator::ImProcCoordinator() : fattal_11_dcrop_cache(nullptr), previmg(nullptr), workimg(nullptr), - ncie (nullptr), - imgsrc (nullptr), - lastAwbEqual (0.), - lastAwbTempBias (0.0), - monitorIntent (RI_RELATIVE), + ncie(nullptr), + imgsrc(nullptr), + lastAwbEqual(0.), + lastAwbTempBias(0.0), + monitorIntent(RI_RELATIVE), softProof(false), gamutCheck(false), sharpMask(false), @@ -181,12 +182,12 @@ ImProcCoordinator::~ImProcCoordinator() imgsrc->decreaseRef(); - if(customTransformIn) { + if (customTransformIn) { cmsDeleteTransform(customTransformIn); customTransformIn = nullptr; } - if(customTransformOut) { + if (customTransformOut) { cmsDeleteTransform(customTransformOut); customTransformOut = nullptr; } @@ -271,9 +272,11 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) imgsrc->setCurrentFrame(params->raw.bayersensor.imageNum); imgsrc->preprocess(rp, params->lensProf, params->coarse); + if (flatFieldAutoClipListener && rp.ff_AutoClipControl) { flatFieldAutoClipListener->flatFieldAutoClipValueChanged(imgsrc->getFlatFieldAutoClipValue()); } + imgsrc->getRAWHistogram(histRedRaw, histGreenRaw, histBlueRaw); highDetailPreprocessComputed = highDetailNeeded; @@ -307,8 +310,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) printf("Demosaic X-Trans image with using method: %s\n", rp.xtranssensor.method.c_str()); } } - if(imgsrc->getSensorType() == ST_BAYER) { - if(params->raw.bayersensor.method != RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT)) { + + if (imgsrc->getSensorType() == ST_BAYER) { + if (params->raw.bayersensor.method != RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT)) { imgsrc->setBorder(params->raw.bayersensor.border); } else { imgsrc->setBorder(std::max(params->raw.bayersensor.border, 2)); @@ -316,6 +320,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } else if (imgsrc->getSensorType() == ST_FUJI_XTRANS) { imgsrc->setBorder(params->raw.xtranssensor.border); } + bool autoContrast = imgsrc->getSensorType() == ST_BAYER ? params->raw.bayersensor.dualDemosaicAutoContrast : params->raw.xtranssensor.dualDemosaicAutoContrast; double contrastThreshold = imgsrc->getSensorType() == ST_BAYER ? params->raw.bayersensor.dualDemosaicContrast : params->raw.xtranssensor.dualDemosaicContrast; imgsrc->demosaic(rp, autoContrast, contrastThreshold); //enabled demosaic @@ -323,6 +328,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if (imgsrc->getSensorType() == ST_BAYER && bayerAutoContrastListener && autoContrast) { bayerAutoContrastListener->autoContrastChanged(autoContrast ? contrastThreshold : -1.0); } + if (imgsrc->getSensorType() == ST_FUJI_XTRANS && xtransAutoContrastListener && autoContrast) { xtransAutoContrastListener->autoContrastChanged(autoContrast ? contrastThreshold : -1.0); } @@ -578,7 +584,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) progress("Exposure curve & CIELAB conversion...", 100 * readyphase / numofphases); - if (todo & (M_AUTOEXP | M_RGBCURVE)) { + if (todo & (M_AUTOEXP | M_RGBCURVE)) { if (params->icm.workingTRC == "Custom") { //exec TRC IN free if (oprevi == orig_prev) { oprevi = new Imagefloat(pW, pH); @@ -590,17 +596,21 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if (profile == "sRGB" || profile == "Adobe RGB" || profile == "ProPhoto" || profile == "WideGamut" || profile == "BruceRGB" || profile == "Beta RGB" || profile == "BestRGB" || profile == "Rec2020" || profile == "ACESp0" || profile == "ACESp1") { const int cw = oprevi->getWidth(); const int ch = oprevi->getHeight(); + // put gamma TRC to 1 - if(customTransformIn) { + if (customTransformIn) { cmsDeleteTransform(customTransformIn); customTransformIn = nullptr; } + ipf.workingtrc(oprevi, oprevi, cw, ch, -5, params->icm.workingProfile, 2.4, 12.92310, customTransformIn, true, false, true); + //adjust TRC - if(customTransformOut) { + if (customTransformOut) { cmsDeleteTransform(customTransformOut); customTransformOut = nullptr; } + ipf.workingtrc(oprevi, oprevi, cw, ch, 5, params->icm.workingProfile, params->icm.workingTRCGamma, params->icm.workingTRCSlope, customTransformOut, false, true, true); } } @@ -608,7 +618,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if ((todo & M_RGBCURVE) || (todo & M_CROP)) { - // if (hListener) oprevi->calcCroppedHistogram(params, scale, histCropped); + // if (hListener) oprevi->calcCroppedHistogram(params, scale, histCropped); //complexCurve also calculated pre-curves histogram depending on crop CurveFactory::complexCurve(params->toneCurve.expcomp, params->toneCurve.black / 65535.0, @@ -702,7 +712,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) DCPProfile::ApplyState as; DCPProfile *dcpProf = imgsrc->getDCP(params->icm, as); - ipf.rgbProc (oprevi, oprevl, nullptr, hltonecurve, shtonecurve, tonecurve, params->toneCurve.saturation, + ipf.rgbProc(oprevi, oprevl, nullptr, hltonecurve, shtonecurve, tonecurve, params->toneCurve.saturation, rCurve, gCurve, bCurve, colourToningSatLimit, colourToningSatLimitOpacity, ctColorCurve, ctOpacityCurve, opautili, clToningcurve, cl2Toningcurve, customToneCurve1, customToneCurve2, beforeToneCurveBW, afterToneCurveBW, rrm, ggm, bbm, bwAutoR, bwAutoG, bwAutoB, params->toneCurve.expcomp, params->toneCurve.hlcompr, params->toneCurve.hlcomprthresh, dcpProf, as, histToneCurve); if (params->blackwhite.enabled && params->blackwhite.autoc && abwListener) { @@ -838,20 +848,119 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) //CurveFactory::curveWavContL ( wavcontlutili,params->wavelet.lcurve, wavclCurve, LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,int skip); CurveFactory::curveWavContL(wavcontlutili, params->wavelet.wavclCurve, wavclCurve, scale == 1 ? 1 : 16); - if ((params->wavelet.enabled)) { WaveletParams WaveParams = params->wavelet; - // WaveParams.getCurves(wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY); WaveParams.getCurves(wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); - int kall = 0; progress("Wavelet...", 100 * readyphase / numofphases); - // ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, scale); + LabImage *unshar = nullptr; + Glib::ustring provis; + LabImage *provradius = nullptr; + + if (WaveParams.softrad > 0.f) { + provradius = new LabImage(pW, pH); + provradius->CopyFrom(nprevl); + } + + + + + if (WaveParams.ushamethod != "none" && WaveParams.expclari && WaveParams.CLmethod != "all") { + unshar = new LabImage(pW, pH); + provis = params->wavelet.CLmethod; + params->wavelet.CLmethod = "all"; + ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); + + unshar->CopyFrom(nprevl); + + params->wavelet.CLmethod = provis; + + } + ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); + if (WaveParams.ushamethod != "none" && WaveParams.expclari && WaveParams.CLmethod != "all") { + float mL = (float)(WaveParams.mergeL / 100.f); + float mC = (float)(WaveParams.mergeC / 100.f); + float mL0; + float mC0; + + if ((WaveParams.CLmethod == "one" || WaveParams.CLmethod == "inf") && WaveParams.Backmethod == "black") { + mL0 = mC0 = 0.f; + mL = -mL; + mC = -mC; + } else if (WaveParams.CLmethod == "sup" && WaveParams.Backmethod == "resid") { + mL0 = mL; + mC0 = mC; + } else { + mL0 = mL = mC0 = mC = 0.f; + } + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int x = 0; x < pH; x++) + for (int y = 0; y < pW; y++) { + nprevl->L[x][y] = (1.f + mL0) * (unshar->L[x][y]) - mL * nprevl->L[x][y]; + nprevl->a[x][y] = (1.f + mC0) * (unshar->a[x][y]) - mC * nprevl->a[x][y]; + nprevl->b[x][y] = (1.f + mC0) * (unshar->b[x][y]) - mC * nprevl->b[x][y]; + } + + delete unshar; + unshar = NULL; + + if (WaveParams.softrad > 0.f) { + array2D ble(pW, pH); + array2D guid(pW, pH); + /* + #ifdef _OPENMP + const int numThreads = omp_get_max_threads(); + #endif + + bool multiTh = false; + + if (numThreads > 1) { + multiTh = true; + } + */ +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < pH; ir++) + for (int jr = 0; jr < pW; jr++) { + ble[ir][jr] = (nprevl->L[ir][jr] - provradius->L[ir][jr]) / 32768.f; + guid[ir][jr] = provradius->L[ir][jr] / 32768.f; + } + + float blur = 10.f / scale * (0.1f + 0.8f * WaveParams.softrad); + // rtengine::guidedFilter(guid, ble, ble, blur, 0.001, multiTh); + rtengine::guidedFilter(guid, ble, ble, blur, 0.001, false); + + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < pH; ir++) + for (int jr = 0; jr < pW; jr++) { + nprevl->L[ir][jr] = provradius->L[ir][jr] + 32768.f * ble[ir][jr]; + } + } + + if (WaveParams.softrad > 0.f) { + delete provradius; + provradius = NULL; + } + + + } } - ipf.softLight(nprevl); + ipf.softLight(nprevl); if (params->colorappearance.enabled) { //L histo and Chroma histo for ciecam @@ -1010,6 +1119,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) hListener->histogramChanged(histRed, histGreen, histBlue, histLuma, histToneCurve, histLCurve, histCCurve, /*histCLurve, histLLCurve,*/ histLCAM, histCCAM, histRedRaw, histGreenRaw, histBlueRaw, histChroma, histLRETI); } } + if (orig_prev != oprevi) { delete oprevi; oprevi = nullptr; @@ -1307,7 +1417,7 @@ void ImProcCoordinator::getSoftProofing(bool &softProof, bool &gamutCheck) gamutCheck = this->gamutCheck; } -void ImProcCoordinator::setSharpMask (bool sharpMask) +void ImProcCoordinator::setSharpMask(bool sharpMask) { this->sharpMask = sharpMask; } @@ -1477,7 +1587,7 @@ void ImProcCoordinator::process() while (changeSinceLast) { const bool panningRelatedChange = - params->toneCurve != nextParams->toneCurve + params->toneCurve != nextParams->toneCurve || params->labCurve != nextParams->labCurve || params->localContrast != nextParams->localContrast || params->rgbCurves != nextParams->rgbCurves diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index d3595b42c..8b5f33b74 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -41,6 +41,7 @@ #include "EdgePreservingDecomposition.h" #include "iccstore.h" #include "procparams.h" +#include "guidedfilter.h" #ifdef _OPENMP #include @@ -149,38 +150,46 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const // init variables to display Munsell corrections MunsellDebugInfo* MunsDebugInfo = new MunsellDebugInfo(); #endif - TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params->icm.workingProfile); + TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix(params->icm.workingProfile); const double wip[3][3] = { {wiprof[0][0], wiprof[0][1], wiprof[0][2]}, {wiprof[1][0], wiprof[1][1], wiprof[1][2]}, {wiprof[2][0], wiprof[2][1], wiprof[2][2]} }; const short int imheight = lab->H, imwidth = lab->W; + LabImage *provradius = nullptr; + + if (waparams.softradend > 0.f && params->wavelet.expfinal) { + provradius = new LabImage(lab->W, lab->H); + provradius->CopyFrom(lab); + } + struct cont_params cp; + cp.avoi = params->wavelet.avoid; - if(params->wavelet.Medgreinf == "more") { + if (params->wavelet.Medgreinf == "more") { cp.reinforce = 1; } - if(params->wavelet.Medgreinf == "none") { + if (params->wavelet.Medgreinf == "none") { cp.reinforce = 2; } - if(params->wavelet.Medgreinf == "less") { + if (params->wavelet.Medgreinf == "less") { cp.reinforce = 3; } - if(params->wavelet.NPmethod == "none") { + if (params->wavelet.NPmethod == "none") { cp.lip3 = false; } - if(params->wavelet.NPmethod == "low") { + if (params->wavelet.NPmethod == "low") { cp.lip3 = true; cp.neigh = 0; } - if(params->wavelet.NPmethod == "high") { + if (params->wavelet.NPmethod == "high") { cp.lip3 = true; cp.neigh = 1; } @@ -192,27 +201,27 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.tonemap = false; cp.bam = false; - if(params->wavelet.tmrs == 0) { + if (params->wavelet.tmrs == 0) { cp.tonemap = false; } else { cp.tonemap = true; } - if(params->wavelet.TMmethod == "cont") { + if (params->wavelet.TMmethod == "cont") { cp.contmet = 1; - } else if(params->wavelet.TMmethod == "tm") { + } else if (params->wavelet.TMmethod == "tm") { cp.contmet = 2; } - if(params->wavelet.BAmethod != "none") { + if (params->wavelet.BAmethod != "none") { cp.bam = true; } - if(params->wavelet.BAmethod == "sli") { + if (params->wavelet.BAmethod == "sli") { cp.BAmet = 1; } - if(params->wavelet.BAmethod == "cur") { + if (params->wavelet.BAmethod == "cur") { cp.BAmet = 2; } @@ -226,15 +235,15 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.toningena = params->wavelet.exptoning; cp.noiseena = params->wavelet.expnoise; - if(params->wavelet.Backmethod == "black") { + if (params->wavelet.Backmethod == "black") { cp.backm = 0; } - if(params->wavelet.Backmethod == "grey") { + if (params->wavelet.Backmethod == "grey") { cp.backm = 1; } - if(params->wavelet.Backmethod == "resid") { + if (params->wavelet.Backmethod == "resid") { cp.backm = 2; } @@ -246,7 +255,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.edgsens = 60.f; cp.edgampl = 10.f; - if(cp.lipp) { + if (cp.lipp) { cp.edgsens = (float) params->wavelet.edgesensi; cp.edgampl = (float) params->wavelet.edgeampli; } @@ -257,7 +266,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const static const float scales[10] = {1.f, 2.f, 4.f, 8.f, 16.f, 32.f, 64.f, 128.f, 256.f, 512.f}; float scaleskip[10]; - for(int sc = 0; sc < 10; sc++) { + for (int sc = 0; sc < 10; sc++) { scaleskip[sc] = scales[sc] / skip; } @@ -267,23 +276,23 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const //int DaubLen = settings->daubech ? 8 : 6; int DaubLen; - if(params->wavelet.daubcoeffmethod == "2_") { + if (params->wavelet.daubcoeffmethod == "2_") { DaubLen = 4; } - if(params->wavelet.daubcoeffmethod == "4_") { + if (params->wavelet.daubcoeffmethod == "4_") { DaubLen = 6; } - if(params->wavelet.daubcoeffmethod == "6_") { + if (params->wavelet.daubcoeffmethod == "6_") { DaubLen = 8; } - if(params->wavelet.daubcoeffmethod == "10_") { + if (params->wavelet.daubcoeffmethod == "10_") { DaubLen = 12; } - if(params->wavelet.daubcoeffmethod == "14_") { + if (params->wavelet.daubcoeffmethod == "14_") { DaubLen = 16; } @@ -292,11 +301,11 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const // if(params->wavelet.CHSLmethod=="CU") cp.CHSLmet=2; cp.EDmet = 1; - if(params->wavelet.EDmethod == "SL") { + if (params->wavelet.EDmethod == "SL") { cp.EDmet = 1; } - if(params->wavelet.EDmethod == "CU") { + if (params->wavelet.EDmethod == "CU") { cp.EDmet = 2; } @@ -316,29 +325,29 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.CHmet = 0; cp.HSmet = false; - if(params->wavelet.CHmethod == "with") { + if (params->wavelet.CHmethod == "with") { cp.CHmet = 1; } - if(params->wavelet.CHmethod == "link") { + if (params->wavelet.CHmethod == "link") { cp.CHmet = 2; } - if(params->wavelet.HSmethod == "with") { + if (params->wavelet.HSmethod == "with") { cp.HSmet = true; } cp.strength = min(1.f, max(0.f, ((float)params->wavelet.strength / 100.f))); - for(int m = 0; m < maxmul; m++) { + for (int m = 0; m < maxmul; m++) { cp.mulC[m] = waparams.ch[m]; } - if(waOpacityCurveRG) { + if (waOpacityCurveRG) { cp.opaRG = true; } - if(cp.opaRG) { + if (cp.opaRG) { cp.mulopaRG[0] = 200.f * (waOpacityCurveRG[0] - 0.5f); cp.mulopaRG[1] = 200.f * (waOpacityCurveRG[62] - 0.5f); cp.mulopaRG[2] = 200.f * (waOpacityCurveRG[125] - 0.5f); @@ -349,16 +358,16 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.mulopaRG[7] = 200.f * (waOpacityCurveRG[438] - 0.5f); cp.mulopaRG[8] = 200.f * (waOpacityCurveRG[500] - 0.5f); } else { - for(int level = 0; level < 9; level++) { + for (int level = 0; level < 9; level++) { cp.mulopaRG[level] = 0.f; } } - if(waOpacityCurveBY) { + if (waOpacityCurveBY) { cp.opaBY = true; } - if(cp.opaBY) { + if (cp.opaBY) { cp.mulopaBY[0] = 200.f * (waOpacityCurveBY[0] - 0.5f); cp.mulopaBY[1] = 200.f * (waOpacityCurveBY[62] - 0.5f); cp.mulopaBY[2] = 200.f * (waOpacityCurveBY[125] - 0.5f); @@ -369,47 +378,47 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.mulopaBY[7] = 200.f * (waOpacityCurveBY[438] - 0.5f); cp.mulopaBY[8] = 200.f * (waOpacityCurveBY[500] - 0.5f); } else { - for(int level = 0; level < 9; level++) { + for (int level = 0; level < 9; level++) { cp.mulopaBY[level] = 0.f; } } - if(wavCLVCcurve) { + if (wavCLVCcurve) { cp.edgcurv = true; } - if(waOpacityCurveWL) { + if (waOpacityCurveWL) { cp.diagcurv = true; } - for(int m = 0; m < maxmul; m++) { + for (int m = 0; m < maxmul; m++) { cp.mul[m] = waparams.c[m]; } cp.mul[9] = (float) waparams.sup; - for(int sc = 0; sc < 10; sc++) { //reduce strength if zoom < 100% for contrast - if(sc == 0) { - if(scaleskip[sc] < 1.f) { + for (int sc = 0; sc < 10; sc++) { //reduce strength if zoom < 100% for contrast + if (sc == 0) { + if (scaleskip[sc] < 1.f) { cp.mul[sc] *= (atten0 * scaleskip[sc]); } } else { - if(scaleskip[sc] < 1.f) { + if (scaleskip[sc] < 1.f) { cp.mul[sc] *= (atten123 * scaleskip[sc]); } } } // if(settings->verbose) printf("Wav mul 0=%f 1=%f 2=%f 3=%f 4=%f 5=%f 6=%f 7=%f 8=%f 9=%f\n",cp.mul[0],cp.mul[1],cp.mul[2],cp.mul[3],cp.mul[4],cp.mul[5],cp.mul[6],cp.mul[7],cp.mul[8],cp.mul[9]); - for(int sc = 0; sc < 9; sc++) { //reduce strength if zoom < 100% for chroma and tuning - if(sc == 0) { - if(scaleskip[sc] < 1.f) { + for (int sc = 0; sc < 9; sc++) { //reduce strength if zoom < 100% for chroma and tuning + if (sc == 0) { + if (scaleskip[sc] < 1.f) { cp.mulC[sc] *= (atten0 * scaleskip[sc]); cp.mulopaRG[sc] *= (atten0 * scaleskip[sc]); cp.mulopaBY[sc] *= (atten0 * scaleskip[sc]); } } else { - if(scaleskip[sc] < 1.f) { + if (scaleskip[sc] < 1.f) { cp.mulC[sc] *= (atten123 * scaleskip[sc]); cp.mulopaRG[sc] *= (atten123 * scaleskip[sc]); cp.mulopaBY[sc] *= (atten123 * scaleskip[sc]); @@ -489,28 +498,28 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const int minwin = min(imwidth, imheight); int maxlevelcrop = 9; - if(cp.mul[9] != 0) { + 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; } @@ -518,7 +527,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const int levwav = params->wavelet.thres; - if(levwav == 9 && cp.mul[9] != 0) { + if (levwav == 9 && cp.mul[9] != 0) { levwav = 10; } @@ -530,7 +539,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const // if(cp.mul[levwav-1]!=0.f) // break; // I suppress this fonctionality ==> crash for level < 3 - if(levwav < 1) { + if (levwav < 1) { return; // nothing to do } @@ -540,11 +549,11 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const //output buffer int realtile = 0; - if(params->wavelet.Tilesmethod == "big") { + if (params->wavelet.Tilesmethod == "big") { realtile = 22; } - if(params->wavelet.Tilesmethod == "lit") { + if (params->wavelet.Tilesmethod == "lit") { realtile = 12; } @@ -552,16 +561,16 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const int overlap = (int) tilesize * 0.125f; int numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip; - if(params->wavelet.Tilesmethod == "full") { + if (params->wavelet.Tilesmethod == "full") { kall = 0; } - Tile_calc (tilesize, overlap, kall, imwidth, imheight, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip); + Tile_calc(tilesize, overlap, kall, imwidth, imheight, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip); const int numtiles = numtiles_W * numtiles_H; LabImage * dsttmp; - if(numtiles == 1) { + if (numtiles == 1) { dsttmp = dst; } else { dsttmp = new LabImage(imwidth, imheight); @@ -576,58 +585,57 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const int minsizetile = min(tilewidth, tileheight); int maxlev2 = 10; - if(minsizetile < 1024 && levwav == 10) { + if (minsizetile < 1024 && levwav == 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; } levwav = min(maxlev2, levwav); //printf("levwav = %d\n",levwav); - #ifdef _OPENMP int numthreads = 1; int maxnumberofthreadsforwavelet = 0; //reduce memory for big tile size - if(kall != 0) { - if(realtile <= 22) { + if (kall != 0) { + if (realtile <= 22) { maxnumberofthreadsforwavelet = 2; } - if(realtile <= 20) { + if (realtile <= 20) { maxnumberofthreadsforwavelet = 3; } - if(realtile <= 18) { + if (realtile <= 18) { maxnumberofthreadsforwavelet = 4; } - if(realtile <= 16) { + if (realtile <= 16) { maxnumberofthreadsforwavelet = 6; } - if(realtile <= 14) { + if (realtile <= 14) { maxnumberofthreadsforwavelet = 8; } //printf("maxNRT=%d\n",maxnumberofthreadsforwavelet); - if((maxnumberofthreadsforwavelet == 6 || maxnumberofthreadsforwavelet == 8) && levwav == 10) { + if ((maxnumberofthreadsforwavelet == 6 || maxnumberofthreadsforwavelet == 8) && levwav == 10) { maxnumberofthreadsforwavelet -= 2; } - if(levwav <= 7 && maxnumberofthreadsforwavelet == 8) { + if (levwav <= 7 && maxnumberofthreadsforwavelet == 8) { maxnumberofthreadsforwavelet = 0; } } @@ -636,13 +644,13 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const // Calculate number of tiles. If less than omp_get_max_threads(), then limit num_threads to number of tiles - if( options.rgbDenoiseThreadLimit > 0) { + if (options.rgbDenoiseThreadLimit > 0) { maxnumberofthreadsforwavelet = min(max(options.rgbDenoiseThreadLimit / 2, 1), maxnumberofthreadsforwavelet); } numthreads = MIN(numtiles, omp_get_max_threads()); - if(maxnumberofthreadsforwavelet > 0) { + if (maxnumberofthreadsforwavelet > 0) { numthreads = MIN(numthreads, maxnumberofthreadsforwavelet); } @@ -650,20 +658,20 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const wavNestedLevels = omp_get_max_threads() / numthreads; bool oldNested = omp_get_nested(); - if(wavNestedLevels < 2) { + if (wavNestedLevels < 2) { wavNestedLevels = 1; } else { omp_set_nested(true); } - if(maxnumberofthreadsforwavelet > 0) - while(wavNestedLevels * numthreads > maxnumberofthreadsforwavelet) { + if (maxnumberofthreadsforwavelet > 0) + while (wavNestedLevels * numthreads > maxnumberofthreadsforwavelet) { wavNestedLevels--; } #endif - if(settings->verbose) { + if (settings->verbose) { printf("Ip Wavelet uses %d main thread(s) and up to %d nested thread(s) for each main thread\n", numthreads, wavNestedLevels); } @@ -703,10 +711,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const float **Lold = nullptr; float *LoldBuffer = nullptr; - if(numtiles == 1) { // untiled processing => we can use output buffer for labco + if (numtiles == 1) { // untiled processing => we can use output buffer for labco labco = dst; - if(cp.avoi) { // we need a buffer to hold a copy of the L channel + if (cp.avoi) { // we need a buffer to hold a copy of the L channel Lold = new float*[tileheight]; LoldBuffer = new float[tilewidth * tileheight]; memcpy(LoldBuffer, lab->L[0], tilewidth * tileheight * sizeof(float)); @@ -741,7 +749,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const _mm_storeu_ps(&varhue[i1][j1], huev); _mm_storeu_ps(&varchro[i1][j1], chrov); - if(labco != lab) { + if (labco != lab) { _mm_storeu_ps(&(labco->L[i1][j1]), LVFU(lab->L[i][j])); _mm_storeu_ps(&(labco->a[i1][j1]), av); _mm_storeu_ps(&(labco->b[i1][j1]), bv); @@ -759,7 +767,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const varhue[i1][j1] = xatan2f(b, a); varchro[i1][j1] = (sqrtf(a * a + b * b)) / 327.68f; - if(labco != lab) { + if (labco != lab) { labco->L[i1][j1] = lab->L[i][j]; labco->a[i1][j1] = a; labco->b[i1][j1] = b; @@ -768,7 +776,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } //to avoid artifacts in blue sky - if(params->wavelet.median) { + if (params->wavelet.median) { float** tmL; int wid = labco->W; int hei = labco->H; @@ -779,8 +787,8 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const tmL[i] = new float[wid]; } - for(int i = borderL; i < hei - borderL; i++ ) { - for(int j = borderL; j < wid - borderL; j++) { + for (int i = borderL; i < hei - borderL; i++) { + for (int j = borderL; j < wid - borderL; j++) { tmL[i][j] = labco->L[i][j]; } } @@ -791,14 +799,14 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const for (int i = 1; i < hei - 1; i++) { for (int j = 1; j < wid - 1; j++) { - if((varhue[i][j] < -1.3f && varhue[i][j] > - 2.5f) && (varchro[i][j] > 15.f && varchro[i][j] < 55.f) && labco->L[i][j] > 6000.f) { //blue sky + med3x3 ==> after for more effect use denoise - tmL[i][j] = median(labco->L[i][j] , labco->L[i - 1][j], labco->L[i + 1][j] , labco->L[i][j + 1], labco->L[i][j - 1], labco->L[i - 1][j - 1], labco->L[i - 1][j + 1], labco->L[i + 1][j - 1], labco->L[i + 1][j + 1]); //3x3 + if ((varhue[i][j] < -1.3f && varhue[i][j] > - 2.5f) && (varchro[i][j] > 15.f && varchro[i][j] < 55.f) && labco->L[i][j] > 6000.f) { //blue sky + med3x3 ==> after for more effect use denoise + tmL[i][j] = median(labco->L[i][j], labco->L[i - 1][j], labco->L[i + 1][j], labco->L[i][j + 1], labco->L[i][j - 1], labco->L[i - 1][j - 1], labco->L[i - 1][j + 1], labco->L[i + 1][j - 1], labco->L[i + 1][j + 1]); //3x3 } } } - for(int i = borderL; i < hei - borderL; i++ ) { - for(int j = borderL; j < wid - borderL; j++) { + for (int i = borderL; i < hei - borderL; i++) { + for (int j = borderL; j < wid - borderL; j++) { labco->L[i][j] = tmL[i][j]; } } @@ -811,7 +819,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const // end blue sky } - if(numtiles == 1) { + if (numtiles == 1) { // reduce the varhue array to get faster access in following processing and reduce peak memory usage float temphue[(tilewidth + 1) / 2] ALIGNED64; @@ -825,7 +833,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const memcpy(varhue[i], temphue, ((tilewidth + 1) / 2) * sizeof(float)); } - for(int i = (tileheight + 1) / 2; i < tileheight; i++) { + for (int i = (tileheight + 1) / 2; i < tileheight; i++) { delete [] varhue[i]; varhue[i] = nullptr; } @@ -842,20 +850,20 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const int levwavL = levwav; bool ref0 = false; - if((cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f || cp.lev3s > 0.f) && cp.noiseena) { + if ((cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f || cp.lev3s > 0.f) && cp.noiseena) { ref0 = true; } // printf("LevwavL before: %d\n",levwavL); - if(cp.contrast == 0.f && !cp.tonemap && cp.conres == 0.f && cp.conresH == 0.f && cp.val == 0 && !ref0 && params->wavelet.CLmethod == "all") { // no processing of residual L or edge=> we probably can reduce the number of levels - while(levwavL > 0 && cp.mul[levwavL - 1] == 0.f) { // cp.mul[level] == 0.f means no changes to level + if (cp.contrast == 0.f && !cp.tonemap && cp.conres == 0.f && cp.conresH == 0.f && cp.val == 0 && !ref0 && params->wavelet.CLmethod == "all") { // no processing of residual L or edge=> we probably can reduce the number of levels + while (levwavL > 0 && cp.mul[levwavL - 1] == 0.f) { // cp.mul[level] == 0.f means no changes to level levwavL--; } } // printf("LevwavL after: %d\n",levwavL); // if(cp.noiseena){ - if(levwavL < 4 ) { + if (levwavL < 4) { levwavL = 4; //to allow edge => I always allocate 3 (4) levels..because if user select wavelet it is to do something !! } @@ -863,10 +871,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const // else { // if(levwavL < 3) levwavL=3;//to allow edge => I always allocate 3 (4) levels..because if user select wavelet it is to do something !! // } - if(levwavL > 0) { - wavelet_decomposition* Ldecomp = new wavelet_decomposition (labco->data, labco->W, labco->H, levwavL, 1, skip, max(1, wavNestedLevels), DaubLen ); + if (levwavL > 0) { + wavelet_decomposition* Ldecomp = new wavelet_decomposition(labco->data, labco->W, labco->H, levwavL, 1, skip, max(1, wavNestedLevels), DaubLen); - if(!Ldecomp->memoryAllocationFailed) { + if (!Ldecomp->memoryAllocationFailed) { float madL[8][3]; #ifdef _OPENMP @@ -886,19 +894,19 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const bool ref = false; - if((cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f || cp.lev3s > 0.f) && cp.noiseena) { + if ((cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f || cp.lev3s > 0.f) && cp.noiseena) { ref = true; } bool contr = false; - for(int f = 0; f < levwavL; f++) { - if(cp.mul[f] != 0.f) { + for (int f = 0; f < levwavL; f++) { + if (cp.mul[f] != 0.f) { contr = true; } } - if(cp.val > 0 || ref || contr) {//edge + if (cp.val > 0 || ref || contr) { //edge Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN); } @@ -910,7 +918,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const vari[2] = 8.f * SQR((cp.lev2n / 125.0) * (1.0 + cp.lev2n / 25.0)); vari[3] = 8.f * SQR((cp.lev3n / 125.0) * (1.0 + cp.lev3n / 25.0)); - if((cp.lev0n > 0.1f || cp.lev1n > 0.1f || cp.lev2n > 0.1f || cp.lev3n > 0.1f) && cp.noiseena) { + if ((cp.lev0n > 0.1f || cp.lev1n > 0.1f || cp.lev2n > 0.1f || cp.lev3n > 0.1f) && cp.noiseena) { int edge = 1; vari[0] = max(0.0001f, vari[0]); vari[1] = max(0.0001f, vari[1]); @@ -937,7 +945,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const WaveletcontAllL(labco, varhue, varchro, *Ldecomp, cp, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); - if(cp.val > 0 || ref || contr || cp.diagcurv) {//edge + if (cp.val > 0 || ref || contr || cp.diagcurv) { //edge Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN); } @@ -964,21 +972,21 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } - if(!hhutili) {//always a or b + if (!hhutili) { //always a or b int levwava = levwav; // printf("Levwava before: %d\n",levwava); - if(cp.chrores == 0.f && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels - while(levwava > 0 && !cp.diag && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwava - 1] == 0.f )) || (cp.CHmet != 2 && (levwava == 10 || (!cp.curv || cp.mulC[levwava - 1] == 0.f))))) && (!cp.opaRG || levwava == 10 || (cp.opaRG && cp.mulopaRG[levwava - 1] == 0.f)) && ((levwava == 10 || (cp.CHSLmet == 1 && cp.mulC[levwava - 1] == 0.f)))) { + if (cp.chrores == 0.f && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels + while (levwava > 0 && !cp.diag && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwava - 1] == 0.f)) || (cp.CHmet != 2 && (levwava == 10 || (!cp.curv || cp.mulC[levwava - 1] == 0.f))))) && (!cp.opaRG || levwava == 10 || (cp.opaRG && cp.mulopaRG[levwava - 1] == 0.f)) && ((levwava == 10 || (cp.CHSLmet == 1 && cp.mulC[levwava - 1] == 0.f)))) { levwava--; } } //printf("Levwava after: %d\n",levwava); - if(levwava > 0) { - wavelet_decomposition* adecomp = new wavelet_decomposition (labco->data + datalen, labco->W, labco->H, levwava, 1, skip, max(1, wavNestedLevels), DaubLen ); + if (levwava > 0) { + wavelet_decomposition* adecomp = new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwava, 1, skip, max(1, wavNestedLevels), DaubLen); - if(!adecomp->memoryAllocationFailed) { + if (!adecomp->memoryAllocationFailed) { WaveletcontAllAB(labco, varhue, varchro, *adecomp, waOpacityCurveW, cp, true); adecomp->reconstruct(labco->data + datalen, cp.strength); } @@ -989,17 +997,17 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const int levwavb = levwav; //printf("Levwavb before: %d\n",levwavb); - if(cp.chrores == 0.f && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels - while(levwavb > 0 && !cp.diag && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwavb - 1] == 0.f )) || (cp.CHmet != 2 && (levwavb == 10 || (!cp.curv || cp.mulC[levwavb - 1] == 0.f))))) && (!cp.opaBY || levwavb == 10 || (cp.opaBY && cp.mulopaBY[levwavb - 1] == 0.f)) && ((levwavb == 10 || (cp.CHSLmet == 1 && cp.mulC[levwavb - 1] == 0.f)))) { + if (cp.chrores == 0.f && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels + while (levwavb > 0 && !cp.diag && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwavb - 1] == 0.f)) || (cp.CHmet != 2 && (levwavb == 10 || (!cp.curv || cp.mulC[levwavb - 1] == 0.f))))) && (!cp.opaBY || levwavb == 10 || (cp.opaBY && cp.mulopaBY[levwavb - 1] == 0.f)) && ((levwavb == 10 || (cp.CHSLmet == 1 && cp.mulC[levwavb - 1] == 0.f)))) { levwavb--; } } // printf("Levwavb after: %d\n",levwavb); - if(levwavb > 0) { - wavelet_decomposition* bdecomp = new wavelet_decomposition (labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, max(1, wavNestedLevels), DaubLen ); + if (levwavb > 0) { + wavelet_decomposition* bdecomp = new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, max(1, wavNestedLevels), DaubLen); - if(!bdecomp->memoryAllocationFailed) { + if (!bdecomp->memoryAllocationFailed) { WaveletcontAllAB(labco, varhue, varchro, *bdecomp, waOpacityCurveW, cp, false); bdecomp->reconstruct(labco->data + 2 * datalen, cp.strength); } @@ -1010,21 +1018,21 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const int levwavab = levwav; // printf("Levwavab before: %d\n",levwavab); - if(cp.chrores == 0.f && !hhutili && params->wavelet.CLmethod == "all") { // no processing of residual ab => we probably can reduce the number of levels - while(levwavab > 0 && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwavab - 1] == 0.f )) || (cp.CHmet != 2 && (levwavab == 10 || (!cp.curv || cp.mulC[levwavab - 1] == 0.f))))) && (!cp.opaRG || levwavab == 10 || (cp.opaRG && cp.mulopaRG[levwavab - 1] == 0.f)) && ((levwavab == 10 || (cp.CHSLmet == 1 && cp.mulC[levwavab - 1] == 0.f)))) { + if (cp.chrores == 0.f && !hhutili && params->wavelet.CLmethod == "all") { // no processing of residual ab => we probably can reduce the number of levels + while (levwavab > 0 && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwavab - 1] == 0.f)) || (cp.CHmet != 2 && (levwavab == 10 || (!cp.curv || cp.mulC[levwavab - 1] == 0.f))))) && (!cp.opaRG || levwavab == 10 || (cp.opaRG && cp.mulopaRG[levwavab - 1] == 0.f)) && ((levwavab == 10 || (cp.CHSLmet == 1 && cp.mulC[levwavab - 1] == 0.f)))) { levwavab--; } } // printf("Levwavab after: %d\n",levwavab); - if(levwavab > 0) { - wavelet_decomposition* adecomp = new wavelet_decomposition (labco->data + datalen, labco->W, labco->H, levwavab, 1, skip, max(1, wavNestedLevels), DaubLen ); - wavelet_decomposition* bdecomp = new wavelet_decomposition (labco->data + 2 * datalen, labco->W, labco->H, levwavab, 1, skip, max(1, wavNestedLevels), DaubLen ); + if (levwavab > 0) { + wavelet_decomposition* adecomp = new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwavab, 1, skip, max(1, wavNestedLevels), DaubLen); + wavelet_decomposition* bdecomp = new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavab, 1, skip, max(1, wavNestedLevels), DaubLen); - if(!adecomp->memoryAllocationFailed && !bdecomp->memoryAllocationFailed) { + if (!adecomp->memoryAllocationFailed && !bdecomp->memoryAllocationFailed) { WaveletcontAllAB(labco, varhue, varchro, *adecomp, waOpacityCurveW, cp, true); WaveletcontAllAB(labco, varhue, varchro, *bdecomp, waOpacityCurveW, cp, false); - WaveletAandBAllAB(*adecomp, *bdecomp, cp, hhCurve, hhutili ); + WaveletAandBAllAB(*adecomp, *bdecomp, cp, hhCurve, hhutili); adecomp->reconstruct(labco->data + datalen, cp.strength); bdecomp->reconstruct(labco->data + 2 * datalen, cp.strength); @@ -1040,12 +1048,12 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const delete hhCurve; } - if(numtiles > 1 || (numtiles == 1 /*&& cp.avoi*/)) {//in all case since I add contrast curve + if (numtiles > 1 || (numtiles == 1 /*&& cp.avoi*/)) { //in all case since I add contrast curve //calculate mask for feathering output tile overlaps float Vmask[height + overlap] ALIGNED16; float Hmask[width + overlap] ALIGNED16; - if(numtiles > 1) { + if (numtiles > 1) { for (int i = 0; i < height; i++) { Vmask[i] = 1; } @@ -1091,7 +1099,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const float xBuffer[rowWidth] ALIGNED64; float yBuffer[rowWidth] ALIGNED64; - if(cp.avoi) { + if (cp.avoi) { int col; __m128 av, bv; __m128 cv, yv, xv; @@ -1100,7 +1108,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const __m128 c327d68v = _mm_set1_ps(327.68f); vmask xyMask; - for(col = 0; col < rowWidth - 3; col += 4) { + for (col = 0; col < rowWidth - 3; col += 4) { av = LVFU(labco->a[i1][col]); bv = LVFU(labco->b[i1][col]); STVF(atan2Buffer[col], xatan2f(bv, av)); @@ -1117,7 +1125,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } - for(; col < rowWidth; col++) { + for (; col < rowWidth; col++) { float a = labco->a[i1][col]; float b = labco->b[i1][col]; atan2Buffer[col] = xatan2f(b, a); @@ -1133,7 +1141,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const for (int j = tileleft; j < tileright; j++) { int j1 = j - tileleft; - if(cp.avoi) { //Gamut and Munsell + if (cp.avoi) { //Gamut and Munsell #ifdef __SSE2__ float HH = atan2Buffer[j1]; float Chprov1 = chprovBuffer[j1]; @@ -1153,7 +1161,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const L = labco->L[i1][j1]; const float Lin = labco->L[i1][j1]; - if(wavclCurve && cp.finena) { + if (wavclCurve && cp.finena) { labco->L[i1][j1] = (0.5f * Lin + 1.5f * wavclCurve[Lin]) / 2.f; //apply contrast curve } @@ -1184,8 +1192,8 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const Color::AllMunsellLch(true, Lprov1, Lprov2, HH, Chprov, memChprov, correctionHue, correctlum); #endif - if(correctionHue != 0.f || correctlum != 0.f) { // only calculate sin and cos if HH changed - if(fabs(correctionHue) < 0.015f) { + if (correctionHue != 0.f || correctlum != 0.f) { // only calculate sin and cos if HH changed + if (fabs(correctionHue) < 0.015f) { HH += correctlum; // correct only if correct Munsell chroma very little. } @@ -1198,7 +1206,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const L = labco->L[i1][j1]; const float Lin = labco->L[i1][j1]; - if(wavclCurve && cp.finena) { + if (wavclCurve && cp.finena) { labco->L[i1][j1] = (0.5f * Lin + 1.5f * wavclCurve[Lin]) / 2.f; //apply contrast curve } @@ -1207,7 +1215,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const b = labco->b[i1][j1]; } - if(numtiles > 1) { + if (numtiles > 1) { float factor = Vmask[i1] * Hmask[j1]; dsttmp->L[i][j] += factor * L; dsttmp->a[i][j] += factor * a; @@ -1222,19 +1230,19 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } - if(LoldBuffer != nullptr) { + if (LoldBuffer != nullptr) { delete [] LoldBuffer; delete [] Lold; } - if(numtiles > 1) { + if (numtiles > 1) { delete labco; } } } for (int i = 0; i < tileheight; i++) - if(varhue[i] != nullptr) { + if (varhue[i] != nullptr) { delete [] varhue[i]; } @@ -1251,11 +1259,54 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const omp_set_nested(oldNested); #endif - if(numtiles != 1) { + if (numtiles != 1) { dst->CopyFrom(dsttmp); delete dsttmp; } + if (waparams.softradend > 0.f && cp.finena) { + array2D ble(lab->W, lab->H); + array2D guid(lab->W, lab->H); + + bool multiTh = false; + +#ifdef _OPENMP + if (numthreads > 1) { + multiTh = true; + } +#endif + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < lab->H; ir++) + for (int jr = 0; jr < lab->W; jr++) { + ble[ir][jr] = (dst->L[ir][jr] - provradius->L[ir][jr]) / 32768.f; + guid[ir][jr] = provradius->L[ir][jr] / 32768.f; + } + + float blur = 10.f / skip * (0.1f + 0.1f * waparams.softradend); + + rtengine::guidedFilter(guid, ble, ble, blur, 0.001, multiTh); + + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < lab->H; ir++) + for (int jr = 0; jr < lab->W; jr++) { + dst->L[ir][jr] = provradius->L[ir][jr] + 32768.f * ble[ir][jr]; + } + } + + if (waparams.softradend > 0.f && cp.finena) { + delete provradius; + provradius = NULL; + } + #ifdef _DEBUG delete MunsDebugInfo; #endif @@ -1267,7 +1318,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const #undef offset #undef epsilon -void ImProcFunctions::Aver( float * RESTRICT DataList, int datalen, float &averagePlus, float &averageNeg, float &max, float &min) +void ImProcFunctions::Aver(float * RESTRICT DataList, int datalen, float &averagePlus, float &averageNeg, float &max, float &min) { //find absolute mean @@ -1286,19 +1337,19 @@ void ImProcFunctions::Aver( float * RESTRICT DataList, int datalen, float &aver #pragma omp for reduction(+:averaP,averaN,countP,countN) nowait #endif - for(int i = 0; i < datalen; i++) { - if(DataList[i] >= thres) { + for (int i = 0; i < datalen; i++) { + if (DataList[i] >= thres) { averaP += DataList[i]; - if(DataList[i] > lmax) { + if (DataList[i] > lmax) { lmax = DataList[i]; } countP++; - } else if(DataList[i] < -thres) { + } else if (DataList[i] < -thres) { averaN += DataList[i]; - if(DataList[i] < lmin) { + if (DataList[i] < lmin) { lmin = DataList[i]; } @@ -1315,13 +1366,13 @@ void ImProcFunctions::Aver( float * RESTRICT DataList, int datalen, float &aver } } - if(countP > 0) { + if (countP > 0) { averagePlus = averaP / countP; } else { averagePlus = 0; } - if(countN > 0) { + if (countN > 0) { averageNeg = averaN / countN; } else { averageNeg = 0; @@ -1330,7 +1381,7 @@ void ImProcFunctions::Aver( float * RESTRICT DataList, int datalen, float &aver } -void ImProcFunctions::Sigma( float * RESTRICT DataList, int datalen, float averagePlus, float averageNeg, float &sigmaPlus, float &sigmaNeg) +void ImProcFunctions::Sigma(float * RESTRICT DataList, int datalen, float averagePlus, float averageNeg, float &sigmaPlus, float &sigmaNeg) { int countP = 0, countN = 0; double variP = 0.0, variN = 0.0; // use double precision for large summations @@ -1340,23 +1391,23 @@ void ImProcFunctions::Sigma( float * RESTRICT DataList, int datalen, float aver #pragma omp parallel for reduction(+:variP,variN,countP,countN) num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif - for(int i = 0; i < datalen; i++) { - if(DataList[i] >= thres) { + for (int i = 0; i < datalen; i++) { + if (DataList[i] >= thres) { variP += SQR(DataList[i] - averagePlus); countP++; - } else if(DataList[i] <= -thres) { + } else if (DataList[i] <= -thres) { variN += SQR(DataList[i] - averageNeg); countN++; } } - if(countP > 0) { + if (countP > 0) { sigmaPlus = sqrt(variP / countP); } else { sigmaPlus = 0; } - if(countN > 0) { + if (countN > 0) { sigmaNeg = sqrt(variN / countN); } else { sigmaNeg = 0; @@ -1377,12 +1428,12 @@ void ImProcFunctions::Evaluate2(wavelet_decomposition &WaveletCoeffs_L, float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl); - Eval2 (WavCoeffs_L, lvl, Wlvl_L, Hlvl_L, mean, meanN, sigma, sigmaN, MaxP, MaxN); + Eval2(WavCoeffs_L, lvl, Wlvl_L, Hlvl_L, mean, meanN, sigma, sigmaN, MaxP, MaxN); } } -void ImProcFunctions::Eval2 (float ** WavCoeffs_L, int level, - int W_L, int H_L, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN) +void ImProcFunctions::Eval2(float ** WavCoeffs_L, int level, + int W_L, int H_L, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN) { float avLP[4], avLN[4]; @@ -1432,17 +1483,17 @@ void ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compress float exponent; - if(DetailBoost > 0.f && DetailBoost < 0.05f ) { + if (DetailBoost > 0.f && DetailBoost < 0.05f) { float betemp = expf(-(2.f - DetailBoost + 0.694f)) - 1.f; //0.694 = log(2) - exponent = 1.2f * xlogf( -betemp); + exponent = 1.2f * xlogf(-betemp); exponent /= 20.f; - } else if(DetailBoost >= 0.05f && DetailBoost < 0.25f ) { + } else if (DetailBoost >= 0.05f && DetailBoost < 0.25f) { float betemp = expf(-(2.f - DetailBoost + 0.694f)) - 1.f; //0.694 = log(2) - exponent = 1.2f * xlogf( -betemp); + exponent = 1.2f * xlogf(-betemp); exponent /= (-75.f * DetailBoost + 23.75f); - } else if(DetailBoost >= 0.25f) { + } else if (DetailBoost >= 0.25f) { float betemp = expf(-(2.f - DetailBoost + 0.694f)) - 1.f; //0.694 = log(2) - exponent = 1.2f * xlogf( -betemp); + exponent = 1.2f * xlogf(-betemp); exponent /= (-2.f * DetailBoost + 5.5f); } else { exponent = (Compression - 1.0f) / 20.f; @@ -1461,12 +1512,12 @@ void ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compress #pragma omp for #endif - for(int i = 0; i < n - 3; i += 4) { + for (int i = 0; i < n - 3; i += 4) { STVFU(Source[i], xexpf(xlogf(LVFU(Source[i])) * exponentv)); } } - for(int i = n - (n % 4); i < n; i++) { + for (int i = n - (n % 4); i < n; i++) { Source[i] = xexpf(xlogf(Source[i]) * exponent); } @@ -1475,7 +1526,7 @@ void ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compress #pragma omp parallel for #endif - for(int i = 0; i < n; i++) { + for (int i = 0; i < n; i++) { Source[i] = xexpf(xlogf(Source[i]) * exponent); } @@ -1489,7 +1540,7 @@ void ImProcFunctions::ContrastResid(float * WavCoeffs_L0, struct cont_params &cp float gamm = params->wavelet.gamma; cp.TMmeth = 2; //default after testing - if(cp.TMmeth == 1) { + if (cp.TMmeth == 1) { min0 = 0.0f; max0 = 32768.f; } else if (cp.TMmeth == 2) { @@ -1500,7 +1551,7 @@ void ImProcFunctions::ContrastResid(float * WavCoeffs_L0, struct cont_params &cp #pragma omp parallel for #endif - for(int i = 0; i < W_L * H_L; i++) { + for (int i = 0; i < W_L * H_L; i++) { WavCoeffs_L0[i] = (WavCoeffs_L0[i] - min0) / max0; WavCoeffs_L0[i] *= gamm; } @@ -1508,7 +1559,7 @@ void ImProcFunctions::ContrastResid(float * WavCoeffs_L0, struct cont_params &cp float Compression = expf(-stren); //This modification turns numbers symmetric around 0 into exponents. float DetailBoost = stren; - if(stren < 0.0f) { + if (stren < 0.0f) { DetailBoost = 0.0f; //Go with effect of exponent only if uncompressing. } @@ -1520,7 +1571,7 @@ void ImProcFunctions::ContrastResid(float * WavCoeffs_L0, struct cont_params &cp #pragma omp parallel for // removed schedule(dynamic,10) #endif - for(int ii = 0; ii < W_L * H_L; ii++) { + for (int ii = 0; ii < W_L * H_L; ii++) { WavCoeffs_L0[ii] = WavCoeffs_L0[ii] * max0 * (1.f / gamm) + min0; } } @@ -1540,7 +1591,7 @@ void ImProcFunctions::EPDToneMapResid(float * WavCoeffs_L0, unsigned int Iterat EdgePreservingDecomposition epd2(W_L, H_L); cp.TMmeth = 2; //default after testing - if(cp.TMmeth == 1) { + if (cp.TMmeth == 1) { min0 = 0.0f; max0 = 32768.f; } else if (cp.TMmeth == 2) { @@ -1552,7 +1603,7 @@ void ImProcFunctions::EPDToneMapResid(float * WavCoeffs_L0, unsigned int Iterat #pragma omp parallel for #endif - for(int i = 0; i < W_L * H_L; i++) { + for (int i = 0; i < W_L * H_L; i++) { WavCoeffs_L0[i] = (WavCoeffs_L0[i] - min0) / max0; WavCoeffs_L0[i] *= gamm; } @@ -1560,12 +1611,12 @@ void ImProcFunctions::EPDToneMapResid(float * WavCoeffs_L0, unsigned int Iterat float Compression = expf(-stren); //This modification turns numbers symmetric around 0 into exponents. float DetailBoost = stren; - if(stren < 0.0f) { + if (stren < 0.0f) { DetailBoost = 0.0f; //Go with effect of exponent only if uncompressing. } //Auto select number of iterates. Note that p->EdgeStopping = 0 makes a Gaussian blur. - if(Iterates == 0) { + if (Iterates == 0) { Iterates = (unsigned int)(edgest * 15.0f); } @@ -1577,7 +1628,7 @@ void ImProcFunctions::EPDToneMapResid(float * WavCoeffs_L0, unsigned int Iterat #pragma omp parallel for // removed schedule(dynamic,10) #endif - for(int ii = 0; ii < W_L * H_L; ii++) { + for (int ii = 0; ii < W_L * H_L; ii++) { WavCoeffs_L0[ii] = WavCoeffs_L0[ii] * max0 * (1.f / gamm) + min0; } } @@ -1592,7 +1643,7 @@ void ImProcFunctions::WaveletcontAllLfinal(wavelet_decomposition &WaveletCoeffs_ int Wlvl_L = WaveletCoeffs_L.level_W(lvl); int Hlvl_L = WaveletCoeffs_L.level_H(lvl); float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl); - finalContAllL (WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, mean, sigma, MaxP, waOpacityCurveWL); + finalContAllL(WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, mean, sigma, MaxP, waOpacityCurveWL); } } } @@ -1615,7 +1666,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * float max0 = 0.f; float min0 = FLT_MAX; - if(contrast != 0.f || (cp.tonemap && cp.resena)) { // contrast = 0.f means that all will be multiplied by 1.f, so we can skip this step + if (contrast != 0.f || (cp.tonemap && cp.resena)) { // contrast = 0.f means that all will be multiplied by 1.f, so we can skip this step #ifdef _OPENMP #pragma omp parallel for reduction(+:avedbl) num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif @@ -1635,12 +1686,12 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * #pragma omp for #endif - for(int i = 0; i < W_L * H_L; i++) { - if(WavCoeffs_L0[i] < lminL) { + for (int i = 0; i < W_L * H_L; i++) { + if (WavCoeffs_L0[i] < lminL) { lminL = WavCoeffs_L0[i]; } - if(WavCoeffs_L0[i] > lmaxL) { + if (WavCoeffs_L0[i] > lmaxL) { lmaxL = WavCoeffs_L0[i]; } @@ -1650,11 +1701,11 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * #pragma omp critical #endif { - if(lminL < min0) { + if (lminL < min0) { min0 = lminL; } - if(lmaxL > max0) { + if (lmaxL > max0) { max0 = lmaxL; } } @@ -1666,7 +1717,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * // printf("MAXmax0=%f MINmin0=%f\n",max0,min0); //tone mapping - if(cp.tonemap && cp.contmet == 2 && cp.resena) { + if (cp.tonemap && cp.contmet == 2 && cp.resena) { //iterate = 5 EPDToneMapResid(WavCoeffs_L0, 5, skip, cp, W_L, H_L, max0, min0); @@ -1691,7 +1742,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * float *koeLibuffer = nullptr; - for(int y = 0; y < 12; y++) { + for (int y = 0; y < 12; y++) { maxkoeLi[y] = 0.f; //9 } @@ -1701,7 +1752,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * koeLi[i] = &koeLibuffer[i * W_L * H_L]; } - for(int j = 0; j < 12; j++) //9 + for (int j = 0; j < 12; j++) //9 for (int i = 0; i < W_L * H_L; i++) { koeLi[j][i] = 0.f; } @@ -1710,17 +1761,17 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif { - if(contrast != 0.f && cp.resena && max0 > 0.0) { // contrast = 0.f means that all will be multiplied by 1.f, so we can skip this step + if (contrast != 0.f && cp.resena && max0 > 0.0) { // contrast = 0.f means that all will be multiplied by 1.f, so we can skip this step { #ifdef _OPENMP #pragma omp for #endif for (int i = 0; i < W_L * H_L; i++) { //contrast - if(WavCoeffs_L0[i] < 32768.f) { + if (WavCoeffs_L0[i] < 32768.f) { float prov; - if( WavCoeffs_L0[i] > ave) { + if (WavCoeffs_L0[i] > ave) { float kh = ah * (WavCoeffs_L0[i] / 327.68f) + bh; prov = WavCoeffs_L0[i]; WavCoeffs_L0[i] = ave + kh * (WavCoeffs_L0[i] - ave); @@ -1738,7 +1789,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } } - if(cp.tonemap && cp.contmet == 1 && cp.resena) { + if (cp.tonemap && cp.contmet == 1 && cp.resena) { float maxp = max0 * 256.f; float minp = min0 * 256.f; #ifdef _OPENMP @@ -1751,7 +1802,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * #pragma omp barrier #endif - if((cp.conres != 0.f || cp.conresH != 0.f) && cp.resena) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step + if ((cp.conres != 0.f || cp.conresH != 0.f) && cp.resena) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step #ifdef _OPENMP #pragma omp for nowait #endif @@ -1763,15 +1814,15 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * //shadow float alp = 3.f; //increase contrast sahdow in lowlights between 1 and ?? - if(cp.th > (100.f - tran)) { + if (cp.th > (100.f - tran)) { tran = 100.f - cp.th; } - if(LL100 < cp.th) { + if (LL100 < cp.th) { float aalp = (1.f - alp) / cp.th; //no changes for LL100 = cp.th float kk = aalp * LL100 + alp; WavCoeffs_L0[i] *= (1.f + kk * cp.conres / 200.f); - } else if(LL100 < cp.th + tran) { + } else if (LL100 < cp.th + tran) { float ath = -cp.conres / tran; float bth = cp.conres - ath * cp.th; WavCoeffs_L0[i] *= (1.f + (LL100 * ath + bth) / 200.f); @@ -1780,13 +1831,13 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * //highlight tran = 5.f; - if(cp.thH < (tran)) { + if (cp.thH < (tran)) { tran = cp.thH; } - if(LL100 > cp.thH) { + if (LL100 > cp.thH) { WavCoeffs_L0[i] *= (1.f + cp.conresH / 200.f); - } else if(LL100 > (cp.thH - tran)) { + } else if (LL100 > (cp.thH - tran)) { float athH = cp.conresH / tran; float bthH = cp.conresH - athH * cp.thH; WavCoeffs_L0[i] *= (1.f + (LL100 * athH + bthH) / 200.f); @@ -1806,7 +1857,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * float eddlipampl = 1.f + cp.edgampl / 50.f; - if(cp.detectedge) { //enabled Lipschitz control...more memory..more time... + if (cp.detectedge) { //enabled Lipschitz control...more memory..more time... float *tmCBuffer = new float[H_L * W_L]; float *tmC[H_L]; @@ -1824,7 +1875,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * int H_L = WaveletCoeffs_L.level_H(lvl); float ** WavCoeffs_LL = WaveletCoeffs_L.level_coeffs(lvl); - calckoe(WavCoeffs_LL, cp, koeLi, lvl , dir, W_L, H_L, edd, maxkoeLi, tmC); + calckoe(WavCoeffs_LL, cp, koeLi, lvl, dir, W_L, H_L, edd, maxkoeLi, tmC); // return convolution KoeLi and maxkoeLi of level 0 1 2 3 and Dir Horiz, Vert, Diag } } @@ -1843,7 +1894,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * //treatment of koeLi and maxkoeLi float interm = 0.f; - if(cp.lip3 && cp.lipp) { + if (cp.lip3 && cp.lipp) { // comparison between pixel and neighbours const auto neigh = cp.neigh == 1; const auto kneigh = neigh ? 28.f : 38.f; @@ -1882,11 +1933,11 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * //Liamp=1 for eddlipinfl //liamp > 1 for alp >eddlipinfl and alph < 1 //Liamp < 1 for alp < eddlipinfl and alph > 0 - if(alph > 1.f) { + if (alph > 1.f) { alph = 1.f / alph; } - if(beta > 1.f) { + if (beta > 1.f) { beta = 1.f / beta; } @@ -1896,14 +1947,14 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * float bet = 1.f; //if(cp.lip3) {//enhance algorithm - if(alph > eddlipinfl && beta < 0.85f * eddlipinfl) { //0.85 arbitrary value ==> eliminate from edge if H V D too different + if (alph > eddlipinfl && beta < 0.85f * eddlipinfl) { //0.85 arbitrary value ==> eliminate from edge if H V D too different bet = beta; } //} float AmpLip = 1.f; - if(alph > eddlipinfl) { + if (alph > eddlipinfl) { AmpLip = alipinfl * alph + blipinfl; //If beta low reduce kampli kampli = SQR(bet) * AmpLip * aamp; } else { @@ -1923,7 +1974,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * interm *= kampli; - if(interm < cp.eddetthr / eddlow) { + if (interm < cp.eddetthr / eddlow) { interm = 0.01f; //eliminate too low values } @@ -1949,7 +2000,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl); - ContAllL (koeLi, maxkoeLi, true, maxlvl, labco, varhue, varchrom, WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); + ContAllL(koeLi, maxkoeLi, true, maxlvl, labco, varhue, varchrom, WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); } @@ -1957,7 +2008,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } //delete edge detection - if(koeLibuffer) { + if (koeLibuffer) { delete [] koeLibuffer; } } @@ -1998,7 +2049,7 @@ void ImProcFunctions::WaveletAandBAllAB(wavelet_decomposition &WaveletCoeffs_a, STVF(chrbuffer[k], chrv); } - for(; k < W_L; k++) { + for (; k < W_L; k++) { huebuffer[k] = xatan2f(WavCoeffs_b0[i * W_L + k], WavCoeffs_a0[i * W_L + k]); chrbuffer[k] = sqrtf(SQR(WavCoeffs_b0[i * W_L + k]) + SQR(WavCoeffs_a0[i * W_L + k])) / 327.68f; } @@ -2044,7 +2095,7 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif { - if(cp.chrores != 0.f && cp.resena) { // cp.chrores == 0.f means all will be multiplied by 1.f, so we can skip the processing of residual + if (cp.chrores != 0.f && cp.resena) { // cp.chrores == 0.f means all will be multiplied by 1.f, so we can skip the processing of residual #ifdef _OPENMP #pragma omp for nowait @@ -2058,22 +2109,22 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float float modhue = varhue[ii][jj]; float scale = 1.f; - if(skyprot > 0.f) { - if((modhue < cp.t_ry && modhue > cp.t_ly)) { + if (skyprot > 0.f) { + if ((modhue < cp.t_ry && modhue > cp.t_ly)) { scale = (100.f - cp.sky) / 100.1f; - } else if((modhue >= cp.t_ry && modhue < cp.b_ry)) { + } else if ((modhue >= cp.t_ry && modhue < cp.b_ry)) { scale = (100.f - cp.sky) / 100.1f; float ar = (scale - 1.f) / (cp.t_ry - cp.b_ry); float br = scale - cp.t_ry * ar; scale = ar * modhue + br; - } else if((modhue > cp.b_ly && modhue < cp.t_ly)) { + } else if ((modhue > cp.b_ly && modhue < cp.t_ly)) { scale = (100.f - cp.sky) / 100.1f; float al = (scale - 1.f) / (-cp.b_ly + cp.t_ly); float bl = scale - cp.t_ly * al; scale = al * modhue + bl; } - } else if(skyprot < 0.f) { - if((modhue > cp.t_ry || modhue < cp.t_ly)) { + } else if (skyprot < 0.f) { + if ((modhue > cp.t_ry || modhue < cp.t_ly)) { scale = (100.f + cp.sky) / 100.1f; } @@ -2097,7 +2148,7 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float } } - if(cp.cbena && cp.resena) {//if user select Toning and color balance + if (cp.cbena && cp.resena) { //if user select Toning and color balance #ifdef _OPENMP #pragma omp for nowait @@ -2110,24 +2161,24 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float float sca = 1.f; //amplifer - reducter...about 1, but perhaps 0.6 or 1.3 - if(useChannelA) {//green red (little magenta) + if (useChannelA) { //green red (little magenta) //transition to avoid artifacts with 6 between 30 to 36 and 63 to 69 float aa = (cp.grmed - cp.grlow) / 6.f; float bb = cp.grlow - 30.f * aa; float aaa = (cp.grhigh - cp.grmed) / 6.f; float bbb = cp.grmed - 63.f * aaa; - if(LL < 30.f) { //shadows + if (LL < 30.f) { //shadows WavCoeffs_ab0[i] += cp.grlow * (sca) * 300.f; - } else if(LL >= 30.f && LL < 36.f) { //transition + } else if (LL >= 30.f && LL < 36.f) { //transition float tr = aa * LL + bb; WavCoeffs_ab0[i] += tr * (sca) * 300.f; - } else if(LL >= 36.f && LL < 63.f) { //midtones + } else if (LL >= 36.f && LL < 63.f) { //midtones WavCoeffs_ab0[i] += cp.grmed * (sca) * 300.f; - } else if(LL >= 63.f && LL < 69.f) { //transition + } else if (LL >= 63.f && LL < 69.f) { //transition float trh = aaa * LL + bbb; WavCoeffs_ab0[i] += trh * (sca) * 300.f; - } else if(LL >= 69.f) { //highlights + } else if (LL >= 69.f) { //highlights WavCoeffs_ab0[i] += cp.grhigh * (sca) * 300.f; } } else { //blue yellow @@ -2137,17 +2188,17 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float float aaa1 = (cp.blhigh - cp.blmed) / 6.f; float bbb1 = cp.blmed - 63.f * aaa1; - if(LL < 30.f) { + if (LL < 30.f) { WavCoeffs_ab0[i] += cp.bllow * (sca) * 300.f; - } else if(LL >= 30.f && LL < 36.f) { + } else if (LL >= 30.f && LL < 36.f) { float tr1 = aa1 * LL + bb1; WavCoeffs_ab0[i] += tr1 * (sca) * 300.f; - } else if(LL >= 36.f && LL < 63.f) { + } else if (LL >= 36.f && LL < 63.f) { WavCoeffs_ab0[i] += cp.blmed * (sca) * 300.f; - } else if(LL >= 63.f && LL < 69.f) { + } else if (LL >= 63.f && LL < 69.f) { float trh1 = aaa1 * LL + bbb1; WavCoeffs_ab0[i] += trh1 * (sca) * 300.f; - } else if(LL >= 69.f) { + } else if (LL >= 69.f) { WavCoeffs_ab0[i] += cp.blhigh * (sca) * 300.f; } } @@ -2165,7 +2216,7 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float int Hlvl_ab = WaveletCoeffs_ab.level_H(lvl); float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); - ContAllAB (labco, maxlvl, varhue, varchrom, WavCoeffs_ab, WavCoeffs_ab0, lvl, dir, waOpacityCurveW, cp, Wlvl_ab, Hlvl_ab, useChannelA); + ContAllAB(labco, maxlvl, varhue, varchrom, WavCoeffs_ab, WavCoeffs_ab0, lvl, dir, waOpacityCurveW, cp, Wlvl_ab, Hlvl_ab, useChannelA); } } @@ -2181,7 +2232,7 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, const struct cont_params& c int borderL = 2; // printf("cpedth=%f\n",cp.eddetthr); - if(cp.eddetthr < 30.f) { + if (cp.eddetthr < 30.f) { borderL = 1; // I calculate coefficients with r size matrix 3x3 r=1 ; 5x5 r=2; 7x7 r=3 @@ -2205,7 +2256,7 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, const struct cont_params& c } } - } else if(cp.eddetthr >= 30.f && cp.eddetthr < 50.f) { + } else if (cp.eddetthr >= 30.f && cp.eddetthr < 50.f) { borderL = 1; for (int i = 1; i < H_L - 1; i++) { //sigma=0.85 @@ -2221,7 +2272,7 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, const struct cont_params& c } - else if(cp.eddetthr >= 50.f && cp.eddetthr < 75.f) { + else if (cp.eddetthr >= 50.f && cp.eddetthr < 75.f) { borderL = 1; for (int i = 1; i < H_L - 1; i++) { @@ -2233,11 +2284,11 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, const struct cont_params& c } } - else if(cp.eddetthr >= 75.f) { + else if (cp.eddetthr >= 75.f) { borderL = 2; //if(cp.lip3 && level > 1) { - if(level > 1) {// do not activate 5x5 if level 0 or 1 + if (level > 1) { // do not activate 5x5 if level 0 or 1 for (int i = 2; i < H_L - 2; i++) { for (int j = 2; j < W_L - 2; j++) { @@ -2255,7 +2306,7 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, const struct cont_params& c // 4 9 12 9 4 // 2 4 5 4 2 // divi 159 - if(cp.eddetthr < 85.f) { //sigma=1.1 + if (cp.eddetthr < 85.f) { //sigma=1.1 tmC[i][j] = (15.f * WavCoeffs_LL[dir][i * W_L + j] + 10.f * WavCoeffs_LL[dir][(i - 1) * W_L + j] + 10.f * WavCoeffs_LL[dir][(i + 1) * W_L + j] + 10.f * WavCoeffs_LL[dir][i * W_L + j + 1] + 10.f * WavCoeffs_LL[dir][i * W_L + j - 1] + 7.f * WavCoeffs_LL[dir][(i - 1) * W_L + j - 1] + 7.f * WavCoeffs_LL[dir][(i - 1) * W_L + j + 1] + 7.f * WavCoeffs_LL[dir][(i + 1) * W_L + j - 1] + 7.f * WavCoeffs_LL[dir][(i + 1) * W_L + j + 1] @@ -2306,24 +2357,24 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, const struct cont_params& c thr2 += cp.eddet / 30.f; //to test float diffFactor = (cp.eddet / 100.f); - for(int i = 0; i < H_L; i++ ) { - for(int j = 0; j < W_L; j++) { + for (int i = 0; i < H_L; i++) { + for (int j = 0; j < W_L; j++) { koeLi[level * 3 + dir - 1][i * W_L + j] = 1.f; } } - for(int i = borderL; i < H_L - borderL; i++ ) { - for(int j = borderL; j < W_L - borderL; j++) { + for (int i = borderL; i < H_L - borderL; i++) { + for (int j = borderL; j < W_L - borderL; j++) { // my own algo : probably a little false, but simpler as Lipschitz ! // Thr2 = maximum of the function ==> Lipsitch says = probably edge // float temp = WavCoeffs_LL[dir][i*W_L + j]; // if(temp>=0.f && temp < thr) temp = thr; // if(temp < 0.f && temp > -thr) temp = -thr; - float temp = max(fabsf(WavCoeffs_LL[dir][i * W_L + j]), thr ); + float temp = max(fabsf(WavCoeffs_LL[dir][i * W_L + j]), thr); koeLi[level * 3 + dir - 1][i * W_L + j] = min(thr2, fabs(tmC[i][j] / temp)); // limit maxi //it will be more complicated to calculate both Wh and Wv, but we have also Wd==> pseudo Lipschitz - if(koeLi[level * 3 + dir - 1][i * W_L + j] > maxkoeLi[level * 3 + dir - 1]) { + if (koeLi[level * 3 + dir - 1][i * W_L + j] > maxkoeLi[level * 3 + dir - 1]) { maxkoeLi[level * 3 + dir - 1] = koeLi[level * 3 + dir - 1][i * W_L + j]; } @@ -2335,10 +2386,10 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, const struct cont_params& c } -void ImProcFunctions::finalContAllL (float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp, - int W_L, int H_L, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL) +void ImProcFunctions::finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp, + int W_L, int H_L, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL) { - if(cp.diagcurv && cp.finena && MaxP[level] > 0.f && mean[level] != 0.f && sigma[level] != 0.f ) { //curve + if (cp.diagcurv && cp.finena && MaxP[level] > 0.f && mean[level] != 0.f && sigma[level] != 0.f) { //curve float insigma = 0.666f; //SD float logmax = log(MaxP[level]); //log Max float rapX = (mean[level] + sigma[level]) / MaxP[level]; //rapport between sD / max @@ -2356,12 +2407,12 @@ void ImProcFunctions::finalContAllL (float ** WavCoeffs_L, float * WavCoeffs_L0, for (int i = 0; i < W_L * H_L; i++) { float absciss; - if(fabsf(WavCoeffs_L[dir][i]) >= (mean[level] + sigma[level])) { //for max + if (fabsf(WavCoeffs_L[dir][i]) >= (mean[level] + sigma[level])) { //for max float valcour = xlogf(fabsf(WavCoeffs_L[dir][i])); float valc = valcour - logmax; float vald = valc * rap; absciss = xexpf(vald); - } else if(fabsf(WavCoeffs_L[dir][i]) >= mean[level]) { + } else if (fabsf(WavCoeffs_L[dir][i]) >= mean[level]) { absciss = asig * fabsf(WavCoeffs_L[dir][i]) + bsig; } else { absciss = amean * fabsf(WavCoeffs_L[dir][i]); @@ -2382,34 +2433,34 @@ void ImProcFunctions::finalContAllL (float ** WavCoeffs_L, float * WavCoeffs_L0, int choiceClevel = 0; - if(params->wavelet.CLmethod == "one") { + if (params->wavelet.CLmethod == "one") { choiceClevel = 0; - } else if(params->wavelet.CLmethod == "inf") { + } else if (params->wavelet.CLmethod == "inf") { choiceClevel = 1; - } else if(params->wavelet.CLmethod == "sup") { + } else if (params->wavelet.CLmethod == "sup") { choiceClevel = 2; - } else if(params->wavelet.CLmethod == "all") { + } else if (params->wavelet.CLmethod == "all") { choiceClevel = 3; } int choiceDir = 0; - if(params->wavelet.Dirmethod == "one") { + if (params->wavelet.Dirmethod == "one") { choiceDir = 1; - } else if(params->wavelet.Dirmethod == "two") { + } else if (params->wavelet.Dirmethod == "two") { choiceDir = 2; - } else if(params->wavelet.Dirmethod == "thr") { + } else if (params->wavelet.Dirmethod == "thr") { choiceDir = 3; - } else if(params->wavelet.Dirmethod == "all") { + } else if (params->wavelet.Dirmethod == "all") { choiceDir = 0; } int dir1 = (choiceDir == 2) ? 1 : 2; int dir2 = (choiceDir == 3) ? 1 : 3; - if(choiceClevel < 3) { // not all levels visible, paint residual - if(level == 0) { - if(cp.backm != 2) { // nothing to change when residual is used as background + if (choiceClevel < 3) { // not all levels visible, paint residual + if (level == 0) { + if (cp.backm != 2) { // nothing to change when residual is used as background float backGroundColor = (cp.backm == 1) ? 12000.f : 0.f; for (int i = 0; i < W_L * H_L; i++) { @@ -2419,10 +2470,10 @@ void ImProcFunctions::finalContAllL (float ** WavCoeffs_L, float * WavCoeffs_L0, } } - if(choiceClevel == 0) { // Only one level + if (choiceClevel == 0) { // Only one level - if(choiceDir == 0) { // All directions - if(level != choicelevel) { // zero all for the levels != choicelevel + if (choiceDir == 0) { // All directions + if (level != choicelevel) { // zero all for the levels != choicelevel for (int dir = 1; dir < 4; dir++) { for (int i = 0; i < W_L * H_L; i++) { WavCoeffs_L[dir][i] = 0.f; @@ -2431,21 +2482,21 @@ void ImProcFunctions::finalContAllL (float ** WavCoeffs_L, float * WavCoeffs_L0, } } else { // zero the unwanted directions for level == choicelevel - if(choicelevel >= cp.maxilev) { + if (choicelevel >= cp.maxilev) { for (int dir = 1; dir < 4; dir++) { for (int i = 0; i < W_L * H_L; i++) { WavCoeffs_L[dir][i] = 0.f; } } - } else if(level != choicelevel) { // zero all for the levels != choicelevel + } else if (level != choicelevel) { // zero all for the levels != choicelevel for (int i = 0; i < W_L * H_L; i++) { WavCoeffs_L[dir1][i] = WavCoeffs_L[dir2][i] = 0.f; } } } - } else if(choiceClevel == 1) { // Only below level - if(choiceDir == 0) { // All directions - if(level > choicelevel) { + } else if (choiceClevel == 1) { // Only below level + if (choiceDir == 0) { // All directions + if (level > choicelevel) { for (int dir = 1; dir < 4; dir++) { for (int i = 0; i < W_L * H_L; i++) { WavCoeffs_L[dir][i] = 0.f; @@ -2453,15 +2504,15 @@ void ImProcFunctions::finalContAllL (float ** WavCoeffs_L, float * WavCoeffs_L0, } } } else { // zero the unwanted directions for level >= choicelevel - if(level > choicelevel) { + if (level > choicelevel) { for (int i = 0; i < W_L * H_L; i++) { WavCoeffs_L[dir1][i] = WavCoeffs_L[dir2][i] = 0.f; } } } - } else if(choiceClevel == 2) { // Only above level - if(choiceDir == 0) { // All directions - if(level <= choicelevel) { + } else if (choiceClevel == 2) { // Only above level + if (choiceDir == 0) { // All directions + if (level <= choicelevel) { for (int dir = 1; dir < 4; dir++) { for (int i = 0; i < W_L * H_L; i++) { WavCoeffs_L[dir][i] = 0.f; @@ -2469,7 +2520,7 @@ void ImProcFunctions::finalContAllL (float ** WavCoeffs_L, float * WavCoeffs_L0, } } } else { // zero the unwanted directions for level >= choicelevel - if(choicelevel >= cp.maxilev) { + if (choicelevel >= cp.maxilev) { for (int dir = 1; dir < 4; dir++) { for (int i = 0; i < W_L * H_L; i++) { WavCoeffs_L[dir][i] = 0.f; @@ -2478,7 +2529,7 @@ void ImProcFunctions::finalContAllL (float ** WavCoeffs_L, float * WavCoeffs_L0, } - else if(level <= choicelevel) { + else if (level <= choicelevel) { for (int i = 0; i < W_L * H_L; i++) { WavCoeffs_L[dir1][i] = WavCoeffs_L[dir2][i] = 0.f; } @@ -2489,16 +2540,16 @@ void ImProcFunctions::finalContAllL (float ** WavCoeffs_L, float * WavCoeffs_L0, } -void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschitz, int maxlvl, LabImage * labco, float ** varhue, float **varchrom, float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp, - int W_L, int H_L, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili) +void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz, int maxlvl, LabImage * labco, float ** varhue, float **varchrom, float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp, + int W_L, int H_L, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili) { - assert (level >= 0); - assert (maxlvl > level); + assert(level >= 0); + assert(maxlvl > level); static const float scales[10] = {1.f, 2.f, 4.f, 8.f, 16.f, 32.f, 64.f, 128.f, 256.f, 512.f}; float scaleskip[10]; - for(int sc = 0; sc < 10; sc++) { + for (int sc = 0; sc < 10; sc++) { scaleskip[sc] = scales[sc] / skip; } @@ -2510,11 +2561,11 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit float aedstr = (eddstrength - 1.f) / 90.f; float bedstr = 1.f - 10.f * aedstr; - if(cp.val > 0 && cp.edgeena) { + if (cp.val > 0 && cp.edgeena) { float * koe = nullptr; float maxkoe = 0.f; - if(!lipschitz) { + if (!lipschitz) { koe = new float [H_L * W_L]; for (int i = 0; i < W_L * H_L; i++) { @@ -2523,7 +2574,7 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit maxkoe = 0.f; - if(cp.detectedge) { + if (cp.detectedge) { float** tmC; int borderL = 1; tmC = new float*[H_L]; @@ -2549,25 +2600,25 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit - for(int i = borderL; i < H_L - borderL; i++ ) { - for(int j = borderL; j < W_L - borderL; j++) { + for (int i = borderL; i < H_L - borderL; i++) { + for (int j = borderL; j < W_L - borderL; j++) { // my own algo : probably a little false, but simpler as Lipschitz ! float thr = 40.f; //avoid artifact eg. noise...to test float thr2 = edd; //edd can be modified in option ed_detect thr2 += cp.eddet / 30.f; //to test float temp = WavCoeffs_L[dir][i * W_L + j]; - if(temp >= 0.f && temp < thr) { + if (temp >= 0.f && temp < thr) { temp = thr; } - if(temp < 0.f && temp > -thr) { + if (temp < 0.f && temp > -thr) { temp = -thr; } koe[i * W_L + j] = min(thr2, fabs(tmC[i][j] / temp)); - if(koe[i * W_L + j] > maxkoe) { + if (koe[i * W_L + j] > maxkoe) { maxkoe = koe[i * W_L + j]; } @@ -2575,7 +2626,7 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit diff *= (cp.eddet / 100.f); float interm = maxkoe - diff; - if(interm < cp.eddetthr / 30.f) { + if (interm < cp.eddetthr / 30.f) { interm = 0.01f; } @@ -2608,18 +2659,18 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit float repart = (float)cp.til; float brepart; - if(cp.reinforce == 1) { + if (cp.reinforce == 1) { brepart = 3.f; } - if(cp.reinforce == 3) { + if (cp.reinforce == 3) { brepart = 0.5f; //arbitrary value to increase / decrease repart, between 1 and 0 } float arepart = -(brepart - 1.f) / (lim0 / 60.f); if (cp.reinforce != 2) { - if(rad < lim0 / 60.f) { + if (rad < lim0 / 60.f) { repart *= (arepart * rad + brepart); //linear repartition of repart } } @@ -2633,35 +2684,35 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit float expkoef = -pow(fabs(rad - lev), koef); //reduce effect for high levels if (cp.reinforce == 3) { - if(rad < lim0 / 60.f && level == 0) { + if (rad < lim0 / 60.f && level == 0) { expkoef *= abs(repart); //reduce effect for low values of rad and level=0==> quasi only level 1 is effective } } if (cp.reinforce == 1) { - if(rad < lim0 / 60.f && level == 1) { + if (rad < lim0 / 60.f && level == 1) { expkoef /= repart; //increase effect for low values of rad and level=1==> quasi only level 0 is effective } } //take into account local contrast - float refin = value * exp (expkoef); + float refin = value * exp(expkoef); - if(cp.link && cp.noiseena) { //combi + if (cp.link && cp.noiseena) { //combi { - if(level == 0) { + if (level == 0) { refin *= (1.f + cp.lev0s / 50.f); // we can change this sensibility! } - if(level == 1) { + if (level == 1) { refin *= (1.f + cp.lev1s / 50.f); } - if(level == 2) { + if (level == 2) { refin *= (1.f + cp.lev2s / 50.f); } - if(level == 3) { + if (level == 3) { refin *= (1.f + cp.lev3s / 50.f); } } @@ -2669,7 +2720,7 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit float edgePrecalc = 1.f + refin; //estimate edge "pseudo variance" - if(cp.EDmet == 2 && MaxP[level] > 0.f) { //curve + if (cp.EDmet == 2 && MaxP[level] > 0.f) { //curve // if(exa) {//curve float insigma = 0.666f; //SD float logmax = log(MaxP[level]); //log Max @@ -2685,21 +2736,21 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit float kmul; int borderL = 1; - for(int i = borderL; i < H_L - borderL; i++ ) { - for(int j = borderL; j < W_L - borderL; j++) { + for (int i = borderL; i < H_L - borderL; i++) { + for (int j = borderL; j < W_L - borderL; j++) { int k = i * W_L + j; - if(cp.detectedge) { - if(!lipschitz) { - if(cp.eddet > 10.f) { + if (cp.detectedge) { + if (!lipschitz) { + if (cp.eddet > 10.f) { edge = (aedstr * cp.eddet + bedstr) * (edgePrecalc * (1.f + koe[k])) / (1.f + 0.9f * maxkoe); } else { edge = (edgePrecalc * (1.f + koe[k])) / (1.f + 0.9f * maxkoe); } } - if(lipschitz) { - if(level < 4) { + if (lipschitz) { + if (level < 4) { edge = 1.f + (edgePrecalc - 1.f) * (koeLi[level * 3][k]) / (1.f + 0.9f * maxkoeLi[level * 3 + dir - 1]); } else { edge = edgePrecalc; @@ -2709,16 +2760,16 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit edge = edgePrecalc; } - if(cp.edgcurv) { - if(fabs(WavCoeffs_L[dir][k]) >= (mean[level] + sigma[level])) { //for max + if (cp.edgcurv) { + if (fabs(WavCoeffs_L[dir][k]) >= (mean[level] + sigma[level])) { //for max float valcour = log(fabs(WavCoeffs_L[dir][k])); float valc = valcour - logmax; float vald = valc * rap; absciss = exp(vald); - } else if(fabs(WavCoeffs_L[dir][k]) >= mean[level] && fabs(WavCoeffs_L[dir][k]) < (mean[level] + sigma[level])) { + } else if (fabs(WavCoeffs_L[dir][k]) >= mean[level] && fabs(WavCoeffs_L[dir][k]) < (mean[level] + sigma[level])) { absciss = asig * fabs(WavCoeffs_L[dir][k]) + bsig; - } else if(fabs(WavCoeffs_L[dir][k]) < mean[level]) { + } else if (fabs(WavCoeffs_L[dir][k]) < mean[level]) { absciss = amean * fabs(WavCoeffs_L[dir][k]); } @@ -2740,7 +2791,7 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit float am = (abssd - bbssd) / 0.666f; float kmuld = 0.f; - if(absciss > 0.666f && absciss < 1.f) { + if (absciss > 0.666f && absciss < 1.f) { kmul = a_abssd * absciss + b_abssd; //about max ==> kinterm kmuld = da_abssd * absciss + db_abssd; } else { @@ -2751,20 +2802,20 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit float kc = kmul * (wavCLVCcurve[absciss * 500.f] - 0.5f); float kcd = kmuld * (wavCLVCcurve[absciss * 500.f] - 0.5f); - if(kc >= 0.f) { + if (kc >= 0.f) { float reduceeffect = 0.6f; kinterm = 1.f + reduceeffect * kmul * (wavCLVCcurve[absciss * 500.f] - 0.5f); //about 1 to 3 general and big amplification for max (under 0) } else { kinterm = 1.f - (SQR(kcd)) / 10.f; } - if(kinterm < 0.f) { + if (kinterm < 0.f) { kinterm = 0.01f; } edge *= kinterm; - if(edge < 1.f) { + if (edge < 1.f) { edge = 1.f; } } @@ -2772,7 +2823,7 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit WavCoeffs_L[dir][k] *= edge; } } - } else if(cp.EDmet == 1) { //threshold adjuster + } else if (cp.EDmet == 1) { //threshold adjuster float MaxPCompare = MaxP[level] * SQR(cp.edg_max / 100.f); //100 instead of b_r...case if b_r < 100 float MaxNCompare = MaxN[level] * SQR(cp.edg_max / 100.f); //always reduce a little edge for near max values float edgeSdCompare = (mean[level] + 1.5f * sigma[level]) * SQR(cp.edg_sd / t_r); // 1.5 standard deviation #80% range between mean 50% and 80% @@ -2781,7 +2832,7 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit float edgeMeanFactor = cbrt(cp.edg_mean / t_l); float interm; - if(cp.edg_low < 10.f) { + if (cp.edg_low < 10.f) { interm = cbrt((5.f + cp.edg_low) / 5.f); } else { interm = 1.437f; //cbrt(3); @@ -2795,21 +2846,21 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit //for (int i=0; i 10.f) { + if (cp.detectedge) { + if (!lipschitz) { + if (cp.eddet > 10.f) { edge = (aedstr * cp.eddet + bedstr) * (edgePrecalc * (1.f + koe[k])) / (1.f + 0.9f * maxkoe); } else { edge = (edgePrecalc * (1.f + koe[k])) / (1.f + 0.9f * maxkoe); } } - if(lipschitz) { - if(level < 4) { + if (lipschitz) { + if (level < 4) { edge = 1.f + (edgePrecalc - 1.f) * (koeLi[level * 3][k]) / (1.f + 0.9f * maxkoeLi[level * 3 + dir - 1]); } else { edge = edgePrecalc; @@ -2829,17 +2880,17 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit // If we move sliders to the left, local contrast is reduced // if we move sliders to the right local contrast is increased // MaxP, MaxN, mean, sigma are calculated if necessary (val > 0) by evaluate2(), eval2(), aver() , sigma() - if(b_r < 100.f && cp.edg_max / b_r > 1.f) { //in case of b_r < 100 and slider move to right + if (b_r < 100.f && cp.edg_max / b_r > 1.f) { //in case of b_r < 100 and slider move to right if (WavCoeffs_L[dir][k] > MaxPCompare * cp.edg_max / b_r) { edge *= edgMaxFsup; - if(edge < 1.f) { + if (edge < 1.f) { edge = 1.f; } } else if (WavCoeffs_L[dir][k] < MaxNCompare * cp.edg_max / b_r) { edge *= edgMaxFsup; - if(edge < 1.f) { + if (edge < 1.f) { edge = 1.f; } } @@ -2848,14 +2899,14 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit if (WavCoeffs_L[dir][k] > MaxPCompare) { edge *= edgeMaxFactor; - if(edge < 1.f) { + if (edge < 1.f) { edge = 1.f; } }//reduce edge if > new max else if (WavCoeffs_L[dir][k] < MaxNCompare) { edge *= edgeMaxFactor; - if(edge < 1.f) { + if (edge < 1.f) { edge = 1.f; } } @@ -2864,7 +2915,7 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit //if (fabs(WavCoeffs_L[dir][i]) > edgeSdCompare) { edge *= edgeSdFactor; - if(edge < 1.f) { + if (edge < 1.f) { edge = 1.f; } }//modify effect if sd change @@ -2872,7 +2923,7 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit if (fabs(WavCoeffs_L[dir][k]) < edgeMeanCompare) { edge *= edgeMeanFactor; - if(edge < 1.f) { + if (edge < 1.f) { edge = 1.f; } } // modify effect if mean change @@ -2880,7 +2931,7 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit if (fabs(WavCoeffs_L[dir][k]) < edgeLowCompare) { edge *= edgeLowFactor; - if(edge < 1.f) { + if (edge < 1.f) { edge = 1.f; } } @@ -2890,29 +2941,29 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit } } - if(!lipschitz) { + if (!lipschitz) { delete [] koe; } } - if(!cp.link && cp.noiseena) { //used both with denoise 1 2 3 + if (!cp.link && cp.noiseena) { //used both with denoise 1 2 3 float refine = 0.f; for (int i = 0; i < W_L * H_L; i++) { - if(level == 0) { + if (level == 0) { refine = cp.lev0s / 40.f; } - if(level == 1) { + if (level == 1) { refine = cp.lev1s / 40.f; } - if(level == 2) { + if (level == 2) { refine = cp.lev2s / 40.f; } - if(level == 3) { + if (level == 3) { refine = cp.lev3s / 40.f; } @@ -2923,7 +2974,7 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit float cpMul = cp.mul[level]; - if(cpMul != 0.f && cp.contena) { // cpMul == 0.f means all will be multiplied by 1.f, so we can skip this + if (cpMul != 0.f && cp.contena) { // cpMul == 0.f means all will be multiplied by 1.f, so we can skip this const float skinprot = params->wavelet.skinprotect; const float skinprotneg = -skinprot; @@ -2950,30 +3001,30 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit for (int i = 0; i < W_L * H_L; i++) { float kLlev = 1.f; - if(cpMul < 0.f) { + if (cpMul < 0.f) { beta = 1.f; // disabled for negatives values "less contrast" } else { float WavCL = fabsf(WavCoeffs_L[dir][i]); //reduction amplification: max action between mean / 2 and mean + sigma // arbitrary coefficient, we can add a slider !! - if(WavCL < mea[0]) { + if (WavCL < mea[0]) { beta = 0.6f; //preserve very low contrast (sky...) - } else if(WavCL < mea[1]) { + } else if (WavCL < mea[1]) { beta = 0.8f; - } else if(WavCL < mea[2]) { + } else if (WavCL < mea[2]) { beta = 1.f; //standard - } else if(WavCL < mea[3]) { + } else if (WavCL < mea[3]) { beta = 1.f; - } else if(WavCL < mea[4]) { + } else if (WavCL < mea[4]) { beta = 0.8f; //+sigma - } else if(WavCL < mea[5]) { + } else if (WavCL < mea[5]) { beta = 0.6f; - } else if(WavCL < mea[6]) { + } else if (WavCL < mea[6]) { beta = 0.4f; - } else if(WavCL < mea[7]) { + } else if (WavCL < mea[7]) { beta = 0.2f; // + 2 sigma - } else if(WavCL < mea[8]) { + } else if (WavCL < mea[8]) { beta = 0.1f; } else { beta = 0.0f; @@ -2992,8 +3043,8 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit LL100res = WavCoeffs_L0[i] / 327.68f; float delta = fabs(LL100init - LL100res) / (maxlvl / 2); - for(int ml = 0; ml < maxlvl; ml++) { - if(ml < maxlvl / 2) { + for (int ml = 0; ml < maxlvl; ml++) { + if (ml < maxlvl / 2) { kH[ml] = (LL100res + ml * delta) / LL100res; // fixed a priori max to level middle } else { kH[ml] = (LL100init - ml * delta) / LL100res; @@ -3001,16 +3052,16 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit } - if(useChromAndHue) { + if (useChromAndHue) { float modhue = varhue[ii][jj]; modchro = varchrom[ii * 2][jj * 2]; // hue chroma skin with initial lab datas scale = 1.f; - if(skinprot > 0.f) { - Color::SkinSatCbdl2 (LL100, modhue, modchro, skinprot, scale, true, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 0); //0 for skin and extand - } else if(skinprot < 0.f) { - Color::SkinSatCbdl2 (LL100, modhue, modchro, skinprotneg, scale, false, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 0); + if (skinprot > 0.f) { + Color::SkinSatCbdl2(LL100, modhue, modchro, skinprot, scale, true, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 0); //0 for skin and extand + } else if (skinprot < 0.f) { + Color::SkinSatCbdl2(LL100, modhue, modchro, skinprotneg, scale, false, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 0); if (scale == 1.f) { scale = factorHard; @@ -3021,14 +3072,14 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit } - if(Chutili) { + if (Chutili) { int i_i = i / W_L; int j_j = i - i_i * W_L; double lr; float modhue2 = varhue[i_i][j_j]; float valparam = float((ChCurve->getVal(lr = Color::huelab_to_huehsv2(modhue2)) - 0.5f)); //get valparam=f(H) - if(valparam > 0.f) { + if (valparam > 0.f) { scale2 = 1.f + 3.f * valparam; //arbitrary value } else { scale2 = 1.f + 1.9f * valparam; //near 0 but not zero if curve # 0 @@ -3039,7 +3090,7 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit float diagacc = 1.f; float alpha = (1024.f + 15.f * (float) cpMul * scale * scale2 * beta * diagacc) / 1024.f ; - if(cp.HSmet && cp.contena) { + if (cp.HSmet && cp.contena) { float aaal = (1.f - alpha) / ((cp.b_lhl - cp.t_lhl) * kH[level]); float bbal = 1.f - aaal * cp.b_lhl * kH[level]; float aaar = (alpha - 1.f) / (cp.t_rhl - cp.b_rhl) * kH[level]; @@ -3050,24 +3101,24 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit float aaarS = (alpha - 1.f) / (cp.t_rsl - cp.b_rsl); float bbbrS = 1.f - cp.b_rsl * aaarS; - if(level <= cp.numlevH) { //in function of levels - if((LL100 > cp.t_lhl * kH[level] && LL100 < cp.t_rhl * kH[level])) { + if (level <= cp.numlevH) { //in function of levels + if ((LL100 > cp.t_lhl * kH[level] && LL100 < cp.t_rhl * kH[level])) { kLlev = alpha; - } else if((LL100 > cp.b_lhl * kH[level] && LL100 <= cp.t_lhl * kH[level])) { + } else if ((LL100 > cp.b_lhl * kH[level] && LL100 <= cp.t_lhl * kH[level])) { kLlev = aaal * LL100 + bbal; - } else if((LL100 > cp.t_rhl * kH[level] && LL100 <= cp.b_rhl * kH[level])) { + } else if ((LL100 > cp.t_rhl * kH[level] && LL100 <= cp.b_rhl * kH[level])) { kLlev = aaar * LL100 + bbbr; } else { kLlev = 1.f; } } - if(level >= (9 - cp.numlevS)) { - if((LL100 > cp.t_lsl && LL100 < cp.t_rsl)) { + if (level >= (9 - cp.numlevS)) { + if ((LL100 > cp.t_lsl && LL100 < cp.t_rsl)) { kLlev = alpha; - } else if((LL100 > cp.b_lsl && LL100 <= cp.t_lsl)) { + } else if ((LL100 > cp.b_lsl && LL100 <= cp.t_lsl)) { kLlev = aaalS * LL100 + bbalS; - } else if((LL100 > cp.t_rsl && LL100 <= cp.b_rsl)) { + } else if ((LL100 > cp.t_rsl && LL100 <= cp.b_rsl)) { kLlev = aaarS * LL100 + bbbrS; } else { kLlev = 1.f; @@ -3082,27 +3133,27 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit } } - if(waOpacityCurveW) { + if (waOpacityCurveW) { cp.opaW = true; } - if(cp.bam && cp.finena) { - if(cp.opaW && cp.BAmet == 2) { + if (cp.bam && cp.finena) { + if (cp.opaW && cp.BAmet == 2) { int iteration = cp.ite; int itplus = 7 + iteration; int itmoins = 7 - iteration; int med = maxlvl / 2; int it; - if(level < med) { + if (level < med) { it = itmoins; - } else if(level == med) { + } else if (level == med) { it = 7; - } else /*if(level > med)*/ { + } else { /*if(level > med)*/ it = itplus; } - for(int j = 0; j < it; j++) { + for (int j = 0; j < it; j++) { //float bal = cp.balan;//-100 +100 float kba = 1.f; @@ -3115,11 +3166,11 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit float k1 = 0.3f * (waOpacityCurveW[6.f * LL100] - 0.5f); //k1 between 0 and 0.5 0.5==> 1/6=0.16 float k2 = k1 * 2.f; - if(dir < 3) { + if (dir < 3) { kba = 1.f + k1; } - if(dir == 3) { + if (dir == 3) { kba = 1.f - k2; } @@ -3128,22 +3179,22 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit } } - if(cp.BAmet == 1) { + if (cp.BAmet == 1) { int iteration = cp.ite; int itplus = 7 + iteration; int itmoins = 7 - iteration; int med = maxlvl / 2; int it; - if(level < med) { + if (level < med) { it = itmoins; - } else if(level == med) { + } else if (level == med) { it = 7; - } else /*if(level > med)*/ { + } else { /*if(level > med)*/ it = itplus; } - for(int j = 0; j < it; j++) { + for (int j = 0; j < it; j++) { float bal = cp.balan;//-100 +100 float kba = 1.f; @@ -3160,12 +3211,12 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit float b0 = 100000.f; float a0 = -4970.f; - if(LL100 > 80.f) { + if (LL100 > 80.f) { k1 = aa * LL100 + bb; k2 = 0.5f * k1; } - if(LL100 < 20.f) { + if (LL100 < 20.f) { k1 = a0 * LL100 + b0; k2 = 0.5f * k1; } @@ -3174,11 +3225,11 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit //k2=300.f; //k1=0.3f*(waOpacityCurveW[6.f*LL100]-0.5f);//k1 between 0 and 0.5 0.5==> 1/6=0.16 //k2=k1*2.f; - if(dir < 3) { + if (dir < 3) { kba = 1.f + bal / k1; } - if(dir == 3) { + if (dir == 3) { kba = 1.f - bal / k2; } @@ -3194,12 +3245,12 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit choicelevel = choicelevel == -1 ? 4 : choicelevel; } -void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, float **varchrom, float ** WavCoeffs_ab, float * WavCoeffs_ab0, int level, int dir, const WavOpacityCurveW & waOpacityCurveW, struct cont_params &cp, - int W_ab, int H_ab, const bool useChannelA) +void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, float **varchrom, float ** WavCoeffs_ab, float * WavCoeffs_ab0, int level, int dir, const WavOpacityCurveW & waOpacityCurveW, struct cont_params &cp, + int W_ab, int H_ab, const bool useChannelA) { float cpMul = cp.mul[level]; - if(cpMul != 0.f && cp.CHmet == 2 && cp.chro != 0.f && cp.chromena) { // cpMul == 0.f or cp.chro = 0.f means all will be multiplied by 1.f, so we can skip this + if (cpMul != 0.f && cp.CHmet == 2 && cp.chro != 0.f && cp.chromena) { // cpMul == 0.f or cp.chro = 0.f means all will be multiplied by 1.f, so we can skip this const float skinprot = params->wavelet.skinprotect; const float skinprotneg = -skinprot; const float factorHard = (1.f - skinprotneg / 100.f); @@ -3210,7 +3261,7 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, float alphaC = (1024.f + 15.f * cpMul * cpChrom / 50.f) / 1024.f ; for (int i = 0; i < W_ab * H_ab; i++) { - if(useSkinControl) { + if (useSkinControl) { int ii = i / W_ab; int jj = i - ii * W_ab; float LL100 = labco->L[ii * 2][jj * 2] / 327.68f; @@ -3219,10 +3270,10 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, // hue chroma skin with initial lab datas float scale = 1.f; - if(skinprot > 0.f) { - Color::SkinSatCbdl2 (LL100, modhue, modchro, skinprot, scale, true, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 0); //0 for skin and extand - } else if(skinprot < 0.f) { - Color::SkinSatCbdl2 (LL100, modhue, modchro, skinprotneg, scale, false, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 0); + if (skinprot > 0.f) { + Color::SkinSatCbdl2(LL100, modhue, modchro, skinprot, scale, true, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 0); //0 for skin and extand + } else if (skinprot < 0.f) { + Color::SkinSatCbdl2(LL100, modhue, modchro, skinprotneg, scale, false, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 0); scale = (scale == 1.f) ? factorHard : 1.f; } @@ -3238,7 +3289,7 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, float cpMulC = cp.mulC[level]; // if( (cp.curv || cp.CHSLmet==1) && cp.CHmet!=2 && level < 9 && cpMulC != 0.f) { // cpMulC == 0.f means all will be multiplied by 1.f, so we can skip - if( cp.CHmet != 2 && level < 9 && cpMulC != 0.f && cp.chromena) { // cpMulC == 0.f means all will be multiplied by 1.f, so we can skip + if (cp.CHmet != 2 && level < 9 && cpMulC != 0.f && cp.chromena) { // cpMulC == 0.f means all will be multiplied by 1.f, so we can skip const float skinprot = params->wavelet.skinprotect; const float skinprotneg = -skinprot; const float factorHard = (1.f - skinprotneg / 100.f); @@ -3251,37 +3302,37 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, float scale = 1.f; float modchro = varchrom[ii * 2][jj * 2]; - if(useSkinControl) { + if (useSkinControl) { // hue chroma skin with initial lab datas float LL100 = labco->L[ii * 2][jj * 2] / 327.68f; float modhue = varhue[ii][jj]; - if(skinprot > 0.f) { - Color::SkinSatCbdl2 (LL100, modhue, modchro, skinprot, scale, true, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 1); //1 for curve - } else if(skinprot < 0.f) { - Color::SkinSatCbdl2 (LL100, modhue, modchro, skinprotneg, scale, false, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 1); + if (skinprot > 0.f) { + Color::SkinSatCbdl2(LL100, modhue, modchro, skinprot, scale, true, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 1); //1 for curve + } else if (skinprot < 0.f) { + Color::SkinSatCbdl2(LL100, modhue, modchro, skinprotneg, scale, false, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 1); scale = (scale == 1.f) ? factorHard : 1.f; } } float beta = (1024.f + 20.f * cpMulC * scale) / 1024.f ; - if(beta < 0.02f) { + if (beta < 0.02f) { beta = 0.02f; } float kClev = beta; - if(cp.CHmet == 1) { - if(level < cp.chrom) { + if (cp.CHmet == 1) { + if (level < cp.chrom) { //linear for saturated - if((modchro > cp.t_lsat && modchro < cp.t_rsat)) { + if ((modchro > cp.t_lsat && modchro < cp.t_rsat)) { kClev = beta; - } else if((modchro > cp.b_lsat && modchro <= cp.t_lsat)) { + } else if ((modchro > cp.b_lsat && modchro <= cp.t_lsat)) { float aaal = (1.f - beta) / (cp.b_lsat - cp.t_lsat); float bbal = 1.f - aaal * cp.b_lsat; kClev = aaal * modchro + bbal; - } else if((modchro > cp.t_rsat && modchro <= cp.b_rsat)) { + } else if ((modchro > cp.t_rsat && modchro <= cp.b_rsat)) { float aaar = (beta - 1.f) / (cp.t_rsat - cp.b_rsat); float bbbr = 1.f - cp.b_rsat * aaar; kClev = aaar * modchro + bbbr; @@ -3290,13 +3341,13 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, } } else { //linear for pastel - if((modchro > cp.t_lpast && modchro < cp.t_rpast)) { + if ((modchro > cp.t_lpast && modchro < cp.t_rpast)) { kClev = beta; - } else if((modchro > cp.b_lpast && modchro <= cp.t_lpast)) { + } else if ((modchro > cp.b_lpast && modchro <= cp.t_lpast)) { float aaalS = (1.f - beta) / (cp.b_lpast - cp.t_lpast); float bbalS = 1.f - aaalS * cp.b_lpast; kClev = aaalS * modchro + bbalS; - } else if((modchro > cp.t_rpast && modchro <= cp.b_rpast)) { + } else if ((modchro > cp.t_rpast && modchro <= cp.b_rpast)) { float aaarS = (beta - 1.f) / (cp.t_rpast - cp.b_rpast); float bbbrS = 1.f - cp.b_rpast * aaarS; kClev = aaarS * modchro + bbbrS; @@ -3304,7 +3355,7 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, kClev = 1.f; } } - } else if(cp.CHmet == 0) { + } else if (cp.CHmet == 0) { kClev = beta; } @@ -3315,19 +3366,21 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, bool useOpacity; float mulOpacity = 0.f; - if(useChannelA) { + if (useChannelA) { useOpacity = cp.opaRG; - if(level < 9) { + + if (level < 9) { mulOpacity = cp.mulopaRG[level]; } } else { useOpacity = cp.opaBY; - if(level < 9) { + + if (level < 9) { mulOpacity = cp.mulopaBY[level]; } } - if((useOpacity && level < 9 && mulOpacity != 0.f) && cp.toningena) { //toning + if ((useOpacity && level < 9 && mulOpacity != 0.f) && cp.toningena) { //toning float beta = (1024.f + 20.f * mulOpacity) / 1024.f ; @@ -3339,28 +3392,28 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, // WavCoeffs_ab[dir][i] += beta; } - if(waOpacityCurveW) { + if (waOpacityCurveW) { cp.opaW = true; } - if(cp.bam && cp.diag) { + if (cp.bam && cp.diag) { //printf("OK Chroma\n"); - if(cp.opaW && cp.BAmet == 2) { + if (cp.opaW && cp.BAmet == 2) { int iteration = cp.ite; int itplus = 7 + iteration; int itmoins = 7 - iteration; int med = maxlvl / 2; int it; - if(level < med) { + if (level < med) { it = itmoins; - } else if(level == med) { + } else if (level == med) { it = 7; - } else /*if(level > med)*/ { + } else { /*if(level > med)*/ it = itplus; } - for(int j = 0; j < it; j++) { + for (int j = 0; j < it; j++) { //float bal = cp.balan;//-100 +100 float kba = 1.f; @@ -3373,11 +3426,11 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, float k1 = 0.3f * (waOpacityCurveW[6.f * LL100] - 0.5f); //k1 between 0 and 0.5 0.5==> 1/6=0.16 float k2 = k1 * 2.f; - if(dir < 3) { + if (dir < 3) { kba = 1.f + k1; } - if(dir == 3) { + if (dir == 3) { kba = 1.f - k2; } @@ -3386,22 +3439,22 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, } } - if(cp.BAmet == 1) { + if (cp.BAmet == 1) { int iteration = cp.ite; int itplus = 7 + iteration; int itmoins = 7 - iteration; int med = maxlvl / 2; int it; - if(level < med) { + if (level < med) { it = itmoins; - } else if(level == med) { + } else if (level == med) { it = 7; - } else /*if(level > med)*/ { + } else { /*if(level > med)*/ it = itplus; } - for(int j = 0; j < it; j++) { + for (int j = 0; j < it; j++) { float bal = cp.balan;//-100 +100 float kba = 1.f; @@ -3418,12 +3471,12 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, float b0 = 100000.f; float a0 = -4970.f; - if(LL100 > 80.f) { + if (LL100 > 80.f) { k1 = aa * LL100 + bb; k2 = 0.5f * k1; } - if(LL100 < 20.f) { + if (LL100 < 20.f) { k1 = a0 * LL100 + b0; k2 = 0.5f * k1; } @@ -3432,11 +3485,11 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, //k2=300.f; //k1=0.3f*(waOpacityCurveW[6.f*LL100]-0.5f);//k1 between 0 and 0.5 0.5==> 1/6=0.16 //k2=k1*2.f; - if(dir < 3) { + if (dir < 3) { kba = 1.f + bal / k1; } - if(dir == 3) { + if (dir == 3) { kba = 1.f - bal / k2; } @@ -3452,34 +3505,34 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, choicelevel = choicelevel == -1 ? 4 : choicelevel; int choiceClevel = 0; - if(params->wavelet.CLmethod == "one") { + if (params->wavelet.CLmethod == "one") { choiceClevel = 0; - } else if(params->wavelet.CLmethod == "inf") { + } else if (params->wavelet.CLmethod == "inf") { choiceClevel = 1; - } else if(params->wavelet.CLmethod == "sup") { + } else if (params->wavelet.CLmethod == "sup") { choiceClevel = 2; - } else if(params->wavelet.CLmethod == "all") { + } else if (params->wavelet.CLmethod == "all") { choiceClevel = 3; } int choiceDir = 0; - if(params->wavelet.Dirmethod == "one") { + if (params->wavelet.Dirmethod == "one") { choiceDir = 1; - } else if(params->wavelet.Dirmethod == "two") { + } else if (params->wavelet.Dirmethod == "two") { choiceDir = 2; - } else if(params->wavelet.Dirmethod == "thr") { + } else if (params->wavelet.Dirmethod == "thr") { choiceDir = 3; - } else if(params->wavelet.Dirmethod == "all") { + } else if (params->wavelet.Dirmethod == "all") { choiceDir = 0; } int dir1 = (choiceDir == 2) ? 1 : 2; int dir2 = (choiceDir == 3) ? 1 : 3; - if(choiceClevel < 3) { // not all levels visible, paint residual - if(level == 0) { - if(cp.backm != 2) { // nothing to change when residual is used as background + if (choiceClevel < 3) { // not all levels visible, paint residual + if (level == 0) { + if (cp.backm != 2) { // nothing to change when residual is used as background for (int i = 0; i < W_ab * H_ab; i++) { WavCoeffs_ab0[i] = 0.f; } @@ -3487,9 +3540,9 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, } } - if(choiceClevel == 0) { // Only one level - if(choiceDir == 0) { // All directions - if(level != choicelevel) { // zero all for the levels != choicelevel + if (choiceClevel == 0) { // Only one level + if (choiceDir == 0) { // All directions + if (level != choicelevel) { // zero all for the levels != choicelevel for (int dir = 1; dir < 4; dir++) { for (int i = 0; i < W_ab * H_ab; i++) { WavCoeffs_ab[dir][i] = 0.f; @@ -3497,21 +3550,21 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, } } } else { // zero the unwanted directions for level == choicelevel - if(choicelevel >= cp.maxilev) { + if (choicelevel >= cp.maxilev) { for (int dir = 1; dir < 4; dir++) { for (int i = 0; i < W_ab * H_ab; i++) { WavCoeffs_ab[dir][i] = 0.f; } } - } else if(level != choicelevel) { // zero all for the levels != choicelevel + } else if (level != choicelevel) { // zero all for the levels != choicelevel for (int i = 0; i < W_ab * H_ab; i++) { WavCoeffs_ab[dir1][i] = WavCoeffs_ab[dir2][i] = 0.f; } } } - } else if(choiceClevel == 1) { // Only below level - if(choiceDir == 0) { // All directions - if(level > choicelevel) { + } else if (choiceClevel == 1) { // Only below level + if (choiceDir == 0) { // All directions + if (level > choicelevel) { for (int dir = 1; dir < 4; dir++) { for (int i = 0; i < W_ab * H_ab; i++) { WavCoeffs_ab[dir][i] = 0.f; @@ -3519,15 +3572,15 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, } } } else { // zero the unwanted directions for level >= choicelevel - if(level > choicelevel) { + if (level > choicelevel) { for (int i = 0; i < W_ab * H_ab; i++) { WavCoeffs_ab[dir1][i] = WavCoeffs_ab[dir2][i] = 0.f; } } } - } else if(choiceClevel == 2) { // Only above level - if(choiceDir == 0) { // All directions - if(level <= choicelevel) { + } else if (choiceClevel == 2) { // Only above level + if (choiceDir == 0) { // All directions + if (level <= choicelevel) { for (int dir = 1; dir < 4; dir++) { for (int i = 0; i < W_ab * H_ab; i++) { WavCoeffs_ab[dir][i] = 0.f; @@ -3535,13 +3588,13 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, } } } else { // zero the unwanted directions for level >= choicelevel - if(choicelevel >= cp.maxilev) { + if (choicelevel >= cp.maxilev) { for (int dir = 1; dir < 4; dir++) { for (int i = 0; i < W_ab * H_ab; i++) { WavCoeffs_ab[dir][i] = 0.f; } } - } else if(level <= choicelevel) { + } else if (level <= choicelevel) { for (int i = 0; i < W_ab * H_ab; i++) { WavCoeffs_ab[dir1][i] = WavCoeffs_ab[dir2][i] = 0.f; } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 6d914bb27..1bbab3f74 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2150,6 +2150,10 @@ WaveletParams::WaveletParams() : bluemed(0), greenhigh(0), bluehigh(0), + mergeL(40.), + mergeC(20.), + softrad(0.), + softradend(0.), lipst(false), avoid(false), tmr(false), @@ -2165,6 +2169,7 @@ WaveletParams::WaveletParams() : expfinal(false), exptoning(false), expnoise(false), + expclari(false), Lmethod(4), CLmethod("all"), Backmethod("grey"), @@ -2172,6 +2177,7 @@ WaveletParams::WaveletParams() : daubcoeffmethod("4_"), CHmethod("without"), Medgreinf("less"), + ushamethod("none"), CHSLmethod("SL"), EDmethod("CU"), NPmethod("none"), @@ -2239,6 +2245,10 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && bluemed == other.bluemed && greenhigh == other.greenhigh && bluehigh == other.bluehigh + && mergeL == other.mergeL + && mergeC == other.mergeC + && softrad == other.softrad + && softradend == other.softradend && lipst == other.lipst && avoid == other.avoid && tmr == other.tmr @@ -2259,6 +2269,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && expedge == other.expedge && expresid == other.expresid && expfinal == other.expfinal + && expclari == other.expclari && exptoning == other.exptoning && expnoise == other.expnoise && Lmethod == other.Lmethod @@ -2268,6 +2279,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && daubcoeffmethod == other.daubcoeffmethod && CHmethod == other.CHmethod && Medgreinf == other.Medgreinf + && ushamethod == other.ushamethod && CHSLmethod == other.CHSLmethod && EDmethod == other.EDmethod && NPmethod == other.NPmethod @@ -3335,6 +3347,10 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.bluehigh, "Wavelet", "CBbluehigh", wavelet.bluehigh, keyFile); saveToKeyfile(!pedited || pedited->wavelet.bluemed, "Wavelet", "CBbluemed", wavelet.bluemed, keyFile); saveToKeyfile(!pedited || pedited->wavelet.bluelow, "Wavelet", "CBbluelow", wavelet.bluelow, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.mergeL, "Wavelet", "MergeL", wavelet.mergeL, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.mergeC, "Wavelet", "MergeC", wavelet.mergeC, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.softrad, "Wavelet", "Softrad", wavelet.softrad, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.softradend, "Wavelet", "Softradend", wavelet.softradend, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expcontrast, "Wavelet", "Expcontrast", wavelet.expcontrast, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expchroma, "Wavelet", "Expchroma", wavelet.expchroma, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expedge, "Wavelet", "Expedge", wavelet.expedge, keyFile); @@ -3342,6 +3358,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.expfinal, "Wavelet", "Expfinal", wavelet.expfinal, keyFile); saveToKeyfile(!pedited || pedited->wavelet.exptoning, "Wavelet", "Exptoning", wavelet.exptoning, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expnoise, "Wavelet", "Expnoise", wavelet.expnoise, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.expclari, "Wavelet", "Expclari", wavelet.expclari, keyFile); for (int i = 0; i < 9; i++) { std::stringstream ss; @@ -3376,6 +3393,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.chroma, "Wavelet", "ThresholdChroma", wavelet.chroma, keyFile); saveToKeyfile(!pedited || pedited->wavelet.CHmethod, "Wavelet", "CHromaMethod", wavelet.CHmethod, keyFile); saveToKeyfile(!pedited || pedited->wavelet.Medgreinf, "Wavelet", "Medgreinf", wavelet.Medgreinf, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.ushamethod, "Wavelet", "Ushamethod", wavelet.ushamethod, keyFile); saveToKeyfile(!pedited || pedited->wavelet.CHSLmethod, "Wavelet", "CHSLromaMethod", wavelet.CHSLmethod, keyFile); saveToKeyfile(!pedited || pedited->wavelet.EDmethod, "Wavelet", "EDMethod", wavelet.EDmethod, keyFile); saveToKeyfile(!pedited || pedited->wavelet.NPmethod, "Wavelet", "NPMethod", wavelet.NPmethod, keyFile); @@ -4457,6 +4475,10 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "CBbluehigh", pedited, wavelet.bluehigh, pedited->wavelet.bluehigh); assignFromKeyfile(keyFile, "Wavelet", "CBbluemed", pedited, wavelet.bluemed, pedited->wavelet.bluemed); assignFromKeyfile(keyFile, "Wavelet", "CBbluelow", pedited, wavelet.bluelow, pedited->wavelet.bluelow); + assignFromKeyfile(keyFile, "Wavelet", "MergeL", pedited, wavelet.mergeL, pedited->wavelet.mergeL); + assignFromKeyfile(keyFile, "Wavelet", "MergeC", pedited, wavelet.mergeC, pedited->wavelet.mergeC); + assignFromKeyfile(keyFile, "Wavelet", "Softrad", pedited, wavelet.softrad, pedited->wavelet.softrad); + assignFromKeyfile(keyFile, "Wavelet", "Softradend", pedited, wavelet.softradend, pedited->wavelet.softradend); assignFromKeyfile(keyFile, "Wavelet", "Lipst", pedited, wavelet.lipst, pedited->wavelet.lipst); assignFromKeyfile(keyFile, "Wavelet", "AvoidColorShift", pedited, wavelet.avoid, pedited->wavelet.avoid); assignFromKeyfile(keyFile, "Wavelet", "TMr", pedited, wavelet.tmr, pedited->wavelet.tmr); @@ -4478,6 +4500,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "DaubMethod", pedited, wavelet.daubcoeffmethod, pedited->wavelet.daubcoeffmethod); assignFromKeyfile(keyFile, "Wavelet", "CHromaMethod", pedited, wavelet.CHmethod, pedited->wavelet.CHmethod); assignFromKeyfile(keyFile, "Wavelet", "Medgreinf", pedited, wavelet.Medgreinf, pedited->wavelet.Medgreinf); + assignFromKeyfile(keyFile, "Wavelet", "Ushamethod", pedited, wavelet.ushamethod, pedited->wavelet.ushamethod); assignFromKeyfile(keyFile, "Wavelet", "CHSLromaMethod", pedited, wavelet.CHSLmethod, pedited->wavelet.CHSLmethod); assignFromKeyfile(keyFile, "Wavelet", "EDMethod", pedited, wavelet.EDmethod, pedited->wavelet.EDmethod); assignFromKeyfile(keyFile, "Wavelet", "NPMethod", pedited, wavelet.NPmethod, pedited->wavelet.NPmethod); @@ -4684,6 +4707,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "Expfinal", pedited, wavelet.expfinal, pedited->wavelet.expfinal); assignFromKeyfile(keyFile, "Wavelet", "Exptoning", pedited, wavelet.exptoning, pedited->wavelet.exptoning); assignFromKeyfile(keyFile, "Wavelet", "Expnoise", pedited, wavelet.expnoise, pedited->wavelet.expnoise); + assignFromKeyfile(keyFile, "Wavelet", "Expclari", pedited, wavelet.expclari, pedited->wavelet.expclari); } if (keyFile.has_group("Directional Pyramid Equalizer")) { diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 0982fda48..f2328217a 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1180,6 +1180,10 @@ struct WaveletParams { int bluemed; int greenhigh; int bluehigh; + double mergeL; + double mergeC; + double softrad; + double softradend; bool lipst; bool avoid; @@ -1196,6 +1200,7 @@ struct WaveletParams { bool expfinal; bool exptoning; bool expnoise; + bool expclari; int Lmethod; Glib::ustring CLmethod; @@ -1204,6 +1209,7 @@ struct WaveletParams { Glib::ustring daubcoeffmethod; Glib::ustring CHmethod; Glib::ustring Medgreinf; + Glib::ustring ushamethod; Glib::ustring CHSLmethod; Glib::ustring EDmethod; Glib::ustring NPmethod; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index ff2b234a3..52ab5a590 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -30,6 +30,8 @@ #include "rawimagesource.h" #include "../rtgui/multilangmgr.h" #include "mytime.h" +#include "guidedfilter.h" + #undef THREAD_PRIORITY_NORMAL namespace rtengine @@ -40,7 +42,7 @@ namespace { template -void adjust_radius (const T &default_param, double scale_factor, T ¶m) +void adjust_radius(const T &default_param, double scale_factor, T ¶m) { const double delta = (param - default_param) * scale_factor; param = default_param + delta; @@ -56,10 +58,10 @@ public: ProgressListener* pl, bool flush ) : - job (static_cast (pjob)), - errorCode (errorCode), - pl (pl), - flush (flush), + job(static_cast(pjob)), + errorCode(errorCode), + pl(pl), + flush(flush), // internal state ii(nullptr), imgsrc(nullptr), @@ -139,14 +141,14 @@ private: errorCode = 0; if (pl) { - pl->setProgressStr ("PROGRESSBAR_PROCESSING"); - pl->setProgress (0.0); + pl->setProgressStr("PROGRESSBAR_PROCESSING"); + pl->setProgress(0.0); } ii = job->initialImage; if (!ii) { - ii = InitialImage::load (job->fname, job->isRaw, &errorCode); + ii = InitialImage::load(job->fname, job->isRaw, &errorCode); if (errorCode) { delete job; @@ -157,11 +159,12 @@ private: procparams::ProcParams& params = job->pparams; // acquire image from imagesource - imgsrc = ii->getImageSource (); + imgsrc = ii->getImageSource(); - tr = getCoarseBitMask (params.coarse); - if(imgsrc->getSensorType() == ST_BAYER) { - if(params.raw.bayersensor.method!= RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT)) { + tr = getCoarseBitMask(params.coarse); + + if (imgsrc->getSensorType() == ST_BAYER) { + if (params.raw.bayersensor.method != RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT)) { imgsrc->setBorder(params.raw.bayersensor.border); } else { imgsrc->setBorder(std::max(params.raw.bayersensor.border, 2)); @@ -169,7 +172,8 @@ private: } else if (imgsrc->getSensorType() == ST_FUJI_XTRANS) { imgsrc->setBorder(params.raw.xtranssensor.border); } - imgsrc->getFullSize (fw, fh, tr); + + imgsrc->getFullSize(fw, fh, tr); // check the crop params if (params.crop.x > fw || params.crop.y > fh) { @@ -203,29 +207,31 @@ private: // MyTime t1,t2; // t1.set(); - ipf_p.reset (new ImProcFunctions (¶ms, true)); + ipf_p.reset(new ImProcFunctions(¶ms, true)); ImProcFunctions &ipf = * (ipf_p.get()); - imgsrc->setCurrentFrame (params.raw.bayersensor.imageNum); - imgsrc->preprocess ( params.raw, params.lensProf, params.coarse, params.dirpyrDenoise.enabled); + imgsrc->setCurrentFrame(params.raw.bayersensor.imageNum); + imgsrc->preprocess(params.raw, params.lensProf, params.coarse, params.dirpyrDenoise.enabled); if (pl) { - pl->setProgress (0.20); + pl->setProgress(0.20); } + bool autoContrast = imgsrc->getSensorType() == ST_BAYER ? params.raw.bayersensor.dualDemosaicAutoContrast : params.raw.xtranssensor.dualDemosaicAutoContrast; double contrastThreshold = imgsrc->getSensorType() == ST_BAYER ? params.raw.bayersensor.dualDemosaicContrast : params.raw.xtranssensor.dualDemosaicContrast; - imgsrc->demosaic (params.raw, autoContrast, contrastThreshold); + imgsrc->demosaic(params.raw, autoContrast, contrastThreshold); if (pl) { - pl->setProgress (0.30); + pl->setProgress(0.30); } - pp = PreviewProps (0, 0, fw, fh, 1); + + pp = PreviewProps(0, 0, fw, fh, 1); if (params.retinex.enabled) { //enabled Retinex - LUTf cdcurve (65536, 0); - LUTf mapcurve (65536, 0); + LUTf cdcurve(65536, 0); + LUTf mapcurve(65536, 0); LUTu dummy; RetinextransmissionCurve dehatransmissionCurve; RetinexgaintransmissionCurve dehagaintransmissionCurve; @@ -233,39 +239,39 @@ private: bool mapcontlutili = false; bool useHsl = false; // multi_array2D conversionBuffer(1, 1); - multi_array2D conversionBuffer (1, 1); - imgsrc->retinexPrepareBuffers (params.icm, params.retinex, conversionBuffer, dummy); - imgsrc->retinexPrepareCurves (params.retinex, cdcurve, mapcurve, dehatransmissionCurve, dehagaintransmissionCurve, dehacontlutili, mapcontlutili, useHsl, dummy, dummy ); + multi_array2D conversionBuffer(1, 1); + imgsrc->retinexPrepareBuffers(params.icm, params.retinex, conversionBuffer, dummy); + imgsrc->retinexPrepareCurves(params.retinex, cdcurve, mapcurve, dehatransmissionCurve, dehagaintransmissionCurve, dehacontlutili, mapcontlutili, useHsl, dummy, dummy); float minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax; - imgsrc->retinex ( params.icm, params.retinex, params.toneCurve, cdcurve, mapcurve, dehatransmissionCurve, dehagaintransmissionCurve, conversionBuffer, dehacontlutili, mapcontlutili, useHsl, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, dummy); + imgsrc->retinex(params.icm, params.retinex, params.toneCurve, cdcurve, mapcurve, dehatransmissionCurve, dehagaintransmissionCurve, conversionBuffer, dehacontlutili, mapcontlutili, useHsl, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, dummy); } if (pl) { - pl->setProgress (0.40); + pl->setProgress(0.40); } - imgsrc->HLRecovery_Global ( params.toneCurve ); + imgsrc->HLRecovery_Global(params.toneCurve); if (pl) { - pl->setProgress (0.45); + pl->setProgress(0.45); } // set the color temperature - currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.equal, params.wb.method); + currWB = ColorTemp(params.wb.temperature, params.wb.green, params.wb.equal, params.wb.method); if (!params.wb.enabled) { currWB = ColorTemp(); } else if (params.wb.method == "Camera") { - currWB = imgsrc->getWB (); + currWB = imgsrc->getWB(); } else if (params.wb.method == "Auto") { double rm, gm, bm; - imgsrc->getAutoWBMultipliers (rm, gm, bm); - currWB.update (rm, gm, bm, params.wb.equal, params.wb.tempBias); + imgsrc->getAutoWBMultipliers(rm, gm, bm); + currWB.update(rm, gm, bm, params.wb.equal, params.wb.tempBias); } calclum = nullptr ; - params.dirpyrDenoise.getCurves (noiseLCurve, noiseCCurve); + params.dirpyrDenoise.getCurves(noiseLCurve, noiseCCurve); autoNR = (float) settings->nrauto;// autoNRmax = (float) settings->nrautomax;// @@ -282,7 +288,7 @@ private: // const int tilesize = 768; // const int overlap = 96; int numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip; - ipf.Tile_calc (tilesize, overlap, 2, fw, fh, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip); + ipf.Tile_calc(tilesize, overlap, 2, fw, fh, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip); int nbtl = numtiles_W * numtiles_H; if ((settings->leveldnautsimpl == 1 && params.dirpyrDenoise.Cmethod == "AUT") || (settings->leveldnautsimpl == 0 && params.dirpyrDenoise.C2method == "AUTO")) { @@ -335,16 +341,16 @@ private: // Imagefloat *origCropPart;//init auto noise // origCropPart = new Imagefloat (crW, crH);//allocate memory if (params.dirpyrDenoise.enabled) {//evaluate Noise - LUTf gamcurve (65536, 0); + LUTf gamcurve(65536, 0); float gam, gamthresh, gamslope; - ipf.RGB_denoise_infoGamCurve (params.dirpyrDenoise, imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope); + ipf.RGB_denoise_infoGamCurve(params.dirpyrDenoise, imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope); #ifdef _OPENMP #pragma omp parallel #endif { Imagefloat *origCropPart;//init auto noise - origCropPart = new Imagefloat (crW, crH);//allocate memory - Imagefloat *provicalc = new Imagefloat ((crW + 1) / 2, (crH + 1) / 2); //for denoise curves + origCropPart = new Imagefloat(crW, crH); //allocate memory + Imagefloat *provicalc = new Imagefloat((crW + 1) / 2, (crH + 1) / 2); //for denoise curves int skipP = 1; #ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) nowait @@ -354,20 +360,20 @@ private: for (int hcr = 0; hcr < numtiles_H; hcr++) { int beg_tileW = wcr * tileWskip + tileWskip / 2.f - crW / 2.f; int beg_tileH = hcr * tileHskip + tileHskip / 2.f - crH / 2.f; - PreviewProps ppP (beg_tileW, beg_tileH, crW, crH, skipP); - imgsrc->getImage (currWB, tr, origCropPart, ppP, params.toneCurve, params.raw ); + PreviewProps ppP(beg_tileW, beg_tileH, crW, crH, skipP); + imgsrc->getImage(currWB, tr, origCropPart, ppP, params.toneCurve, params.raw); //baseImg->getStdImage(currWB, tr, origCropPart, ppP, true, params.toneCurve); // 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); + 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); } } - imgsrc->convertColorSpace (provicalc, params.icm, currWB); //for denoise luminance curve + imgsrc->convertColorSpace(provicalc, params.icm, currWB); //for denoise luminance curve float maxr = 0.f; float maxb = 0.f; float pondcorrec = 1.0f; @@ -380,11 +386,11 @@ private: maxblueaut = 0.f; chromina = 0.f; sigma = 0.f; - ipf.RGB_denoise_info (origCropPart, provicalc, imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, imgsrc->getDirPyrDenoiseExpComp(), chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc); + ipf.RGB_denoise_info(origCropPart, provicalc, imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, imgsrc->getDirPyrDenoiseExpComp(), chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc); float multip = 1.f; float adjustr = 1.f; - if (params.icm.workingProfile == "ProPhoto") { + if (params.icm.workingProfile == "ProPhoto") { adjustr = 1.f; // } else if (params.icm.workingProfile == "Adobe RGB") { adjustr = 1.f / 1.3f; @@ -406,11 +412,11 @@ private: 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 = 2; int lissage = settings->leveldnliss; - ipf.calcautodn_info (chaut, delta, Nb, levaut, maxmax, lumema, chromina, mode, lissage, redyel, skinc, nsknc); + ipf.calcautodn_info(chaut, delta, Nb, levaut, maxmax, lumema, chromina, mode, lissage, redyel, skinc, nsknc); // printf("PROCESS cha=%f red=%f bl=%f redM=%f bluM=%f chrom=%f sigm=%f lum=%f sigL=%f\n",chaut,redaut,blueaut, maxredaut, maxblueaut, chromina, sigma, lumema, sigma_L); if (maxredaut > maxblueaut) { @@ -509,7 +515,7 @@ private: if (settings->verbose) { t2pone.set(); - printf ("Info denoise ponderated performed in %d usec:\n", t2pone.etime (t1pone)); + printf("Info denoise ponderated performed in %d usec:\n", t2pone.etime(t1pone)); } } @@ -550,9 +556,9 @@ private: } if (params.dirpyrDenoise.enabled) {//evaluate Noise - LUTf gamcurve (65536, 0); + LUTf gamcurve(65536, 0); float gam, gamthresh, gamslope; - ipf.RGB_denoise_infoGamCurve (params.dirpyrDenoise, imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope); + ipf.RGB_denoise_infoGamCurve(params.dirpyrDenoise, imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope); int Nb[9]; int coordW[3];//coordinate of part of image to measure noise int coordH[3]; @@ -569,8 +575,8 @@ private: #endif { Imagefloat *origCropPart;//init auto noise - origCropPart = new Imagefloat (crW, crH);//allocate memory - Imagefloat *provicalc = new Imagefloat ((crW + 1) / 2, (crH + 1) / 2); //for denoise curves + origCropPart = new Imagefloat(crW, crH); //allocate memory + Imagefloat *provicalc = new Imagefloat((crW + 1) / 2, (crH + 1) / 2); //for denoise curves #ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) nowait @@ -578,24 +584,24 @@ private: for (int wcr = 0; wcr <= 2; wcr++) { for (int hcr = 0; hcr <= 2; hcr++) { - PreviewProps ppP (coordW[wcr], coordH[hcr], crW, crH, 1); - imgsrc->getImage (currWB, tr, origCropPart, ppP, params.toneCurve, params.raw); + PreviewProps ppP(coordW[wcr], coordH[hcr], crW, crH, 1); + imgsrc->getImage(currWB, tr, origCropPart, ppP, params.toneCurve, params.raw); //baseImg->getStdImage(currWB, tr, origCropPart, ppP, true, params.toneCurve); // 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); + 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); } } - imgsrc->convertColorSpace (provicalc, params.icm, currWB); //for denoise luminance curve + imgsrc->convertColorSpace(provicalc, params.icm, currWB); //for denoise luminance curve 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, 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 (origCropPart, provicalc, imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, imgsrc->getDirPyrDenoiseExpComp(), chaut, nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc); + ipf.RGB_denoise_info(origCropPart, provicalc, imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, imgsrc->getDirPyrDenoiseExpComp(), chaut, nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc); Nb[hcr * 3 + wcr] = nb; ch_M[hcr * 3 + wcr] = chaut; max_r[hcr * 3 + wcr] = maxredaut; @@ -631,7 +637,7 @@ private: float MinRMoy = 0.f; float MinBMoy = 0.f; - if (params.icm.workingProfile == "ProPhoto") { + if (params.icm.workingProfile == "ProPhoto") { adjustr = 1.f; } else if (params.icm.workingProfile == "Adobe RGB") { adjustr = 1.f / 1.3f; @@ -658,8 +664,8 @@ private: int lissage = settings->leveldnliss; for (int k = 0; k < 9; k++) { - float maxmax = max (max_r[k], max_b[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] ); + float maxmax = max(max_r[k], max_b[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]); } @@ -732,17 +738,17 @@ private: 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 } - baseImg = new Imagefloat (fw, fh); - imgsrc->getImage (currWB, tr, baseImg, pp, params.toneCurve, params.raw); + baseImg = new Imagefloat(fw, fh); + imgsrc->getImage(currWB, tr, baseImg, pp, params.toneCurve, params.raw); if (pl) { - pl->setProgress (0.50); + pl->setProgress(0.50); } // LUTf Noisecurve (65536,0); @@ -758,9 +764,10 @@ private: if (params.toneCurve.autoexp) { LUTu aehist; int aehistcompr; - imgsrc->getAutoExpHistogram (aehist, aehistcompr); - ipf.getAutoExp (aehist, aehistcompr, params.toneCurve.clip, expcomp, bright, contr, black, hlcompr, hlcomprthresh); + imgsrc->getAutoExpHistogram(aehist, aehistcompr); + ipf.getAutoExp(aehist, aehistcompr, params.toneCurve.clip, expcomp, bright, contr, black, hlcompr, hlcomprthresh); } + if (params.toneCurve.histmatching) { if (!params.toneCurve.fromHistMatching) { imgsrc->getAutoMatchedToneCurve(params.icm, params.toneCurve.curve); @@ -776,7 +783,7 @@ private: params.toneCurve.brightness = 0; params.toneCurve.contrast = 0; params.toneCurve.black = 0; - } + } // at this stage, we can flush the raw data to free up quite an important amount of memory // commented out because it makes the application crash when batch processing... @@ -815,22 +822,22 @@ private: noiseLCurve.Reset(); } - if (denoiseParams.enabled && (noiseLCurve || noiseCCurve )) { + if (denoiseParams.enabled && (noiseLCurve || noiseCCurve)) { // we only need image reduced to 1/4 here - calclum = new Imagefloat ((fw + 1) / 2, (fh + 1) / 2); //for luminance denoise curve + calclum = new Imagefloat((fw + 1) / 2, (fh + 1) / 2); //for luminance denoise curve #ifdef _OPENMP #pragma omp parallel for #endif for (int ii = 0; ii < fh; ii += 2) { for (int jj = 0; jj < fw; jj += 2) { - calclum->r (ii >> 1, jj >> 1) = baseImg->r (ii, jj); - calclum->g (ii >> 1, jj >> 1) = baseImg->g (ii, jj); - calclum->b (ii >> 1, jj >> 1) = baseImg->b (ii, jj); + calclum->r(ii >> 1, jj >> 1) = baseImg->r(ii, jj); + calclum->g(ii >> 1, jj >> 1) = baseImg->g(ii, jj); + calclum->b(ii >> 1, jj >> 1) = baseImg->b(ii, jj); } } - imgsrc->convertColorSpace (calclum, params.icm, currWB); + imgsrc->convertColorSpace(calclum, params.icm, currWB); } if (denoiseParams.enabled) { @@ -839,7 +846,7 @@ private: // ipf.RGB_denoise(baseImg, baseImg, calclum, imgsrc->isRAW(), denoiseParams, params.defringe, imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, lldenoiseutili); float nresi, highresi; int kall = 2; - ipf.RGB_denoise (kall, baseImg, baseImg, calclum, ch_M, max_r, max_b, imgsrc->isRAW(), denoiseParams, imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, noiseCCurve, nresi, highresi); + ipf.RGB_denoise(kall, baseImg, baseImg, calclum, ch_M, max_r, max_b, imgsrc->isRAW(), denoiseParams, imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, noiseCCurve, nresi, highresi); } @@ -862,12 +869,12 @@ private: //ImProcFunctions ipf (¶ms, true); ImProcFunctions &ipf = * (ipf_p.get()); - imgsrc->convertColorSpace (baseImg, params.icm, currWB); + imgsrc->convertColorSpace(baseImg, params.icm, currWB); // perform first analysis - hist16 (65536); + hist16(65536); - ipf.firstAnalysis (baseImg, params, hist16); + ipf.firstAnalysis(baseImg, params, hist16); ipf.dehaze(baseImg); ipf.ToneMapFattal02(baseImg); @@ -875,14 +882,17 @@ private: // perform transform (excepted resizing) if (ipf.needsTransform()) { Imagefloat* trImg = nullptr; + if (ipf.needsLuminanceOnly()) { trImg = baseImg; } else { - trImg = new Imagefloat (fw, fh); + trImg = new Imagefloat(fw, fh); } - ipf.transform (baseImg, trImg, 0, 0, 0, 0, fw, fh, fw, fh, - imgsrc->getMetaData(), imgsrc->getRotateDegree(), true); - if(trImg != baseImg) { + + ipf.transform(baseImg, trImg, 0, 0, 0, 0, fw, fh, fw, fh, + imgsrc->getMetaData(), imgsrc->getRotateDegree(), true); + + if (trImg != baseImg) { delete baseImg; baseImg = trImg; } @@ -898,10 +908,10 @@ private: if (params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled) { const int W = baseImg->getWidth(); const int H = baseImg->getHeight(); - LabImage labcbdl (W, H); - ipf.rgb2lab (*baseImg, labcbdl, params.icm.workingProfile); - ipf.dirpyrequalizer (&labcbdl, 1); - ipf.lab2rgb (labcbdl, *baseImg, params.icm.workingProfile); + LabImage labcbdl(W, H); + ipf.rgb2lab(*baseImg, labcbdl, params.icm.workingProfile); + ipf.dirpyrequalizer(&labcbdl, 1); + ipf.lab2rgb(labcbdl, *baseImg, params.icm.workingProfile); } //gamma TRC working @@ -921,45 +931,45 @@ private: // RGB processing - curve1 (65536); - curve2 (65536); - curve (65536, 0); - satcurve (65536, 0); - lhskcurve (65536, 0); - lumacurve (32770, 0); // lumacurve[32768] and lumacurve[32769] will be set to 32768 and 32769 later to allow linear interpolation - clcurve (65536, 0); - wavclCurve (65536, 0); + curve1(65536); + curve2(65536); + curve(65536, 0); + satcurve(65536, 0); + lhskcurve(65536, 0); + lumacurve(32770, 0); // lumacurve[32768] and lumacurve[32769] will be set to 32768 and 32769 later to allow linear interpolation + clcurve(65536, 0); + wavclCurve(65536, 0); //if(params.blackwhite.enabled) params.toneCurve.hrenabled=false; - CurveFactory::complexCurve (expcomp, black / 65535.0, hlcompr, hlcomprthresh, params.toneCurve.shcompr, bright, contr, - params.toneCurve.curve, params.toneCurve.curve2, - hist16, curve1, curve2, curve, dummy, customToneCurve1, customToneCurve2 ); + CurveFactory::complexCurve(expcomp, black / 65535.0, hlcompr, hlcomprthresh, params.toneCurve.shcompr, bright, contr, + params.toneCurve.curve, params.toneCurve.curve2, + hist16, curve1, curve2, curve, dummy, customToneCurve1, customToneCurve2); - CurveFactory::RGBCurve (params.rgbCurves.rcurve, rCurve, 1); - CurveFactory::RGBCurve (params.rgbCurves.gcurve, gCurve, 1); - CurveFactory::RGBCurve (params.rgbCurves.bcurve, bCurve, 1); + CurveFactory::RGBCurve(params.rgbCurves.rcurve, rCurve, 1); + CurveFactory::RGBCurve(params.rgbCurves.gcurve, gCurve, 1); + CurveFactory::RGBCurve(params.rgbCurves.bcurve, bCurve, 1); bool opautili = false; if (params.colorToning.enabled) { - TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params.icm.workingProfile); + TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(params.icm.workingProfile); double wp[3][3] = { {wprof[0][0], wprof[0][1], wprof[0][2]}, {wprof[1][0], wprof[1][1], wprof[1][2]}, {wprof[2][0], wprof[2][1], wprof[2][2]} }; - params.colorToning.getCurves (ctColorCurve, ctOpacityCurve, wp, opautili); - clToningcurve (65536, 0); - CurveFactory::curveToning (params.colorToning.clcurve, clToningcurve, 1); - cl2Toningcurve (65536, 0); - CurveFactory::curveToning (params.colorToning.cl2curve, cl2Toningcurve, 1); + params.colorToning.getCurves(ctColorCurve, ctOpacityCurve, wp, opautili); + clToningcurve(65536, 0); + CurveFactory::curveToning(params.colorToning.clcurve, clToningcurve, 1); + cl2Toningcurve(65536, 0); + CurveFactory::curveToning(params.colorToning.cl2curve, cl2Toningcurve, 1); } - labView = new LabImage (fw, fh); + labView = new LabImage(fw, fh); if (params.blackwhite.enabled) { - CurveFactory::curveBW (params.blackwhite.beforeCurve, params.blackwhite.afterCurve, hist16, dummy, customToneCurvebw1, customToneCurvebw2, 1); + CurveFactory::curveBW(params.blackwhite.beforeCurve, params.blackwhite.afterCurve, hist16, dummy, customToneCurvebw1, customToneCurvebw2, 1); } double rrm, ggm, bbm; @@ -970,7 +980,7 @@ private: if (params.colorToning.enabled && params.colorToning.autosat && params.colorToning.method != "LabGrid") { //for colortoning evaluation of saturation settings float moyS = 0.f; float eqty = 0.f; - ipf.moyeqt (baseImg, moyS, eqty);//return image : mean saturation and standard dev of saturation + ipf.moyeqt(baseImg, moyS, eqty); //return image : mean saturation and standard dev of saturation float satp = ((moyS + 1.5f * eqty) - 0.3f) / 0.7f; //1.5 sigma ==> 93% pixels with high saturation -0.3 / 0.7 convert to Hombre scale if (satp >= 0.92f) { @@ -988,18 +998,18 @@ private: autor = -9000.f; // This will ask to compute the "auto" values for the B&W tool (have to be inferior to -5000) DCPProfile::ApplyState as; - DCPProfile *dcpProf = imgsrc->getDCP (params.icm, as); + DCPProfile *dcpProf = imgsrc->getDCP(params.icm, as); LUTu histToneCurve; - ipf.rgbProc (baseImg, labView, nullptr, curve1, curve2, curve, params.toneCurve.saturation, rCurve, gCurve, bCurve, satLimit, satLimitOpacity, ctColorCurve, ctOpacityCurve, opautili, clToningcurve, cl2Toningcurve, customToneCurve1, customToneCurve2, customToneCurvebw1, customToneCurvebw2, rrm, ggm, bbm, autor, autog, autob, expcomp, hlcompr, hlcomprthresh, dcpProf, as, histToneCurve, options.chunkSizeRGB, options.measure); + ipf.rgbProc(baseImg, labView, nullptr, curve1, curve2, curve, params.toneCurve.saturation, rCurve, gCurve, bCurve, satLimit, satLimitOpacity, ctColorCurve, ctOpacityCurve, opautili, clToningcurve, cl2Toningcurve, customToneCurve1, customToneCurve2, customToneCurvebw1, customToneCurvebw2, rrm, ggm, bbm, autor, autog, autob, expcomp, hlcompr, hlcomprthresh, dcpProf, as, histToneCurve, options.chunkSizeRGB, options.measure); if (settings->verbose) { - printf ("Output image / Auto B&W coefs: R=%.2f G=%.2f B=%.2f\n", autor, autog, autob); + printf("Output image / Auto B&W coefs: R=%.2f G=%.2f B=%.2f\n", autor, autog, autob); } // if clut was used and size of clut cache == 1 we free the memory used by the clutstore (default clut cache size = 1 for 32 bit OS) - if ( params.filmSimulation.enabled && !params.filmSimulation.clutFilename.empty() && options.clutCacheSize == 1) { + if (params.filmSimulation.enabled && !params.filmSimulation.clutFilename.empty() && options.clutCacheSize == 1) { CLUTStore::getInstance().clearCache(); } @@ -1018,7 +1028,7 @@ private: baseImg = nullptr; if (pl) { - pl->setProgress (0.55); + pl->setProgress(0.55); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1033,7 +1043,7 @@ private: #pragma omp parallel #endif { - LUTu hist16thr (hist16.getSize()); // one temporary lookup table per thread + LUTu hist16thr(hist16.getSize()); // one temporary lookup table per thread hist16thr.clear(); #ifdef _OPENMP #pragma omp for schedule(static) nowait @@ -1041,7 +1051,7 @@ private: for (int i = 0; i < fh; i++) for (int j = 0; j < fw; j++) { - hist16thr[ (int) ((labView->L[i][j]))]++; + hist16thr[(int)((labView->L[i][j]))]++; } #ifdef _OPENMP @@ -1054,77 +1064,174 @@ private: } bool utili; - CurveFactory::complexLCurve (params.labCurve.brightness, params.labCurve.contrast, params.labCurve.lcurve, hist16, lumacurve, dummy, 1, utili); + CurveFactory::complexLCurve(params.labCurve.brightness, params.labCurve.contrast, params.labCurve.lcurve, hist16, lumacurve, dummy, 1, utili); bool clcutili; - CurveFactory::curveCL (clcutili, params.labCurve.clcurve, clcurve, 1); + CurveFactory::curveCL(clcutili, params.labCurve.clcurve, clcurve, 1); bool ccutili, cclutili; - CurveFactory::complexsgnCurve (autili, butili, ccutili, cclutili, params.labCurve.acurve, params.labCurve.bcurve, params.labCurve.cccurve, - params.labCurve.lccurve, curve1, curve2, satcurve, lhskcurve, 1); + CurveFactory::complexsgnCurve(autili, butili, ccutili, cclutili, params.labCurve.acurve, params.labCurve.bcurve, params.labCurve.cccurve, + params.labCurve.lccurve, curve1, curve2, satcurve, lhskcurve, 1); - ipf.chromiLuminanceCurve (nullptr, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy); + ipf.chromiLuminanceCurve(nullptr, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy); if ((params.colorappearance.enabled && !params.colorappearance.tonecie) || (!params.colorappearance.enabled)) { - ipf.EPDToneMap (labView, 5, 1); + ipf.EPDToneMap(labView, 5, 1); } - ipf.vibrance (labView); + ipf.vibrance(labView); ipf.labColorCorrectionRegions(labView); if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { - ipf.impulsedenoise (labView); + ipf.impulsedenoise(labView); } // for all treatments Defringe, Sharpening, Contrast detail ,Microcontrast they are activated if "CIECAM" function are disabled if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { - ipf.defringe (labView); + ipf.defringe(labView); } if (params.sharpenEdge.enabled) { - ipf.MLsharpen (labView); + ipf.MLsharpen(labView); } if (params.sharpenMicro.enabled) { - if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { - ipf.MLmicrocontrast (labView); //!params.colorappearance.sharpcie + if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { + ipf.MLmicrocontrast(labView); //!params.colorappearance.sharpcie } } if (((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) && params.sharpening.enabled) { - ipf.sharpening (labView, params.sharpening); + ipf.sharpening(labView, params.sharpening); } - WaveletParams WaveParams = params.wavelet; - WavCurve wavCLVCurve; - WavOpacityCurveRG waOpacityCurveRG; - WavOpacityCurveBY waOpacityCurveBY; - WavOpacityCurveW waOpacityCurveW; - WavOpacityCurveWL waOpacityCurveWL; - - params.wavelet.getCurves (wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL ); // directional pyramid wavelet if (params.dirpyrequalizer.cbdlMethod == "aft") { if ((params.colorappearance.enabled && !settings->autocielab) || !params.colorappearance.enabled) { - ipf.dirpyrequalizer (labView, 1); //TODO: this is the luminance tonecurve, not the RGB one + ipf.dirpyrequalizer(labView, 1); //TODO: this is the luminance tonecurve, not the RGB one } } - bool wavcontlutili = false; + if ((params.wavelet.enabled)) { + LabImage *unshar = nullptr; + Glib::ustring provis; - CurveFactory::curveWavContL (wavcontlutili, params.wavelet.wavclCurve, wavclCurve,/* hist16C, dummy,*/ 1); + bool wavcontlutili = false; + WaveletParams WaveParams = params.wavelet; + WavCurve wavCLVCurve; + WavOpacityCurveRG waOpacityCurveRG; + WavOpacityCurveBY waOpacityCurveBY; + WavOpacityCurveW waOpacityCurveW; + WavOpacityCurveWL waOpacityCurveWL; + LabImage *provradius = nullptr; - if (params.wavelet.enabled) { - ipf.ip_wavelet (labView, labView, 2, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); + if (WaveParams.softrad > 0.f) { + provradius = new LabImage(fw, fh); + provradius->CopyFrom(labView); + } + + params.wavelet.getCurves(wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); + + CurveFactory::curveWavContL(wavcontlutili, params.wavelet.wavclCurve, wavclCurve,/* hist16C, dummy,*/ 1); + + if (WaveParams.ushamethod != "none" && WaveParams.expclari && WaveParams.CLmethod != "all") { + unshar = new LabImage(fw, fh); + provis = params.wavelet.CLmethod; + params.wavelet.CLmethod = "all"; + ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); + unshar->CopyFrom(labView); + params.wavelet.CLmethod = provis; + } + + ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); + + if (WaveParams.ushamethod != "none" && WaveParams.expclari && WaveParams.CLmethod != "all") { + float mL = (float)(WaveParams.mergeL / 100.f); + float mC = (float)(WaveParams.mergeC / 100.f); + float mL0; + float mC0; + + if ((WaveParams.CLmethod == "one" || WaveParams.CLmethod == "inf") && WaveParams.Backmethod == "black") { + mL0 = mC0 = 0.f; + mL = -mL; + mC = -mC; + } else if (WaveParams.CLmethod == "sup" && WaveParams.Backmethod == "resid") { + mL0 = mL; + mC0 = mC; + } else { + mL0 = mL = mC0 = mC = 0.f; + } + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int x = 0; x < fh; x++) + for (int y = 0; y < fw; y++) { + labView->L[x][y] = (1.f + mL0) * (unshar->L[x][y]) - mL * labView->L[x][y]; + labView->a[x][y] = (1.f + mC0) * (unshar->a[x][y]) - mC * labView->a[x][y]; + labView->b[x][y] = (1.f + mC0) * (unshar->b[x][y]) - mC * labView->b[x][y]; + } + + delete unshar; + unshar = NULL; + + if (WaveParams.softrad > 0.f) { + array2D ble(fw, fh); + array2D guid(fw, fh); + /* + #ifdef _OPENMP + const int numThreads = omp_get_max_threads(); + #endif + + bool multiTh = false; + + if (numThreads > 1) { + multiTh = true; + } + */ +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < fh; ir++) + for (int jr = 0; jr < fw; jr++) { + ble[ir][jr] = (labView->L[ir][jr] - provradius->L[ir][jr]) / 32768.f; + guid[ir][jr] = provradius->L[ir][jr] / 32768.f; + } + + float blur = 10.f / 1 * (0.1f + 0.8f * WaveParams.softrad); + // rtengine::guidedFilter(guid, ble, ble, blur, 0.001, multiTh); + rtengine::guidedFilter(guid, ble, ble, blur, 0.001, false); + + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < fh; ir++) + for (int jr = 0; jr < fw; jr++) { + labView->L[ir][jr] = provradius->L[ir][jr] + 32768.f * ble[ir][jr]; + } + } + + if (WaveParams.softrad > 0.f) { + delete provradius; + provradius = NULL; + } + + } + + wavCLVCurve.Reset(); } - wavCLVCurve.Reset(); - ipf.softLight(labView); //Colorappearance and tone-mapping associated @@ -1136,9 +1243,9 @@ private: f_h = fh; } - CieImage *cieView = new CieImage (f_w, (f_h)); + CieImage *cieView = new CieImage(f_w, (f_h)); - CurveFactory::curveLightBrightColor ( + CurveFactory::curveLightBrightColor( params.colorappearance.curve, params.colorappearance.curve2, params.colorappearance.curve3, @@ -1152,24 +1259,26 @@ private: if (params.colorappearance.enabled) { double adap; int imgNum = 0; + if (imgsrc->getSensorType() == ST_BAYER) { imgNum = params.raw.bayersensor.imageNum; } else if (imgsrc->getSensorType() == ST_FUJI_XTRANS) { //imgNum = params.raw.xtranssensor.imageNum; } - float fnum = imgsrc->getMetaData()->getFNumber (imgNum); // F number - float fiso = imgsrc->getMetaData()->getISOSpeed (imgNum) ; // ISO - float fspeed = imgsrc->getMetaData()->getShutterSpeed (imgNum) ; //speed - float fcomp = imgsrc->getMetaData()->getExpComp (imgNum); //compensation + - + + float fnum = imgsrc->getMetaData()->getFNumber(imgNum); // F number + float fiso = imgsrc->getMetaData()->getISOSpeed(imgNum) ; // ISO + float fspeed = imgsrc->getMetaData()->getShutterSpeed(imgNum) ; //speed + float fcomp = imgsrc->getMetaData()->getExpComp(imgNum); //compensation + - if (fnum < 0.3f || fiso < 5.f || fspeed < 0.00001f) { adap = 2000.; }//if no exif data or wrong else { - float E_V = fcomp + log2 ((fnum * fnum) / fspeed / (fiso / 100.f)); + float E_V = fcomp + log2((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 = powf (2.f, E_V - 3.f); //cd / m2 + E_V += log2(params.raw.expos); // exposure raw white point ; log2 ==> linear to EV + adap = powf(2.f, E_V - 3.f); //cd / m2 } LUTf CAMBrightCurveJ; @@ -1177,7 +1286,7 @@ private: float CAMMean = NAN; float d, dj, yb; - ipf.ciecam_02float (cieView, float (adap), 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, d, dj, yb, 1); + ipf.ciecam_02float(cieView, float (adap), 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, d, dj, yb, 1); } delete cieView; @@ -1191,11 +1300,11 @@ private: //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if (pl) { - pl->setProgress (0.60); + pl->setProgress(0.60); } int imw, imh; - double tmpScale = ipf.resizeScale (¶ms, fw, fh, imw, imh); + double tmpScale = ipf.resizeScale(¶ms, fw, fh, imw, imh); bool labResize = params.resize.enabled && params.resize.method != "Nearest" && (tmpScale != 1.0 || params.prsharpening.enabled); LabImage *tmplab; @@ -1209,7 +1318,7 @@ private: ch = params.crop.h; if (labResize) { // crop lab data - tmplab = new LabImage (cw, ch); + tmplab = new LabImage(cw, ch); for (int row = 0; row < ch; row++) { for (int col = 0; col < cw; col++) { @@ -1228,13 +1337,14 @@ private: if (labResize) { // resize lab data if ((labView->W != imw || labView->H != imh) && - (params.resize.allowUpscaling || (labView->W >= imw && labView->H >= imh))) { + (params.resize.allowUpscaling || (labView->W >= imw && labView->H >= imh))) { // resize image - tmplab = new LabImage (imw, imh); - ipf.Lanczos (labView, tmplab, tmpScale); + tmplab = new LabImage(imw, imh); + ipf.Lanczos(labView, tmplab, tmpScale); delete labView; labView = tmplab; } + cw = labView->W; ch = labView->H; @@ -1244,7 +1354,8 @@ private: labView->L[i][j] = labView->L[i][j] < 0.f ? 0.f : labView->L[i][j]; } } - ipf.sharpening (labView, params.prsharpening); + + ipf.sharpening(labView, params.prsharpening); } } @@ -1259,10 +1370,10 @@ private: // if Default gamma mode: we use the profile selected in the "Output profile" combobox; // gamma come from the selected profile, otherwise it comes from "Free gamma" tool - Imagefloat* readyImg = ipf.lab2rgbOut (labView, cx, cy, cw, ch, params.icm); + Imagefloat* readyImg = ipf.lab2rgbOut(labView, cx, cy, cw, ch, params.icm); if (settings->verbose) { - printf ("Output profile_: \"%s\"\n", params.icm.outputProfile.c_str()); + printf("Output profile_: \"%s\"\n", params.icm.outputProfile.c_str()); } delete labView; @@ -1272,42 +1383,44 @@ private: if (bwonly) { //force BW r=g=b if (settings->verbose) { - printf ("Force BW\n"); + printf("Force BW\n"); } for (int ccw = 0; ccw < cw; ccw++) { for (int cch = 0; cch < ch; cch++) { - readyImg->r (cch, ccw) = readyImg->g (cch, ccw); - readyImg->b (cch, ccw) = readyImg->g (cch, ccw); + readyImg->r(cch, ccw) = readyImg->g(cch, ccw); + readyImg->b(cch, ccw) = readyImg->g(cch, ccw); } } } if (pl) { - pl->setProgress (0.70); + pl->setProgress(0.70); } if (tmpScale != 1.0 && params.resize.method == "Nearest" && - (params.resize.allowUpscaling || (readyImg->getWidth() >= imw && readyImg->getHeight() >= imh))) { // resize rgb data (gamma applied) - Imagefloat* tempImage = new Imagefloat (imw, imh); - ipf.resize (readyImg, tempImage, tmpScale); + (params.resize.allowUpscaling || (readyImg->getWidth() >= imw && readyImg->getHeight() >= imh))) { // resize rgb data (gamma applied) + Imagefloat* tempImage = new Imagefloat(imw, imh); + ipf.resize(readyImg, tempImage, tmpScale); delete readyImg; readyImg = tempImage; } switch (params.metadata.mode) { - case MetaDataParams::TUNNEL: - // Sending back the whole first root, which won't necessarily be the selected frame number - // and may contain subframe depending on initial raw's hierarchy - readyImg->setMetadata (ii->getMetaData()->getRootExifData ()); - break; - case MetaDataParams::EDIT: - // ask for the correct frame number, but may contain subframe depending on initial raw's hierarchy - readyImg->setMetadata (ii->getMetaData()->getBestExifData(imgsrc, ¶ms.raw), params.exif, params.iptc); - break; - default: // case MetaDataParams::STRIP - // nothing to do - break; + case MetaDataParams::TUNNEL: + // Sending back the whole first root, which won't necessarily be the selected frame number + // and may contain subframe depending on initial raw's hierarchy + readyImg->setMetadata(ii->getMetaData()->getRootExifData()); + break; + + case MetaDataParams::EDIT: + // ask for the correct frame number, but may contain subframe depending on initial raw's hierarchy + readyImg->setMetadata(ii->getMetaData()->getBestExifData(imgsrc, ¶ms.raw), params.exif, params.iptc); + break; + + default: // case MetaDataParams::STRIP + // nothing to do + break; } @@ -1315,8 +1428,8 @@ private: if (customGamma) { if (!useLCMS) { // use corrected sRGB profile in order to apply a good TRC if present, otherwise use LCMS2 profile generated by lab2rgb16 w/ gamma - ProfileContent pc (jprof); - readyImg->setOutputProfile (pc.getData().c_str(), pc.getData().size()); + ProfileContent pc(jprof); + readyImg->setOutputProfile(pc.getData().c_str(), pc.getData().size()); } } else { // use the selected output profile if present, otherwise use LCMS2 profile generate by lab2rgb16 w/ gamma @@ -1324,23 +1437,23 @@ private: if (params.icm.outputProfile != "" && params.icm.outputProfile != ColorManagementParams::NoICMString) { // if ICCStore::getInstance()->getProfile send back an object, then ICCStore::getInstance()->getContent will do too - cmsHPROFILE jprof = ICCStore::getInstance()->getProfile (params.icm.outputProfile); //get outProfile + cmsHPROFILE jprof = ICCStore::getInstance()->getProfile(params.icm.outputProfile); //get outProfile if (jprof == nullptr) { if (settings->verbose) { - printf ("\"%s\" ICC output profile not found!\n - use LCMS2 substitution\n", params.icm.outputProfile.c_str()); + printf("\"%s\" ICC output profile not found!\n - use LCMS2 substitution\n", params.icm.outputProfile.c_str()); } } else { if (settings->verbose) { - printf ("Using \"%s\" output profile\n", params.icm.outputProfile.c_str()); + printf("Using \"%s\" output profile\n", params.icm.outputProfile.c_str()); } - ProfileContent pc = ICCStore::getInstance()->getContent (params.icm.outputProfile); - readyImg->setOutputProfile (pc.getData().c_str(), pc.getData().size()); + ProfileContent pc = ICCStore::getInstance()->getContent(params.icm.outputProfile); + readyImg->setOutputProfile(pc.getData().c_str(), pc.getData().size()); } } else { // No ICM - readyImg->setOutputProfile (nullptr, 0); + readyImg->setOutputProfile(nullptr, 0); } } @@ -1349,13 +1462,13 @@ private: // printf("Total:- %d usec\n", t2.etime(t1)); if (!job->initialImage) { - ii->decreaseRef (); + ii->decreaseRef(); } delete job; if (pl) { - pl->setProgress (0.75); + pl->setProgress(0.75); } /* curve1.reset();curve2.reset(); @@ -1379,10 +1492,10 @@ private: ImProcFunctions &ipf = * (ipf_p.get()); int imw, imh; - double scale_factor = ipf.resizeScale (¶ms, fw, fh, imw, imh); + double scale_factor = ipf.resizeScale(¶ms, fw, fh, imw, imh); - std::unique_ptr tmplab (new LabImage (fw, fh)); - ipf.rgb2lab (*baseImg, *tmplab, params.icm.workingProfile); + std::unique_ptr tmplab(new LabImage(fw, fh)); + ipf.rgb2lab(*baseImg, *tmplab, params.icm.workingProfile); if (params.crop.enabled) { int cx = params.crop.x; @@ -1390,7 +1503,7 @@ private: int cw = params.crop.w; int ch = params.crop.h; - std::unique_ptr cropped (new LabImage (cw, ch)); + std::unique_ptr cropped(new LabImage(cw, ch)); for (int row = 0; row < ch; row++) { for (int col = 0; col < cw; col++) { @@ -1400,29 +1513,29 @@ private: } } - tmplab = std::move (cropped); + tmplab = std::move(cropped); } - assert (params.resize.enabled); + assert(params.resize.enabled); // resize image if (params.resize.allowUpscaling || (imw <= fw && imh <= fh)) { - std::unique_ptr resized (new LabImage (imw, imh)); - ipf.Lanczos (tmplab.get(), resized.get(), scale_factor); - tmplab = std::move (resized); + std::unique_ptr resized(new LabImage(imw, imh)); + ipf.Lanczos(tmplab.get(), resized.get(), scale_factor); + tmplab = std::move(resized); } - adjust_procparams (scale_factor); + adjust_procparams(scale_factor); fw = imw; fh = imh; delete baseImg; - baseImg = new Imagefloat (fw, fh); - ipf.lab2rgb (*tmplab, *baseImg, params.icm.workingProfile); + baseImg = new Imagefloat(fw, fh); + ipf.lab2rgb(*tmplab, *baseImg, params.icm.workingProfile); } - void adjust_procparams (double scale_factor) + void adjust_procparams(double scale_factor) { procparams::ProcParams ¶ms = job->pparams; procparams::ProcParams defaultparams; @@ -1453,13 +1566,13 @@ private: lcurve[i] *= min(noise_factor /* * scale_factor*/, 1.0); } - noiseLCurve.Set (lcurve); + noiseLCurve.Set(lcurve); const char *medmethods[] = { "soft", "33", "55soft", "55", "77", "99" }; if (params.dirpyrDenoise.median) { auto &key = params.dirpyrDenoise.methodmed == "RGB" ? params.dirpyrDenoise.rgbmethod : params.dirpyrDenoise.medmethod; - for (int i = 1; i < int (sizeof (medmethods) / sizeof (const char *)); ++i) { + for (int i = 1; i < int (sizeof(medmethods) / sizeof(const char *)); ++i) { if (key == medmethods[i]) { int j = i - int (1.0 / scale_factor); @@ -1477,17 +1590,17 @@ private: params.epd.scale *= scale_factor; //params.epd.edgeStopping *= scale_factor; - const double dirpyreq_scale = min (scale_factor * 1.5, 1.0); + const double dirpyreq_scale = min(scale_factor * 1.5, 1.0); for (int i = 0; i < 6; ++i) { - adjust_radius (defaultparams.dirpyrequalizer.mult[i], dirpyreq_scale, - params.dirpyrequalizer.mult[i]); + adjust_radius(defaultparams.dirpyrequalizer.mult[i], dirpyreq_scale, + params.dirpyrequalizer.mult[i]); } params.dirpyrequalizer.threshold *= scale_factor; - adjust_radius (defaultparams.defringe.radius, scale_factor, - params.defringe.radius); + adjust_radius(defaultparams.defringe.radius, scale_factor, + params.defringe.radius); params.sh.radius *= scale_factor; params.localContrast.radius *= scale_factor; @@ -1582,40 +1695,40 @@ private: } // namespace -IImagefloat* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* pl, bool flush) +IImagefloat* processImage(ProcessingJob* pjob, int& errorCode, ProgressListener* pl, bool flush) { - ImageProcessor proc (pjob, errorCode, pl, flush); + ImageProcessor proc(pjob, errorCode, pl, flush); return proc(); } -void batchProcessingThread (ProcessingJob* job, BatchProcessingListener* bpl) +void batchProcessingThread(ProcessingJob* job, BatchProcessingListener* bpl) { ProcessingJob* currentJob = job; while (currentJob) { int errorCode; - IImagefloat* img = processImage (currentJob, errorCode, bpl, true); + IImagefloat* img = processImage(currentJob, errorCode, bpl, true); if (errorCode) { - bpl->error (M ("MAIN_MSG_CANNOTLOAD")); + bpl->error(M("MAIN_MSG_CANNOTLOAD")); currentJob = nullptr; } else { try { - currentJob = bpl->imageReady (img); + currentJob = bpl->imageReady(img); } catch (Glib::Exception& ex) { - bpl->error (ex.what()); + bpl->error(ex.what()); currentJob = nullptr; } } } } -void startBatchProcessing (ProcessingJob* job, BatchProcessingListener* bpl) +void startBatchProcessing(ProcessingJob* job, BatchProcessingListener* bpl) { if (bpl) { - Glib::Thread::create (sigc::bind (sigc::ptr_fun (batchProcessingThread), job, bpl), 0, true, true, Glib::THREAD_PRIORITY_LOW); + Glib::Thread::create(sigc::bind(sigc::ptr_fun(batchProcessingThread), job, bpl), 0, true, true, Glib::THREAD_PRIORITY_LOW); } } diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 2c29b4f5b..cec0a5c92 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -473,7 +473,12 @@ void ParamsEdited::set(bool v) wavelet.bluemed = v; wavelet.bluelow = v; wavelet.lipst = v; + wavelet.mergeL = v; + wavelet.mergeC = v; + wavelet.softrad = v; + wavelet.softradend = v; wavelet.Medgreinf = v; + wavelet.ushamethod = v; wavelet.avoid = v; wavelet.tmr = v; wavelet.Lmethod = v; @@ -538,6 +543,7 @@ void ParamsEdited::set(bool v) // wavelet.enaedge = v; // wavelet.enares = v; wavelet.expfinal = v; + wavelet.expclari = v; wavelet.expcontrast = v; wavelet.expchroma = v; wavelet.expedge = v; @@ -1040,7 +1046,12 @@ void ParamsEdited::initFrom(const std::vector& wavelet.greenlow = wavelet.greenlow && p.wavelet.greenlow == other.wavelet.greenlow; wavelet.bluelow = wavelet.bluelow && p.wavelet.bluelow == other.wavelet.bluelow; wavelet.lipst = wavelet.lipst && p.wavelet.lipst == other.wavelet.lipst; - wavelet.Medgreinf = wavelet.Medgreinf && p.wavelet.Medgreinf == other.wavelet.Medgreinf; + wavelet.bluehigh = wavelet.bluehigh && p.wavelet.bluehigh == other.wavelet.bluehigh; + wavelet.mergeL = wavelet.mergeL && p.wavelet.mergeL == other.wavelet.mergeL; + wavelet.mergeC = wavelet.mergeC && p.wavelet.mergeC == other.wavelet.mergeC; + wavelet.softrad = wavelet.softrad && p.wavelet.softrad == other.wavelet.softrad; + wavelet.softradend = wavelet.softradend && p.wavelet.softradend == other.wavelet.softradend; + wavelet.ushamethod = wavelet.ushamethod && p.wavelet.ushamethod == other.wavelet.ushamethod; wavelet.avoid = wavelet.avoid && p.wavelet.avoid == other.wavelet.avoid; wavelet.tmr = wavelet.tmr && p.wavelet.tmr == other.wavelet.tmr; wavelet.Lmethod = wavelet.Lmethod && p.wavelet.Lmethod == other.wavelet.Lmethod; @@ -1107,6 +1118,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.expfinal = wavelet.expfinal && p.wavelet.expfinal == other.wavelet.expfinal; wavelet.exptoning = wavelet.exptoning && p.wavelet.exptoning == other.wavelet.exptoning; wavelet.expnoise = wavelet.expnoise && p.wavelet.expnoise == other.wavelet.expnoise; + wavelet.expclari = wavelet.expclari && p.wavelet.expclari == other.wavelet.expclari; for (int i = 0; i < 9; i++) { wavelet.c[i] = wavelet.c[i] && p.wavelet.c[i] == other.wavelet.c[i]; @@ -2802,6 +2814,22 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.bluelow = mods.wavelet.bluelow; } + if (wavelet.mergeL) { + toEdit.wavelet.mergeL = mods.wavelet.mergeL; + } + + if (wavelet.mergeC) { + toEdit.wavelet.mergeC = mods.wavelet.mergeC; + } + + if (wavelet.softrad) { + toEdit.wavelet.softrad = mods.wavelet.softrad; + } + + if (wavelet.softradend) { + toEdit.wavelet.softradend = mods.wavelet.softradend; + } + if (wavelet.lipst) { toEdit.wavelet.lipst = mods.wavelet.lipst; } @@ -2810,6 +2838,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.Medgreinf = mods.wavelet.Medgreinf; } + if (wavelet.ushamethod) { + toEdit.wavelet.ushamethod = mods.wavelet.ushamethod; + } + if (wavelet.avoid) { toEdit.wavelet.avoid = mods.wavelet.avoid; } @@ -2979,6 +3011,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.expfinal = mods.wavelet.expfinal; } + if (wavelet.expclari) { + toEdit.wavelet.expclari = mods.wavelet.expclari; + } + if (wavelet.exptoning) { toEdit.wavelet.exptoning = mods.wavelet.exptoning; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 95701e01a..13d575d90 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -475,6 +475,7 @@ struct WaveletParamsEdited { bool cbenab; bool lipst; bool Medgreinf; + bool ushamethod; bool avoid; bool tmr; bool c[9]; @@ -541,6 +542,10 @@ struct WaveletParamsEdited { bool bluemed; bool greenhigh; bool bluehigh; + bool mergeL; + bool mergeC; + bool softrad; + bool softradend; bool expcontrast; bool expchroma; bool expedge; @@ -548,6 +553,7 @@ struct WaveletParamsEdited { bool expfinal; bool exptoning; bool expnoise; + bool expclari; }; struct DirPyrEqualizerParamsEdited { diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 60915fa02..6aa86abfa 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -22,6 +22,7 @@ #include "edit.h" #include "guiutils.h" #include "rtimage.h" +#include "eventmapper.h" using namespace rtengine; using namespace rtengine::procparams; @@ -30,27 +31,27 @@ extern Options options; namespace { - GradientMilestone makeHsvGm(double position, float h, float s, float v) - { - float r; - float g; - float b; - Color::hsv2rgb01(h, s, v, r, g, b); - return GradientMilestone(position, r, g, b); +GradientMilestone makeHsvGm(double position, float h, float s, float v) +{ + float r; + float g; + float b; + Color::hsv2rgb01(h, s, v, r, g, b); + return GradientMilestone(position, r, g, b); +} + +std::vector makeWholeHueRange() +{ + std::vector res; + res.reserve(7); + + for (int i = 0; i < 7; ++i) { + const float x = static_cast(i) / 6.0f; + res.push_back(makeHsvGm(x, x, 0.5f, 0.5f)); } - std::vector makeWholeHueRange() - { - std::vector res; - res.reserve(7); - - for (int i = 0; i < 7; ++i) { - const float x = static_cast(i) / 6.0f; - res.push_back(makeHsvGm(x, x, 0.5f, 0.5f)); - } - - return res; - } + return res; +} } @@ -87,10 +88,10 @@ Wavelet::Wavelet() : contrast(Gtk::manage(new Adjuster(M("TP_WAVELET_CONTRA"), -100, 100, 1, 0))), thr(Gtk::manage(new Adjuster(M("TP_WAVELET_THR"), 0, 100, 1, 35))), thrH(Gtk::manage(new Adjuster(M("TP_WAVELET_THRH"), 0, 100, 1, 65))), - skinprotect(Gtk::manage( new Adjuster(M("TP_WAVELET_SKIN"), -100, 100, 1, 0.) )), - edgrad(Gtk::manage( new Adjuster(M("TP_WAVELET_EDRAD"), 0, 100, 1, 15) )), - edgval(Gtk::manage( new Adjuster(M("TP_WAVELET_EDVAL"), 0, 100, 1, 0) )), - edgthresh(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGTHRESH"), -50, 100, 1, 10 ))), + skinprotect(Gtk::manage(new Adjuster(M("TP_WAVELET_SKIN"), -100, 100, 1, 0.))), + edgrad(Gtk::manage(new Adjuster(M("TP_WAVELET_EDRAD"), 0, 100, 1, 15))), + edgval(Gtk::manage(new Adjuster(M("TP_WAVELET_EDVAL"), 0, 100, 1, 0))), + edgthresh(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGTHRESH"), -50, 100, 1, 10))), strength(Gtk::manage(new Adjuster(M("TP_WAVELET_STRENGTH"), 0, 100, 1, 100))), balance(Gtk::manage(new Adjuster(M("TP_WAVELET_BALANCE"), -30, 100, 1, 0))), iter(Gtk::manage(new Adjuster(M("TP_WAVELET_ITER"), -3, 3, 1, 0))), @@ -112,6 +113,10 @@ Wavelet::Wavelet() : edgedetectthr2(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGEDETECTTHR2"), -10, 100, 1, 0))), edgesensi(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGESENSI"), 0, 100, 1, 60))), edgeampli(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGEAMPLI"), 0, 100, 1, 10))), + mergeL(Gtk::manage(new Adjuster(M("TP_WAVELET_MERGEL"), -50, 100, 1, 40))), + mergeC(Gtk::manage(new Adjuster(M("TP_WAVELET_MERGEC"), -50, 100, 1, 20))), + softrad(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.1, 0.))), + softradend(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.1, 0.))), Lmethod(Gtk::manage(new MyComboBoxText())), CHmethod(Gtk::manage(new MyComboBoxText())), CHSLmethod(Gtk::manage(new MyComboBoxText())), @@ -126,12 +131,14 @@ Wavelet::Wavelet() : daubcoeffmethod(Gtk::manage(new MyComboBoxText())), Dirmethod(Gtk::manage(new MyComboBoxText())), Medgreinf(Gtk::manage(new MyComboBoxText())), + ushamethod(Gtk::manage(new MyComboBoxText())), chanMixerHLFrame(Gtk::manage(new Gtk::Frame(M("TP_COLORTONING_HIGHLIGHT")))), chanMixerMidFrame(Gtk::manage(new Gtk::Frame(M("TP_COLORTONING_MIDTONES")))), chanMixerShadowsFrame(Gtk::manage(new Gtk::Frame(M("TP_COLORTONING_SHADOWS")))), wavLabels(Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER))), labmC(Gtk::manage(new Gtk::Label(M("TP_WAVELET_CTYPE") + ":"))), labmNP(Gtk::manage(new Gtk::Label(M("TP_WAVELET_NPTYPE") + ":"))), + usharpLabel(Gtk::manage(new Gtk::Label(M("TP_WAVELET_USHARP") + ":"))), expchroma(Gtk::manage(new MyExpander(true, M("TP_WAVELET_LEVCH")))), expcontrast(Gtk::manage(new MyExpander(true, M("TP_WAVELET_LEVF")))), expedge(Gtk::manage(new MyExpander(true, M("TP_WAVELET_EDGE")))), @@ -141,80 +148,92 @@ Wavelet::Wavelet() : expresid(Gtk::manage(new MyExpander(true, M("TP_WAVELET_RESID")))), expsettings(Gtk::manage(new MyExpander(false, M("TP_WAVELET_SETTINGS")))), exptoning(Gtk::manage(new MyExpander(true, M("TP_WAVELET_TON")))), - neutrHBox(Gtk::manage(new Gtk::HBox())) + expclari(Gtk::manage(new MyExpander(true, M("TP_WAVELET_CLARI")))), + neutrHBox(Gtk::manage(new Gtk::HBox())), + usharpHBox(Gtk::manage(new Gtk::HBox())) { CurveListener::setMulti(true); + auto m = ProcEventMapper::getInstance(); + EvWavenaclari = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVCLARI"); + EvWavushamet = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVUSHAMET"); + EvWavmergeL = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVMERGEL"); + EvWavmergeC = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVMERGEC"); + EvWavsoftrad = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSOFTRAD"); + EvWavsoftradend = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSOFTRADEND"); - expsettings->signal_button_release_event().connect_notify( sigc::bind( sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings) ); + expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings)); - expcontrast->signal_button_release_event().connect_notify( sigc::bind( sigc::mem_fun(this, &Wavelet::foldAllButMe), expcontrast) ); - enableContrastConn = expcontrast->signal_enabled_toggled().connect ( sigc::bind( sigc::mem_fun(this, &Wavelet::enableToggled), expcontrast) ); + expcontrast->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expcontrast)); + enableContrastConn = expcontrast->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), expcontrast)); - expchroma->signal_button_release_event().connect_notify( sigc::bind ( sigc::mem_fun(this, &Wavelet::foldAllButMe), expchroma) ); - enableChromaConn = expchroma->signal_enabled_toggled().connect ( sigc::bind( sigc::mem_fun(this, &Wavelet::enableToggled), expchroma) ); + expchroma->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expchroma)); + enableChromaConn = expchroma->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), expchroma)); - exptoning->signal_button_release_event().connect_notify( sigc::bind ( sigc::mem_fun(this, &Wavelet::foldAllButMe), exptoning) ); - enableToningConn = exptoning->signal_enabled_toggled().connect ( sigc::bind( sigc::mem_fun(this, &Wavelet::enableToggled), exptoning) ); + exptoning->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), exptoning)); + enableToningConn = exptoning->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), exptoning)); - expnoise->signal_button_release_event().connect_notify( sigc::bind ( sigc::mem_fun(this, &Wavelet::foldAllButMe), expnoise) ); - enableNoiseConn = expnoise->signal_enabled_toggled().connect ( sigc::bind( sigc::mem_fun(this, &Wavelet::enableToggled), expnoise) ); + expnoise->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expnoise)); + enableNoiseConn = expnoise->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), expnoise)); - expedge->signal_button_release_event().connect_notify( sigc::bind ( sigc::mem_fun(this, &Wavelet::foldAllButMe), expedge) ); - enableEdgeConn = expedge->signal_enabled_toggled().connect ( sigc::bind( sigc::mem_fun(this, &Wavelet::enableToggled), expedge) ); + expedge->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expedge)); + enableEdgeConn = expedge->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), expedge)); - expgamut->signal_button_release_event().connect_notify( sigc::bind ( sigc::mem_fun(this, &Wavelet::foldAllButMe), expgamut) ); + expgamut->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expgamut)); - expresid->signal_button_release_event().connect_notify( sigc::bind ( sigc::mem_fun(this, &Wavelet::foldAllButMe), expresid) ); - enableResidConn = expresid->signal_enabled_toggled().connect ( sigc::bind( sigc::mem_fun(this, &Wavelet::enableToggled), expresid) ); + expresid->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expresid)); + enableResidConn = expresid->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), expresid)); - expfinal->signal_button_release_event().connect_notify( sigc::bind ( sigc::mem_fun(this, &Wavelet::foldAllButMe), expfinal) ); - enableFinalConn = expfinal->signal_enabled_toggled().connect ( sigc::bind( sigc::mem_fun(this, &Wavelet::enableToggled), expfinal) ); + expfinal->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expfinal)); + enableFinalConn = expfinal->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), expfinal)); + + expclari->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expclari)); + enableclariConn = expclari->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), expclari)); // Wavelet Settings - ToolParamBlock* const settingsBox = Gtk::manage (new ToolParamBlock()); + ToolParamBlock* const settingsBox = Gtk::manage(new ToolParamBlock()); - strength->setAdjusterListener (this); + strength->setAdjusterListener(this); - thres->set_tooltip_text (M("TP_WAVELET_LEVELS_TOOLTIP")); - thres->setAdjusterListener (this); + thres->set_tooltip_text(M("TP_WAVELET_LEVELS_TOOLTIP")); + thres->setAdjusterListener(this); - Tilesmethod->append (M("TP_WAVELET_TILESFULL")); - Tilesmethod->append (M("TP_WAVELET_TILESBIG")); - Tilesmethod->append (M("TP_WAVELET_TILESLIT")); - Tilesmethodconn = Tilesmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::TilesmethodChanged) ); - Tilesmethod->set_tooltip_text (M("TP_WAVELET_TILES_TOOLTIP")); + Tilesmethod->append(M("TP_WAVELET_TILESFULL")); + Tilesmethod->append(M("TP_WAVELET_TILESBIG")); + Tilesmethod->append(M("TP_WAVELET_TILESLIT")); + Tilesmethodconn = Tilesmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::TilesmethodChanged)); + Tilesmethod->set_tooltip_text(M("TP_WAVELET_TILES_TOOLTIP")); Gtk::HBox* const tilesizeHBox = Gtk::manage(new Gtk::HBox()); Gtk::Label* const tilesizeLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_TILESIZE") + ":")); tilesizeHBox->pack_start(*tilesizeLabel, Gtk::PACK_SHRINK, 4); tilesizeHBox->pack_start(*Tilesmethod); daubcoeffmethod->set_sensitive(true); - daubcoeffmethod->append (M("TP_WAVELET_DAUB2")); - daubcoeffmethod->append (M("TP_WAVELET_DAUB4")); - daubcoeffmethod->append (M("TP_WAVELET_DAUB6")); - daubcoeffmethod->append (M("TP_WAVELET_DAUB10")); - daubcoeffmethod->append (M("TP_WAVELET_DAUB14")); - daubcoeffmethodconn = daubcoeffmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::daubcoeffmethodChanged) ); - daubcoeffmethod->set_tooltip_text (M("TP_WAVELET_DAUB_TOOLTIP")); + daubcoeffmethod->append(M("TP_WAVELET_DAUB2")); + daubcoeffmethod->append(M("TP_WAVELET_DAUB4")); + daubcoeffmethod->append(M("TP_WAVELET_DAUB6")); + daubcoeffmethod->append(M("TP_WAVELET_DAUB10")); + daubcoeffmethod->append(M("TP_WAVELET_DAUB14")); + daubcoeffmethodconn = daubcoeffmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::daubcoeffmethodChanged)); + daubcoeffmethod->set_tooltip_text(M("TP_WAVELET_DAUB_TOOLTIP")); Gtk::Label* const daubcoeffLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_DAUB") + ":")); Gtk::HBox* const daubcoeffHBox = Gtk::manage(new Gtk::HBox()); daubcoeffHBox->pack_start(*daubcoeffLabel, Gtk::PACK_SHRINK, 4); daubcoeffHBox->pack_start(*daubcoeffmethod); - Backmethod->append (M("TP_WAVELET_B0")); - Backmethod->append (M("TP_WAVELET_B1")); - Backmethod->append (M("TP_WAVELET_B2")); - Backmethodconn = Backmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::BackmethodChanged) ); + Backmethod->append(M("TP_WAVELET_B0")); + Backmethod->append(M("TP_WAVELET_B1")); + Backmethod->append(M("TP_WAVELET_B2")); + Backmethodconn = Backmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::BackmethodChanged)); Gtk::HBox* const backgroundHBox = Gtk::manage(new Gtk::HBox()); Gtk::Label* const backgroundLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_BACKGROUND") + ":")); backgroundHBox->pack_start(*backgroundLabel, Gtk::PACK_SHRINK, 4); backgroundHBox->pack_start(*Backmethod); - CLmethod->append (M("TP_WAVELET_LEVDIR_ONE")); - CLmethod->append (M("TP_WAVELET_LEVDIR_INF")); - CLmethod->append (M("TP_WAVELET_LEVDIR_SUP")); - CLmethod->append (M("TP_WAVELET_LEVDIR_ALL")); - CLmethodconn = CLmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::CLmethodChanged) ); + CLmethod->append(M("TP_WAVELET_LEVDIR_ONE")); + CLmethod->append(M("TP_WAVELET_LEVDIR_INF")); + CLmethod->append(M("TP_WAVELET_LEVDIR_SUP")); + CLmethod->append(M("TP_WAVELET_LEVDIR_ALL")); + CLmethodconn = CLmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::CLmethodChanged)); Gtk::HBox* const levdirMainHBox = Gtk::manage(new Gtk::HBox()); Gtk::Label* const levdirMainLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_PROC") + ":")); levdirMainHBox->pack_start(*levdirMainLabel, Gtk::PACK_SHRINK, 4); @@ -222,25 +241,25 @@ Wavelet::Wavelet() : Lmethod->set_sensitive(false); Lmethod->set_sensitive(false); - Lmethod->append (M("TP_WAVELET_1")); - Lmethod->append (M("TP_WAVELET_2")); - Lmethod->append (M("TP_WAVELET_3")); - Lmethod->append (M("TP_WAVELET_4")); - Lmethod->append (M("TP_WAVELET_5")); - Lmethod->append (M("TP_WAVELET_6")); - Lmethod->append (M("TP_WAVELET_7")); - Lmethod->append (M("TP_WAVELET_8")); - Lmethod->append (M("TP_WAVELET_9")); - Lmethod->append (M("TP_WAVELET_SUPE")); - Lmethod->append (M("TP_WAVELET_RESID")); + Lmethod->append(M("TP_WAVELET_1")); + Lmethod->append(M("TP_WAVELET_2")); + Lmethod->append(M("TP_WAVELET_3")); + Lmethod->append(M("TP_WAVELET_4")); + Lmethod->append(M("TP_WAVELET_5")); + Lmethod->append(M("TP_WAVELET_6")); + Lmethod->append(M("TP_WAVELET_7")); + Lmethod->append(M("TP_WAVELET_8")); + Lmethod->append(M("TP_WAVELET_9")); + Lmethod->append(M("TP_WAVELET_SUPE")); + Lmethod->append(M("TP_WAVELET_RESID")); Lmethod->set_active(0); Dirmethod->set_sensitive(false); - Dirmethod->append (M("TP_WAVELET_DONE")); - Dirmethod->append (M("TP_WAVELET_DTWO")); - Dirmethod->append (M("TP_WAVELET_DTHR")); - Dirmethod->append (M("TP_WAVELET_DALL")); - Lmethodconn = Lmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::LmethodChanged) ); - Dirmethodconn = Dirmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::DirmethodChanged) ); + Dirmethod->append(M("TP_WAVELET_DONE")); + Dirmethod->append(M("TP_WAVELET_DTWO")); + Dirmethod->append(M("TP_WAVELET_DTHR")); + Dirmethod->append(M("TP_WAVELET_DALL")); + Lmethodconn = Lmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::LmethodChanged)); + Dirmethodconn = Dirmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::DirmethodChanged)); Gtk::HBox* const levdirSubHBox = Gtk::manage(new Gtk::HBox()); levdirSubHBox->pack_start(*Lmethod); levdirSubHBox->pack_start(*Dirmethod, Gtk::PACK_EXPAND_WIDGET, 2); // same, but 2 not 4? @@ -254,74 +273,74 @@ Wavelet::Wavelet() : settingsBox->pack_start(*levdirSubHBox); // Contrast - ToolParamBlock* const levBox = Gtk::manage (new ToolParamBlock()); + ToolParamBlock* const levBox = Gtk::manage(new ToolParamBlock()); - Gtk::HBox* const buttonBox = Gtk::manage (new Gtk::HBox(true, 10)); + Gtk::HBox* const buttonBox = Gtk::manage(new Gtk::HBox(true, 10)); levBox->pack_start(*buttonBox, Gtk::PACK_SHRINK, 2); - Gtk::Button* const contrastMinusButton = Gtk::manage (new Gtk::Button(M("TP_WAVELET_CONTRAST_MINUS"))); + Gtk::Button* const contrastMinusButton = Gtk::manage(new Gtk::Button(M("TP_WAVELET_CONTRAST_MINUS"))); buttonBox->pack_start(*contrastMinusButton); - contrastMinusPressedConn = contrastMinusButton->signal_pressed().connect( sigc::mem_fun(*this, &Wavelet::contrastMinusPressed)); + contrastMinusPressedConn = contrastMinusButton->signal_pressed().connect(sigc::mem_fun(*this, &Wavelet::contrastMinusPressed)); - Gtk::Button* const neutralButton = Gtk::manage (new Gtk::Button(M("TP_WAVELET_NEUTRAL"))); + Gtk::Button* const neutralButton = Gtk::manage(new Gtk::Button(M("TP_WAVELET_NEUTRAL"))); buttonBox->pack_start(*neutralButton); - neutralPressedConn = neutralButton->signal_pressed().connect( sigc::mem_fun(*this, &Wavelet::neutralPressed)); + neutralPressedConn = neutralButton->signal_pressed().connect(sigc::mem_fun(*this, &Wavelet::neutralPressed)); - Gtk::Button* const contrastPlusButton = Gtk::manage (new Gtk::Button(M("TP_WAVELET_CONTRAST_PLUS"))); + Gtk::Button* const contrastPlusButton = Gtk::manage(new Gtk::Button(M("TP_WAVELET_CONTRAST_PLUS"))); buttonBox->pack_start(*contrastPlusButton); - contrastPlusPressedConn = contrastPlusButton->signal_pressed().connect( sigc::mem_fun(*this, &Wavelet::contrastPlusPressed)); + contrastPlusPressedConn = contrastPlusButton->signal_pressed().connect(sigc::mem_fun(*this, &Wavelet::contrastPlusPressed)); buttonBox->show_all_children(); - for(int i = 0; i < 9; i++) { + for (int i = 0; i < 9; i++) { Glib::ustring ss; - switch( i ) { - case 0: - ss = Glib::ustring::compose( "%1 (%2)", (i + 1), M("TP_WAVELET_FINEST")); - break; + switch (i) { + case 0: + ss = Glib::ustring::compose("%1 (%2)", (i + 1), M("TP_WAVELET_FINEST")); + break; - case 8: - ss = Glib::ustring::compose( "%1 (%2)", (i + 1), M("TP_WAVELET_LARGEST")); - break; + case 8: + ss = Glib::ustring::compose("%1 (%2)", (i + 1), M("TP_WAVELET_LARGEST")); + break; - default: - ss = Glib::ustring::compose( "%1", (i + 1)); + default: + ss = Glib::ustring::compose("%1", (i + 1)); } - correction[i] = Gtk::manage ( new Adjuster (ss, -100, 350, 1, 0) ); + correction[i] = Gtk::manage(new Adjuster(ss, -100, 350, 1, 0)); correction[i]->setAdjusterListener(this); levBox->pack_start(*correction[i]); } levBox->pack_start(*sup); - sup->setAdjusterListener (this); + sup->setAdjusterListener(this); wavLabels->show(); - levBox->pack_start (*wavLabels); + levBox->pack_start(*wavLabels); Gtk::VBox* const contrastSHVBox = Gtk::manage(new Gtk::VBox); contrastSHVBox->set_spacing(2); - HSmethod->append (M("TP_WAVELET_HS1")); - HSmethod->append (M("TP_WAVELET_HS2")); - HSmethodconn = HSmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::HSmethodChanged) ); + HSmethod->append(M("TP_WAVELET_HS1")); + HSmethod->append(M("TP_WAVELET_HS2")); + HSmethodconn = HSmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::HSmethodChanged)); const std::vector milestones2 = { GradientMilestone(0.0, 0.0, 0.0, 0.0), GradientMilestone(1.0, 1.0, 1.0, 1.0) }; - hllev->setAdjusterListener (this); + hllev->setAdjusterListener(this); hllev->setBgGradient(milestones2); - threshold->setAdjusterListener (this); - threshold->set_tooltip_text (M("TP_WAVELET_THRESHOLD_TOOLTIP")); + threshold->setAdjusterListener(this); + threshold->set_tooltip_text(M("TP_WAVELET_THRESHOLD_TOOLTIP")); - bllev->setAdjusterListener (this); + bllev->setAdjusterListener(this); bllev->setBgGradient(milestones2); - threshold2->setAdjusterListener (this); - threshold2->set_tooltip_text (M("TP_WAVELET_THRESHOLD2_TOOLTIP")); + threshold2->setAdjusterListener(this); + threshold2->set_tooltip_text(M("TP_WAVELET_THRESHOLD2_TOOLTIP")); contrastSHVBox->pack_start(*HSmethod); contrastSHVBox->pack_start(*hllev); @@ -333,79 +352,79 @@ Wavelet::Wavelet() : levBox->pack_start(*contrastSHFrame); // Chromaticity - ToolParamBlock* const chBox = Gtk::manage (new ToolParamBlock()); + ToolParamBlock* const chBox = Gtk::manage(new ToolParamBlock()); Gtk::Label* const labmch = Gtk::manage(new Gtk::Label(M("TP_WAVELET_CHTYPE") + ":")); Gtk::HBox* const ctboxch = Gtk::manage(new Gtk::HBox()); - ctboxch->pack_start (*labmch, Gtk::PACK_SHRINK, 1); + ctboxch->pack_start(*labmch, Gtk::PACK_SHRINK, 1); - CHmethod->append (M("TP_WAVELET_CH1")); - CHmethod->append (M("TP_WAVELET_CH2")); - CHmethod->append (M("TP_WAVELET_CH3")); - CHmethodconn = CHmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::CHmethodChanged) ); + CHmethod->append(M("TP_WAVELET_CH1")); + CHmethod->append(M("TP_WAVELET_CH2")); + CHmethod->append(M("TP_WAVELET_CH3")); + CHmethodconn = CHmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::CHmethodChanged)); ctboxch->pack_start(*CHmethod); chBox->pack_start(*ctboxch); Gtk::HBox* const ctboxCH = Gtk::manage(new Gtk::HBox()); - ctboxCH->pack_start (*labmC, Gtk::PACK_SHRINK, 1); + ctboxCH->pack_start(*labmC, Gtk::PACK_SHRINK, 1); - CHSLmethod->append (M("TP_WAVELET_CHSL")); - CHSLmethod->append (M("TP_WAVELET_CHCU")); - CHSLmethodconn = CHSLmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::CHSLmethodChanged) ); + CHSLmethod->append(M("TP_WAVELET_CHSL")); + CHSLmethod->append(M("TP_WAVELET_CHCU")); + CHSLmethodconn = CHSLmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::CHSLmethodChanged)); ctboxCH->pack_start(*CHSLmethod); - Gtk::HSeparator* const separatorChromaMethod = Gtk::manage (new Gtk::HSeparator()); + Gtk::HSeparator* const separatorChromaMethod = Gtk::manage(new Gtk::HSeparator()); chBox->pack_start(*separatorChromaMethod, Gtk::PACK_SHRINK, 2); - chroma->set_tooltip_text (M("TP_WAVELET_CHRO_TOOLTIP")); + chroma->set_tooltip_text(M("TP_WAVELET_CHRO_TOOLTIP")); chBox->pack_start(*chroma); - chroma->setAdjusterListener (this); + chroma->setAdjusterListener(this); - satlev->setAdjusterListener (this); + satlev->setAdjusterListener(this); satlev->setBgGradient(milestones2); - pastlev->setAdjusterListener (this); + pastlev->setAdjusterListener(this); pastlev->setBgGradient(milestones2); chBox->pack_start(*pastlev); chBox->pack_start(*satlev); - chro->set_tooltip_text (M("TP_WAVELET_CHR_TOOLTIP")); + chro->set_tooltip_text(M("TP_WAVELET_CHR_TOOLTIP")); chBox->pack_start(*chro); - chro->setAdjusterListener (this); + chro->setAdjusterListener(this); - Gtk::HBox* const buttonchBox = Gtk::manage (new Gtk::HBox(true, 10)); - neutralchPressedConn = neutralchButton->signal_pressed().connect( sigc::mem_fun(*this, &Wavelet::neutralchPressed)); + Gtk::HBox* const buttonchBox = Gtk::manage(new Gtk::HBox(true, 10)); + neutralchPressedConn = neutralchButton->signal_pressed().connect(sigc::mem_fun(*this, &Wavelet::neutralchPressed)); chBox->pack_start(*separatorNeutral, Gtk::PACK_SHRINK, 2); buttonchBox->pack_start(*neutralchButton); buttonchBox->show_all_children(); chBox->pack_start(*buttonchBox, Gtk::PACK_SHRINK, 2); - for(int i = 0; i < 9; i++) { + for (int i = 0; i < 9; i++) { Glib::ustring ss; - switch( i ) { - case 0: - ss = Glib::ustring::compose( "%1 (%2)", (i + 1), M("TP_WAVELET_FINEST")); - break; + switch (i) { + case 0: + ss = Glib::ustring::compose("%1 (%2)", (i + 1), M("TP_WAVELET_FINEST")); + break; - case 8: - ss = Glib::ustring::compose( "%1 (%2)", (i + 1), M("TP_WAVELET_LARGEST")); - break; + case 8: + ss = Glib::ustring::compose("%1 (%2)", (i + 1), M("TP_WAVELET_LARGEST")); + break; - default: - ss = Glib::ustring::compose( "%1", (i + 1)); + default: + ss = Glib::ustring::compose("%1", (i + 1)); } - correctionch[i] = Gtk::manage ( new Adjuster (ss, -100, 100, 1, 0) ); + correctionch[i] = Gtk::manage(new Adjuster(ss, -100, 100, 1, 0)); correctionch[i]->setAdjusterListener(this); chBox->pack_start(*correctionch[i]); } // Toning - ToolParamBlock* const tonBox = Gtk::manage (new ToolParamBlock()); + ToolParamBlock* const tonBox = Gtk::manage(new ToolParamBlock()); - opaCurveEditorG->setCurveListener (this); + opaCurveEditorG->setCurveListener(this); const WaveletParams default_params; @@ -416,9 +435,9 @@ Wavelet::Wavelet() : opaCurveEditorG->curveListComplete(); opaCurveEditorG->show(); - tonBox->pack_start( *opaCurveEditorG, Gtk::PACK_SHRINK, 2); + tonBox->pack_start(*opaCurveEditorG, Gtk::PACK_SHRINK, 2); - opacityCurveEditorG->setCurveListener (this); + opacityCurveEditorG->setCurveListener(this); opacityShapeBY = static_cast(opacityCurveEditorG->addCurve(CT_Flat, "", nullptr, false, false)); opacityShapeBY->setIdentityValue(0.); @@ -427,77 +446,96 @@ Wavelet::Wavelet() : opacityCurveEditorG->curveListComplete(); opacityCurveEditorG->show(); - tonBox->pack_start( *opacityCurveEditorG, Gtk::PACK_SHRINK, 2); + tonBox->pack_start(*opacityCurveEditorG, Gtk::PACK_SHRINK, 2); // Denoise and Refine - ToolParamBlock* const noiseBox = Gtk::manage (new ToolParamBlock()); + ToolParamBlock* const noiseBox = Gtk::manage(new ToolParamBlock()); - linkedg->set_active (true); - linkedgConn = linkedg->signal_toggled().connect( sigc::mem_fun(*this, &Wavelet::linkedgToggled) ); + linkedg->set_active(true); + linkedgConn = linkedg->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::linkedgToggled)); noiseBox->pack_start(*linkedg); - level0noise->setAdjusterListener (this); + level0noise->setAdjusterListener(this); level0noise->setUpdatePolicy(RTUP_DYNAMIC); - level1noise->setAdjusterListener (this); + level1noise->setAdjusterListener(this); level1noise->setUpdatePolicy(RTUP_DYNAMIC); - level2noise->setAdjusterListener (this); + level2noise->setAdjusterListener(this); level2noise->setUpdatePolicy(RTUP_DYNAMIC); - level3noise->setAdjusterListener (this); + level3noise->setAdjusterListener(this); level3noise->setUpdatePolicy(RTUP_DYNAMIC); - noiseBox->pack_start( *level0noise, Gtk::PACK_SHRINK, 0); - noiseBox->pack_start( *level1noise, Gtk::PACK_SHRINK, 0); - noiseBox->pack_start( *level2noise, Gtk::PACK_SHRINK, 0); - noiseBox->pack_start( *level3noise, Gtk::PACK_SHRINK, 0); + noiseBox->pack_start(*level0noise, Gtk::PACK_SHRINK, 0); + noiseBox->pack_start(*level1noise, Gtk::PACK_SHRINK, 0); + noiseBox->pack_start(*level2noise, Gtk::PACK_SHRINK, 0); + noiseBox->pack_start(*level3noise, Gtk::PACK_SHRINK, 0); + +//Clarity + mergeL->setAdjusterListener(this); + mergeC->setAdjusterListener(this); + softrad->setAdjusterListener(this); + + ToolParamBlock* const clariBox = Gtk::manage(new ToolParamBlock()); + ushamethod->append(M("TP_WAVELET_USH")); + ushamethod->append(M("TP_WAVELET_SHA")); + ushamethod->append(M("TP_WAVELET_CLA")); + ushamethodconn = ushamethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::ushamethodChanged)); + ushamethod->set_tooltip_text(M("TP_WAVELET_USH_TOOLTIP")); + usharpHBox->pack_start(*usharpLabel, Gtk::PACK_SHRINK, 0); + usharpHBox->pack_start(*ushamethod); + + clariBox->pack_start(*usharpHBox); + clariBox->pack_start(*mergeL); + clariBox->pack_start(*mergeC); + clariBox->pack_start(*softrad); // Edge Sharpness - ToolParamBlock* const edgBox = Gtk::manage (new ToolParamBlock()); + ToolParamBlock* const edgBox = Gtk::manage(new ToolParamBlock()); edgval->setAdjusterListener(this); edgBox->pack_start(*edgval); edgrad->setAdjusterListener(this); edgBox->pack_start(*edgrad); - edgrad->set_tooltip_markup (M("TP_WAVELET_EDRAD_TOOLTIP")); + edgrad->set_tooltip_markup(M("TP_WAVELET_EDRAD_TOOLTIP")); - edgthresh->setAdjusterListener (this); - edgthresh->set_tooltip_markup (M("TP_WAVELET_EDGTHRESH_TOOLTIP")); - edgBox->pack_start (*edgthresh); + edgthresh->setAdjusterListener(this); + edgthresh->set_tooltip_markup(M("TP_WAVELET_EDGTHRESH_TOOLTIP")); + edgBox->pack_start(*edgthresh); Gtk::Label* const labmedgr = Gtk::manage(new Gtk::Label(M("TP_WAVELET_MEDGREINF") + ":")); Gtk::HBox* const edbox = Gtk::manage(new Gtk::HBox()); - edbox->pack_start (*labmedgr, Gtk::PACK_SHRINK, 1); + edbox->pack_start(*labmedgr, Gtk::PACK_SHRINK, 1); - Medgreinf->append (M("TP_WAVELET_RE1")); - Medgreinf->append (M("TP_WAVELET_RE2")); - Medgreinf->append (M("TP_WAVELET_RE3")); - MedgreinfConn = Medgreinf->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::MedgreinfChanged) ); - Medgreinf->set_tooltip_markup (M("TP_WAVELET_EDGREINF_TOOLTIP")); + Medgreinf->append(M("TP_WAVELET_RE1")); + Medgreinf->append(M("TP_WAVELET_RE2")); + Medgreinf->append(M("TP_WAVELET_RE3")); + MedgreinfConn = Medgreinf->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::MedgreinfChanged)); + Medgreinf->set_tooltip_markup(M("TP_WAVELET_EDGREINF_TOOLTIP")); edbox->pack_start(*Medgreinf); edgBox->pack_start(*edbox); - Gtk::HSeparator* const separatorlc = Gtk::manage (new Gtk::HSeparator()); + Gtk::HSeparator* const separatorlc = Gtk::manage(new Gtk::HSeparator()); edgBox->pack_start(*separatorlc, Gtk::PACK_SHRINK, 2); Gtk::Label* const labmED = Gtk::manage(new Gtk::Label(M("TP_WAVELET_EDTYPE") + ":")); Gtk::HBox* const ctboxED = Gtk::manage(new Gtk::HBox()); - ctboxED->pack_start (*labmED, Gtk::PACK_SHRINK, 1); + ctboxED->pack_start(*labmED, Gtk::PACK_SHRINK, 1); - EDmethod->append (M("TP_WAVELET_EDSL")); - EDmethod->append (M("TP_WAVELET_EDCU")); - EDmethodconn = EDmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::EDmethodChanged) ); + EDmethod->append(M("TP_WAVELET_EDSL")); + EDmethod->append(M("TP_WAVELET_EDCU")); + EDmethodconn = EDmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::EDmethodChanged)); ctboxED->pack_start(*EDmethod); - edgBox->pack_start (*ctboxED); + edgBox->pack_start(*ctboxED); - edgcont->setAdjusterListener (this); + edgcont->setAdjusterListener(this); edgcont->setBgGradient(milestones2); - edgcont->set_tooltip_markup (M("TP_WAVELET_EDGCONT_TOOLTIP")); + edgcont->set_tooltip_markup(M("TP_WAVELET_EDGCONT_TOOLTIP")); // <-- Edge Sharpness Local Contrast curve - CCWcurveEditorG->setCurveListener (this); + CCWcurveEditorG->setCurveListener(this); ccshape = static_cast(CCWcurveEditorG->addCurve(CT_Flat, "", nullptr, false, false)); @@ -509,56 +547,56 @@ Wavelet::Wavelet() : CCWcurveEditorG->show(); // --> - edgBox->pack_start (*edgcont); + edgBox->pack_start(*edgcont); edgBox->pack_start(*CCWcurveEditorG, Gtk::PACK_SHRINK, 4); - medianlev->set_active (true); - medianlevConn = medianlev->signal_toggled().connect( sigc::mem_fun(*this, &Wavelet::medianlevToggled) ); - medianlev->set_tooltip_text (M("TP_WAVELET_MEDILEV_TOOLTIP")); + medianlev->set_active(true); + medianlevConn = medianlev->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::medianlevToggled)); + medianlev->set_tooltip_text(M("TP_WAVELET_MEDILEV_TOOLTIP")); - Gtk::HSeparator* const separatored1 = Gtk::manage (new Gtk::HSeparator()); + Gtk::HSeparator* const separatored1 = Gtk::manage(new Gtk::HSeparator()); edgBox->pack_start(*separatored1, Gtk::PACK_SHRINK, 2); Gtk::HBox* const eddebox = Gtk::manage(new Gtk::HBox()); - edgBox->pack_start (*eddebox); + edgBox->pack_start(*eddebox); edgBox->pack_start(*medianlev); - edgedetect->setAdjusterListener (this); - edgedetect->set_tooltip_text (M("TP_WAVELET_EDGEDETECT_TOOLTIP")); + edgedetect->setAdjusterListener(this); + edgedetect->set_tooltip_text(M("TP_WAVELET_EDGEDETECT_TOOLTIP")); edgBox->pack_start(*edgedetect); - edgedetectthr->setAdjusterListener (this); - edgedetectthr->set_tooltip_text (M("TP_WAVELET_EDGEDETECTTHR_TOOLTIP")); + edgedetectthr->setAdjusterListener(this); + edgedetectthr->set_tooltip_text(M("TP_WAVELET_EDGEDETECTTHR_TOOLTIP")); edgBox->pack_start(*edgedetectthr); - edgedetectthr2->setAdjusterListener (this); + edgedetectthr2->setAdjusterListener(this); edgBox->pack_start(*edgedetectthr2); edgBox->pack_start(*separatoredge, Gtk::PACK_SHRINK, 2); - lipst->set_active (true); - lipstConn = lipst->signal_toggled().connect( sigc::mem_fun(*this, &Wavelet::lipstToggled) ); + lipst->set_active(true); + lipstConn = lipst->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::lipstToggled)); // lipst->set_tooltip_text (M("TP_WAVELET_LIPST_TOOLTIP")); edgBox->pack_start(*lipst); - edgesensi->setAdjusterListener (this); + edgesensi->setAdjusterListener(this); edgBox->pack_start(*edgesensi); - edgeampli->setAdjusterListener (this); + edgeampli->setAdjusterListener(this); edgBox->pack_start(*edgeampli); - Gtk::VBox* const ctboxES = Gtk::manage (new Gtk::VBox()); + Gtk::VBox* const ctboxES = Gtk::manage(new Gtk::VBox()); ctboxES->set_spacing(2); Gtk::HBox* const ctboxNP = Gtk::manage(new Gtk::HBox()); - ctboxNP->pack_start (*labmNP, Gtk::PACK_SHRINK, 1); + ctboxNP->pack_start(*labmNP, Gtk::PACK_SHRINK, 1); - NPmethod->append (M("TP_WAVELET_NPNONE")); - NPmethod->append (M("TP_WAVELET_NPLOW")); - NPmethod->append (M("TP_WAVELET_NPHIGH")); - NPmethodconn = NPmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::NPmethodChanged) ); - NPmethod->set_tooltip_text (M("TP_WAVELET_NPTYPE_TOOLTIP")); + NPmethod->append(M("TP_WAVELET_NPNONE")); + NPmethod->append(M("TP_WAVELET_NPLOW")); + NPmethod->append(M("TP_WAVELET_NPHIGH")); + NPmethodconn = NPmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::NPmethodChanged)); + NPmethod->set_tooltip_text(M("TP_WAVELET_NPTYPE_TOOLTIP")); ctboxNP->pack_start(*NPmethod); ctboxES->pack_start(*ctboxNP); @@ -566,13 +604,13 @@ Wavelet::Wavelet() : edgBox->pack_start(*ctboxES); // Gamut - ToolParamBlock* const conBox = Gtk::manage (new ToolParamBlock()); + ToolParamBlock* const conBox = Gtk::manage(new ToolParamBlock()); - median->set_active (true); - medianConn = median->signal_toggled().connect( sigc::mem_fun(*this, &Wavelet::medianToggled) ); + median->set_active(true); + medianConn = median->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::medianToggled)); conBox->pack_start(*median); - hueskin->set_tooltip_markup (M("TP_WAVELET_HUESKIN_TOOLTIP")); + hueskin->set_tooltip_markup(M("TP_WAVELET_HUESKIN_TOOLTIP")); //from -PI to +PI (radians) convert to hsv and draw bottombar const std::vector milestones = { @@ -595,13 +633,13 @@ Wavelet::Wavelet() : hueskin->setBgGradient(milestones); conBox->pack_start(*hueskin); - hueskin->setAdjusterListener (this); + hueskin->setAdjusterListener(this); skinprotect->setAdjusterListener(this); conBox->pack_start(*skinprotect); - skinprotect->set_tooltip_markup (M("TP_WAVELET_SKIN_TOOLTIP")); + skinprotect->set_tooltip_markup(M("TP_WAVELET_SKIN_TOOLTIP")); - curveEditorGAM->setCurveListener (this); + curveEditorGAM->setCurveListener(this); Chshape = static_cast(curveEditorGAM->addCurve(CT_Flat, M("TP_WAVELET_CURVEEDITOR_CH"))); Chshape->setTooltip(M("TP_WAVELET_CURVEEDITOR_CH_TOOLTIP")); @@ -609,74 +647,74 @@ Wavelet::Wavelet() : curveEditorGAM->curveListComplete(); Chshape->setBottomBarBgGradient(milestones); - conBox->pack_start (*curveEditorGAM, Gtk::PACK_SHRINK, 4); + conBox->pack_start(*curveEditorGAM, Gtk::PACK_SHRINK, 4); - avoid->set_active (true); - avoidConn = avoid->signal_toggled().connect( sigc::mem_fun(*this, &Wavelet::avoidToggled) ); + avoid->set_active(true); + avoidConn = avoid->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::avoidToggled)); conBox->pack_start(*avoid); // Residual Image - ToolParamBlock* const resBox = Gtk::manage (new ToolParamBlock()); + ToolParamBlock* const resBox = Gtk::manage(new ToolParamBlock()); - rescon->setAdjusterListener (this); + rescon->setAdjusterListener(this); resBox->pack_start(*rescon, Gtk::PACK_SHRINK); resBox->pack_start(*thr); - thr->setAdjusterListener (this); + thr->setAdjusterListener(this); - resconH->setAdjusterListener (this); + resconH->setAdjusterListener(this); resBox->pack_start(*resconH, Gtk::PACK_SHRINK); - thrH->setAdjusterListener (this); + thrH->setAdjusterListener(this); resBox->pack_start(*thrH, Gtk::PACK_SHRINK); - contrast->set_tooltip_text (M("TP_WAVELET_CONTRA_TOOLTIP")); - contrast->setAdjusterListener (this); + contrast->set_tooltip_text(M("TP_WAVELET_CONTRA_TOOLTIP")); + contrast->setAdjusterListener(this); resBox->pack_start(*contrast); //keep the possibility to reinstall - reschro->setAdjusterListener (this); + reschro->setAdjusterListener(this); resBox->pack_start(*reschro); Gtk::Label* const labmTM = Gtk::manage(new Gtk::Label(M("TP_WAVELET_TMTYPE") + ":")); Gtk::HBox* const ctboxTM = Gtk::manage(new Gtk::HBox()); - ctboxTM->pack_start (*labmTM, Gtk::PACK_SHRINK, 1); + ctboxTM->pack_start(*labmTM, Gtk::PACK_SHRINK, 1); - Gtk::HSeparator* const separatorR0 = Gtk::manage (new Gtk::HSeparator()); + Gtk::HSeparator* const separatorR0 = Gtk::manage(new Gtk::HSeparator()); resBox->pack_start(*separatorR0, Gtk::PACK_SHRINK, 2); - TMmethod->append (M("TP_WAVELET_COMPCONT")); - TMmethod->append (M("TP_WAVELET_COMPTM")); - TMmethodconn = TMmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::TMmethodChanged) ); + TMmethod->append(M("TP_WAVELET_COMPCONT")); + TMmethod->append(M("TP_WAVELET_COMPTM")); + TMmethodconn = TMmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::TMmethodChanged)); ctboxTM->pack_start(*TMmethod); - resBox->pack_start (*ctboxTM); + resBox->pack_start(*ctboxTM); - tmrs->set_tooltip_text (M("TP_WAVELET_TMSTRENGTH_TOOLTIP")); + tmrs->set_tooltip_text(M("TP_WAVELET_TMSTRENGTH_TOOLTIP")); resBox->pack_start(*tmrs); - tmrs->setAdjusterListener (this); + tmrs->setAdjusterListener(this); - gamma->set_tooltip_text (M("TP_WAVELET_COMPGAMMA_TOOLTIP")); + gamma->set_tooltip_text(M("TP_WAVELET_COMPGAMMA_TOOLTIP")); resBox->pack_start(*gamma); - gamma->setAdjusterListener (this); + gamma->setAdjusterListener(this); - Gtk::HSeparator* const separatorR1 = Gtk::manage (new Gtk::HSeparator()); + Gtk::HSeparator* const separatorR1 = Gtk::manage(new Gtk::HSeparator()); resBox->pack_start(*separatorR1, Gtk::PACK_SHRINK, 2); - hueskin2->set_tooltip_markup (M("TP_WAVELET_HUESKY_TOOLTIP")); + hueskin2->set_tooltip_markup(M("TP_WAVELET_HUESKY_TOOLTIP")); hueskin2->setBgGradient(milestones); resBox->pack_start(*hueskin2); - hueskin2->setAdjusterListener (this); + hueskin2->setAdjusterListener(this); - sky->set_tooltip_text (M("TP_WAVELET_SKY_TOOLTIP")); - sky->setAdjusterListener (this); + sky->set_tooltip_text(M("TP_WAVELET_SKY_TOOLTIP")); + sky->setAdjusterListener(this); resBox->pack_start(*sky); // whole hue range const std::vector milestones3 = makeWholeHueRange(); - curveEditorRES->setCurveListener (this); + curveEditorRES->setCurveListener(this); hhshape = static_cast(curveEditorRES->addCurve(CT_Flat, M("TP_WAVELET_CURVEEDITOR_HH"))); hhshape->setTooltip(M("TP_WAVELET_CURVEEDITOR_HH_TOOLTIP")); @@ -684,54 +722,54 @@ Wavelet::Wavelet() : curveEditorRES->curveListComplete(); hhshape->setBottomBarBgGradient(milestones3); - resBox->pack_start (*curveEditorRES, Gtk::PACK_SHRINK, 4); + resBox->pack_start(*curveEditorRES, Gtk::PACK_SHRINK, 4); // Toning and Color Balance - Gtk::HSeparator* const separatorCB = Gtk::manage (new Gtk::HSeparator()); + Gtk::HSeparator* const separatorCB = Gtk::manage(new Gtk::HSeparator()); - Gtk::VBox* const chanMixerHLBox = Gtk::manage (new Gtk::VBox()); - Gtk::VBox* const chanMixerMidBox = Gtk::manage (new Gtk::VBox()); - Gtk::VBox* const chanMixerShadowsBox = Gtk::manage (new Gtk::VBox()); + Gtk::VBox* const chanMixerHLBox = Gtk::manage(new Gtk::VBox()); + Gtk::VBox* const chanMixerMidBox = Gtk::manage(new Gtk::VBox()); + Gtk::VBox* const chanMixerShadowsBox = Gtk::manage(new Gtk::VBox()); - cbenab->set_active (true); - cbenabConn = cbenab->signal_toggled().connect( sigc::mem_fun(*this, &Wavelet::cbenabToggled) ); - cbenab->set_tooltip_text (M("TP_WAVELET_CB_TOOLTIP")); + cbenab->set_active(true); + cbenabConn = cbenab->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::cbenabToggled)); + cbenab->set_tooltip_text(M("TP_WAVELET_CB_TOOLTIP")); - Gtk::Image* const iblueR = Gtk::manage (new RTImage ("circle-blue-small.png")); - Gtk::Image* const iyelL = Gtk::manage (new RTImage ("circle-yellow-small.png")); - Gtk::Image* const imagL = Gtk::manage (new RTImage ("circle-magenta-small.png")); - Gtk::Image* const igreenR = Gtk::manage (new RTImage ("circle-green-small.png")); + Gtk::Image* const iblueR = Gtk::manage(new RTImage("circle-blue-small.png")); + Gtk::Image* const iyelL = Gtk::manage(new RTImage("circle-yellow-small.png")); + Gtk::Image* const imagL = Gtk::manage(new RTImage("circle-magenta-small.png")); + Gtk::Image* const igreenR = Gtk::manage(new RTImage("circle-green-small.png")); - Gtk::Image* const iblueRm = Gtk::manage (new RTImage ("circle-blue-small.png")); - Gtk::Image* const iyelLm = Gtk::manage (new RTImage ("circle-yellow-small.png")); - Gtk::Image* const imagLm = Gtk::manage (new RTImage ("circle-magenta-small.png")); - Gtk::Image* const igreenRm = Gtk::manage (new RTImage ("circle-green-small.png")); + Gtk::Image* const iblueRm = Gtk::manage(new RTImage("circle-blue-small.png")); + Gtk::Image* const iyelLm = Gtk::manage(new RTImage("circle-yellow-small.png")); + Gtk::Image* const imagLm = Gtk::manage(new RTImage("circle-magenta-small.png")); + Gtk::Image* const igreenRm = Gtk::manage(new RTImage("circle-green-small.png")); - Gtk::Image* const iblueRh = Gtk::manage (new RTImage ("circle-blue-small.png")); - Gtk::Image* const iyelLh = Gtk::manage (new RTImage ("circle-yellow-small.png")); - Gtk::Image* const imagLh = Gtk::manage (new RTImage ("circle-magenta-small.png")); - Gtk::Image* const igreenRh = Gtk::manage (new RTImage ("circle-green-small.png")); + Gtk::Image* const iblueRh = Gtk::manage(new RTImage("circle-blue-small.png")); + Gtk::Image* const iyelLh = Gtk::manage(new RTImage("circle-yellow-small.png")); + Gtk::Image* const imagLh = Gtk::manage(new RTImage("circle-magenta-small.png")); + Gtk::Image* const igreenRh = Gtk::manage(new RTImage("circle-green-small.png")); - greenhigh = Gtk::manage (new Adjuster ("", -100., 100., 1., 0., igreenRh, imagLh)); - bluehigh = Gtk::manage (new Adjuster ("", -100., 100., 1., 0., iblueRh, iyelLh)); - greenmed = Gtk::manage (new Adjuster ("", -100., 100., 1., 0., igreenRm, imagLm)); - bluemed = Gtk::manage (new Adjuster ("", -100., 100., 1., 0. , iblueRm , iyelLm)); - greenlow = Gtk::manage (new Adjuster ("", -100., 100., 1., 0., igreenR, imagL)); - bluelow = Gtk::manage (new Adjuster ("", -100., 100., 1., 0., iblueR , iyelL)); + greenhigh = Gtk::manage(new Adjuster("", -100., 100., 1., 0., igreenRh, imagLh)); + bluehigh = Gtk::manage(new Adjuster("", -100., 100., 1., 0., iblueRh, iyelLh)); + greenmed = Gtk::manage(new Adjuster("", -100., 100., 1., 0., igreenRm, imagLm)); + bluemed = Gtk::manage(new Adjuster("", -100., 100., 1., 0., iblueRm, iyelLm)); + greenlow = Gtk::manage(new Adjuster("", -100., 100., 1., 0., igreenR, imagL)); + bluelow = Gtk::manage(new Adjuster("", -100., 100., 1., 0., iblueR, iyelL)); - chanMixerHLBox->pack_start (*greenhigh); - chanMixerHLBox->pack_start (*bluehigh); - chanMixerMidBox->pack_start (*greenmed); - chanMixerMidBox->pack_start (*bluemed); - chanMixerShadowsBox->pack_start (*greenlow); - chanMixerShadowsBox->pack_start (*bluelow); + chanMixerHLBox->pack_start(*greenhigh); + chanMixerHLBox->pack_start(*bluehigh); + chanMixerMidBox->pack_start(*greenmed); + chanMixerMidBox->pack_start(*bluemed); + chanMixerShadowsBox->pack_start(*greenlow); + chanMixerShadowsBox->pack_start(*bluelow); - greenlow->setAdjusterListener (this); - bluelow->setAdjusterListener (this); - greenmed->setAdjusterListener (this); - bluemed->setAdjusterListener (this); - greenhigh->setAdjusterListener (this); - bluehigh->setAdjusterListener (this); + greenlow->setAdjusterListener(this); + bluelow->setAdjusterListener(this); + greenmed->setAdjusterListener(this); + bluemed->setAdjusterListener(this); + greenhigh->setAdjusterListener(this); + bluehigh->setAdjusterListener(this); resBox->pack_start(*separatorCB, Gtk::PACK_SHRINK); @@ -747,15 +785,15 @@ Wavelet::Wavelet() : //RTImage *resetImg = Gtk::manage (new RTImage ("undo-small.png", "redo-small.png")); //neutral->set_image(*resetImg); Gtk::Button* const neutral = Gtk::manage(new Gtk::Button(M("TP_COLORTONING_NEUTRAL"))); - neutral->set_tooltip_text (M("TP_COLORTONING_NEUTRAL_TIP")); - neutralconn = neutral->signal_pressed().connect( sigc::mem_fun(*this, &Wavelet::neutral_pressed) ); + neutral->set_tooltip_text(M("TP_COLORTONING_NEUTRAL_TIP")); + neutralconn = neutral->signal_pressed().connect(sigc::mem_fun(*this, &Wavelet::neutral_pressed)); neutral->show(); - neutrHBox->pack_start (*neutral, Gtk::PACK_EXPAND_WIDGET); + neutrHBox->pack_start(*neutral, Gtk::PACK_EXPAND_WIDGET); - resBox->pack_start (*neutrHBox); + resBox->pack_start(*neutrHBox); // Final Touchup - Gtk::VBox* const ctboxBA = Gtk::manage (new Gtk::VBox()); + Gtk::VBox* const ctboxBA = Gtk::manage(new Gtk::VBox()); ctboxBA->set_spacing(2); @@ -763,19 +801,20 @@ Wavelet::Wavelet() : //ctboxBA->pack_start(*separatorfin, Gtk::PACK_SHRINK, 2); Gtk::Label* const labmBA = Gtk::manage(new Gtk::Label(M("TP_WAVELET_BATYPE") + ":")); Gtk::HBox* const ctboxFI = Gtk::manage(new Gtk::HBox()); - ctboxFI->pack_start (*labmBA, Gtk::PACK_SHRINK, 1); + ctboxFI->pack_start(*labmBA, Gtk::PACK_SHRINK, 1); - BAmethod->append (M("TP_WAVELET_BANONE")); - BAmethod->append (M("TP_WAVELET_BASLI")); - BAmethod->append (M("TP_WAVELET_BACUR")); - BAmethodconn = BAmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::BAmethodChanged) ); + BAmethod->append(M("TP_WAVELET_BANONE")); + BAmethod->append(M("TP_WAVELET_BASLI")); + BAmethod->append(M("TP_WAVELET_BACUR")); + BAmethodconn = BAmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::BAmethodChanged)); ctboxFI->pack_start(*BAmethod); ctboxBA->pack_start(*ctboxFI); - balance->setAdjusterListener (this); - balance->set_tooltip_text (M("TP_WAVELET_BALANCE_TOOLTIP")); + balance->setAdjusterListener(this); + balance->set_tooltip_text(M("TP_WAVELET_BALANCE_TOOLTIP")); + softradend->setAdjusterListener(this); - opacityCurveEditorW->setCurveListener (this); + opacityCurveEditorW->setCurveListener(this); opacityShape = static_cast(opacityCurveEditorW->addCurve(CT_Flat, "", nullptr, false, false)); opacityShape->setIdentityValue(0.); @@ -786,12 +825,12 @@ Wavelet::Wavelet() : opacityCurveEditorW->curveListComplete(); opacityCurveEditorW->show(); - iter->setAdjusterListener (this); - iter->set_tooltip_text (M("TP_WAVELET_ITER_TOOLTIP")); + iter->setAdjusterListener(this); + iter->set_tooltip_text(M("TP_WAVELET_ITER_TOOLTIP")); - Gtk::HSeparator* const separatorbalend = Gtk::manage (new Gtk::HSeparator()); + Gtk::HSeparator* const separatorbalend = Gtk::manage(new Gtk::HSeparator()); - opacityCurveEditorWL->setCurveListener (this); + opacityCurveEditorWL->setCurveListener(this); opacityShapeWL = static_cast(opacityCurveEditorWL->addCurve(CT_Flat, "", nullptr, false, false)); opacityShapeWL->setIdentityValue(0.); @@ -802,7 +841,7 @@ Wavelet::Wavelet() : opacityCurveEditorWL->curveListComplete(); opacityCurveEditorWL->show(); - curveEditorG->setCurveListener (this); + curveEditorG->setCurveListener(this); clshape = static_cast(curveEditorG->addCurve(CT_Diagonal, M("TP_WAVELET_CURVEEDITOR_CL"))); clshape->setTooltip(M("TP_WAVELET_CURVEEDITOR_CL_TOOLTIP")); @@ -811,54 +850,61 @@ Wavelet::Wavelet() : curveEditorG->curveListComplete(); - tmr->set_active (true); - tmr->set_tooltip_text (M("TP_WAVELET_BALCHRO_TOOLTIP")); - tmrConn = tmr->signal_toggled().connect( sigc::mem_fun(*this, &Wavelet::tmrToggled) ); + tmr->set_active(true); + tmr->set_tooltip_text(M("TP_WAVELET_BALCHRO_TOOLTIP")); + tmrConn = tmr->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::tmrToggled)); - ToolParamBlock* const finalBox = Gtk::manage (new ToolParamBlock()); + ToolParamBlock* const finalBox = Gtk::manage(new ToolParamBlock()); - finalBox->pack_start (*ctboxBA); + finalBox->pack_start(*ctboxBA); finalBox->pack_start(*balance); - finalBox->pack_start( *opacityCurveEditorW, Gtk::PACK_SHRINK, 2); + finalBox->pack_start(*opacityCurveEditorW, Gtk::PACK_SHRINK, 2); finalBox->pack_start(*iter); finalBox->pack_start(*tmr); finalBox->pack_start(*separatorbalend, Gtk::PACK_SHRINK, 2); - finalBox->pack_start( *opacityCurveEditorWL, Gtk::PACK_SHRINK, 2); + finalBox->pack_start(*opacityCurveEditorWL, Gtk::PACK_SHRINK, 2); - finalBox->pack_start (*curveEditorG, Gtk::PACK_SHRINK, 4); + finalBox->pack_start(*curveEditorG, Gtk::PACK_SHRINK, 4); + finalBox->pack_start(*softradend); //----------------------------- + + expsettings->add(*settingsBox, false); expsettings->setLevel(2); - pack_start (*expsettings); + pack_start(*expsettings); expcontrast->add(*levBox, false); expcontrast->setLevel(2); - pack_start (*expcontrast); + pack_start(*expcontrast); expchroma->add(*chBox, false); expchroma->setLevel(2); - pack_start (*expchroma); + pack_start(*expchroma); exptoning->add(*tonBox, false); exptoning->setLevel(2); - pack_start (*exptoning); + pack_start(*exptoning); expnoise->add(*noiseBox, false); expnoise->setLevel(2); - pack_start (*expnoise); + pack_start(*expnoise); expedge->add(*edgBox, false); expedge->setLevel(2); - pack_start (*expedge); + pack_start(*expedge); + + expclari->add(*clariBox, false); + expclari->setLevel(2); + pack_start(*expclari); expgamut->add(*conBox, false); expgamut->setLevel(2); - pack_start (*expgamut); + pack_start(*expgamut); expresid->add(*resBox, false); expresid->setLevel(2); @@ -869,7 +915,7 @@ Wavelet::Wavelet() : pack_start(*expfinal); } -Wavelet::~Wavelet () +Wavelet::~Wavelet() { idle_register.destroy(); @@ -884,27 +930,26 @@ Wavelet::~Wavelet () } -void Wavelet::wavChanged (double nlevel) +void Wavelet::wavChanged(double nlevel) { if (!batchMode) { idle_register.add( - [this, nlevel]() -> bool - { - wavLabels->set_text( - Glib::ustring::compose( - M("TP_WAVELET_LEVLABEL"), - Glib::ustring::format(std::fixed, std::setprecision(0), nlevel) - ) - ); - return false; - } + [this, nlevel]() -> bool { + wavLabels->set_text( + Glib::ustring::compose( + M("TP_WAVELET_LEVLABEL"), + Glib::ustring::format(std::fixed, std::setprecision(0), nlevel) + ) + ); + return false; + } ); } } // Will only reset the channel mixer // WARNING! In mutiImage mode, and for sliders in ADD mode, this will reset the slider to 0, but not to the default value as in SET mode. -void Wavelet::neutral_pressed () +void Wavelet::neutral_pressed() { disableListener(); greenlow->resetValue(false); @@ -917,11 +962,11 @@ void Wavelet::neutral_pressed () enableListener(); if (listener && getEnabled()) { - listener->panelChanged (EvWavNeutral, M("GENERAL_RESET")); + listener->panelChanged(EvWavNeutral, M("GENERAL_RESET")); } } -void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) +void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) { /***************************************************************************************************** @@ -930,7 +975,7 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) * *****************************************************************************************************/ - disableListener (); + disableListener(); Lmethodconn.block(true); CLmethodconn.block(true); Backmethodconn.block(true); @@ -945,6 +990,7 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) TMmethodconn.block(true); HSmethodconn.block(true); MedgreinfConn.block(true); + ushamethodconn.block(true); cbenabConn.block(true); enableChromaConn.block(true); enableContrastConn.block(true); @@ -962,65 +1008,74 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) //HSmethod->set_active (1); // Note: default values are controlled in rtengine::ProcParams::SetDefaults if (pp->wavelet.HSmethod == "without") { - HSmethod->set_active (0); + HSmethod->set_active(0); } else if (pp->wavelet.HSmethod == "with") { - HSmethod->set_active (1); + HSmethod->set_active(1); } //CHmethod->set_active (1); if (pp->wavelet.CHmethod == "without") { - CHmethod->set_active (0); + CHmethod->set_active(0); } else if (pp->wavelet.CHmethod == "with") { - CHmethod->set_active (1); + CHmethod->set_active(1); } else if (pp->wavelet.CHmethod == "link") { - CHmethod->set_active (2); + CHmethod->set_active(2); } //Medgreinf->set_active (1); if (pp->wavelet.Medgreinf == "more") { - Medgreinf->set_active (0); + Medgreinf->set_active(0); } else if (pp->wavelet.Medgreinf == "none") { - Medgreinf->set_active (1); + Medgreinf->set_active(1); } else if (pp->wavelet.Medgreinf == "less") { - Medgreinf->set_active (2); + Medgreinf->set_active(2); + } + + //ushamethod + if (pp->wavelet.ushamethod == "none") { + ushamethod->set_active(0); + } else if (pp->wavelet.ushamethod == "sharp") { + ushamethod->set_active(1); + } else if (pp->wavelet.ushamethod == "clari") { + ushamethod->set_active(2); } //CHSLmethod->set_active (1); if (pp->wavelet.CHSLmethod == "SL") { - CHSLmethod->set_active (0); + CHSLmethod->set_active(0); } else if (pp->wavelet.CHSLmethod == "CU") { - CHSLmethod->set_active (1); + CHSLmethod->set_active(1); } //EDmethod->set_active (1); if (pp->wavelet.EDmethod == "SL") { - EDmethod->set_active (0); + EDmethod->set_active(0); } else if (pp->wavelet.EDmethod == "CU") { - EDmethod->set_active (1); + EDmethod->set_active(1); } if (pp->wavelet.NPmethod == "none") { - NPmethod->set_active (0); + NPmethod->set_active(0); } else if (pp->wavelet.NPmethod == "low") { - NPmethod->set_active (1); + NPmethod->set_active(1); } else if (pp->wavelet.NPmethod == "high") { - NPmethod->set_active (2); + NPmethod->set_active(2); } //BAmethod->set_active (0); if (pp->wavelet.BAmethod == "none") { - BAmethod->set_active (0); + BAmethod->set_active(0); } else if (pp->wavelet.BAmethod == "sli") { - BAmethod->set_active (1); + BAmethod->set_active(1); } else if (pp->wavelet.BAmethod == "cur") { - BAmethod->set_active (2); + BAmethod->set_active(2); } //TMmethod->set_active (1); if (pp->wavelet.TMmethod == "cont") { - TMmethod->set_active (0); + TMmethod->set_active(0); } else if (pp->wavelet.TMmethod == "tm") { - TMmethod->set_active (1); + TMmethod->set_active(1); } // else if (pp->wavelet.TMmethod=="both") @@ -1028,99 +1083,100 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) //Backmethod->set_active (3); if (pp->wavelet.Backmethod == "black") { - Backmethod->set_active (0); + Backmethod->set_active(0); } else if (pp->wavelet.Backmethod == "grey") { - Backmethod->set_active (1); + Backmethod->set_active(1); } else if (pp->wavelet.Backmethod == "resid") { - Backmethod->set_active (2); + Backmethod->set_active(2); } //CLmethod->set_active (3); if (pp->wavelet.CLmethod == "one") { - CLmethod->set_active (0); + CLmethod->set_active(0); } else if (pp->wavelet.CLmethod == "inf") { - CLmethod->set_active (1); + CLmethod->set_active(1); } else if (pp->wavelet.CLmethod == "sup") { - CLmethod->set_active (2); + CLmethod->set_active(2); } else if (pp->wavelet.CLmethod == "all") { - CLmethod->set_active (3); + CLmethod->set_active(3); } //Tilesmethod->set_active (2); if (pp->wavelet.Tilesmethod == "full") { - Tilesmethod->set_active (0); + Tilesmethod->set_active(0); } else if (pp->wavelet.Tilesmethod == "big") { - Tilesmethod->set_active (1); + Tilesmethod->set_active(1); } else if (pp->wavelet.Tilesmethod == "lit") { - Tilesmethod->set_active (2); + Tilesmethod->set_active(2); } //daubcoeffmethod->set_active (4); if (pp->wavelet.daubcoeffmethod == "2_") { - daubcoeffmethod->set_active (0); + daubcoeffmethod->set_active(0); } else if (pp->wavelet.daubcoeffmethod == "4_") { - daubcoeffmethod->set_active (1); + daubcoeffmethod->set_active(1); } else if (pp->wavelet.daubcoeffmethod == "6_") { - daubcoeffmethod->set_active (2); + daubcoeffmethod->set_active(2); } else if (pp->wavelet.daubcoeffmethod == "10_") { - daubcoeffmethod->set_active (3); + daubcoeffmethod->set_active(3); } else if (pp->wavelet.daubcoeffmethod == "14_") { - daubcoeffmethod->set_active (4); + daubcoeffmethod->set_active(4); } //Dirmethod->set_active (3); if (pp->wavelet.Dirmethod == "one") { - Dirmethod->set_active (0); + Dirmethod->set_active(0); } else if (pp->wavelet.Dirmethod == "two") { - Dirmethod->set_active (1); + Dirmethod->set_active(1); } else if (pp->wavelet.Dirmethod == "thr") { - Dirmethod->set_active (2); + Dirmethod->set_active(2); } else if (pp->wavelet.Dirmethod == "all") { - Dirmethod->set_active (3); + Dirmethod->set_active(3); } int selectedLevel = pp->wavelet.Lmethod - 1; - Lmethod->set_active (selectedLevel == -1 ? 4 : selectedLevel); + Lmethod->set_active(selectedLevel == -1 ? 4 : selectedLevel); - ccshape->setCurve (pp->wavelet.ccwcurve); - opacityShapeRG->setCurve (pp->wavelet.opacityCurveRG); - opacityShapeBY->setCurve (pp->wavelet.opacityCurveBY); - opacityShape->setCurve (pp->wavelet.opacityCurveW); - opacityShapeWL->setCurve (pp->wavelet.opacityCurveWL); - hhshape->setCurve (pp->wavelet.hhcurve); - Chshape->setCurve (pp->wavelet.Chcurve); - clshape->setCurve (pp->wavelet.wavclCurve); - expcontrast->setEnabled (pp->wavelet.expcontrast); - expchroma->setEnabled (pp->wavelet.expchroma); - expedge->setEnabled (pp->wavelet.expedge); - expresid->setEnabled (pp->wavelet.expresid); - expfinal->setEnabled (pp->wavelet.expfinal); - exptoning->setEnabled (pp->wavelet.exptoning); - expnoise->setEnabled (pp->wavelet.expnoise); + ccshape->setCurve(pp->wavelet.ccwcurve); + opacityShapeRG->setCurve(pp->wavelet.opacityCurveRG); + opacityShapeBY->setCurve(pp->wavelet.opacityCurveBY); + opacityShape->setCurve(pp->wavelet.opacityCurveW); + opacityShapeWL->setCurve(pp->wavelet.opacityCurveWL); + hhshape->setCurve(pp->wavelet.hhcurve); + Chshape->setCurve(pp->wavelet.Chcurve); + clshape->setCurve(pp->wavelet.wavclCurve); + expcontrast->setEnabled(pp->wavelet.expcontrast); + expchroma->setEnabled(pp->wavelet.expchroma); + expedge->setEnabled(pp->wavelet.expedge); + expresid->setEnabled(pp->wavelet.expresid); + expfinal->setEnabled(pp->wavelet.expfinal); + exptoning->setEnabled(pp->wavelet.exptoning); + expnoise->setEnabled(pp->wavelet.expnoise); + expclari->setEnabled(pp->wavelet.expclari); setEnabled(pp->wavelet.enabled); - avoidConn.block (true); - avoid->set_active (pp->wavelet.avoid); - avoidConn.block (false); - tmrConn.block (true); - tmr->set_active (pp->wavelet.tmr); - tmrConn.block (false); - medianConn.block (true); - median->set_active (pp->wavelet.median); - medianConn.block (false); - medianlevConn.block (true); - medianlev->set_active (pp->wavelet.medianlev); - medianlevConn.block (false); - linkedgConn.block (true); - linkedg->set_active (pp->wavelet.linkedg); - linkedgConn.block (false); - cbenabConn.block (true); - cbenab->set_active (pp->wavelet.cbenab); - cbenabConn.block (false); + avoidConn.block(true); + avoid->set_active(pp->wavelet.avoid); + avoidConn.block(false); + tmrConn.block(true); + tmr->set_active(pp->wavelet.tmr); + tmrConn.block(false); + medianConn.block(true); + median->set_active(pp->wavelet.median); + medianConn.block(false); + medianlevConn.block(true); + medianlev->set_active(pp->wavelet.medianlev); + medianlevConn.block(false); + linkedgConn.block(true); + linkedg->set_active(pp->wavelet.linkedg); + linkedgConn.block(false); + cbenabConn.block(true); + cbenab->set_active(pp->wavelet.cbenab); + cbenabConn.block(false); - lipstConn.block (true); - lipst->set_active (pp->wavelet.lipst); - lipstConn.block (false); + lipstConn.block(true); + lipst->set_active(pp->wavelet.lipst); + lipstConn.block(false); //edgreinfConn.block (true); //edgreinf->set_active (pp->wavelet.edgreinf); //edgreinfConn.block (false); @@ -1132,22 +1188,22 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) lastlipst = pp->wavelet.lipst; lastavoid = pp->wavelet.avoid; lasttmr = pp->wavelet.tmr; - rescon->setValue (pp->wavelet.rescon); - resconH->setValue (pp->wavelet.resconH); - reschro->setValue (pp->wavelet.reschro); - tmrs->setValue (pp->wavelet.tmrs); - gamma->setValue (pp->wavelet.gamma); - sup->setValue (pp->wavelet.sup); - sky->setValue (pp->wavelet.sky); - thres->setValue (pp->wavelet.thres); - chroma->setValue (pp->wavelet.chroma); - chro->setValue (pp->wavelet.chro); - contrast->setValue (pp->wavelet.contrast); - edgrad->setValue (pp->wavelet.edgrad); - edgval->setValue (pp->wavelet.edgval); - edgthresh->setValue (pp->wavelet.edgthresh); - thr->setValue (pp->wavelet.thr); - thrH->setValue (pp->wavelet.thrH); + rescon->setValue(pp->wavelet.rescon); + resconH->setValue(pp->wavelet.resconH); + reschro->setValue(pp->wavelet.reschro); + tmrs->setValue(pp->wavelet.tmrs); + gamma->setValue(pp->wavelet.gamma); + sup->setValue(pp->wavelet.sup); + sky->setValue(pp->wavelet.sky); + thres->setValue(pp->wavelet.thres); + chroma->setValue(pp->wavelet.chroma); + chro->setValue(pp->wavelet.chro); + contrast->setValue(pp->wavelet.contrast); + edgrad->setValue(pp->wavelet.edgrad); + edgval->setValue(pp->wavelet.edgval); + edgthresh->setValue(pp->wavelet.edgthresh); + thr->setValue(pp->wavelet.thr); + thrH->setValue(pp->wavelet.thrH); skinprotect->setValue(pp->wavelet.skinprotect); hueskin->setValue(pp->wavelet.hueskin); hueskin2->setValue(pp->wavelet.hueskin2); @@ -1164,12 +1220,16 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) satlev->setValue(pp->wavelet.satlev); edgcont->setValue(pp->wavelet.edgcont); - greenlow->setValue (pp->wavelet.greenlow); - bluelow->setValue (pp->wavelet.bluelow); - greenmed->setValue (pp->wavelet.greenmed); - bluemed->setValue (pp->wavelet.bluemed); - greenhigh->setValue (pp->wavelet.greenhigh); - bluehigh->setValue (pp->wavelet.bluehigh); + greenlow->setValue(pp->wavelet.greenlow); + bluelow->setValue(pp->wavelet.bluelow); + greenmed->setValue(pp->wavelet.greenmed); + bluemed->setValue(pp->wavelet.bluemed); + greenhigh->setValue(pp->wavelet.greenhigh); + bluehigh->setValue(pp->wavelet.bluehigh); + mergeL->setValue(pp->wavelet.mergeL); + mergeC->setValue(pp->wavelet.mergeC); + softrad->setValue(pp->wavelet.softrad); + softradend->setValue(pp->wavelet.softradend); level0noise->setValue(pp->wavelet.level0noise); level1noise->setValue(pp->wavelet.level1noise); @@ -1250,83 +1310,92 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) Medgreinf->set_active_text(M("GENERAL_UNCHANGED")); } - set_inconsistent (multiImage && !pedited->wavelet.enabled); - ccshape->setUnChanged (!pedited->wavelet.ccwcurve); - expcontrast->set_inconsistent (!pedited->wavelet.expcontrast); - expchroma->set_inconsistent (!pedited->wavelet.expchroma); - expedge->set_inconsistent (!pedited->wavelet.expedge); - expresid->set_inconsistent (!pedited->wavelet.expresid); - expfinal->set_inconsistent (!pedited->wavelet.expfinal); - exptoning->set_inconsistent (!pedited->wavelet.exptoning); - expnoise->set_inconsistent (!pedited->wavelet.expnoise); - opacityShapeRG->setCurve (pp->wavelet.opacityCurveRG); - opacityShapeBY->setCurve (pp->wavelet.opacityCurveBY); - opacityShape->setCurve (pp->wavelet.opacityCurveW); - opacityShapeWL->setCurve (pp->wavelet.opacityCurveWL); - hhshape->setUnChanged (!pedited->wavelet.hhcurve); - Chshape->setUnChanged (!pedited->wavelet.Chcurve); - clshape->setUnChanged (!pedited->wavelet.wavclCurve); - avoid->set_inconsistent (!pedited->wavelet.avoid); - tmr->set_inconsistent (!pedited->wavelet.tmr); - edgthresh->setEditedState (pedited->wavelet.edgthresh ? Edited : UnEdited); - rescon->setEditedState (pedited->wavelet.rescon ? Edited : UnEdited); - resconH->setEditedState (pedited->wavelet.resconH ? Edited : UnEdited); - reschro->setEditedState (pedited->wavelet.reschro ? Edited : UnEdited); - tmrs->setEditedState (pedited->wavelet.tmrs ? Edited : UnEdited); - gamma->setEditedState (pedited->wavelet.gamma ? Edited : UnEdited); - sup->setEditedState (pedited->wavelet.sup ? Edited : UnEdited); - sky->setEditedState (pedited->wavelet.sky ? Edited : UnEdited); - thres->setEditedState (pedited->wavelet.thres ? Edited : UnEdited); - balance->setEditedState (pedited->wavelet.balance ? Edited : UnEdited); - iter->setEditedState (pedited->wavelet.iter ? Edited : UnEdited); - threshold->setEditedState (pedited->wavelet.threshold ? Edited : UnEdited); - threshold2->setEditedState (pedited->wavelet.threshold2 ? Edited : UnEdited); - edgedetect->setEditedState (pedited->wavelet.edgedetect ? Edited : UnEdited); - edgedetectthr->setEditedState (pedited->wavelet.edgedetectthr ? Edited : UnEdited); - edgedetectthr2->setEditedState (pedited->wavelet.edgedetectthr2 ? Edited : UnEdited); - edgesensi->setEditedState (pedited->wavelet.edgesensi ? Edited : UnEdited); - edgeampli->setEditedState (pedited->wavelet.edgeampli ? Edited : UnEdited); - chroma->setEditedState (pedited->wavelet.chroma ? Edited : UnEdited); - chro->setEditedState (pedited->wavelet.chro ? Edited : UnEdited); - - greenlow->setEditedState (pedited->wavelet.greenlow ? Edited : UnEdited); - bluelow->setEditedState (pedited->wavelet.bluelow ? Edited : UnEdited); - greenmed->setEditedState (pedited->wavelet.greenmed ? Edited : UnEdited); - bluemed->setEditedState (pedited->wavelet.bluemed ? Edited : UnEdited); - greenhigh->setEditedState (pedited->wavelet.greenhigh ? Edited : UnEdited); - bluehigh->setEditedState (pedited->wavelet.bluehigh ? Edited : UnEdited); - - median->set_inconsistent (!pedited->wavelet.median); - medianlev->set_inconsistent (!pedited->wavelet.medianlev); - linkedg->set_inconsistent (!pedited->wavelet.linkedg); -// edgreinf->set_inconsistent (!pedited->wavelet.edgreinf); - cbenab->set_inconsistent (!pedited->wavelet.cbenab); - lipst->set_inconsistent (!pedited->wavelet.lipst); - contrast->setEditedState (pedited->wavelet.contrast ? Edited : UnEdited); - edgrad->setEditedState (pedited->wavelet.edgrad ? Edited : UnEdited); - edgval->setEditedState (pedited->wavelet.edgval ? Edited : UnEdited); - thr->setEditedState (pedited->wavelet.thr ? Edited : UnEdited); - thrH->setEditedState (pedited->wavelet.thrH ? Edited : UnEdited); - skinprotect->setEditedState (pedited->wavelet.skinprotect ? Edited : UnEdited); - hueskin->setEditedState (pedited->wavelet.hueskin ? Edited : UnEdited); - hueskin2->setEditedState (pedited->wavelet.hueskin2 ? Edited : UnEdited); - hllev->setEditedState (pedited->wavelet.hllev ? Edited : UnEdited); - bllev->setEditedState (pedited->wavelet.bllev ? Edited : UnEdited); - pastlev->setEditedState (pedited->wavelet.pastlev ? Edited : UnEdited); - satlev->setEditedState (pedited->wavelet.satlev ? Edited : UnEdited); - strength->setEditedState(pedited->wavelet.strength ? Edited : UnEdited); - edgcont->setEditedState (pedited->wavelet.edgcont ? Edited : UnEdited); - level0noise->setEditedState (pedited->wavelet.level0noise ? Edited : UnEdited); - level1noise->setEditedState (pedited->wavelet.level1noise ? Edited : UnEdited); - level2noise->setEditedState (pedited->wavelet.level2noise ? Edited : UnEdited); - level3noise->setEditedState (pedited->wavelet.level3noise ? Edited : UnEdited); - - for(int i = 0; i < 9; i++) { - correction[i]->setEditedState (pedited->wavelet.c[i] ? Edited : UnEdited); + if (!pedited->wavelet.ushamethod) { + ushamethod->set_active_text(M("GENERAL_UNCHANGED")); } - for(int i = 0; i < 9; i++) { - correctionch[i]->setEditedState (pedited->wavelet.ch[i] ? Edited : UnEdited); + set_inconsistent(multiImage && !pedited->wavelet.enabled); + ccshape->setUnChanged(!pedited->wavelet.ccwcurve); + expcontrast->set_inconsistent(!pedited->wavelet.expcontrast); + expchroma->set_inconsistent(!pedited->wavelet.expchroma); + expedge->set_inconsistent(!pedited->wavelet.expedge); + expresid->set_inconsistent(!pedited->wavelet.expresid); + expfinal->set_inconsistent(!pedited->wavelet.expfinal); + expclari->set_inconsistent(!pedited->wavelet.expclari); + exptoning->set_inconsistent(!pedited->wavelet.exptoning); + expnoise->set_inconsistent(!pedited->wavelet.expnoise); + opacityShapeRG->setCurve(pp->wavelet.opacityCurveRG); + opacityShapeBY->setCurve(pp->wavelet.opacityCurveBY); + opacityShape->setCurve(pp->wavelet.opacityCurveW); + opacityShapeWL->setCurve(pp->wavelet.opacityCurveWL); + hhshape->setUnChanged(!pedited->wavelet.hhcurve); + Chshape->setUnChanged(!pedited->wavelet.Chcurve); + clshape->setUnChanged(!pedited->wavelet.wavclCurve); + avoid->set_inconsistent(!pedited->wavelet.avoid); + tmr->set_inconsistent(!pedited->wavelet.tmr); + edgthresh->setEditedState(pedited->wavelet.edgthresh ? Edited : UnEdited); + rescon->setEditedState(pedited->wavelet.rescon ? Edited : UnEdited); + resconH->setEditedState(pedited->wavelet.resconH ? Edited : UnEdited); + reschro->setEditedState(pedited->wavelet.reschro ? Edited : UnEdited); + tmrs->setEditedState(pedited->wavelet.tmrs ? Edited : UnEdited); + gamma->setEditedState(pedited->wavelet.gamma ? Edited : UnEdited); + sup->setEditedState(pedited->wavelet.sup ? Edited : UnEdited); + sky->setEditedState(pedited->wavelet.sky ? Edited : UnEdited); + thres->setEditedState(pedited->wavelet.thres ? Edited : UnEdited); + balance->setEditedState(pedited->wavelet.balance ? Edited : UnEdited); + iter->setEditedState(pedited->wavelet.iter ? Edited : UnEdited); + threshold->setEditedState(pedited->wavelet.threshold ? Edited : UnEdited); + threshold2->setEditedState(pedited->wavelet.threshold2 ? Edited : UnEdited); + edgedetect->setEditedState(pedited->wavelet.edgedetect ? Edited : UnEdited); + edgedetectthr->setEditedState(pedited->wavelet.edgedetectthr ? Edited : UnEdited); + edgedetectthr2->setEditedState(pedited->wavelet.edgedetectthr2 ? Edited : UnEdited); + edgesensi->setEditedState(pedited->wavelet.edgesensi ? Edited : UnEdited); + edgeampli->setEditedState(pedited->wavelet.edgeampli ? Edited : UnEdited); + chroma->setEditedState(pedited->wavelet.chroma ? Edited : UnEdited); + chro->setEditedState(pedited->wavelet.chro ? Edited : UnEdited); + + greenlow->setEditedState(pedited->wavelet.greenlow ? Edited : UnEdited); + bluelow->setEditedState(pedited->wavelet.bluelow ? Edited : UnEdited); + greenmed->setEditedState(pedited->wavelet.greenmed ? Edited : UnEdited); + bluemed->setEditedState(pedited->wavelet.bluemed ? Edited : UnEdited); + greenhigh->setEditedState(pedited->wavelet.greenhigh ? Edited : UnEdited); + bluehigh->setEditedState(pedited->wavelet.bluehigh ? Edited : UnEdited); + mergeL->setEditedState(pedited->wavelet.mergeL ? Edited : UnEdited); + mergeC->setEditedState(pedited->wavelet.mergeC ? Edited : UnEdited); + softrad->setEditedState(pedited->wavelet.softrad ? Edited : UnEdited); + softradend->setEditedState(pedited->wavelet.softradend ? Edited : UnEdited); + + median->set_inconsistent(!pedited->wavelet.median); + medianlev->set_inconsistent(!pedited->wavelet.medianlev); + linkedg->set_inconsistent(!pedited->wavelet.linkedg); +// edgreinf->set_inconsistent (!pedited->wavelet.edgreinf); + cbenab->set_inconsistent(!pedited->wavelet.cbenab); + lipst->set_inconsistent(!pedited->wavelet.lipst); + contrast->setEditedState(pedited->wavelet.contrast ? Edited : UnEdited); + edgrad->setEditedState(pedited->wavelet.edgrad ? Edited : UnEdited); + edgval->setEditedState(pedited->wavelet.edgval ? Edited : UnEdited); + thr->setEditedState(pedited->wavelet.thr ? Edited : UnEdited); + thrH->setEditedState(pedited->wavelet.thrH ? Edited : UnEdited); + skinprotect->setEditedState(pedited->wavelet.skinprotect ? Edited : UnEdited); + hueskin->setEditedState(pedited->wavelet.hueskin ? Edited : UnEdited); + hueskin2->setEditedState(pedited->wavelet.hueskin2 ? Edited : UnEdited); + hllev->setEditedState(pedited->wavelet.hllev ? Edited : UnEdited); + bllev->setEditedState(pedited->wavelet.bllev ? Edited : UnEdited); + pastlev->setEditedState(pedited->wavelet.pastlev ? Edited : UnEdited); + satlev->setEditedState(pedited->wavelet.satlev ? Edited : UnEdited); + strength->setEditedState(pedited->wavelet.strength ? Edited : UnEdited); + edgcont->setEditedState(pedited->wavelet.edgcont ? Edited : UnEdited); + level0noise->setEditedState(pedited->wavelet.level0noise ? Edited : UnEdited); + level1noise->setEditedState(pedited->wavelet.level1noise ? Edited : UnEdited); + level2noise->setEditedState(pedited->wavelet.level2noise ? Edited : UnEdited); + level3noise->setEditedState(pedited->wavelet.level3noise ? Edited : UnEdited); + + for (int i = 0; i < 9; i++) { + correction[i]->setEditedState(pedited->wavelet.c[i] ? Edited : UnEdited); + } + + for (int i = 0; i < 9; i++) { + correctionch[i]->setEditedState(pedited->wavelet.ch[i] ? Edited : UnEdited); } } @@ -1341,20 +1410,20 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) y = thres->getValue(); int z; - for(z = y; z < 9; z++) { + for (z = y; z < 9; z++) { correction[z]->hide(); } - for(z = 0; z < y; z++) { + for (z = 0; z < y; z++) { correction[z]->show(); } if (pp->wavelet.CHSLmethod == "SL") { - for(z = y; z < 9; z++) { + for (z = y; z < 9; z++) { correctionch[z]->hide(); } - for(z = 0; z < y; z++) { + for (z = 0; z < y; z++) { correctionch[z]->show(); } } @@ -1370,16 +1439,16 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) TMmethodUpdateUI(); //BackmethodUpdateUI(); CLmethodUpdateUI(); - lipstUpdateUI (); + lipstUpdateUI(); //TilesmethodUpdateUI(); //daubcoeffmethodUpdateUI(); //DirmethodUpdateUI(); //LmethodUpdateUI(); - enabledUpdateUI (); - medianlevUpdateUI (); - cbenabUpdateUI (); + enabledUpdateUI(); + medianlevUpdateUI(); + cbenabUpdateUI(); - if(z == 9) { + if (z == 9) { sup->show(); } else { sup->hide(); @@ -1406,6 +1475,7 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) HSmethodconn.block(false); Dirmethodconn.block(false); MedgreinfConn.block(false); + ushamethodconn.block(false); enableChromaConn.block(false); enableContrastConn.block(false); enableEdgeConn.block(false); @@ -1414,10 +1484,10 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) enableResidConn.block(false); enableToningConn.block(false); - enableListener (); + enableListener(); } -void Wavelet::setEditProvider (EditDataProvider *provider) +void Wavelet::setEditProvider(EditDataProvider *provider) { ccshape->setEditProvider(provider); opacityShapeRG->setEditProvider(provider); @@ -1429,19 +1499,19 @@ void Wavelet::setEditProvider (EditDataProvider *provider) clshape->setEditProvider(provider); } -void Wavelet::autoOpenCurve () +void Wavelet::autoOpenCurve() { ccshape->openIfNonlinear(); //opacityShapeRG->openIfNonlinear(); //opacityShapeBY->openIfNonlinear(); } -void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) +void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) { pp->wavelet.enabled = getEnabled(); - pp->wavelet.avoid = avoid->get_active (); - pp->wavelet.tmr = tmr->get_active (); + pp->wavelet.avoid = avoid->get_active(); + pp->wavelet.tmr = tmr->get_active(); pp->wavelet.rescon = rescon->getValue(); pp->wavelet.resconH = resconH->getValue(); pp->wavelet.reschro = reschro->getValue(); @@ -1452,12 +1522,12 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) pp->wavelet.thres = thres->getValue(); pp->wavelet.chroma = chroma->getValue(); pp->wavelet.chro = chro->getValue(); - pp->wavelet.median = median->get_active (); - pp->wavelet.medianlev = medianlev->get_active (); - pp->wavelet.linkedg = linkedg->get_active (); + pp->wavelet.median = median->get_active(); + pp->wavelet.medianlev = medianlev->get_active(); + pp->wavelet.linkedg = linkedg->get_active(); // pp->wavelet.edgreinf = edgreinf->get_active (); - pp->wavelet.cbenab = cbenab->get_active (); - pp->wavelet.lipst = lipst->get_active (); + pp->wavelet.cbenab = cbenab->get_active(); + pp->wavelet.lipst = lipst->get_active(); pp->wavelet.contrast = contrast->getValue(); pp->wavelet.edgrad = edgrad->getValue(); pp->wavelet.edgval = edgval->getValue(); @@ -1481,24 +1551,28 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) pp->wavelet.level1noise = level1noise->getValue (); pp->wavelet.level2noise = level2noise->getValue (); pp->wavelet.level3noise = level3noise->getValue (); - pp->wavelet.ccwcurve = ccshape->getCurve (); - pp->wavelet.opacityCurveRG = opacityShapeRG->getCurve (); - pp->wavelet.opacityCurveBY = opacityShapeBY->getCurve (); - pp->wavelet.opacityCurveW = opacityShape->getCurve (); - pp->wavelet.opacityCurveWL = opacityShapeWL->getCurve (); - pp->wavelet.hhcurve = hhshape->getCurve (); - pp->wavelet.Chcurve = Chshape->getCurve (); + pp->wavelet.ccwcurve = ccshape->getCurve(); + pp->wavelet.opacityCurveRG = opacityShapeRG->getCurve(); + pp->wavelet.opacityCurveBY = opacityShapeBY->getCurve(); + pp->wavelet.opacityCurveW = opacityShape->getCurve(); + pp->wavelet.opacityCurveWL = opacityShapeWL->getCurve(); + pp->wavelet.hhcurve = hhshape->getCurve(); + pp->wavelet.Chcurve = Chshape->getCurve(); pp->wavelet.pastlev = pastlev->getValue (); pp->wavelet.satlev = satlev->getValue (); pp->wavelet.strength = (int) strength->getValue(); pp->wavelet.balance = (int) balance->getValue(); - pp->wavelet.greenlow = greenlow->getValue (); - pp->wavelet.bluelow = bluelow->getValue (); - pp->wavelet.greenmed = greenmed->getValue (); - pp->wavelet.bluemed = bluemed->getValue (); - pp->wavelet.greenhigh = greenhigh->getValue (); - pp->wavelet.bluehigh = bluehigh->getValue (); + pp->wavelet.greenlow = greenlow->getValue(); + pp->wavelet.bluelow = bluelow->getValue(); + pp->wavelet.greenmed = greenmed->getValue(); + pp->wavelet.bluemed = bluemed->getValue(); + pp->wavelet.greenhigh = greenhigh->getValue(); + pp->wavelet.bluehigh = bluehigh->getValue(); + pp->wavelet.mergeL = mergeL->getValue(); + pp->wavelet.mergeC = mergeC->getValue(); + pp->wavelet.softrad = softrad->getValue(); + pp->wavelet.softradend = softradend->getValue(); pp->wavelet.expcontrast = expcontrast->getEnabled(); pp->wavelet.expchroma = expchroma->getEnabled(); pp->wavelet.expedge = expedge->getEnabled(); @@ -1506,9 +1580,10 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) pp->wavelet.expfinal = expfinal->getEnabled(); pp->wavelet.exptoning = exptoning->getEnabled(); pp->wavelet.expnoise = expnoise->getEnabled(); + pp->wavelet.expclari = expclari->getEnabled(); pp->wavelet.iter = (int) iter->getValue(); - pp->wavelet.wavclCurve = clshape->getCurve (); + pp->wavelet.wavclCurve = clshape->getCurve(); for (int i = 0; i < 9; i++) { pp->wavelet.c[i] = (int) correction[i]->getValue(); @@ -1528,6 +1603,7 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.cbenab = !cbenab->get_inconsistent(); pedited->wavelet.lipst = !lipst->get_inconsistent(); pedited->wavelet.Medgreinf = Medgreinf->get_active_text() != M("GENERAL_UNCHANGED"); + pedited->wavelet.ushamethod = ushamethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.Lmethod = Lmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.CLmethod = CLmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.Backmethod = Backmethod->get_active_text() != M("GENERAL_UNCHANGED"); @@ -1564,35 +1640,39 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.edgval = edgval->getEditedState(); pedited->wavelet.thr = thr->getEditedState(); pedited->wavelet.thrH = thrH->getEditedState(); - pedited->wavelet.hueskin = hueskin->getEditedState (); - pedited->wavelet.hueskin2 = hueskin2->getEditedState (); + pedited->wavelet.hueskin = hueskin->getEditedState(); + pedited->wavelet.hueskin2 = hueskin2->getEditedState(); pedited->wavelet.skinprotect = skinprotect->getEditedState(); - pedited->wavelet.hllev = hllev->getEditedState (); - pedited->wavelet.ccwcurve = !ccshape->isUnChanged (); - pedited->wavelet.edgcont = edgcont->getEditedState (); - pedited->wavelet.level0noise = level0noise->getEditedState (); - pedited->wavelet.level1noise = level1noise->getEditedState (); - pedited->wavelet.level2noise = level2noise->getEditedState (); - pedited->wavelet.level3noise = level3noise->getEditedState (); - pedited->wavelet.opacityCurveRG = !opacityShapeRG->isUnChanged (); - pedited->wavelet.opacityCurveBY = !opacityShapeBY->isUnChanged (); - pedited->wavelet.opacityCurveW = !opacityShape->isUnChanged (); - pedited->wavelet.opacityCurveWL = !opacityShapeWL->isUnChanged (); - pedited->wavelet.hhcurve = !hhshape->isUnChanged (); - pedited->wavelet.Chcurve = !Chshape->isUnChanged (); - pedited->wavelet.bllev = bllev->getEditedState (); - pedited->wavelet.pastlev = pastlev->getEditedState (); - pedited->wavelet.satlev = satlev->getEditedState (); - pedited->wavelet.strength = strength->getEditedState (); - pedited->wavelet.greenlow = greenlow->getEditedState (); - pedited->wavelet.bluelow = bluelow->getEditedState (); - pedited->wavelet.greenmed = greenmed->getEditedState (); - pedited->wavelet.bluemed = bluemed->getEditedState (); - pedited->wavelet.greenhigh = greenhigh->getEditedState (); - pedited->wavelet.bluehigh = bluehigh->getEditedState (); - pedited->wavelet.balance = balance->getEditedState (); - pedited->wavelet.iter = iter->getEditedState (); - pedited->wavelet.wavclCurve = !clshape->isUnChanged (); + pedited->wavelet.hllev = hllev->getEditedState(); + pedited->wavelet.ccwcurve = !ccshape->isUnChanged(); + pedited->wavelet.edgcont = edgcont->getEditedState(); + pedited->wavelet.level0noise = level0noise->getEditedState(); + pedited->wavelet.level1noise = level1noise->getEditedState(); + pedited->wavelet.level2noise = level2noise->getEditedState(); + pedited->wavelet.level3noise = level3noise->getEditedState(); + pedited->wavelet.opacityCurveRG = !opacityShapeRG->isUnChanged(); + pedited->wavelet.opacityCurveBY = !opacityShapeBY->isUnChanged(); + pedited->wavelet.opacityCurveW = !opacityShape->isUnChanged(); + pedited->wavelet.opacityCurveWL = !opacityShapeWL->isUnChanged(); + pedited->wavelet.hhcurve = !hhshape->isUnChanged(); + pedited->wavelet.Chcurve = !Chshape->isUnChanged(); + pedited->wavelet.bllev = bllev->getEditedState(); + pedited->wavelet.pastlev = pastlev->getEditedState(); + pedited->wavelet.satlev = satlev->getEditedState(); + pedited->wavelet.strength = strength->getEditedState(); + pedited->wavelet.greenlow = greenlow->getEditedState(); + pedited->wavelet.bluelow = bluelow->getEditedState(); + pedited->wavelet.greenmed = greenmed->getEditedState(); + pedited->wavelet.bluemed = bluemed->getEditedState(); + pedited->wavelet.greenhigh = greenhigh->getEditedState(); + pedited->wavelet.bluehigh = bluehigh->getEditedState(); + pedited->wavelet.mergeL = mergeL->getEditedState(); + pedited->wavelet.mergeC = mergeC->getEditedState(); + pedited->wavelet.softrad = softrad->getEditedState(); + pedited->wavelet.softradend = softradend->getEditedState(); + pedited->wavelet.balance = balance->getEditedState(); + pedited->wavelet.iter = iter->getEditedState(); + pedited->wavelet.wavclCurve = !clshape->isUnChanged(); pedited->wavelet.expcontrast = !expcontrast->get_inconsistent(); pedited->wavelet.expchroma = !expchroma->get_inconsistent(); pedited->wavelet.expedge = !expedge->get_inconsistent(); @@ -1600,12 +1680,13 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.expfinal = !expfinal->get_inconsistent(); pedited->wavelet.exptoning = !exptoning->get_inconsistent(); pedited->wavelet.expnoise = !expnoise->get_inconsistent(); + pedited->wavelet.expclari = !expclari->get_inconsistent(); - for(int i = 0; i < 9; i++) { + for (int i = 0; i < 9; i++) { pedited->wavelet.c[i] = correction[i]->getEditedState(); } - for(int i = 0; i < 9; i++) { + for (int i = 0; i < 9; i++) { pedited->wavelet.ch[i] = correctionch[i]->getEditedState(); } @@ -1627,6 +1708,14 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) pp->wavelet.Medgreinf = "less"; } + if (ushamethod->get_active_row_number() == 0) { + pp->wavelet.ushamethod = "none"; + } else if (ushamethod->get_active_row_number() == 1) { + pp->wavelet.ushamethod = "sharp"; + } else if (ushamethod->get_active_row_number() == 2) { + pp->wavelet.ushamethod = "clari"; + } + if (CHSLmethod->get_active_row_number() == 0) { pp->wavelet.CHSLmethod = "SL"; } else if (CHSLmethod->get_active_row_number() == 1) { @@ -1721,31 +1810,31 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) pp->wavelet.Lmethod = Lmethod->get_active_row_number() + 1; } -void Wavelet::curveChanged (CurveEditor* ce) +void Wavelet::curveChanged(CurveEditor* ce) { if (listener && getEnabled()) { if (ce == ccshape) { - listener->panelChanged (EvWavCCCurve, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvWavCCCurve, M("HISTORY_CUSTOMCURVE")); } else if (ce == opacityShapeRG) { - listener->panelChanged (EvWavColor, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvWavColor, M("HISTORY_CUSTOMCURVE")); } else if (ce == opacityShapeBY) { - listener->panelChanged (EvWavOpac, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvWavOpac, M("HISTORY_CUSTOMCURVE")); } else if (ce == opacityShape) { - listener->panelChanged (EvWavopacity, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvWavopacity, M("HISTORY_CUSTOMCURVE")); } else if (ce == opacityShapeWL) { - listener->panelChanged (EvWavopacityWL, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvWavopacityWL, M("HISTORY_CUSTOMCURVE")); } else if (ce == hhshape) { - listener->panelChanged (EvWavHHCurve, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvWavHHCurve, M("HISTORY_CUSTOMCURVE")); } else if (ce == Chshape) { - listener->panelChanged (EvWavCHCurve, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvWavCHCurve, M("HISTORY_CUSTOMCURVE")); } else if (ce == clshape) { - listener->panelChanged (EvWavCLCurve, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvWavCLCurve, M("HISTORY_CUSTOMCURVE")); } } } -void Wavelet::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) +void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedited) { for (int i = 0; i < 9; i++) { @@ -1756,32 +1845,32 @@ void Wavelet::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi correctionch[i]->setDefault(defParams->wavelet.ch[i]); } - strength->setDefault(defParams->wavelet.strength ); - balance->setDefault(defParams->wavelet.balance ); - iter->setDefault(defParams->wavelet.iter ); - rescon->setDefault (defParams->wavelet.rescon); - resconH->setDefault (defParams->wavelet.resconH); - reschro->setDefault (defParams->wavelet.reschro); - tmrs->setDefault (defParams->wavelet.tmrs); - gamma->setDefault (defParams->wavelet.gamma); - sup->setDefault (defParams->wavelet.sup); - sky->setDefault (defParams->wavelet.sky); - thres->setDefault (defParams->wavelet.thres); - threshold->setDefault (defParams->wavelet.threshold); - threshold2->setDefault (defParams->wavelet.threshold2); - edgedetect->setDefault (defParams->wavelet.edgedetect); - edgedetectthr->setDefault (defParams->wavelet.edgedetectthr); - edgedetectthr2->setDefault (defParams->wavelet.edgedetectthr2); - edgesensi->setDefault (defParams->wavelet.edgesensi); - edgeampli->setDefault (defParams->wavelet.edgeampli); - chroma->setDefault (defParams->wavelet.chroma); - chro->setDefault (defParams->wavelet.chro); - contrast->setDefault (defParams->wavelet.contrast); - edgrad->setDefault (defParams->wavelet.edgrad); - edgval->setDefault (defParams->wavelet.edgval); - edgthresh->setDefault (defParams->wavelet.edgthresh); - thr->setDefault (defParams->wavelet.thr); - thrH->setDefault (defParams->wavelet.thrH); + strength->setDefault(defParams->wavelet.strength); + balance->setDefault(defParams->wavelet.balance); + iter->setDefault(defParams->wavelet.iter); + rescon->setDefault(defParams->wavelet.rescon); + resconH->setDefault(defParams->wavelet.resconH); + reschro->setDefault(defParams->wavelet.reschro); + tmrs->setDefault(defParams->wavelet.tmrs); + gamma->setDefault(defParams->wavelet.gamma); + sup->setDefault(defParams->wavelet.sup); + sky->setDefault(defParams->wavelet.sky); + thres->setDefault(defParams->wavelet.thres); + threshold->setDefault(defParams->wavelet.threshold); + threshold2->setDefault(defParams->wavelet.threshold2); + edgedetect->setDefault(defParams->wavelet.edgedetect); + edgedetectthr->setDefault(defParams->wavelet.edgedetectthr); + edgedetectthr2->setDefault(defParams->wavelet.edgedetectthr2); + edgesensi->setDefault(defParams->wavelet.edgesensi); + edgeampli->setDefault(defParams->wavelet.edgeampli); + chroma->setDefault(defParams->wavelet.chroma); + chro->setDefault(defParams->wavelet.chro); + contrast->setDefault(defParams->wavelet.contrast); + edgrad->setDefault(defParams->wavelet.edgrad); + edgval->setDefault(defParams->wavelet.edgval); + edgthresh->setDefault(defParams->wavelet.edgthresh); + thr->setDefault(defParams->wavelet.thr); + thrH->setDefault(defParams->wavelet.thrH); hueskin->setDefault (defParams->wavelet.hueskin); hueskin2->setDefault (defParams->wavelet.hueskin2); hllev->setDefault (defParams->wavelet.hllev); @@ -1794,27 +1883,35 @@ void Wavelet::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi level2noise->setDefault (defParams->wavelet.level2noise); level3noise->setDefault (defParams->wavelet.level3noise); - greenlow->setDefault (defParams->wavelet.greenlow); - bluelow->setDefault (defParams->wavelet.bluelow); - greenmed->setDefault (defParams->wavelet.greenmed); - bluemed->setDefault (defParams->wavelet.bluemed); - greenhigh->setDefault (defParams->wavelet.greenhigh); - bluehigh->setDefault (defParams->wavelet.bluehigh); + greenlow->setDefault(defParams->wavelet.greenlow); + bluelow->setDefault(defParams->wavelet.bluelow); + greenmed->setDefault(defParams->wavelet.greenmed); + bluemed->setDefault(defParams->wavelet.bluemed); + greenhigh->setDefault(defParams->wavelet.greenhigh); + bluehigh->setDefault(defParams->wavelet.bluehigh); + mergeL->setDefault(defParams->wavelet.mergeL); + mergeC->setDefault(defParams->wavelet.mergeC); + softrad->setDefault(defParams->wavelet.softrad); + softradend->setDefault(defParams->wavelet.softradend); if (pedited) { - greenlow->setDefaultEditedState (pedited->wavelet.greenlow ? Edited : UnEdited); - bluelow->setDefaultEditedState (pedited->wavelet.bluelow ? Edited : UnEdited); - greenmed->setDefaultEditedState (pedited->wavelet.greenmed ? Edited : UnEdited); - bluemed->setDefaultEditedState (pedited->wavelet.bluemed ? Edited : UnEdited); - greenhigh->setDefaultEditedState (pedited->wavelet.greenhigh ? Edited : UnEdited); - bluehigh->setDefaultEditedState (pedited->wavelet.bluehigh ? Edited : UnEdited); + greenlow->setDefaultEditedState(pedited->wavelet.greenlow ? Edited : UnEdited); + bluelow->setDefaultEditedState(pedited->wavelet.bluelow ? Edited : UnEdited); + greenmed->setDefaultEditedState(pedited->wavelet.greenmed ? Edited : UnEdited); + bluemed->setDefaultEditedState(pedited->wavelet.bluemed ? Edited : UnEdited); + greenhigh->setDefaultEditedState(pedited->wavelet.greenhigh ? Edited : UnEdited); + bluehigh->setDefaultEditedState(pedited->wavelet.bluehigh ? Edited : UnEdited); + mergeL->setDefaultEditedState(pedited->wavelet.mergeL ? Edited : UnEdited); + mergeC->setDefaultEditedState(pedited->wavelet.mergeC ? Edited : UnEdited); + softrad->setDefaultEditedState(pedited->wavelet.softrad ? Edited : UnEdited); + softradend->setDefaultEditedState(pedited->wavelet.softradend ? Edited : UnEdited); - rescon->setDefault (defParams->wavelet.rescon); - resconH->setDefault (defParams->wavelet.resconH); - reschro->setDefault (defParams->wavelet.reschro); - tmrs->setDefault (defParams->wavelet.tmrs); - gamma->setDefault (defParams->wavelet.gamma); - sup->setDefault (defParams->wavelet.sup); + rescon->setDefault(defParams->wavelet.rescon); + resconH->setDefault(defParams->wavelet.resconH); + reschro->setDefault(defParams->wavelet.reschro); + tmrs->setDefault(defParams->wavelet.tmrs); + gamma->setDefault(defParams->wavelet.gamma); + sup->setDefault(defParams->wavelet.sup); sky->setDefaultEditedState(pedited->wavelet.sky ? Edited : UnEdited); thres->setDefaultEditedState(pedited->wavelet.thres ? Edited : UnEdited); threshold->setDefaultEditedState(pedited->wavelet.threshold ? Edited : UnEdited); @@ -1829,7 +1926,7 @@ void Wavelet::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi contrast->setDefaultEditedState(pedited->wavelet.contrast ? Edited : UnEdited); edgrad->setDefaultEditedState(pedited->wavelet.edgrad ? Edited : UnEdited); edgval->setDefaultEditedState(pedited->wavelet.edgval ? Edited : UnEdited); - edgthresh->setDefault (defParams->wavelet.edgthresh); + edgthresh->setDefault(defParams->wavelet.edgthresh); thr->setDefaultEditedState(pedited->wavelet.thr ? Edited : UnEdited); thrH->setDefaultEditedState(pedited->wavelet.thrH ? Edited : UnEdited); skinprotect->setDefaultEditedState(pedited->wavelet.skinprotect ? Edited : UnEdited); @@ -1880,20 +1977,20 @@ void Wavelet::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi thr->setDefaultEditedState(Irrelevant); thrH->setDefaultEditedState(Irrelevant); skinprotect->setDefaultEditedState(Irrelevant); - hueskin->setDefaultEditedState (Irrelevant); - hueskin2->setDefaultEditedState (Irrelevant); - hllev->setDefaultEditedState (Irrelevant); - bllev->setDefaultEditedState (Irrelevant); - edgcont->setDefaultEditedState (Irrelevant); - level0noise->setDefaultEditedState (Irrelevant); - level1noise->setDefaultEditedState (Irrelevant); - level2noise->setDefaultEditedState (Irrelevant); - level3noise->setDefaultEditedState (Irrelevant); - pastlev->setDefaultEditedState (Irrelevant); - satlev->setDefaultEditedState (Irrelevant); - strength->setDefaultEditedState (Irrelevant); - balance->setDefaultEditedState (Irrelevant); - iter->setDefaultEditedState (Irrelevant); + hueskin->setDefaultEditedState(Irrelevant); + hueskin2->setDefaultEditedState(Irrelevant); + hllev->setDefaultEditedState(Irrelevant); + bllev->setDefaultEditedState(Irrelevant); + edgcont->setDefaultEditedState(Irrelevant); + level0noise->setDefaultEditedState(Irrelevant); + level1noise->setDefaultEditedState(Irrelevant); + level2noise->setDefaultEditedState(Irrelevant); + level3noise->setDefaultEditedState(Irrelevant); + pastlev->setDefaultEditedState(Irrelevant); + satlev->setDefaultEditedState(Irrelevant); + strength->setDefaultEditedState(Irrelevant); + balance->setDefaultEditedState(Irrelevant); + iter->setDefaultEditedState(Irrelevant); for (int i = 0; i < 9; i++) { correction[i]->setDefaultEditedState(Irrelevant); @@ -1907,19 +2004,19 @@ void Wavelet::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi void Wavelet::adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) { - if (listener && (multiImage || getEnabled()) ) { - if(a == level0noise) { - listener->panelChanged (EvWavlev0nois, - Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_NOIS") + ": %1" + "\n" + M("TP_WAVELET_STREN") + ": %2"), int(newTop), int(newBottom))); - } else if(a == level1noise) { - listener->panelChanged (EvWavlev1nois, - Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_NOIS") + ": %1" + "\n" + M("TP_WAVELET_STREN") + ": %2"), int(newTop), int(newBottom))); - } else if(a == level2noise) { - listener->panelChanged (EvWavlev2nois, - Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_NOIS") + ": %1" + "\n" + M("TP_WAVELET_STREN") + ": %2"), int(newTop), int(newBottom))); - } else if(a == level3noise) { - listener->panelChanged (EvWavlev3nois, - Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_NOIS") + ": %1" + "\n" + M("TP_WAVELET_STREN") + ": %2"), int(newTop), int(newBottom))); + if (listener && (multiImage || getEnabled())) { + if (a == level0noise) { + listener->panelChanged(EvWavlev0nois, + Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_NOIS") + ": %1" + "\n" + M("TP_WAVELET_STREN") + ": %2"), int(newTop), int(newBottom))); + } else if (a == level1noise) { + listener->panelChanged(EvWavlev1nois, + Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_NOIS") + ": %1" + "\n" + M("TP_WAVELET_STREN") + ": %2"), int(newTop), int(newBottom))); + } else if (a == level2noise) { + listener->panelChanged(EvWavlev2nois, + Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_NOIS") + ": %1" + "\n" + M("TP_WAVELET_STREN") + ": %2"), int(newTop), int(newBottom))); + } else if (a == level3noise) { + listener->panelChanged(EvWavlev3nois, + Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_NOIS") + ": %1" + "\n" + M("TP_WAVELET_STREN") + ": %2"), int(newTop), int(newBottom))); } } @@ -1939,21 +2036,21 @@ void Wavelet::adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTo void Wavelet::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) { - if (listener && (multiImage || getEnabled()) ) { - if(a == hueskin) { - listener->panelChanged (EvWavHueskin, hueskin->getHistoryString()); - } else if(a == hueskin2) { - listener->panelChanged (EvWavHueskin2, hueskin2->getHistoryString()); - } else if(a == hllev) { - listener->panelChanged (EvWavlhl, hllev->getHistoryString()); - } else if(a == bllev) { - listener->panelChanged (EvWavlbl, bllev->getHistoryString()); - } else if(a == pastlev) { - listener->panelChanged (EvWavpast, pastlev->getHistoryString()); - } else if(a == satlev) { - listener->panelChanged (EvWavsat, satlev->getHistoryString()); - } else if(a == edgcont) { - listener->panelChanged (EvWavedgcont, edgcont->getHistoryString()); + if (listener && (multiImage || getEnabled())) { + if (a == hueskin) { + listener->panelChanged(EvWavHueskin, hueskin->getHistoryString()); + } else if (a == hueskin2) { + listener->panelChanged(EvWavHueskin2, hueskin2->getHistoryString()); + } else if (a == hllev) { + listener->panelChanged(EvWavlhl, hllev->getHistoryString()); + } else if (a == bllev) { + listener->panelChanged(EvWavlbl, bllev->getHistoryString()); + } else if (a == pastlev) { + listener->panelChanged(EvWavpast, pastlev->getHistoryString()); + } else if (a == satlev) { + listener->panelChanged(EvWavsat, satlev->getHistoryString()); + } else if (a == edgcont) { + listener->panelChanged(EvWavedgcont, edgcont->getHistoryString()); } } } @@ -1961,7 +2058,7 @@ void Wavelet::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL void Wavelet::HSmethodUpdateUI() { if (!batchMode) { - if(HSmethod->get_active_row_number() == 0) { //without + if (HSmethod->get_active_row_number() == 0) { //without hllev->hide(); bllev->hide(); threshold->hide(); @@ -1979,15 +2076,15 @@ void Wavelet::HSmethodChanged() { HSmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavHSmet, HSmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavHSmet, HSmethod->get_active_text()); } } void Wavelet::CHmethodUpdateUI() { if (!batchMode) { - if(CHmethod->get_active_row_number() == 0) { + if (CHmethod->get_active_row_number() == 0) { CHSLmethod->show(); pastlev->hide(); satlev->hide(); @@ -1999,14 +2096,14 @@ void Wavelet::CHmethodUpdateUI() int y = thres->getValue(); int z; - for(z = y; z < 9; z++) { + for (z = y; z < 9; z++) { correctionch[z]->hide(); } - for(z = 0; z < y; z++) { + for (z = 0; z < y; z++) { correctionch[z]->show(); } - } else if(CHmethod->get_active_row_number() == 1) { + } else if (CHmethod->get_active_row_number() == 1) { CHSLmethod->show(); pastlev->show(); satlev->show(); @@ -2018,11 +2115,11 @@ void Wavelet::CHmethodUpdateUI() int y = thres->getValue(); int z; - for(z = y; z < 9; z++) { + for (z = y; z < 9; z++) { correctionch[z]->hide(); } - for(z = 0; z < y; z++) { + for (z = 0; z < y; z++) { correctionch[z]->show(); } } else { @@ -2046,8 +2143,8 @@ void Wavelet::CHmethodChanged() { CHmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavCHmet, CHmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavCHmet, CHmethod->get_active_text()); } } @@ -2086,10 +2183,10 @@ void Wavelet::CHSLmethodChanged() void Wavelet::EDmethodUpdateUI() { if (!batchMode) { - if(EDmethod->get_active_row_number() == 0 ) { //SL + if (EDmethod->get_active_row_number() == 0) { //SL CCWcurveEditorG->hide(); edgcont->show(); - } else if(EDmethod->get_active_row_number() == 1) { //CU + } else if (EDmethod->get_active_row_number() == 1) { //CU CCWcurveEditorG->show(); edgcont->hide(); } @@ -2099,8 +2196,8 @@ void Wavelet::EDmethodChanged() { EDmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavEDmet, EDmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavEDmet, EDmethod->get_active_text()); } } @@ -2114,8 +2211,8 @@ void Wavelet::NPmethodChanged() { NPmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavNPmet, NPmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavNPmet, NPmethod->get_active_text()); } } @@ -2124,16 +2221,16 @@ void Wavelet::NPmethodChanged() void Wavelet::BAmethodUpdateUI() { if (!batchMode) { - if(BAmethod->get_active_row_number() == 0 ) { //none + if (BAmethod->get_active_row_number() == 0) { //none balance->hide(); opacityCurveEditorW->hide(); iter->hide(); - } else if(BAmethod->get_active_row_number() == 1) { //sli + } else if (BAmethod->get_active_row_number() == 1) { //sli opacityCurveEditorW->hide(); balance->show(); iter->show(); - } else if(BAmethod->get_active_row_number() == 2) { //CU + } else if (BAmethod->get_active_row_number() == 2) { //CU opacityCurveEditorW->show(); balance->hide(); iter->show(); @@ -2144,8 +2241,8 @@ void Wavelet::BAmethodChanged() { BAmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavBAmet, BAmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavBAmet, BAmethod->get_active_text()); } } @@ -2168,8 +2265,8 @@ void Wavelet::TMmethodChanged() { TMmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavTMmet, TMmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavTMmet, TMmethod->get_active_text()); } } @@ -2183,8 +2280,8 @@ void Wavelet::BackmethodUpdateUI() { void Wavelet::BackmethodChanged() { //BackmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavBackmet, Backmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavBackmet, Backmethod->get_active_text()); } } @@ -2192,19 +2289,19 @@ void Wavelet::CLmethodUpdateUI() { if (!batchMode) { if (CLmethod->get_active_row_number() == 0) { - CLmethod->set_active (0); + CLmethod->set_active(0); Lmethod->set_sensitive(true); Dirmethod->set_sensitive(true); } else if (CLmethod->get_active_row_number() == 1) { - CLmethod->set_active (1); + CLmethod->set_active(1); Lmethod->set_sensitive(true); Dirmethod->set_sensitive(true); } else if (CLmethod->get_active_row_number() == 2) { - CLmethod->set_active (2); + CLmethod->set_active(2); Lmethod->set_sensitive(true); Dirmethod->set_sensitive(true); } else if (CLmethod->get_active_row_number() == 3) { - CLmethod->set_active (3); + CLmethod->set_active(3); Lmethod->set_sensitive(false); Dirmethod->set_sensitive(false); } @@ -2215,8 +2312,8 @@ void Wavelet::CLmethodChanged() { CLmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavCLmet, CLmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavCLmet, CLmethod->get_active_text()); } } @@ -2227,11 +2324,50 @@ void Wavelet::TilesmethodUpdateUI() { } */ + +void Wavelet::ushamethodChanged() +{ + if (ushamethod->get_active_row_number() == 2 && expclari->getEnabled() == true) { + Backmethod->set_active(2); + CLmethod->set_active(2); + Lmethod->set_active(6); + Lmethod->set_sensitive(true); + Dirmethod->set_sensitive(true); + Dirmethod->set_active(3); + } else if (ushamethod->get_active_row_number() == 1 && expclari->getEnabled() == true) { + Backmethod->set_active(0); + CLmethod->set_active(1); + Lmethod->set_active(2); + Dirmethod->set_active(3); + Lmethod->set_sensitive(true); + Dirmethod->set_sensitive(true); + } else if (ushamethod->get_active_row_number() == 0 || expclari->getEnabled() == false) { + Backmethod->set_active(1); + CLmethod->set_active(3); + Lmethod->set_active(3); + Dirmethod->set_active(3); + Lmethod->set_sensitive(false); + Dirmethod->set_sensitive(false); + } else if (expclari->getEnabled() == false) { + Backmethod->set_active(1); + CLmethod->set_active(3); + Lmethod->set_active(3); + Dirmethod->set_active(3); + Lmethod->set_sensitive(false); + Dirmethod->set_sensitive(false); + } + + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavushamet, ushamethod->get_active_text()); + } +} + + void Wavelet::TilesmethodChanged() { //TilesmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavTilesmet, Tilesmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavTilesmet, Tilesmethod->get_active_text()); } } @@ -2243,8 +2379,8 @@ void Wavelet::daubcoeffmethodUpdateUI() { void Wavelet::daubcoeffmethodChanged() { //daubcoeffmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavdaubcoeffmet, daubcoeffmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavdaubcoeffmet, daubcoeffmethod->get_active_text()); } } @@ -2257,8 +2393,8 @@ void Wavelet::MedgreinfUpdateUI() { void Wavelet::MedgreinfChanged() { //MedgreinfUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavedgreinf, Medgreinf->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavedgreinf, Medgreinf->get_active_text()); } } @@ -2271,8 +2407,8 @@ void Wavelet::DirmethodUpdateUI() { void Wavelet::DirmethodChanged() { //DirmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavDirmeto, Dirmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavDirmeto, Dirmethod->get_active_text()); } } @@ -2285,74 +2421,75 @@ void Wavelet::LmethodUpdateUI() { void Wavelet::LmethodChanged() { //LmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavLmet, Lmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavLmet, Lmethod->get_active_text()); } } -void Wavelet::setBatchMode (bool batchMode) +void Wavelet::setBatchMode(bool batchMode) { - Lmethod->append (M("GENERAL_UNCHANGED")); - CLmethod->append (M("GENERAL_UNCHANGED")); - Backmethod->append (M("GENERAL_UNCHANGED")); - Tilesmethod->append (M("GENERAL_UNCHANGED")); - daubcoeffmethod->append (M("GENERAL_UNCHANGED")); - CHmethod->append (M("GENERAL_UNCHANGED")); - Medgreinf->append (M("GENERAL_UNCHANGED")); - CHSLmethod->append (M("GENERAL_UNCHANGED")); - EDmethod->append (M("GENERAL_UNCHANGED")); - NPmethod->append (M("GENERAL_UNCHANGED")); - BAmethod->append (M("GENERAL_UNCHANGED")); - TMmethod->append (M("GENERAL_UNCHANGED")); - HSmethod->append (M("GENERAL_UNCHANGED")); - Dirmethod->append (M("GENERAL_UNCHANGED")); - CCWcurveEditorG->setBatchMode (batchMode); - opaCurveEditorG->setBatchMode (batchMode); - opacityCurveEditorG->setBatchMode (batchMode); - opacityCurveEditorW->setBatchMode (batchMode); - opacityCurveEditorWL->setBatchMode (batchMode); - curveEditorRES->setBatchMode (batchMode); - curveEditorGAM->setBatchMode (batchMode); - rescon->showEditedCB (); - resconH->showEditedCB (); - reschro->showEditedCB (); - tmrs->showEditedCB (); - gamma->showEditedCB (); - sup->showEditedCB (); - sky->showEditedCB (); - thres->showEditedCB (); - threshold->showEditedCB (); - threshold2->showEditedCB (); - edgedetect->showEditedCB (); - edgedetectthr->showEditedCB (); - edgedetectthr2->showEditedCB (); - edgesensi->showEditedCB (); - edgeampli->showEditedCB (); - chroma->showEditedCB (); - chro->showEditedCB (); - contrast->showEditedCB (); - edgrad->showEditedCB (); - edgval->showEditedCB (); - edgthresh->showEditedCB (); - thr->showEditedCB (); - thrH->showEditedCB (); + Lmethod->append(M("GENERAL_UNCHANGED")); + CLmethod->append(M("GENERAL_UNCHANGED")); + Backmethod->append(M("GENERAL_UNCHANGED")); + Tilesmethod->append(M("GENERAL_UNCHANGED")); + daubcoeffmethod->append(M("GENERAL_UNCHANGED")); + CHmethod->append(M("GENERAL_UNCHANGED")); + Medgreinf->append(M("GENERAL_UNCHANGED")); + ushamethod->append(M("GENERAL_UNCHANGED")); + CHSLmethod->append(M("GENERAL_UNCHANGED")); + EDmethod->append(M("GENERAL_UNCHANGED")); + NPmethod->append(M("GENERAL_UNCHANGED")); + BAmethod->append(M("GENERAL_UNCHANGED")); + TMmethod->append(M("GENERAL_UNCHANGED")); + HSmethod->append(M("GENERAL_UNCHANGED")); + Dirmethod->append(M("GENERAL_UNCHANGED")); + CCWcurveEditorG->setBatchMode(batchMode); + opaCurveEditorG->setBatchMode(batchMode); + opacityCurveEditorG->setBatchMode(batchMode); + opacityCurveEditorW->setBatchMode(batchMode); + opacityCurveEditorWL->setBatchMode(batchMode); + curveEditorRES->setBatchMode(batchMode); + curveEditorGAM->setBatchMode(batchMode); + rescon->showEditedCB(); + resconH->showEditedCB(); + reschro->showEditedCB(); + tmrs->showEditedCB(); + gamma->showEditedCB(); + sup->showEditedCB(); + sky->showEditedCB(); + thres->showEditedCB(); + threshold->showEditedCB(); + threshold2->showEditedCB(); + edgedetect->showEditedCB(); + edgedetectthr->showEditedCB(); + edgedetectthr2->showEditedCB(); + edgesensi->showEditedCB(); + edgeampli->showEditedCB(); + chroma->showEditedCB(); + chro->showEditedCB(); + contrast->showEditedCB(); + edgrad->showEditedCB(); + edgval->showEditedCB(); + edgthresh->showEditedCB(); + thr->showEditedCB(); + thrH->showEditedCB(); skinprotect->showEditedCB(); - hueskin->showEditedCB (); - hueskin2->showEditedCB (); - hllev->showEditedCB (); - bllev->showEditedCB (); - pastlev->showEditedCB (); - satlev->showEditedCB (); - edgcont->showEditedCB (); - strength->showEditedCB (); - balance->showEditedCB (); - iter->showEditedCB (); - level0noise->showEditedCB (); - level1noise->showEditedCB (); - level2noise->showEditedCB (); - level3noise->showEditedCB (); + hueskin->showEditedCB(); + hueskin2->showEditedCB(); + hllev->showEditedCB(); + bllev->showEditedCB(); + pastlev->showEditedCB(); + satlev->showEditedCB(); + edgcont->showEditedCB(); + strength->showEditedCB(); + balance->showEditedCB(); + iter->showEditedCB(); + level0noise->showEditedCB(); + level1noise->showEditedCB(); + level2noise->showEditedCB(); + level3noise->showEditedCB(); - ToolPanel::setBatchMode (batchMode); + ToolPanel::setBatchMode(batchMode); for (int i = 0; i < 9; i++) { correction[i]->showEditedCB(); @@ -2363,7 +2500,7 @@ void Wavelet::setBatchMode (bool batchMode) } } -void Wavelet::adjusterUpdateUI (Adjuster* a) +void Wavelet::adjusterUpdateUI(Adjuster* a) { /* if (!batchMode) { @@ -2386,128 +2523,136 @@ void Wavelet::adjusterUpdateUI (Adjuster* a) void Wavelet::adjusterChanged(Adjuster* a, double newval) { - if (listener && (multiImage || getEnabled()) ) { + if (listener && (multiImage || getEnabled())) { if (a == edgthresh) { - listener->panelChanged (EvWavtiles, edgthresh->getTextValue()); - } else if (a == rescon ) { - listener->panelChanged (EvWavrescon, rescon->getTextValue()); - } else if (a == resconH ) { - listener->panelChanged (EvWavresconH, resconH->getTextValue()); - } else if (a == reschro ) { - listener->panelChanged (EvWavreschro, reschro->getTextValue()); - } else if (a == tmrs ) { + listener->panelChanged(EvWavtiles, edgthresh->getTextValue()); + } else if (a == rescon) { + listener->panelChanged(EvWavrescon, rescon->getTextValue()); + } else if (a == resconH) { + listener->panelChanged(EvWavresconH, resconH->getTextValue()); + } else if (a == reschro) { + listener->panelChanged(EvWavreschro, reschro->getTextValue()); + } else if (a == tmrs) { adjusterUpdateUI(a); - listener->panelChanged (EvWavtmrs, tmrs->getTextValue()); - } else if (a == gamma ) { + listener->panelChanged(EvWavtmrs, tmrs->getTextValue()); + } else if (a == gamma) { adjusterUpdateUI(a); - listener->panelChanged (EvWavgamma, gamma->getTextValue()); - } else if (a == sky ) { - listener->panelChanged (EvWavsky, sky->getTextValue()); - } else if (a == sup ) { - listener->panelChanged (EvWavsup, sup->getTextValue()); - } else if (a == chroma ) { - listener->panelChanged (EvWavchroma, chroma->getTextValue()); - } else if (a == chro ) { - listener->panelChanged (EvWavchro, chro->getTextValue()); - } else if (a == contrast ) { - listener->panelChanged (EvWavunif, contrast->getTextValue()); - } else if (a == thr ) { - listener->panelChanged (EvWavthr, thr->getTextValue()); - } else if (a == thrH ) { - listener->panelChanged (EvWavthrH, thrH->getTextValue()); - } else if (a == threshold ) { - listener->panelChanged (EvWavThreshold, threshold->getTextValue()); - } else if (a == threshold2 ) { - listener->panelChanged (EvWavThreshold2, threshold2->getTextValue()); - } else if (a == edgedetect ) { - listener->panelChanged (EvWavedgedetect, edgedetect->getTextValue()); - } else if (a == edgedetectthr ) { - listener->panelChanged (EvWavedgedetectthr, edgedetectthr->getTextValue()); - } else if (a == edgedetectthr2 ) { - listener->panelChanged (EvWavedgedetectthr2, edgedetectthr2->getTextValue()); - } else if (a == edgesensi ) { - listener->panelChanged (EvWavedgesensi, edgesensi->getTextValue()); - } else if (a == edgeampli ) { - listener->panelChanged (EvWavedgeampli, edgeampli->getTextValue()); - } else if (a == edgrad ) { - listener->panelChanged (EvWavedgrad, edgrad->getTextValue()); - } else if (a == edgval ) { - listener->panelChanged (EvWavedgval, edgval->getTextValue()); - } else if (a == thres ) { + listener->panelChanged(EvWavgamma, gamma->getTextValue()); + } else if (a == sky) { + listener->panelChanged(EvWavsky, sky->getTextValue()); + } else if (a == sup) { + listener->panelChanged(EvWavsup, sup->getTextValue()); + } else if (a == chroma) { + listener->panelChanged(EvWavchroma, chroma->getTextValue()); + } else if (a == chro) { + listener->panelChanged(EvWavchro, chro->getTextValue()); + } else if (a == contrast) { + listener->panelChanged(EvWavunif, contrast->getTextValue()); + } else if (a == thr) { + listener->panelChanged(EvWavthr, thr->getTextValue()); + } else if (a == thrH) { + listener->panelChanged(EvWavthrH, thrH->getTextValue()); + } else if (a == threshold) { + listener->panelChanged(EvWavThreshold, threshold->getTextValue()); + } else if (a == threshold2) { + listener->panelChanged(EvWavThreshold2, threshold2->getTextValue()); + } else if (a == edgedetect) { + listener->panelChanged(EvWavedgedetect, edgedetect->getTextValue()); + } else if (a == edgedetectthr) { + listener->panelChanged(EvWavedgedetectthr, edgedetectthr->getTextValue()); + } else if (a == edgedetectthr2) { + listener->panelChanged(EvWavedgedetectthr2, edgedetectthr2->getTextValue()); + } else if (a == edgesensi) { + listener->panelChanged(EvWavedgesensi, edgesensi->getTextValue()); + } else if (a == edgeampli) { + listener->panelChanged(EvWavedgeampli, edgeampli->getTextValue()); + } else if (a == edgrad) { + listener->panelChanged(EvWavedgrad, edgrad->getTextValue()); + } else if (a == edgval) { + listener->panelChanged(EvWavedgval, edgval->getTextValue()); + } else if (a == thres) { int y = thres->getValue(); int z; - for(z = y; z < 9; z++) { + for (z = y; z < 9; z++) { correction[z]->hide(); } - for(z = 0; z < y; z++) { + for (z = 0; z < y; z++) { correction[z]->show(); } - for(z = y; z < 9; z++) { + for (z = y; z < 9; z++) { correctionch[z]->hide(); } - for(z = 0; z < y; z++) { + for (z = 0; z < y; z++) { correctionch[z]->show(); } - if(z == 9) { + if (z == 9) { sup->show(); } else { sup->hide(); } - listener->panelChanged (EvWavthres, thres->getTextValue()); + listener->panelChanged(EvWavthres, thres->getTextValue()); } else if (a == skinprotect) { - listener->panelChanged (EvWavSkin, skinprotect->getTextValue()); + listener->panelChanged(EvWavSkin, skinprotect->getTextValue()); } else if (a == strength) { - listener->panelChanged (EvWavStrength, strength->getTextValue()); + listener->panelChanged(EvWavStrength, strength->getTextValue()); } else if (a == balance) { - listener->panelChanged (EvWavbalance, balance->getTextValue()); + listener->panelChanged(EvWavbalance, balance->getTextValue()); } else if (a == iter) { - listener->panelChanged (EvWaviter, iter->getTextValue()); - } else if (a == greenhigh ) { - listener->panelChanged (EvWavgreenhigh, greenhigh->getTextValue()); - } else if (a == bluehigh ) { - listener->panelChanged (EvWavbluehigh, bluehigh->getTextValue()); - } else if (a == greenmed ) { - listener->panelChanged (EvWavgreenmed, greenmed->getTextValue()); - } else if (a == bluemed ) { - listener->panelChanged (EvWavbluemed, bluemed->getTextValue()); - } else if (a == greenlow ) { - listener->panelChanged (EvWavgreenlow, greenlow->getTextValue()); - } else if (a == bluelow ) { - listener->panelChanged (EvWavbluelow, bluelow->getTextValue()); + listener->panelChanged(EvWaviter, iter->getTextValue()); + } else if (a == greenhigh) { + listener->panelChanged(EvWavgreenhigh, greenhigh->getTextValue()); + } else if (a == bluehigh) { + listener->panelChanged(EvWavbluehigh, bluehigh->getTextValue()); + } else if (a == mergeL) { + listener->panelChanged(EvWavmergeL, mergeL->getTextValue()); + } else if (a == mergeC) { + listener->panelChanged(EvWavmergeC, mergeC->getTextValue()); + } else if (a == softrad) { + listener->panelChanged(EvWavsoftrad, softrad->getTextValue()); + } else if (a == softradend) { + listener->panelChanged(EvWavsoftradend, softradend->getTextValue()); + } else if (a == greenmed) { + listener->panelChanged(EvWavgreenmed, greenmed->getTextValue()); + } else if (a == bluemed) { + listener->panelChanged(EvWavbluemed, bluemed->getTextValue()); + } else if (a == greenlow) { + listener->panelChanged(EvWavgreenlow, greenlow->getTextValue()); + } else if (a == bluelow) { + listener->panelChanged(EvWavbluelow, bluelow->getTextValue()); } if ((a == correction[0] || a == correction[1] || a == correction[2] || a == correction[3] || a == correction[4] || a == correction[5] || a == correction[6] || a == correction[7] || a == correction[8])) { - listener->panelChanged (EvWavelet, - Glib::ustring::compose("%1, %2, %3, %4, %5, %6, %7, %8, %9", - Glib::ustring::format(std::fixed, std::setprecision(0), correction[0]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correction[1]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correction[2]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correction[3]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correction[4]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correction[5]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correction[6]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correction[7]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correction[8]->getValue())) - ); - } else if (a == correctionch[0] || a == correctionch[1] || a == correctionch[2] || a == correctionch[3] || a == correctionch[4] || a == correctionch[5] || a == correctionch[6] || a == correctionch[7] || a == correctionch[8] ) { - listener->panelChanged (EvWaveletch, - Glib::ustring::compose("%1, %2, %3, %4, %5, %6, %7, %8, %9", - Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[0]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[1]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[2]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[3]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[4]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[5]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[6]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[7]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[8]->getValue())) - ); + listener->panelChanged(EvWavelet, + Glib::ustring::compose("%1, %2, %3, %4, %5, %6, %7, %8, %9", + Glib::ustring::format(std::fixed, std::setprecision(0), correction[0]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correction[1]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correction[2]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correction[3]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correction[4]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correction[5]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correction[6]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correction[7]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correction[8]->getValue())) + ); + } else if (a == correctionch[0] || a == correctionch[1] || a == correctionch[2] || a == correctionch[3] || a == correctionch[4] || a == correctionch[5] || a == correctionch[6] || a == correctionch[7] || a == correctionch[8]) { + listener->panelChanged(EvWaveletch, + Glib::ustring::compose("%1, %2, %3, %4, %5, %6, %7, %8, %9", + Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[0]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[1]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[2]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[3]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[4]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[5]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[6]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[7]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[8]->getValue())) + ); } } } @@ -2516,21 +2661,21 @@ void Wavelet::adjusterAutoToggled(Adjuster* a, bool newval) { } -void Wavelet::enabledUpdateUI () +void Wavelet::enabledUpdateUI() { if (!batchMode) { int y = thres->getValue(); int z; - for(z = y; z < 9; z++) { + for (z = y; z < 9; z++) { correction[z]->hide(); } - for(z = 0; z < y; z++) { + for (z = 0; z < y; z++) { correction[z]->show(); } - if(z == 9) { + if (z == 9) { sup->show(); } else { sup->hide(); @@ -2540,52 +2685,52 @@ void Wavelet::enabledUpdateUI () } } -void Wavelet::enabledChanged () +void Wavelet::enabledChanged() { enabledUpdateUI(); if (listener) { if (get_inconsistent()) { - listener->panelChanged (EvWavEnabled, M("GENERAL_UNCHANGED")); + listener->panelChanged(EvWavEnabled, M("GENERAL_UNCHANGED")); } else if (getEnabled()) { - listener->panelChanged (EvWavEnabled, M("GENERAL_ENABLED")); + listener->panelChanged(EvWavEnabled, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvWavEnabled, M("GENERAL_DISABLED")); + listener->panelChanged(EvWavEnabled, M("GENERAL_DISABLED")); } } } -void Wavelet::medianToggled () +void Wavelet::medianToggled() { if (multiImage) { if (median->get_inconsistent()) { - median->set_inconsistent (false); - medianConn.block (true); - median->set_active (false); - medianConn.block (false); + median->set_inconsistent(false); + medianConn.block(true); + median->set_active(false); + medianConn.block(false); } else if (lastmedian) { - median->set_inconsistent (true); + median->set_inconsistent(true); } - lastmedian = median->get_active (); + lastmedian = median->get_active(); } - if (listener && (multiImage || getEnabled ())) { + if (listener && (multiImage || getEnabled())) { if (median->get_inconsistent()) { - listener->panelChanged (EvWavmedian, M("GENERAL_UNCHANGED")); - } else if (median->get_active ()) { - listener->panelChanged (EvWavmedian, M("GENERAL_ENABLED")); + listener->panelChanged(EvWavmedian, M("GENERAL_UNCHANGED")); + } else if (median->get_active()) { + listener->panelChanged(EvWavmedian, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvWavmedian, M("GENERAL_DISABLED")); + listener->panelChanged(EvWavmedian, M("GENERAL_DISABLED")); } } } -void Wavelet::medianlevUpdateUI () +void Wavelet::medianlevUpdateUI() { if (!batchMode) { - if (medianlev->get_active ()) { + if (medianlev->get_active()) { edgedetect->show(); lipst->show(); separatoredge->show(); @@ -2597,7 +2742,7 @@ void Wavelet::medianlevUpdateUI () // edgeampli->show(); // NPmethod->show(); // labmNP->show(); - if (lipst->get_active ()) { + if (lipst->get_active()) { edgesensi->show(); edgeampli->show(); NPmethod->show(); @@ -2625,66 +2770,66 @@ void Wavelet::medianlevUpdateUI () } } -void Wavelet::medianlevToggled () +void Wavelet::medianlevToggled() { if (multiImage) { if (medianlev->get_inconsistent()) { - medianlev->set_inconsistent (false); - medianlevConn.block (true); - medianlev->set_active (false); - medianlevConn.block (false); + medianlev->set_inconsistent(false); + medianlevConn.block(true); + medianlev->set_active(false); + medianlevConn.block(false); } else if (lastmedianlev) { - medianlev->set_inconsistent (true); + medianlev->set_inconsistent(true); } - lastmedianlev = medianlev->get_active (); + lastmedianlev = medianlev->get_active(); } medianlevUpdateUI(); - if (listener && (multiImage || getEnabled ())) { + if (listener && (multiImage || getEnabled())) { if (medianlev->get_inconsistent()) { - listener->panelChanged (EvWavmedianlev, M("GENERAL_UNCHANGED")); - } else if (medianlev->get_active () ) { - listener->panelChanged (EvWavmedianlev, M("GENERAL_ENABLED")); + listener->panelChanged(EvWavmedianlev, M("GENERAL_UNCHANGED")); + } else if (medianlev->get_active()) { + listener->panelChanged(EvWavmedianlev, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvWavmedianlev, M("GENERAL_DISABLED")); + listener->panelChanged(EvWavmedianlev, M("GENERAL_DISABLED")); } } } -void Wavelet::linkedgToggled () +void Wavelet::linkedgToggled() { if (multiImage) { if (linkedg->get_inconsistent()) { - linkedg->set_inconsistent (false); - linkedgConn.block (true); - linkedg->set_active (false); - linkedgConn.block (false); + linkedg->set_inconsistent(false); + linkedgConn.block(true); + linkedg->set_active(false); + linkedgConn.block(false); } else if (lastlinkedg) { - linkedg->set_inconsistent (true); + linkedg->set_inconsistent(true); } - lastlinkedg = linkedg->get_active (); + lastlinkedg = linkedg->get_active(); } - if (listener && (multiImage || getEnabled ())) { + if (listener && (multiImage || getEnabled())) { if (linkedg->get_inconsistent()) { - listener->panelChanged (EvWavlinkedg, M("GENERAL_UNCHANGED")); - } else if (linkedg->get_active () ) { - listener->panelChanged (EvWavlinkedg, M("GENERAL_ENABLED")); + listener->panelChanged(EvWavlinkedg, M("GENERAL_UNCHANGED")); + } else if (linkedg->get_active()) { + listener->panelChanged(EvWavlinkedg, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvWavlinkedg, M("GENERAL_DISABLED")); + listener->panelChanged(EvWavlinkedg, M("GENERAL_DISABLED")); } } } -void Wavelet::cbenabUpdateUI () +void Wavelet::cbenabUpdateUI() { if (!batchMode) { - if(cbenab->get_active ()) { + if (cbenab->get_active()) { chanMixerHLFrame->show(); chanMixerMidFrame->show(); chanMixerShadowsFrame->show(); @@ -2698,40 +2843,40 @@ void Wavelet::cbenabUpdateUI () } } -void Wavelet::cbenabToggled () +void Wavelet::cbenabToggled() { if (multiImage) { if (cbenab->get_inconsistent()) { - cbenab->set_inconsistent (false); - cbenabConn.block (true); - cbenab->set_active (false); - cbenabConn.block (false); + cbenab->set_inconsistent(false); + cbenabConn.block(true); + cbenab->set_active(false); + cbenabConn.block(false); } else if (lastcbenab) { - cbenab->set_inconsistent (true); + cbenab->set_inconsistent(true); } - lastcbenab = cbenab->get_active (); + lastcbenab = cbenab->get_active(); } cbenabUpdateUI(); - if (listener && (multiImage || getEnabled ())) { - if (cbenab->get_inconsistent() ) { - listener->panelChanged (EvWavcbenab, M("GENERAL_UNCHANGED")); - } else if (cbenab->get_active () ) { - listener->panelChanged (EvWavcbenab, M("GENERAL_ENABLED")); + if (listener && (multiImage || getEnabled())) { + if (cbenab->get_inconsistent()) { + listener->panelChanged(EvWavcbenab, M("GENERAL_UNCHANGED")); + } else if (cbenab->get_active()) { + listener->panelChanged(EvWavcbenab, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvWavcbenab, M("GENERAL_DISABLED")); + listener->panelChanged(EvWavcbenab, M("GENERAL_DISABLED")); } } } -void Wavelet::lipstUpdateUI () +void Wavelet::lipstUpdateUI() { if (!batchMode) { - if (lipst->get_active ()) { + if (lipst->get_active()) { NPmethod->show(); edgesensi->show(); edgeampli->show(); @@ -2747,31 +2892,31 @@ void Wavelet::lipstUpdateUI () } -void Wavelet::lipstToggled () +void Wavelet::lipstToggled() { if (multiImage) { if (lipst->get_inconsistent()) { - lipst->set_inconsistent (false); - lipstConn.block (true); - lipst->set_active (false); - lipstConn.block (false); + lipst->set_inconsistent(false); + lipstConn.block(true); + lipst->set_active(false); + lipstConn.block(false); } else if (lastlipst) { - lipst->set_inconsistent (true); + lipst->set_inconsistent(true); } - lastlipst = lipst->get_active (); + lastlipst = lipst->get_active(); } lipstUpdateUI(); - if (listener && (multiImage || getEnabled ())) { + if (listener && (multiImage || getEnabled())) { if (lipst->get_inconsistent()) { - listener->panelChanged (EvWavlipst, M("GENERAL_UNCHANGED")); - } else if (lipst->get_active ()) { - listener->panelChanged (EvWavlipst, M("GENERAL_ENABLED")); + listener->panelChanged(EvWavlipst, M("GENERAL_UNCHANGED")); + } else if (lipst->get_active()) { + listener->panelChanged(EvWavlipst, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvWavlipst, M("GENERAL_DISABLED")); + listener->panelChanged(EvWavlipst, M("GENERAL_DISABLED")); } } } @@ -2802,62 +2947,62 @@ void Wavelet::edgreinfToggled () { } } */ -void Wavelet::avoidToggled () +void Wavelet::avoidToggled() { if (multiImage) { if (avoid->get_inconsistent()) { - avoid->set_inconsistent (false); - avoidConn.block (true); - avoid->set_active (false); - avoidConn.block (false); + avoid->set_inconsistent(false); + avoidConn.block(true); + avoid->set_active(false); + avoidConn.block(false); } else if (lastavoid) { - avoid->set_inconsistent (true); + avoid->set_inconsistent(true); } - lastavoid = avoid->get_active (); + lastavoid = avoid->get_active(); } - if (listener && (multiImage || getEnabled ())) { + if (listener && (multiImage || getEnabled())) { if (avoid->get_inconsistent()) { - listener->panelChanged (EvWavavoid, M("GENERAL_UNCHANGED")); - } else if (avoid->get_active ()) { - listener->panelChanged (EvWavavoid, M("GENERAL_ENABLED")); + listener->panelChanged(EvWavavoid, M("GENERAL_UNCHANGED")); + } else if (avoid->get_active()) { + listener->panelChanged(EvWavavoid, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvWavavoid, M("GENERAL_DISABLED")); + listener->panelChanged(EvWavavoid, M("GENERAL_DISABLED")); } } } -void Wavelet::tmrToggled () +void Wavelet::tmrToggled() { if (multiImage) { if (tmr->get_inconsistent()) { - tmr->set_inconsistent (false); - tmrConn.block (true); - tmr->set_active (false); - tmrConn.block (false); + tmr->set_inconsistent(false); + tmrConn.block(true); + tmr->set_active(false); + tmrConn.block(false); } else if (lasttmr) { - tmr->set_inconsistent (true); + tmr->set_inconsistent(true); } - lasttmr = tmr->get_active (); + lasttmr = tmr->get_active(); } - if (listener && (multiImage || getEnabled ())) { + if (listener && (multiImage || getEnabled())) { if (tmr->get_inconsistent()) { - listener->panelChanged (EvWavtmr, M("GENERAL_UNCHANGED")); - } else if (tmr->get_active ()) { - listener->panelChanged (EvWavtmr, M("GENERAL_ENABLED")); + listener->panelChanged(EvWavtmr, M("GENERAL_UNCHANGED")); + } else if (tmr->get_active()) { + listener->panelChanged(EvWavtmr, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvWavtmr, M("GENERAL_DISABLED")); + listener->panelChanged(EvWavtmr, M("GENERAL_DISABLED")); } } } -void Wavelet::colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller *caller) +void Wavelet::colorForValue(double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller *caller) { float R = 0.f, G = 0.f, B = 0.f; @@ -2897,7 +3042,7 @@ void Wavelet::colorForValue (double valX, double valY, enum ColorCaller::ElemTyp caller->ccGreen = double(G); caller->ccBlue = double(B); } -void Wavelet::setAdjusterBehavior (bool multiplieradd, bool thresholdadd, bool threshold2add, bool thresadd, bool chroadd, bool chromaadd, bool contrastadd, bool skinadd, bool reschroadd, bool tmrsadd, bool resconadd, bool resconHadd, bool thradd, bool thrHadd, bool skyadd, bool edgradadd, bool edgvaladd, bool strengthadd, bool gammaadd, bool edgedetectadd, bool edgedetectthradd , bool edgedetectthr2add) +void Wavelet::setAdjusterBehavior(bool multiplieradd, bool thresholdadd, bool threshold2add, bool thresadd, bool chroadd, bool chromaadd, bool contrastadd, bool skinadd, bool reschroadd, bool tmrsadd, bool resconadd, bool resconHadd, bool thradd, bool thrHadd, bool skyadd, bool edgradadd, bool edgvaladd, bool strengthadd, bool gammaadd, bool edgedetectadd, bool edgedetectthradd, bool edgedetectthr2add) { for (int i = 0; i < 9; i++) { @@ -2928,7 +3073,7 @@ void Wavelet::setAdjusterBehavior (bool multiplieradd, bool thresholdadd, bool t } -void Wavelet::neutralPressed () +void Wavelet::neutralPressed() { for (int i = 0; i < 9; i++) { correction[i]->setValue(0); @@ -2936,7 +3081,7 @@ void Wavelet::neutralPressed () } } -void Wavelet::neutralchPressed () +void Wavelet::neutralchPressed() { for (int i = 0; i < 9; i++) { @@ -2946,7 +3091,7 @@ void Wavelet::neutralchPressed () } -void Wavelet::contrastPlusPressed () +void Wavelet::contrastPlusPressed() { for (int i = 0; i < 9; i++) { @@ -2957,7 +3102,7 @@ void Wavelet::contrastPlusPressed () } -void Wavelet::contrastMinusPressed () +void Wavelet::contrastMinusPressed() { for (int i = 0; i < 9; i++) { @@ -2967,7 +3112,7 @@ void Wavelet::contrastMinusPressed () } } -void Wavelet::foldAllButMe (GdkEventButton* event, MyExpander *expander) +void Wavelet::foldAllButMe(GdkEventButton* event, MyExpander *expander) { if (event->button == 3) { expsettings->set_expanded(expsettings == expander); @@ -2979,6 +3124,7 @@ void Wavelet::foldAllButMe (GdkEventButton* event, MyExpander *expander) expgamut->set_expanded(expgamut == expander); expresid->set_expanded(expresid == expander); expfinal->set_expanded(expfinal == expander); + expclari->set_expanded(expclari == expander); } } @@ -3001,6 +3147,33 @@ void Wavelet::enableToggled(MyExpander *expander) event = EvWavenares; } else if (expander == expfinal) { event = EvWavenafin; + } else if (expander == expclari) { + if (expclari->getEnabled() == false) { + Backmethod->set_active(1); + CLmethod->set_active(3); + Lmethod->set_active(3); + Dirmethod->set_active(3); + Lmethod->set_sensitive(false); + Dirmethod->set_sensitive(false); + } else { + if (ushamethod->get_active_row_number() == 2) { + Backmethod->set_active(2); + CLmethod->set_active(2); + Lmethod->set_active(6); + Lmethod->set_sensitive(true); + Dirmethod->set_sensitive(true); + Dirmethod->set_active(3); + } else if (ushamethod->get_active_row_number() == 1) { + Backmethod->set_active(0); + CLmethod->set_active(1); + Lmethod->set_active(2); + Dirmethod->set_active(3); + Lmethod->set_sensitive(true); + Dirmethod->set_sensitive(true); + } + } + + event = EvWavenaclari; } else // unknown expander, returning ! { @@ -3008,31 +3181,32 @@ void Wavelet::enableToggled(MyExpander *expander) } if (expander->get_inconsistent()) { - listener->panelChanged (event, M("GENERAL_UNCHANGED")); + listener->panelChanged(event, M("GENERAL_UNCHANGED")); } else if (expander->getEnabled()) { - listener->panelChanged (event, M("GENERAL_ENABLED")); + listener->panelChanged(event, M("GENERAL_ENABLED")); } else { - listener->panelChanged (event, M("GENERAL_DISABLED")); + listener->panelChanged(event, M("GENERAL_DISABLED")); } } } void Wavelet::writeOptions(std::vector &tpOpen) { - tpOpen.push_back (expsettings->get_expanded ()); - tpOpen.push_back (expcontrast->get_expanded ()); - tpOpen.push_back (expchroma->get_expanded ()); - tpOpen.push_back (exptoning->get_expanded ()); - tpOpen.push_back (expnoise->get_expanded ()); - tpOpen.push_back (expedge->get_expanded ()); - tpOpen.push_back (expgamut->get_expanded ()); - tpOpen.push_back (expresid->get_expanded ()); - tpOpen.push_back (expfinal->get_expanded ()); + tpOpen.push_back(expsettings->get_expanded()); + tpOpen.push_back(expcontrast->get_expanded()); + tpOpen.push_back(expchroma->get_expanded()); + tpOpen.push_back(exptoning->get_expanded()); + tpOpen.push_back(expnoise->get_expanded()); + tpOpen.push_back(expedge->get_expanded()); + tpOpen.push_back(expgamut->get_expanded()); + tpOpen.push_back(expresid->get_expanded()); + tpOpen.push_back(expfinal->get_expanded()); + tpOpen.push_back(expclari->get_expanded()); } void Wavelet::updateToolState(std::vector &tpOpen) { - if(tpOpen.size() >= 9) { + if (tpOpen.size() >= 10) { expsettings->set_expanded(tpOpen.at(0)); expcontrast->set_expanded(tpOpen.at(1)); expchroma->set_expanded(tpOpen.at(2)); @@ -3042,6 +3216,7 @@ void Wavelet::updateToolState(std::vector &tpOpen) expgamut->set_expanded(tpOpen.at(6)); expresid->set_expanded(tpOpen.at(7)); expfinal->set_expanded(tpOpen.at(8)); + expclari->set_expanded(tpOpen.at(9)); } } diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index 163395d52..59dde8039 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -63,6 +63,13 @@ public: void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) override; private: + rtengine::ProcEvent EvWavenaclari; + rtengine::ProcEvent EvWavushamet; + rtengine::ProcEvent EvWavmergeL; + rtengine::ProcEvent EvWavmergeC; + rtengine::ProcEvent EvWavsoftrad; + rtengine::ProcEvent EvWavsoftradend; + void foldAllButMe (GdkEventButton* event, MyExpander *expander); void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller) override; @@ -95,6 +102,7 @@ private: void tmrToggled (); void updatewavLabel (); void wavChanged (double nlevel) override; + void ushamethodChanged(); void HSmethodUpdateUI(); void CHmethodUpdateUI(); @@ -196,6 +204,11 @@ private: Adjuster* const edgedetectthr2; Adjuster* const edgesensi; Adjuster* const edgeampli; + Adjuster* const mergeL; + Adjuster* const mergeC; + Adjuster* const softrad; + Adjuster* const softradend; + MyComboBoxText* const Lmethod; sigc::connection Lmethodconn; MyComboBoxText* const CHmethod; @@ -224,6 +237,9 @@ private: sigc::connection Dirmethodconn; MyComboBoxText* const Medgreinf; sigc::connection MedgreinfConn; + MyComboBoxText* const ushamethod; + sigc::connection ushamethodconn; + Gtk::Frame* const chanMixerHLFrame; Gtk::Frame* const chanMixerMidFrame; Gtk::Frame* const chanMixerShadowsFrame; @@ -231,6 +247,7 @@ private: Gtk::Label* const wavLabels; Gtk::Label* const labmC; Gtk::Label* const labmNP; + Gtk::Label* const usharpLabel; MyExpander* const expchroma; MyExpander* const expcontrast; MyExpander* const expedge; @@ -240,10 +257,12 @@ private: MyExpander* const expresid; MyExpander* const expsettings; MyExpander* const exptoning; + MyExpander* const expclari; Gtk::HBox* const neutrHBox; + Gtk::HBox* const usharpHBox; - sigc::connection enableChromaConn, enableContrastConn, enableEdgeConn, enableFinalConn; + sigc::connection enableChromaConn, enableContrastConn, enableEdgeConn, enableFinalConn, enableclariConn; sigc::connection enableNoiseConn, enableResidConn, enableToningConn; sigc::connection medianConn, avoidConn, tmrConn, medianlevConn, linkedgConn, lipstConn, cbenabConn, neutralconn; sigc::connection neutralPressedConn; From 7ec1b27a91d7f8a19f35c9dc65e1365ee6358602 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 23 Mar 2019 12:45:44 +0100 Subject: [PATCH 002/154] Add show mask to Clarity --- rtdata/languages/default | 4 +- rtengine/dcrop.cc | 6 ++ rtengine/improccoordinator.cc | 5 ++ rtengine/procparams.cc | 4 ++ rtengine/procparams.h | 1 + rtengine/simpleprocess.cc | 7 ++- rtgui/paramsedited.cc | 6 ++ rtgui/paramsedited.h | 1 + rtgui/wavelet.cc | 103 ++++++++++++++++++++++++++++++---- rtgui/wavelet.h | 7 ++- 10 files changed, 130 insertions(+), 14 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 6e2124b21..5ae722656 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -786,6 +786,7 @@ HISTORY_MSG_WAVMERGEL;Merge L HISTORY_MSG_WAVMERGEC;Merge C HISTORY_MSG_WAVSOFTRAD;Soft radius clarity HISTORY_MSG_WAVSOFTRADEND;Soft radius final +HISTORY_MSG_WAVSHOWMASK;Show mask HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -2268,8 +2269,9 @@ TP_WAVELET_TMTYPE;Compression method TP_WAVELET_TON;Toning TP_WAVELET_USHARP;Clarity method TP_WAVELET_USH;None -TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, wavelet settings will be automatically positioned :\nBackground=black, Process=below, level=3...you can change level\nIf you select Clarity, wavelet settings will be automatically positioned :\nBackground=residual, Process=above, level=7..you can change level and wavelet levels +TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, wavelet settings will be automatically positioned :\nBackground=black, Process=below, level=3...you can change level\nIf you select Clarity, wavelet settings will be automatically positioned :\nBackground=residual, Process=above, level=7..you can change level and wavelet levels. TP_WAVELET_SHA;Sharp mask +TP_WAVELET_SHOWMASK;Show mask TP_WAVELET_CLA;Clarity TP_WAVELET_USHARP;Sharp method TP_WAVELET_USHARP_TOOLTIP;Origin : the source file is the file before Wavelet.\nWavelet : the source file is the file including wavelet threatment diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index f334a6d27..7d2d573ba 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -993,6 +993,12 @@ void Crop::update(int todo) Glib::ustring provis; LabImage *provradius = nullptr; + if(WaveParams.showmask) { + // WaveParams.showmask = false; + // WaveParams.expclari = true; + } + + if (WaveParams.softrad > 0.f) { provradius = new LabImage(labnCrop->W, labnCrop->H); provradius->CopyFrom(labnCrop); diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index c6207964f..1c5b1d5df 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -857,6 +857,11 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) Glib::ustring provis; LabImage *provradius = nullptr; + if(WaveParams.showmask) { + // WaveParams.showmask = false; + // WaveParams.expclari = true; + } + if (WaveParams.softrad > 0.f) { provradius = new LabImage(pW, pH); provradius->CopyFrom(nprevl); diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 1bbab3f74..6aa680a62 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2156,6 +2156,7 @@ WaveletParams::WaveletParams() : softradend(0.), lipst(false), avoid(false), + showmask(false), tmr(false), strength(100), balance(0), @@ -2251,6 +2252,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && softradend == other.softradend && lipst == other.lipst && avoid == other.avoid + && showmask == other.showmask && tmr == other.tmr && strength == other.strength && balance == other.balance @@ -3421,6 +3423,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.edgval, "Wavelet", "Edgval", wavelet.edgval, keyFile); saveToKeyfile(!pedited || pedited->wavelet.edgthresh, "Wavelet", "ThrEdg", wavelet.edgthresh, keyFile); saveToKeyfile(!pedited || pedited->wavelet.avoid, "Wavelet", "AvoidColorShift", wavelet.avoid, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.showmask, "Wavelet", "Showmask", wavelet.showmask, keyFile); saveToKeyfile(!pedited || pedited->wavelet.tmr, "Wavelet", "TMr", wavelet.tmr, keyFile); saveToKeyfile(!pedited || pedited->wavelet.rescon, "Wavelet", "ResidualcontShadow", wavelet.rescon, keyFile); saveToKeyfile(!pedited || pedited->wavelet.resconH, "Wavelet", "ResidualcontHighlight", wavelet.resconH, keyFile); @@ -4481,6 +4484,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "Softradend", pedited, wavelet.softradend, pedited->wavelet.softradend); assignFromKeyfile(keyFile, "Wavelet", "Lipst", pedited, wavelet.lipst, pedited->wavelet.lipst); assignFromKeyfile(keyFile, "Wavelet", "AvoidColorShift", pedited, wavelet.avoid, pedited->wavelet.avoid); + assignFromKeyfile(keyFile, "Wavelet", "Showmask", pedited, wavelet.showmask, pedited->wavelet.showmask); assignFromKeyfile(keyFile, "Wavelet", "TMr", pedited, wavelet.tmr, pedited->wavelet.tmr); if (ppVersion < 331) { // wavelet.Lmethod was a string before version 331 diff --git a/rtengine/procparams.h b/rtengine/procparams.h index f2328217a..1258ee05b 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1187,6 +1187,7 @@ struct WaveletParams { bool lipst; bool avoid; + bool showmask; bool tmr; int strength; int balance; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 52ab5a590..d4cdfc81e 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1129,7 +1129,12 @@ private: WavOpacityCurveW waOpacityCurveW; WavOpacityCurveWL waOpacityCurveWL; LabImage *provradius = nullptr; - +/* + if(WaveParams.showmask) { + WaveParams.showmask = false; + WaveParams.expclari = true; + } +*/ if (WaveParams.softrad > 0.f) { provradius = new LabImage(fw, fh); provradius->CopyFrom(labView); diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index cec0a5c92..6e9a6372c 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -480,6 +480,7 @@ void ParamsEdited::set(bool v) wavelet.Medgreinf = v; wavelet.ushamethod = v; wavelet.avoid = v; + wavelet.showmask = v; wavelet.tmr = v; wavelet.Lmethod = v; wavelet.CLmethod = v; @@ -1053,6 +1054,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.softradend = wavelet.softradend && p.wavelet.softradend == other.wavelet.softradend; wavelet.ushamethod = wavelet.ushamethod && p.wavelet.ushamethod == other.wavelet.ushamethod; wavelet.avoid = wavelet.avoid && p.wavelet.avoid == other.wavelet.avoid; + wavelet.showmask = wavelet.showmask && p.wavelet.showmask == other.wavelet.showmask; wavelet.tmr = wavelet.tmr && p.wavelet.tmr == other.wavelet.tmr; wavelet.Lmethod = wavelet.Lmethod && p.wavelet.Lmethod == other.wavelet.Lmethod; wavelet.CLmethod = wavelet.CLmethod && p.wavelet.CLmethod == other.wavelet.CLmethod; @@ -2846,6 +2848,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.avoid = mods.wavelet.avoid; } + if (wavelet.showmask) { + toEdit.wavelet.showmask = mods.wavelet.showmask; + } + if (wavelet.tmr) { toEdit.wavelet.tmr = mods.wavelet.tmr; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 13d575d90..366703fc7 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -477,6 +477,7 @@ struct WaveletParamsEdited { bool Medgreinf; bool ushamethod; bool avoid; + bool showmask; bool tmr; bool c[9]; bool ch[9]; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index a6660610f..cda404d2a 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -75,6 +75,7 @@ Wavelet::Wavelet() : lipst(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_LIPST")))), avoid(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_AVOID")))), tmr(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_BALCHRO")))), + showmask(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_SHOWMASK")))), neutralchButton(Gtk::manage(new Gtk::Button(M("TP_WAVELET_NEUTRAL")))), rescon(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCON"), -100, 100, 1, 0))), resconH(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCONH"), -100, 100, 1, 0))), @@ -161,6 +162,7 @@ Wavelet::Wavelet() : EvWavmergeC = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVMERGEC"); EvWavsoftrad = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSOFTRAD"); EvWavsoftradend = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSOFTRADEND"); + EvWavshowmask = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSHOWMASK"); expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings)); @@ -477,6 +479,8 @@ Wavelet::Wavelet() : mergeL->setAdjusterListener(this); mergeC->setAdjusterListener(this); softrad->setAdjusterListener(this); + showmask->set_active(false); + showmaskConn = showmask->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::showmaskToggled)); ToolParamBlock* const clariBox = Gtk::manage(new ToolParamBlock()); ushamethod->append(M("TP_WAVELET_USH")); @@ -491,6 +495,7 @@ Wavelet::Wavelet() : clariBox->pack_start(*mergeL); clariBox->pack_start(*mergeC); clariBox->pack_start(*softrad); + clariBox->pack_start(*showmask); // Edge Sharpness ToolParamBlock* const edgBox = Gtk::manage(new ToolParamBlock()); @@ -1159,6 +1164,9 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) avoidConn.block(true); avoid->set_active(pp->wavelet.avoid); avoidConn.block(false); + showmaskConn.block(true); + showmask->set_active(pp->wavelet.showmask); + showmaskConn.block(false); tmrConn.block(true); tmr->set_active(pp->wavelet.tmr); tmrConn.block(false); @@ -1188,6 +1196,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) lastcbenab = pp->wavelet.cbenab; lastlipst = pp->wavelet.lipst; lastavoid = pp->wavelet.avoid; + lastshowmask = pp->wavelet.showmask; lasttmr = pp->wavelet.tmr; rescon->setValue(pp->wavelet.rescon); resconH->setValue(pp->wavelet.resconH); @@ -1333,6 +1342,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) Chshape->setUnChanged(!pedited->wavelet.Chcurve); clshape->setUnChanged(!pedited->wavelet.wavclCurve); avoid->set_inconsistent(!pedited->wavelet.avoid); + showmask->set_inconsistent(!pedited->wavelet.showmask); tmr->set_inconsistent(!pedited->wavelet.tmr); edgthresh->setEditedState(pedited->wavelet.edgthresh ? Edited : UnEdited); rescon->setEditedState(pedited->wavelet.rescon ? Edited : UnEdited); @@ -1512,6 +1522,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.enabled = getEnabled(); pp->wavelet.avoid = avoid->get_active(); + pp->wavelet.showmask = showmask->get_active(); pp->wavelet.tmr = tmr->get_active(); pp->wavelet.rescon = rescon->getValue(); pp->wavelet.resconH = resconH->getValue(); @@ -1597,6 +1608,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) if (pedited) { pedited->wavelet.enabled = !get_inconsistent(); pedited->wavelet.avoid = !avoid->get_inconsistent(); + pedited->wavelet.showmask = !showmask->get_inconsistent(); pedited->wavelet.tmr = !tmr->get_inconsistent(); pedited->wavelet.median = !median->get_inconsistent(); pedited->wavelet.medianlev = !medianlev->get_inconsistent(); @@ -2342,14 +2354,14 @@ void Wavelet::ushamethodChanged() Dirmethod->set_active(3); Lmethod->set_sensitive(true); Dirmethod->set_sensitive(true); - } else if (ushamethod->get_active_row_number() == 0 || expclari->getEnabled() == false) { + } else if (ushamethod->get_active_row_number() == 0 || expclari->getEnabled() == false) { Backmethod->set_active(1); CLmethod->set_active(3); Lmethod->set_active(3); Dirmethod->set_active(3); Lmethod->set_sensitive(false); Dirmethod->set_sensitive(false); - } else if (expclari->getEnabled() == false) { + } else if (expclari->getEnabled() == false) { Backmethod->set_active(1); CLmethod->set_active(3); Lmethod->set_active(3); @@ -2975,6 +2987,72 @@ void Wavelet::avoidToggled() } } +void Wavelet::showmaskToggled() +{ + if (ushamethod->get_active_row_number() == 2 && showmask->get_active()) { + Backmethod->set_active(2); + CLmethod->set_active(2); + Lmethod->set_active(6); + Lmethod->set_sensitive(true); + Dirmethod->set_sensitive(true); + Dirmethod->set_active(3); + expclari->setEnabled(false); + + } else if (ushamethod->get_active_row_number() == 1 && showmask->get_active()) { + Backmethod->set_active(0); + CLmethod->set_active(1); + Lmethod->set_active(2); + Dirmethod->set_active(3); + Lmethod->set_sensitive(true); + Dirmethod->set_sensitive(true); + expclari->setEnabled(false); + + } + + if (ushamethod->get_active_row_number() == 2 && !showmask->get_active()) { + Backmethod->set_active(2); + CLmethod->set_active(2); + Lmethod->set_active(6); + Lmethod->set_sensitive(true); + Dirmethod->set_sensitive(true); + Dirmethod->set_active(3); + expclari->setEnabled(true); + + } else if (ushamethod->get_active_row_number() == 1 && !showmask->get_active()) { + Backmethod->set_active(0); + CLmethod->set_active(1); + Lmethod->set_active(2); + Dirmethod->set_active(3); + Lmethod->set_sensitive(true); + Dirmethod->set_sensitive(true); + expclari->setEnabled(true); + + } + + if (multiImage) { + if (showmask->get_inconsistent()) { + showmask->set_inconsistent(false); + showmaskConn.block(true); + showmask->set_active(false); + showmaskConn.block(false); + } else if (lastshowmask) { + showmask->set_inconsistent(true); + } + + lastshowmask = showmask->get_active(); + } + + if (listener && (multiImage || getEnabled())) { + if (showmask->get_inconsistent()) { + listener->panelChanged(EvWavshowmask, M("GENERAL_UNCHANGED")); + } else if (showmask->get_active()) { + listener->panelChanged(EvWavshowmask, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvWavshowmask, M("GENERAL_DISABLED")); + } + } +} + void Wavelet::tmrToggled() { @@ -3150,13 +3228,19 @@ void Wavelet::enableToggled(MyExpander *expander) event = EvWavenafin; } else if (expander == expclari) { if (expclari->getEnabled() == false) { - Backmethod->set_active(1); - CLmethod->set_active(3); - Lmethod->set_active(3); - Dirmethod->set_active(3); - Lmethod->set_sensitive(false); - Dirmethod->set_sensitive(false); - } else { + if (! showmask->get_active()) { + Backmethod->set_active(1); + CLmethod->set_active(3); + Lmethod->set_active(3); + Dirmethod->set_active(3); + Lmethod->set_sensitive(false); + Dirmethod->set_sensitive(false); + } + } else { + if (showmask->get_active()) { + showmask->set_active(false); + } + if (ushamethod->get_active_row_number() == 2) { Backmethod->set_active(2); CLmethod->set_active(2); @@ -3173,7 +3257,6 @@ void Wavelet::enableToggled(MyExpander *expander) Dirmethod->set_sensitive(true); } } - event = EvWavenaclari; } else // unknown expander, returning ! diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index 1e7a07fc6..7dee7e955 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -71,6 +71,7 @@ private: rtengine::ProcEvent EvWavmergeC; rtengine::ProcEvent EvWavsoftrad; rtengine::ProcEvent EvWavsoftradend; + rtengine::ProcEvent EvWavshowmask; void foldAllButMe (GdkEventButton* event, MyExpander *expander); @@ -89,6 +90,7 @@ private: void TMmethodChanged (); void TilesmethodChanged (); void avoidToggled (); + void showmaskToggled (); void cbenabToggled (); void contrastMinusPressed (); void contrastPlusPressed (); @@ -156,6 +158,7 @@ private: Gtk::CheckButton* const lipst; Gtk::CheckButton* const avoid; Gtk::CheckButton* const tmr; + Gtk::CheckButton* const showmask; Gtk::Button* const neutralchButton; Adjuster* correction[9]; @@ -266,13 +269,13 @@ private: sigc::connection enableChromaConn, enableContrastConn, enableEdgeConn, enableFinalConn, enableclariConn; sigc::connection enableNoiseConn, enableResidConn, enableToningConn; - sigc::connection medianConn, avoidConn, tmrConn, medianlevConn, linkedgConn, lipstConn, cbenabConn, neutralconn; + sigc::connection medianConn, avoidConn, tmrConn, medianlevConn, linkedgConn, lipstConn, cbenabConn, neutralconn, showmaskConn; sigc::connection neutralPressedConn; sigc::connection contrastPlusPressedConn; sigc::connection contrastMinusPressedConn; sigc::connection neutralchPressedConn; - bool lastmedian, lastmedianlev, lastlinkedg, lastavoid, lastlipst, lasttmr, lastcbenab; + bool lastmedian, lastmedianlev, lastlinkedg, lastavoid, lastlipst, lasttmr, lastcbenab, lastshowmask; int nextnlevel; IdleRegister idle_register; From 71cfb520a03900b760dee68f6458a286a5256544 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 23 Mar 2019 18:07:53 +0100 Subject: [PATCH 003/154] increase sensitivity of Soft radius clarity and shap mask --- rtengine/dcrop.cc | 4 ++-- rtengine/improccoordinator.cc | 4 ++-- rtengine/simpleprocess.cc | 4 ++-- rtgui/wavelet.cc | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 7d2d573ba..7ddf9ed8f 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -1067,8 +1067,8 @@ void Crop::update(int todo) guid[ir][jr] = provradius->L[ir][jr] / 32768.f; } - float blur = 10.f / skip * (0.1f + 0.8f * WaveParams.softrad); - rtengine::guidedFilter(guid, ble, ble, blur, 0.001, false); + float blur = 10.f / skip * (0.01f + 0.8f * WaveParams.softrad); + rtengine::guidedFilter(guid, ble, ble, blur, 0.0005, false); diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 1c5b1d5df..1f18a3527 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -940,9 +940,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) guid[ir][jr] = provradius->L[ir][jr] / 32768.f; } - float blur = 10.f / scale * (0.1f + 0.8f * WaveParams.softrad); + float blur = 10.f / scale * (0.01f + 0.8f * WaveParams.softrad); // rtengine::guidedFilter(guid, ble, ble, blur, 0.001, multiTh); - rtengine::guidedFilter(guid, ble, ble, blur, 0.001, false); + rtengine::guidedFilter(guid, ble, ble, blur, 0.0005, false); diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index d4cdfc81e..50badfdd6 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1211,9 +1211,9 @@ private: guid[ir][jr] = provradius->L[ir][jr] / 32768.f; } - float blur = 10.f / 1 * (0.1f + 0.8f * WaveParams.softrad); + float blur = 10.f / 1 * (0.01f + 0.8f * WaveParams.softrad); // rtengine::guidedFilter(guid, ble, ble, blur, 0.001, multiTh); - rtengine::guidedFilter(guid, ble, ble, blur, 0.001, false); + rtengine::guidedFilter(guid, ble, ble, blur, 0.0005, false); diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index cda404d2a..4397e1662 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -117,8 +117,8 @@ Wavelet::Wavelet() : edgeampli(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGEAMPLI"), 0, 100, 1, 10))), mergeL(Gtk::manage(new Adjuster(M("TP_WAVELET_MERGEL"), -50, 100, 1, 40))), mergeC(Gtk::manage(new Adjuster(M("TP_WAVELET_MERGEC"), -50, 100, 1, 20))), - softrad(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.1, 0.))), - softradend(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.1, 0.))), + softrad(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.01, 0.))), + softradend(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.01, 0.))), Lmethod(Gtk::manage(new MyComboBoxText())), CHmethod(Gtk::manage(new MyComboBoxText())), CHSLmethod(Gtk::manage(new MyComboBoxText())), From 3d62375623f39f51d85a614e07bad3d03bbfff28 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 24 Mar 2019 13:59:38 +0100 Subject: [PATCH 004/154] Improvment to Soft radius --- rtdata/languages/default | 4 ++-- rtengine/dcrop.cc | 11 ++++++++--- rtengine/improccoordinator.cc | 9 +++++++-- rtengine/ipwavelet.cc | 11 +++++++++-- rtengine/simpleprocess.cc | 9 +++++++-- 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 5ae722656..f21a40d24 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -786,7 +786,7 @@ HISTORY_MSG_WAVMERGEL;Merge L HISTORY_MSG_WAVMERGEC;Merge C HISTORY_MSG_WAVSOFTRAD;Soft radius clarity HISTORY_MSG_WAVSOFTRADEND;Soft radius final -HISTORY_MSG_WAVSHOWMASK;Show mask +HISTORY_MSG_WAVSHOWMASK;Show wavelet mask HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -2271,7 +2271,7 @@ TP_WAVELET_USHARP;Clarity method TP_WAVELET_USH;None TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, wavelet settings will be automatically positioned :\nBackground=black, Process=below, level=3...you can change level\nIf you select Clarity, wavelet settings will be automatically positioned :\nBackground=residual, Process=above, level=7..you can change level and wavelet levels. TP_WAVELET_SHA;Sharp mask -TP_WAVELET_SHOWMASK;Show mask +TP_WAVELET_SHOWMASK;Show wavelet 'mask' TP_WAVELET_CLA;Clarity TP_WAVELET_USHARP;Sharp method TP_WAVELET_USHARP_TOOLTIP;Origin : the source file is the file before Wavelet.\nWavelet : the source file is the file including wavelet threatment diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 7ddf9ed8f..21fca6153 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -1066,9 +1066,14 @@ void Crop::update(int todo) ble[ir][jr] = (labnCrop->L[ir][jr] - provradius->L[ir][jr]) / 32768.f; guid[ir][jr] = provradius->L[ir][jr] / 32768.f; } - - float blur = 10.f / skip * (0.01f + 0.8f * WaveParams.softrad); - rtengine::guidedFilter(guid, ble, ble, blur, 0.0005, false); + double epsilmax = 0.001; + double epsilmin = 0.0001; + double aepsil = (epsilmax - epsilmin) / 90.f; + double bepsil = epsilmax - 100.f * aepsil; + double epsil = aepsil * WaveParams.softrad + bepsil; + + float blur = 10.f / skip * (0.001f + 0.8f * WaveParams.softrad); + rtengine::guidedFilter(guid, ble, ble, blur, epsil, false); diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 1f18a3527..61736cdfb 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -939,10 +939,15 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) ble[ir][jr] = (nprevl->L[ir][jr] - provradius->L[ir][jr]) / 32768.f; guid[ir][jr] = provradius->L[ir][jr] / 32768.f; } + double epsilmax = 0.001; + double epsilmin = 0.0001; + double aepsil = (epsilmax - epsilmin) / 90.f; + double bepsil = epsilmax - 100.f * aepsil; + double epsil = aepsil * WaveParams.softrad + bepsil; - float blur = 10.f / scale * (0.01f + 0.8f * WaveParams.softrad); + float blur = 10.f / scale * (0.001f + 0.8f * WaveParams.softrad); // rtengine::guidedFilter(guid, ble, ble, blur, 0.001, multiTh); - rtengine::guidedFilter(guid, ble, ble, blur, 0.0005, false); + rtengine::guidedFilter(guid, ble, ble, blur, epsil, false); diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 8b5f33b74..b25e75b7a 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1286,9 +1286,16 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const guid[ir][jr] = provradius->L[ir][jr] / 32768.f; } - float blur = 10.f / skip * (0.1f + 0.1f * waparams.softradend); + // float blur = 10.f / skip * (0.1f + 0.1f * waparams.softradend); + double epsilmax = 0.001; + double epsilmin = 0.0001; + double aepsil = (epsilmax - epsilmin) / 90.f; + double bepsil = epsilmax - 100.f * aepsil; + double epsil = aepsil * waparams.softradend + bepsil; - rtengine::guidedFilter(guid, ble, ble, blur, 0.001, multiTh); + float blur = 10.f / scale * (0.001f + 0.8f * waparams.softradend); + + rtengine::guidedFilter(guid, ble, ble, blur, epsil, multiTh); diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 50badfdd6..fde5c8310 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1210,10 +1210,15 @@ private: ble[ir][jr] = (labView->L[ir][jr] - provradius->L[ir][jr]) / 32768.f; guid[ir][jr] = provradius->L[ir][jr] / 32768.f; } + double epsilmax = 0.001; + double epsilmin = 0.0001; + double aepsil = (epsilmax - epsilmin) / 90.f; + double bepsil = epsilmax - 100.f * aepsil; + double epsil = aepsil * WaveParams.softrad + bepsil; - float blur = 10.f / 1 * (0.01f + 0.8f * WaveParams.softrad); + float blur = 10.f / 1 * (0.001f + 0.8f * WaveParams.softrad); // rtengine::guidedFilter(guid, ble, ble, blur, 0.001, multiTh); - rtengine::guidedFilter(guid, ble, ble, blur, 0.0005, false); + rtengine::guidedFilter(guid, ble, ble, blur, epsil, false); From 5837f722a8e9a320061de6134dfabe704cf63c8c Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 3 Apr 2019 09:23:03 +0200 Subject: [PATCH 005/154] disabled showmask - improve GUI --- rtdata/languages/default | 2 +- rtengine/dcrop.cc | 4 ++-- rtengine/improccoordinator.cc | 4 ++-- rtengine/procparams.cc | 2 +- rtengine/simpleprocess.cc | 4 ++-- rtgui/wavelet.cc | 43 +++++++++++++++++++---------------- 6 files changed, 31 insertions(+), 28 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 8ab20b81c..126d1d693 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2277,7 +2277,7 @@ TP_WAVELET_TMTYPE;Compression method TP_WAVELET_TON;Toning TP_WAVELET_USHARP;Clarity method TP_WAVELET_USH;None -TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, wavelet settings will be automatically positioned :\nBackground=black, Process=below, level=3...you can change level\nIf you select Clarity, wavelet settings will be automatically positioned :\nBackground=residual, Process=above, level=7..you can change level and wavelet levels. +TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, wavelet settings will be automatically positioned :\nBackground=black, Process=below, level=3...you can change level.\n\nIf you select Clarity, wavelet settings will be automatically positioned :\nBackground=residual, Process=above, level=7..you can change level and wavelet levels. TP_WAVELET_SHA;Sharp mask TP_WAVELET_SHOWMASK;Show wavelet 'mask' TP_WAVELET_CLA;Clarity diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index b7fb38c8a..c13831468 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -1006,7 +1006,7 @@ void Crop::update(int todo) - if (WaveParams.ushamethod != "none" && WaveParams.expclari && WaveParams.CLmethod != "all") { + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { unshar = new LabImage(labnCrop->W, labnCrop->H); provis = params.wavelet.CLmethod; @@ -1020,7 +1020,7 @@ void Crop::update(int todo) parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); - if (WaveParams.ushamethod != "none" && WaveParams.expclari && WaveParams.CLmethod != "all") { + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { float mL = (float)(WaveParams.mergeL / 100.f); float mC = (float)(WaveParams.mergeC / 100.f); diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 61736cdfb..2790f93a2 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -870,7 +870,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) - if (WaveParams.ushamethod != "none" && WaveParams.expclari && WaveParams.CLmethod != "all") { + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { unshar = new LabImage(pW, pH); provis = params->wavelet.CLmethod; params->wavelet.CLmethod = "all"; @@ -884,7 +884,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); - if (WaveParams.ushamethod != "none" && WaveParams.expclari && WaveParams.CLmethod != "all") { + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { float mL = (float)(WaveParams.mergeL / 100.f); float mC = (float)(WaveParams.mergeC / 100.f); float mL0; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 6aa680a62..c60b8e8a0 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2178,7 +2178,7 @@ WaveletParams::WaveletParams() : daubcoeffmethod("4_"), CHmethod("without"), Medgreinf("less"), - ushamethod("none"), + ushamethod("clari"), CHSLmethod("SL"), EDmethod("CU"), NPmethod("none"), diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index fde5c8310..dcf66ca5e 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1144,7 +1144,7 @@ private: CurveFactory::curveWavContL(wavcontlutili, params.wavelet.wavclCurve, wavclCurve,/* hist16C, dummy,*/ 1); - if (WaveParams.ushamethod != "none" && WaveParams.expclari && WaveParams.CLmethod != "all") { + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { unshar = new LabImage(fw, fh); provis = params.wavelet.CLmethod; params.wavelet.CLmethod = "all"; @@ -1155,7 +1155,7 @@ private: ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); - if (WaveParams.ushamethod != "none" && WaveParams.expclari && WaveParams.CLmethod != "all") { + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { float mL = (float)(WaveParams.mergeL / 100.f); float mC = (float)(WaveParams.mergeC / 100.f); float mL0; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 4397e1662..1fc4143d0 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -117,8 +117,8 @@ Wavelet::Wavelet() : edgeampli(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGEAMPLI"), 0, 100, 1, 10))), mergeL(Gtk::manage(new Adjuster(M("TP_WAVELET_MERGEL"), -50, 100, 1, 40))), mergeC(Gtk::manage(new Adjuster(M("TP_WAVELET_MERGEC"), -50, 100, 1, 20))), - softrad(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.01, 0.))), - softradend(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.01, 0.))), + softrad(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.1, 0.))), + softradend(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.1, 0.))), Lmethod(Gtk::manage(new MyComboBoxText())), CHmethod(Gtk::manage(new MyComboBoxText())), CHSLmethod(Gtk::manage(new MyComboBoxText())), @@ -483,7 +483,7 @@ Wavelet::Wavelet() : showmaskConn = showmask->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::showmaskToggled)); ToolParamBlock* const clariBox = Gtk::manage(new ToolParamBlock()); - ushamethod->append(M("TP_WAVELET_USH")); + // ushamethod->append(M("TP_WAVELET_USH")); ushamethod->append(M("TP_WAVELET_SHA")); ushamethod->append(M("TP_WAVELET_CLA")); ushamethodconn = ushamethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::ushamethodChanged)); @@ -495,7 +495,7 @@ Wavelet::Wavelet() : clariBox->pack_start(*mergeL); clariBox->pack_start(*mergeC); clariBox->pack_start(*softrad); - clariBox->pack_start(*showmask); +// clariBox->pack_start(*showmask); // Edge Sharpness ToolParamBlock* const edgBox = Gtk::manage(new ToolParamBlock()); @@ -1038,12 +1038,13 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) } //ushamethod - if (pp->wavelet.ushamethod == "none") { +// if (pp->wavelet.ushamethod == "none") { +// ushamethod->set_active(0); + // } else + if (pp->wavelet.ushamethod == "sharp") { ushamethod->set_active(0); - } else if (pp->wavelet.ushamethod == "sharp") { - ushamethod->set_active(1); } else if (pp->wavelet.ushamethod == "clari") { - ushamethod->set_active(2); + ushamethod->set_active(1); } //CHSLmethod->set_active (1); @@ -1721,11 +1722,12 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.Medgreinf = "less"; } + // if (ushamethod->get_active_row_number() == 0) { + // pp->wavelet.ushamethod = "none"; + // } else if (ushamethod->get_active_row_number() == 0) { - pp->wavelet.ushamethod = "none"; - } else if (ushamethod->get_active_row_number() == 1) { pp->wavelet.ushamethod = "sharp"; - } else if (ushamethod->get_active_row_number() == 2) { + } else if (ushamethod->get_active_row_number() == 1) { pp->wavelet.ushamethod = "clari"; } @@ -2340,27 +2342,28 @@ void Wavelet::TilesmethodUpdateUI() { void Wavelet::ushamethodChanged() { - if (ushamethod->get_active_row_number() == 2 && expclari->getEnabled() == true) { + if (ushamethod->get_active_row_number() == 1 && expclari->getEnabled() == true) { Backmethod->set_active(2); CLmethod->set_active(2); Lmethod->set_active(6); Lmethod->set_sensitive(true); Dirmethod->set_sensitive(true); Dirmethod->set_active(3); - } else if (ushamethod->get_active_row_number() == 1 && expclari->getEnabled() == true) { + } else if (ushamethod->get_active_row_number() == 0 && expclari->getEnabled() == true) { Backmethod->set_active(0); CLmethod->set_active(1); Lmethod->set_active(2); Dirmethod->set_active(3); Lmethod->set_sensitive(true); Dirmethod->set_sensitive(true); - } else if (ushamethod->get_active_row_number() == 0 || expclari->getEnabled() == false) { + /* } else if (ushamethod->get_active_row_number() == 0 || expclari->getEnabled() == false) { Backmethod->set_active(1); CLmethod->set_active(3); Lmethod->set_active(3); Dirmethod->set_active(3); Lmethod->set_sensitive(false); Dirmethod->set_sensitive(false); + */ } else if (expclari->getEnabled() == false) { Backmethod->set_active(1); CLmethod->set_active(3); @@ -2989,7 +2992,7 @@ void Wavelet::avoidToggled() void Wavelet::showmaskToggled() { - if (ushamethod->get_active_row_number() == 2 && showmask->get_active()) { + if (ushamethod->get_active_row_number() == 1 && showmask->get_active()) { Backmethod->set_active(2); CLmethod->set_active(2); Lmethod->set_active(6); @@ -2998,7 +3001,7 @@ void Wavelet::showmaskToggled() Dirmethod->set_active(3); expclari->setEnabled(false); - } else if (ushamethod->get_active_row_number() == 1 && showmask->get_active()) { + } else if (ushamethod->get_active_row_number() == 0 && showmask->get_active()) { Backmethod->set_active(0); CLmethod->set_active(1); Lmethod->set_active(2); @@ -3009,7 +3012,7 @@ void Wavelet::showmaskToggled() } - if (ushamethod->get_active_row_number() == 2 && !showmask->get_active()) { + if (ushamethod->get_active_row_number() == 1 && !showmask->get_active()) { Backmethod->set_active(2); CLmethod->set_active(2); Lmethod->set_active(6); @@ -3018,7 +3021,7 @@ void Wavelet::showmaskToggled() Dirmethod->set_active(3); expclari->setEnabled(true); - } else if (ushamethod->get_active_row_number() == 1 && !showmask->get_active()) { + } else if (ushamethod->get_active_row_number() == 0 && !showmask->get_active()) { Backmethod->set_active(0); CLmethod->set_active(1); Lmethod->set_active(2); @@ -3241,14 +3244,14 @@ void Wavelet::enableToggled(MyExpander *expander) showmask->set_active(false); } - if (ushamethod->get_active_row_number() == 2) { + if (ushamethod->get_active_row_number() == 1) { Backmethod->set_active(2); CLmethod->set_active(2); Lmethod->set_active(6); Lmethod->set_sensitive(true); Dirmethod->set_sensitive(true); Dirmethod->set_active(3); - } else if (ushamethod->get_active_row_number() == 1) { + } else if (ushamethod->get_active_row_number() == 0) { Backmethod->set_active(0); CLmethod->set_active(1); Lmethod->set_active(2); From 516e05fa6138cb722a976e047ba66f6fe0ba839b Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 29 Apr 2019 07:45:26 +0200 Subject: [PATCH 006/154] Suppress grey image when chnanging Clarity --- rtengine/cplx_wavelet_filter_coeffs.h | 6 +++++- rtengine/dcrop.cc | 5 +++++ rtengine/improccoordinator.cc | 5 +++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/rtengine/cplx_wavelet_filter_coeffs.h b/rtengine/cplx_wavelet_filter_coeffs.h index bd333d4b9..629bbe659 100644 --- a/rtengine/cplx_wavelet_filter_coeffs.h +++ b/rtengine/cplx_wavelet_filter_coeffs.h @@ -49,6 +49,10 @@ const float Daub4_anal16[2][16] ALIGNED16 = {//Daub 14 { -0.0002501134f, -0.0012739524f, -0.0003037575f, 0.008874895f, 0.01171997f , -0.026891225f, -0.057001725f, 0.05042335f, 0.158417505f, -0.10175691f, -0.33218624f, 0.515574245f, -0.28039564f, 0.055049715f, 0.f, 0.f} }; -// if necessary ?? we can add D20 !! +const float Daub4_anal22[2][22] ALIGNED16 = {//Daub 20 + {0.f, 0.f, 0.01885858f, 0.13306109f, 0.37278754f, 0.48681406f, 0.19881887f, -0.1766681f, -0.13855494f, 0.09006372f, 0.0658015f, -0.05048328f, -0.02082962f, 0.0234849f, 0.002550222f, -0.0075895, 0.0009866627f, 0.001408843f, -0.0004849739f, -0.0000823545f, 0.00006617734f, -0.0000093792f}, + {0.0000093792f, -0.00006617734f, 0.0000823545f, 0.0004849739f, -0.001408843f, -0.0009866627f, 0.0075895, -0.002550222f, -0.0234849f, 0.02082962f, 0.05048328f, -0.0658015f, -0.09006372f, 0.13855494f, 0.1766681f, -0.19881887f, -0.48681406f, -0.37278754f, -0.13306109f, -0.01885858f, 0.f, 0.f} +}; + } diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index c13831468..4550eac52 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -1018,6 +1018,11 @@ void Crop::update(int todo) } + if (!WaveParams.expclari && WaveParams.CLmethod != "all") { + params.wavelet.CLmethod = "all"; + params.wavelet.Backmethod = "grey"; + } + parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 2790f93a2..c64fe9746 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -882,6 +882,11 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } + if (!WaveParams.expclari && WaveParams.CLmethod != "all") { + params->wavelet.CLmethod = "all"; + params->wavelet.Backmethod = "grey"; + } + ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { From f8b9e2618c93a011f658ce7313f06e84801db743 Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 29 Apr 2019 08:10:51 +0200 Subject: [PATCH 007/154] Comment variable in cplx_wavelet_filter --- rtengine/cplx_wavelet_filter_coeffs.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/cplx_wavelet_filter_coeffs.h b/rtengine/cplx_wavelet_filter_coeffs.h index 629bbe659..44a60d57a 100644 --- a/rtengine/cplx_wavelet_filter_coeffs.h +++ b/rtengine/cplx_wavelet_filter_coeffs.h @@ -48,11 +48,11 @@ const float Daub4_anal16[2][16] ALIGNED16 = {//Daub 14 {0.f, 0.f, 0.055049715f, 0.28039564f, 0.515574245f, 0.33218624f, -0.10175691f, -0.158417505f, 0.05042335f, 0.057001725f, -0.026891225f, -0.01171997f, 0.008874895f, 0.0003037575f, -0.0012739524f, 0.0002501134f}, { -0.0002501134f, -0.0012739524f, -0.0003037575f, 0.008874895f, 0.01171997f , -0.026891225f, -0.057001725f, 0.05042335f, 0.158417505f, -0.10175691f, -0.33218624f, 0.515574245f, -0.28039564f, 0.055049715f, 0.f, 0.f} }; - +/* const float Daub4_anal22[2][22] ALIGNED16 = {//Daub 20 {0.f, 0.f, 0.01885858f, 0.13306109f, 0.37278754f, 0.48681406f, 0.19881887f, -0.1766681f, -0.13855494f, 0.09006372f, 0.0658015f, -0.05048328f, -0.02082962f, 0.0234849f, 0.002550222f, -0.0075895, 0.0009866627f, 0.001408843f, -0.0004849739f, -0.0000823545f, 0.00006617734f, -0.0000093792f}, {0.0000093792f, -0.00006617734f, 0.0000823545f, 0.0004849739f, -0.001408843f, -0.0009866627f, 0.0075895, -0.002550222f, -0.0234849f, 0.02082962f, 0.05048328f, -0.0658015f, -0.09006372f, 0.13855494f, 0.1766681f, -0.19881887f, -0.48681406f, -0.37278754f, -0.13306109f, -0.01885858f, 0.f, 0.f} }; - +*/ } From f5eedc404d3aadd704fd1cea20e8d6b6b9fe7f88 Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 10 May 2019 07:43:53 +0200 Subject: [PATCH 008/154] disable GUI background and process if clarity is selected --- rtengine/cplx_wavelet_filter_coeffs.h | 6 +++--- rtgui/wavelet.cc | 12 ++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/rtengine/cplx_wavelet_filter_coeffs.h b/rtengine/cplx_wavelet_filter_coeffs.h index 44a60d57a..371f834a1 100644 --- a/rtengine/cplx_wavelet_filter_coeffs.h +++ b/rtengine/cplx_wavelet_filter_coeffs.h @@ -49,9 +49,9 @@ const float Daub4_anal16[2][16] ALIGNED16 = {//Daub 14 { -0.0002501134f, -0.0012739524f, -0.0003037575f, 0.008874895f, 0.01171997f , -0.026891225f, -0.057001725f, 0.05042335f, 0.158417505f, -0.10175691f, -0.33218624f, 0.515574245f, -0.28039564f, 0.055049715f, 0.f, 0.f} }; /* -const float Daub4_anal22[2][22] ALIGNED16 = {//Daub 20 - {0.f, 0.f, 0.01885858f, 0.13306109f, 0.37278754f, 0.48681406f, 0.19881887f, -0.1766681f, -0.13855494f, 0.09006372f, 0.0658015f, -0.05048328f, -0.02082962f, 0.0234849f, 0.002550222f, -0.0075895, 0.0009866627f, 0.001408843f, -0.0004849739f, -0.0000823545f, 0.00006617734f, -0.0000093792f}, - {0.0000093792f, -0.00006617734f, 0.0000823545f, 0.0004849739f, -0.001408843f, -0.0009866627f, 0.0075895, -0.002550222f, -0.0234849f, 0.02082962f, 0.05048328f, -0.0658015f, -0.09006372f, 0.13855494f, 0.1766681f, -0.19881887f, -0.48681406f, -0.37278754f, -0.13306109f, -0.01885858f, 0.f, 0.f} +const double Daub4_anal22[2][22] ALIGNED16 = {//Daub 20 + {0., 0., 0.01885858, 0.13306109, 0.37278754, 0.48681406, 0.19881887, -0.1766681, -0.13855494, 0.09006372, 0.0658015, -0.05048328, -0.02082962, 0.0234849, 0.0025502185, -0.0075895, 0.0009866625, 0.0014088433, -0.00048497392, -0.0000823545, 0.00006617718, -0.000009379205}, + {0.000009379205, -0.00006617718, 0.0000823545, 0.00048497392, -0.0014088433, -0.0009866627, 0.0075895, -0.0025502185, -0.0234849, 0.02082962, 0.05048328, -0.0658015, -0.09006372, 0.13855494, 0.1766681, -0.19881887, -0.48681406, -0.37278754, -0.13306109, -0.01885858, 0., 0.} }; */ } diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 1fc4143d0..7e4d41501 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -2349,6 +2349,8 @@ void Wavelet::ushamethodChanged() Lmethod->set_sensitive(true); Dirmethod->set_sensitive(true); Dirmethod->set_active(3); + CLmethod->set_sensitive(false); + Backmethod->set_sensitive(false); } else if (ushamethod->get_active_row_number() == 0 && expclari->getEnabled() == true) { Backmethod->set_active(0); CLmethod->set_active(1); @@ -2356,6 +2358,8 @@ void Wavelet::ushamethodChanged() Dirmethod->set_active(3); Lmethod->set_sensitive(true); Dirmethod->set_sensitive(true); + CLmethod->set_sensitive(false); + Backmethod->set_sensitive(false); /* } else if (ushamethod->get_active_row_number() == 0 || expclari->getEnabled() == false) { Backmethod->set_active(1); CLmethod->set_active(3); @@ -2371,6 +2375,8 @@ void Wavelet::ushamethodChanged() Dirmethod->set_active(3); Lmethod->set_sensitive(false); Dirmethod->set_sensitive(false); + CLmethod->set_sensitive(true); + Backmethod->set_sensitive(true); } if (listener && (multiImage || getEnabled())) { @@ -3238,6 +3244,8 @@ void Wavelet::enableToggled(MyExpander *expander) Dirmethod->set_active(3); Lmethod->set_sensitive(false); Dirmethod->set_sensitive(false); + CLmethod->set_sensitive(true); + Backmethod->set_sensitive(true); } } else { if (showmask->get_active()) { @@ -3251,6 +3259,8 @@ void Wavelet::enableToggled(MyExpander *expander) Lmethod->set_sensitive(true); Dirmethod->set_sensitive(true); Dirmethod->set_active(3); + CLmethod->set_sensitive(false); + Backmethod->set_sensitive(false); } else if (ushamethod->get_active_row_number() == 0) { Backmethod->set_active(0); CLmethod->set_active(1); @@ -3258,6 +3268,8 @@ void Wavelet::enableToggled(MyExpander *expander) Dirmethod->set_active(3); Lmethod->set_sensitive(true); Dirmethod->set_sensitive(true); + CLmethod->set_sensitive(false); + Backmethod->set_sensitive(false); } } event = EvWavenaclari; From 744ca10eccef478ef26f44f4a5bb7091824a2740 Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 13 May 2019 16:18:37 +0200 Subject: [PATCH 009/154] Improve clarity --- rtengine/dcrop.cc | 25 +++++++++++++++++++++++ rtengine/improccoordinator.cc | 37 ++++++++++++++++++++++++----------- rtengine/simpleprocess.cc | 25 +++++++++++++++++++++++ 3 files changed, 76 insertions(+), 11 deletions(-) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 4550eac52..8aafac91c 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -992,6 +992,12 @@ void Crop::update(int todo) LabImage *unshar = nullptr; Glib::ustring provis; LabImage *provradius = nullptr; + bool procont = WaveParams.expcontrast; + bool prochro = WaveParams.expchroma; + bool proedge = WaveParams.expedge; + bool profin = WaveParams.expfinal; + bool proton = WaveParams.exptoning; + bool pronois = WaveParams.expnoise; if(WaveParams.showmask) { // WaveParams.showmask = false; @@ -1023,8 +1029,27 @@ void Crop::update(int todo) params.wavelet.Backmethod = "grey"; } + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { + WaveParams.expcontrast = false; + WaveParams.expchroma = false; + WaveParams.expedge = false; + WaveParams.expfinal = false; + WaveParams.exptoning = false; + WaveParams.expnoise = false; + } + parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { + WaveParams.expcontrast = procont; + WaveParams.expchroma = prochro; + WaveParams.expedge = proedge; + WaveParams.expfinal = profin; + WaveParams.exptoning = proton; + WaveParams.expnoise = pronois; + } + + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { float mL = (float)(WaveParams.mergeL / 100.f); diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index c64fe9746..a4e95aacf 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -856,6 +856,12 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) LabImage *unshar = nullptr; Glib::ustring provis; LabImage *provradius = nullptr; + bool procont = WaveParams.expcontrast; + bool prochro = WaveParams.expchroma; + bool proedge = WaveParams.expedge; + bool profin = WaveParams.expfinal; + bool proton = WaveParams.exptoning; + bool pronois = WaveParams.expnoise; if(WaveParams.showmask) { // WaveParams.showmask = false; @@ -887,8 +893,27 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) params->wavelet.Backmethod = "grey"; } + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { + WaveParams.expcontrast = false; + WaveParams.expchroma = false; + WaveParams.expedge = false; + WaveParams.expfinal = false; + WaveParams.exptoning = false; + WaveParams.expnoise = false; + } + ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); + + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { + WaveParams.expcontrast = procont; + WaveParams.expchroma = prochro; + WaveParams.expedge = proedge; + WaveParams.expfinal = profin; + WaveParams.exptoning = proton; + WaveParams.expnoise = pronois; + } + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { float mL = (float)(WaveParams.mergeL / 100.f); float mC = (float)(WaveParams.mergeC / 100.f); @@ -924,17 +949,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if (WaveParams.softrad > 0.f) { array2D ble(pW, pH); array2D guid(pW, pH); - /* - #ifdef _OPENMP - const int numThreads = omp_get_max_threads(); - #endif - - bool multiTh = false; - - if (numThreads > 1) { - multiTh = true; - } - */ #ifdef _OPENMP #pragma omp parallel for #endif @@ -973,6 +987,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } + } ipf.softLight(nprevl); diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index dcf66ca5e..dbc2f9168 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1129,6 +1129,13 @@ private: WavOpacityCurveW waOpacityCurveW; WavOpacityCurveWL waOpacityCurveWL; LabImage *provradius = nullptr; + bool procont = WaveParams.expcontrast; + bool prochro = WaveParams.expchroma; + bool proedge = WaveParams.expedge; + bool profin = WaveParams.expfinal; + bool proton = WaveParams.exptoning; + bool pronois = WaveParams.expnoise; + /* if(WaveParams.showmask) { WaveParams.showmask = false; @@ -1153,8 +1160,26 @@ private: params.wavelet.CLmethod = provis; } + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { + WaveParams.expcontrast = false; + WaveParams.expchroma = false; + WaveParams.expedge = false; + WaveParams.expfinal = false; + WaveParams.exptoning = false; + WaveParams.expnoise = false; + } + ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { + WaveParams.expcontrast = procont; + WaveParams.expchroma = prochro; + WaveParams.expedge = proedge; + WaveParams.expfinal = profin; + WaveParams.exptoning = proton; + WaveParams.expnoise = pronois; + } + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { float mL = (float)(WaveParams.mergeL / 100.f); float mC = (float)(WaveParams.mergeC / 100.f); From 14dc398c4d69b0cb47bacfb88465a75fe36f8f82 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 14 May 2019 10:55:48 +0200 Subject: [PATCH 010/154] Improvment to softradius clarity --- rtengine/dcrop.cc | 71 +++++++++++++------------- rtengine/improccoordinator.cc | 45 +++++++++++++++-- rtengine/simpleprocess.cc | 93 ++++++++++++++++++----------------- 3 files changed, 123 insertions(+), 86 deletions(-) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 8aafac91c..2d584eb8c 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -1046,7 +1046,41 @@ void Crop::update(int todo) WaveParams.expedge = proedge; WaveParams.expfinal = profin; WaveParams.exptoning = proton; - WaveParams.expnoise = pronois; + WaveParams.expnoise = pronois; + if (WaveParams.softrad > 0.f) { + array2D ble(labnCrop->W, labnCrop->H); + array2D guid(labnCrop->W, labnCrop->H); + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < labnCrop->H ; ir++) + for (int jr = 0; jr < labnCrop->W; jr++) { + ble[ir][jr] = (labnCrop->L[ir][jr]) / 32768.f; + guid[ir][jr] = provradius->L[ir][jr] / 32768.f; + } + double epsilmax = 0.0001; + double epsilmin = 0.00001; + double aepsil = (epsilmax - epsilmin) / 90.f; + double bepsil = epsilmax - 100.f * aepsil; + double epsil = aepsil * WaveParams.softrad + bepsil; + + float blur = 10.f / skip * (0.0001f + 0.8f * WaveParams.softrad); + rtengine::guidedFilter(guid, ble, ble, blur, epsil, false); + + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < labnCrop->H; ir++) + for (int jr = 0; jr < labnCrop->W; jr++) { + labnCrop->L[ir][jr] = 32768.f * ble[ir][jr]; + } + } + } @@ -1082,41 +1116,6 @@ void Crop::update(int todo) delete unshar; unshar = NULL; - - if (WaveParams.softrad > 0.f) { - array2D ble(labnCrop->W, labnCrop->H); - array2D guid(labnCrop->W, labnCrop->H); - -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int ir = 0; ir < labnCrop->H ; ir++) - for (int jr = 0; jr < labnCrop->W; jr++) { - ble[ir][jr] = (labnCrop->L[ir][jr] - provradius->L[ir][jr]) / 32768.f; - guid[ir][jr] = provradius->L[ir][jr] / 32768.f; - } - double epsilmax = 0.001; - double epsilmin = 0.0001; - double aepsil = (epsilmax - epsilmin) / 90.f; - double bepsil = epsilmax - 100.f * aepsil; - double epsil = aepsil * WaveParams.softrad + bepsil; - - float blur = 10.f / skip * (0.001f + 0.8f * WaveParams.softrad); - rtengine::guidedFilter(guid, ble, ble, blur, epsil, false); - - - -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int ir = 0; ir < labnCrop->H; ir++) - for (int jr = 0; jr < labnCrop->W; jr++) { - labnCrop->L[ir][jr] = provradius->L[ir][jr] + 32768.f * ble[ir][jr]; - } - } - if (WaveParams.softrad > 0.f) { delete provradius; provradius = NULL; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index a4e95aacf..12929ae25 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -911,7 +911,42 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) WaveParams.expedge = proedge; WaveParams.expfinal = profin; WaveParams.exptoning = proton; - WaveParams.expnoise = pronois; + WaveParams.expnoise = pronois; + + if (WaveParams.softrad > 0.f) { + array2D ble(pW, pH); + array2D guid(pW, pH); +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < pH; ir++) + for (int jr = 0; jr < pW; jr++) { + ble[ir][jr] = (nprevl->L[ir][jr]) / 32768.f; + guid[ir][jr] = provradius->L[ir][jr] / 32768.f; + } + double epsilmax = 0.0001; + double epsilmin = 0.00001; + double aepsil = (epsilmax - epsilmin) / 90.f; + double bepsil = epsilmax - 100.f * aepsil; + double epsil = aepsil * WaveParams.softrad + bepsil; + + float blur = 10.f / scale * (0.0001f + 0.8f * WaveParams.softrad); + // rtengine::guidedFilter(guid, ble, ble, blur, 0.001, multiTh); + rtengine::guidedFilter(guid, ble, ble, blur, epsil, false); + + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < pH; ir++) + for (int jr = 0; jr < pW; jr++) { + nprevl->L[ir][jr] = 32768.f * ble[ir][jr]; + } + } + } if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { @@ -920,6 +955,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) float mL0; float mC0; + + if ((WaveParams.CLmethod == "one" || WaveParams.CLmethod == "inf") && WaveParams.Backmethod == "black") { mL0 = mC0 = 0.f; mL = -mL; @@ -945,7 +982,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) delete unshar; unshar = NULL; - +/* if (WaveParams.softrad > 0.f) { array2D ble(pW, pH); array2D guid(pW, pH); @@ -979,7 +1016,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) nprevl->L[ir][jr] = provradius->L[ir][jr] + 32768.f * ble[ir][jr]; } } - +*/ if (WaveParams.softrad > 0.f) { delete provradius; provradius = NULL; @@ -987,7 +1024,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } - + } ipf.softLight(nprevl); diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index dbc2f9168..7b7361c91 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1177,7 +1177,53 @@ private: WaveParams.expedge = proedge; WaveParams.expfinal = profin; WaveParams.exptoning = proton; - WaveParams.expnoise = pronois; + WaveParams.expnoise = pronois; + + if (WaveParams.softrad > 0.f) { + array2D ble(fw, fh); + array2D guid(fw, fh); + /* + #ifdef _OPENMP + const int numThreads = omp_get_max_threads(); + #endif + + bool multiTh = false; + + if (numThreads > 1) { + multiTh = true; + } + */ +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < fh; ir++) + for (int jr = 0; jr < fw; jr++) { + ble[ir][jr] = (labView->L[ir][jr]) / 32768.f; + guid[ir][jr] = provradius->L[ir][jr] / 32768.f; + } + double epsilmax = 0.0001; + double epsilmin = 0.00001; + double aepsil = (epsilmax - epsilmin) / 90.f; + double bepsil = epsilmax - 100.f * aepsil; + double epsil = aepsil * WaveParams.softrad + bepsil; + + float blur = 10.f / 1 * (0.0001f + 0.8f * WaveParams.softrad); + // rtengine::guidedFilter(guid, ble, ble, blur, 0.001, multiTh); + rtengine::guidedFilter(guid, ble, ble, blur, epsil, false); + + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < fh; ir++) + for (int jr = 0; jr < fw; jr++) { + labView->L[ir][jr] = 32768.f * ble[ir][jr]; + } + } + } if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { @@ -1212,51 +1258,6 @@ private: delete unshar; unshar = NULL; - if (WaveParams.softrad > 0.f) { - array2D ble(fw, fh); - array2D guid(fw, fh); - /* - #ifdef _OPENMP - const int numThreads = omp_get_max_threads(); - #endif - - bool multiTh = false; - - if (numThreads > 1) { - multiTh = true; - } - */ -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int ir = 0; ir < fh; ir++) - for (int jr = 0; jr < fw; jr++) { - ble[ir][jr] = (labView->L[ir][jr] - provradius->L[ir][jr]) / 32768.f; - guid[ir][jr] = provradius->L[ir][jr] / 32768.f; - } - double epsilmax = 0.001; - double epsilmin = 0.0001; - double aepsil = (epsilmax - epsilmin) / 90.f; - double bepsil = epsilmax - 100.f * aepsil; - double epsil = aepsil * WaveParams.softrad + bepsil; - - float blur = 10.f / 1 * (0.001f + 0.8f * WaveParams.softrad); - // rtengine::guidedFilter(guid, ble, ble, blur, 0.001, multiTh); - rtengine::guidedFilter(guid, ble, ble, blur, epsil, false); - - - -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int ir = 0; ir < fh; ir++) - for (int jr = 0; jr < fw; jr++) { - labView->L[ir][jr] = provradius->L[ir][jr] + 32768.f * ble[ir][jr]; - } - } - if (WaveParams.softrad > 0.f) { delete provradius; provradius = NULL; From 1ee64dcdb6a103141d54239638571c53e4308a4d Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 15 May 2019 13:37:38 +0200 Subject: [PATCH 011/154] Improve general soft --- rtengine/ipwavelet.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index b25e75b7a..31b215f02 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1282,11 +1282,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const for (int ir = 0; ir < lab->H; ir++) for (int jr = 0; jr < lab->W; jr++) { - ble[ir][jr] = (dst->L[ir][jr] - provradius->L[ir][jr]) / 32768.f; + ble[ir][jr] = dst->L[ir][jr] / 32768.f; guid[ir][jr] = provradius->L[ir][jr] / 32768.f; } - // float blur = 10.f / skip * (0.1f + 0.1f * waparams.softradend); double epsilmax = 0.001; double epsilmin = 0.0001; double aepsil = (epsilmax - epsilmin) / 90.f; @@ -1305,7 +1304,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const for (int ir = 0; ir < lab->H; ir++) for (int jr = 0; jr < lab->W; jr++) { - dst->L[ir][jr] = provradius->L[ir][jr] + 32768.f * ble[ir][jr]; + dst->L[ir][jr] = 32768.f * ble[ir][jr]; } } From fc9867eb2db7f2cda9965409bcb605772ac2d251 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 21 May 2019 07:48:18 +0200 Subject: [PATCH 012/154] Improvment to residual image --- rtdata/languages/default | 6 +++- rtengine/improcfun.cc | 8 ++--- rtengine/ipwavelet.cc | 8 +++-- rtengine/procparams.cc | 8 +++++ rtengine/procparams.h | 2 ++ rtgui/addsetids.h | 2 ++ rtgui/batchtoolpanelcoord.cc | 6 ++-- rtgui/epd.cc | 12 +++---- rtgui/paramsedited.cc | 12 +++++++ rtgui/paramsedited.h | 2 ++ rtgui/preferences.cc | 2 ++ rtgui/wavelet.cc | 63 +++++++++++++++++++++++++++++++++--- rtgui/wavelet.h | 6 +++- 13 files changed, 115 insertions(+), 22 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 8cad97db8..2c478a23a 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -781,6 +781,8 @@ HISTORY_MSG_WAVMERGEC;Merge C HISTORY_MSG_WAVSOFTRAD;Soft radius clarity HISTORY_MSG_WAVSOFTRADEND;Soft radius final HISTORY_MSG_WAVSHOWMASK;Show wavelet mask +HISTORY_MSG_WAVEDGS;Edge stopping +HISTORY_MSG_WAVSCALE;Scale HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -2228,8 +2230,10 @@ TP_WAVELET_TILESIZE;Tiling method TP_WAVELET_TILESLIT;Little tiles TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements. TP_WAVELET_TMSTRENGTH;Compression strength -TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out. +TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. TP_WAVELET_TMTYPE;Compression method +TP_WAVELET_TMEDGS;Edge stopping +TP_WAVELET_TMSCALE;Scale TP_WAVELET_TON;Toning TP_WAVELET_USHARP;Clarity method TP_WAVELET_USH;None diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index f63313126..bb7c0ac6b 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -5126,11 +5126,11 @@ void ImProcFunctions::EPDToneMapCIE (CieImage *ncie, float a_w, float c_, int Wi if (!params->epd.enabled) { return; } - +/* if (params->wavelet.enabled && params->wavelet.tmrs != 0) { return; } - +*/ float stren = params->epd.strength; float edgest = params->epd.edgeStopping; float sca = params->epd.scale; @@ -5240,11 +5240,11 @@ void ImProcFunctions::EPDToneMap (LabImage *lab, unsigned int Iterates, int skip if (!params->epd.enabled) { return; } - +/* if (params->wavelet.enabled && params->wavelet.tmrs != 0) { return; } - +*/ float stren = params->epd.strength; float edgest = params->epd.edgeStopping; float sca = params->epd.scale; diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 3c51d8f18..af8adca90 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1590,8 +1590,8 @@ void ImProcFunctions::EPDToneMapResid(float * WavCoeffs_L0, unsigned int Iterat float stren = cp.tmstrength; - float edgest = params->epd.edgeStopping; - float sca = params->epd.scale; + float edgest = params->wavelet.edgs; + float sca = params->wavelet.scale; float gamm = params->wavelet.gamma; float rew = params->epd.reweightingIterates; EdgePreservingDecomposition epd2(W_L, H_L); @@ -1769,6 +1769,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * { if (contrast != 0.f && cp.resena && max0 > 0.0) { // contrast = 0.f means that all will be multiplied by 1.f, so we can skip this step { + // #ifdef _OPENMP #pragma omp for #endif @@ -1794,7 +1795,8 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } } } - + +// if (cp.tonemap && cp.contmet == 1 && cp.resena) { float maxp = max0 * 256.f; float minp = min0 * 256.f; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index c60b8e8a0..1fa4d62a4 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2190,6 +2190,8 @@ WaveletParams::WaveletParams() : resconH(0), reschro(0), tmrs(0), + edgs(1.4), + scale(1.), gamma(1), sup(0), sky(0.0), @@ -2293,6 +2295,8 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && resconH == other.resconH && reschro == other.reschro && tmrs == other.tmrs + && edgs == other.edgs + && scale == other.scale && gamma == other.gamma && sup == other.sup && sky == other.sky @@ -3431,6 +3435,8 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.thrH, "Wavelet", "ThresholdResidHighLight", wavelet.thrH, keyFile); saveToKeyfile(!pedited || pedited->wavelet.reschro, "Wavelet", "Residualchroma", wavelet.reschro, keyFile); saveToKeyfile(!pedited || pedited->wavelet.tmrs, "Wavelet", "ResidualTM", wavelet.tmrs, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgs, "Wavelet", "ResidualEDGS", wavelet.edgs, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.scale, "Wavelet", "ResidualSCALE", wavelet.scale, keyFile); saveToKeyfile(!pedited || pedited->wavelet.gamma, "Wavelet", "Residualgamma", wavelet.gamma, keyFile); saveToKeyfile(!pedited || pedited->wavelet.sky, "Wavelet", "HueRangeResidual", wavelet.sky, keyFile); saveToKeyfile(!pedited || pedited->wavelet.hueskin2, "Wavelet", "HueRange", wavelet.hueskin2.toVector(), keyFile); @@ -4516,6 +4522,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "ResidualcontHighlight", pedited, wavelet.resconH, pedited->wavelet.resconH); assignFromKeyfile(keyFile, "Wavelet", "Residualchroma", pedited, wavelet.reschro, pedited->wavelet.reschro); assignFromKeyfile(keyFile, "Wavelet", "ResidualTM", pedited, wavelet.tmrs, pedited->wavelet.tmrs); + assignFromKeyfile(keyFile, "Wavelet", "ResidualEDGS", pedited, wavelet.edgs, pedited->wavelet.edgs); + assignFromKeyfile(keyFile, "Wavelet", "ResidualSCALE", pedited, wavelet.scale, pedited->wavelet.scale); assignFromKeyfile(keyFile, "Wavelet", "Residualgamma", pedited, wavelet.gamma, pedited->wavelet.gamma); assignFromKeyfile(keyFile, "Wavelet", "ContExtra", pedited, wavelet.sup, pedited->wavelet.sup); assignFromKeyfile(keyFile, "Wavelet", "HueRangeResidual", pedited, wavelet.sky, pedited->wavelet.sky); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 1258ee05b..a17a34aaa 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1222,6 +1222,8 @@ struct WaveletParams { int resconH; int reschro; double tmrs; + double edgs; + double scale; double gamma; int sup; double sky; diff --git a/rtgui/addsetids.h b/rtgui/addsetids.h index 163bc27ef..7e9f6f6cd 100644 --- a/rtgui/addsetids.h +++ b/rtgui/addsetids.h @@ -103,6 +103,8 @@ enum { ADDSET_WA_EDGEDETECTTHR, ADDSET_WA_EDGEDETECTTHR2, ADDSET_WA_TMRS, + ADDSET_WA_EDGS, + ADDSET_WA_SCALE, ADDSET_WA_GAMMA, ADDSET_RETI_STR, ADDSET_RETI_NEIGH, diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index 1a0eaeb28..63934f21c 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -165,7 +165,7 @@ void BatchToolPanelCoordinator::initSession () shadowshighlights->setAdjusterBehavior (false, false); dirpyrequalizer->setAdjusterBehavior (false, false, false); - wavelet->setAdjusterBehavior (false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false); + wavelet->setAdjusterBehavior (false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false); dirpyrdenoise->setAdjusterBehavior (false, false, false, false, false, false, false); bayerprocess->setAdjusterBehavior(false, false, false, false, false, false); xtransprocess->setAdjusterBehavior(false, false); @@ -213,7 +213,7 @@ void BatchToolPanelCoordinator::initSession () blackwhite->setAdjusterBehavior (options.baBehav[ADDSET_BLACKWHITE_HUES], options.baBehav[ADDSET_BLACKWHITE_GAMMA]); shadowshighlights->setAdjusterBehavior (options.baBehav[ADDSET_SH_HIGHLIGHTS], options.baBehav[ADDSET_SH_SHADOWS]); dirpyrequalizer->setAdjusterBehavior (options.baBehav[ADDSET_DIRPYREQ], options.baBehav[ADDSET_DIRPYREQ_THRESHOLD], options.baBehav[ADDSET_DIRPYREQ_SKINPROTECT]); - wavelet->setAdjusterBehavior (options.baBehav[ADDSET_WA], options.baBehav[ADDSET_WA_THRESHOLD], options.baBehav[ADDSET_WA_THRESHOLD2], options.baBehav[ADDSET_WA_THRES], options.baBehav[ADDSET_WA_CHRO], options.baBehav[ADDSET_WA_CHROMA], options.baBehav[ADDSET_WA_CONTRAST], options.baBehav[ADDSET_WA_SKINPROTECT], options.baBehav[ADDSET_WA_RESCHRO], options.baBehav[ADDSET_WA_TMRS], options.baBehav[ADDSET_WA_RESCON], options.baBehav[ADDSET_WA_RESCONH], options.baBehav[ADDSET_WA_THRR], options.baBehav[ADDSET_WA_THRRH], options.baBehav[ADDSET_WA_SKYPROTECT], options.baBehav[ADDSET_WA_EDGRAD], options.baBehav[ADDSET_WA_EDGVAL], options.baBehav[ADDSET_WA_STRENGTH], options.baBehav[ADDSET_WA_GAMMA], options.baBehav[ADDSET_WA_EDGEDETECT], options.baBehav[ADDSET_WA_EDGEDETECTTHR], options.baBehav[ADDSET_WA_EDGEDETECTTHR2]); + wavelet->setAdjusterBehavior (options.baBehav[ADDSET_WA], options.baBehav[ADDSET_WA_THRESHOLD], options.baBehav[ADDSET_WA_THRESHOLD2], options.baBehav[ADDSET_WA_THRES], options.baBehav[ADDSET_WA_CHRO], options.baBehav[ADDSET_WA_CHROMA], options.baBehav[ADDSET_WA_CONTRAST], options.baBehav[ADDSET_WA_SKINPROTECT], options.baBehav[ADDSET_WA_RESCHRO], options.baBehav[ADDSET_WA_TMRS], options.baBehav[ADDSET_WA_EDGS], options.baBehav[ADDSET_WA_SCALE], options.baBehav[ADDSET_WA_RESCON], options.baBehav[ADDSET_WA_RESCONH], options.baBehav[ADDSET_WA_THRR], options.baBehav[ADDSET_WA_THRRH], options.baBehav[ADDSET_WA_SKYPROTECT], options.baBehav[ADDSET_WA_EDGRAD], options.baBehav[ADDSET_WA_EDGVAL], options.baBehav[ADDSET_WA_STRENGTH], options.baBehav[ADDSET_WA_GAMMA], options.baBehav[ADDSET_WA_EDGEDETECT], options.baBehav[ADDSET_WA_EDGEDETECTTHR], options.baBehav[ADDSET_WA_EDGEDETECTTHR2]); dirpyrdenoise->setAdjusterBehavior (options.baBehav[ADDSET_DIRPYRDN_LUMA], options.baBehav[ADDSET_DIRPYRDN_LUMDET], options.baBehav[ADDSET_DIRPYRDN_CHROMA], options.baBehav[ADDSET_DIRPYRDN_CHROMARED], options.baBehav[ADDSET_DIRPYRDN_CHROMABLUE], options.baBehav[ADDSET_DIRPYRDN_GAMMA], options.baBehav[ADDSET_DIRPYRDN_PASSES]); bayerprocess->setAdjusterBehavior(options.baBehav[ADDSET_BAYER_FALSE_COLOR_SUPPRESSION], options.baBehav[ADDSET_BAYER_ITER], options.baBehav[ADDSET_BAYER_DUALDEMOZCONTRAST], options.baBehav[ADDSET_BAYER_PS_SIGMA], options.baBehav[ADDSET_BAYER_PS_SMOOTH], options.baBehav[ADDSET_BAYER_PS_EPERISO]); xtransprocess->setAdjusterBehavior(options.baBehav[ADDSET_BAYER_FALSE_COLOR_SUPPRESSION], options.baBehav[ADDSET_BAYER_DUALDEMOZCONTRAST]); @@ -329,6 +329,8 @@ void BatchToolPanelCoordinator::initSession () if (options.baBehav[ADDSET_WA_RESCONH]) { pparams.wavelet.resconH = 0; } if (options.baBehav[ADDSET_WA_RESCHRO]) { pparams.wavelet.reschro = 0; } if (options.baBehav[ADDSET_WA_TMRS]) { pparams.wavelet.tmrs = 0; } + if (options.baBehav[ADDSET_WA_EDGS]) { pparams.wavelet.edgs = 0; } + if (options.baBehav[ADDSET_WA_SCALE]) { pparams.wavelet.scale = 0; } if (options.baBehav[ADDSET_WA_THRR]) { pparams.wavelet.thr = 0; } if (options.baBehav[ADDSET_WA_THRRH]) { pparams.wavelet.thrH = 0; } if (options.baBehav[ADDSET_WA_SKYPROTECT]) { pparams.wavelet.sky = 0; } diff --git a/rtgui/epd.cc b/rtgui/epd.cc index 4b7cca10a..0b62569eb 100644 --- a/rtgui/epd.cc +++ b/rtgui/epd.cc @@ -31,8 +31,8 @@ EdgePreservingDecompositionUI::EdgePreservingDecompositionUI () : FoldableToolPa strength = Gtk::manage(new Adjuster (M("TP_EPD_STRENGTH"), -1.0, 2.0, 0.01, 0.5)); gamma = Gtk::manage(new Adjuster (M("TP_EPD_GAMMA"), 0.8, 1.5, 0.01, 1.)); - edgeStopping = Gtk::manage(new Adjuster (M("TP_EPD_EDGESTOPPING"), 0.1, 4.0, 0.01, 0.5)); - scale = Gtk::manage(new Adjuster (M("TP_EPD_SCALE"), 0.1, 10.0, 0.01, 0.1)); + edgeStopping = Gtk::manage(new Adjuster (M("TP_EPD_EDGESTOPPING"), 0.1, 4.0, 0.01, 1.4)); + scale = Gtk::manage(new Adjuster (M("TP_EPD_SCALE"), 0.1, 10.0, 0.01, 1.0)); reweightingIterates = Gtk::manage(new Adjuster (M("TP_EPD_REWEIGHTINGITERATES"), 0, 9, 1, 0)); strength->setAdjusterListener(this); @@ -69,7 +69,7 @@ void EdgePreservingDecompositionUI::read(const ProcParams *pp, const ParamsEdite setEnabled(pp->epd.enabled); strength->set_sensitive (true); - +/* if(pp->wavelet.enabled) { if(pp->wavelet.tmrs == 0) { strength->set_sensitive (true); @@ -79,7 +79,7 @@ void EdgePreservingDecompositionUI::read(const ProcParams *pp, const ParamsEdite gamma->set_sensitive (false); } } - +*/ strength->setValue(pp->epd.strength); gamma->setValue(pp->epd.gamma); edgeStopping->setValue(pp->epd.edgeStopping); @@ -98,7 +98,7 @@ void EdgePreservingDecompositionUI::write(ProcParams *pp, ParamsEdited *pedited) pp->epd.reweightingIterates = reweightingIterates->getValue(); pp->epd.enabled = getEnabled(); strength->set_sensitive (true); - +/* if(pp->wavelet.enabled) { if(pp->wavelet.tmrs == 0) { strength->set_sensitive (true); @@ -108,7 +108,7 @@ void EdgePreservingDecompositionUI::write(ProcParams *pp, ParamsEdited *pedited) gamma->set_sensitive (false); } } - +*/ if(pedited) { pedited->epd.strength = strength->getEditedState(); pedited->epd.gamma = gamma->getEditedState(); diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 6e9a6372c..f0abd04f7 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -499,6 +499,8 @@ void ParamsEdited::set(bool v) wavelet.resconH = v; wavelet.reschro = v; wavelet.tmrs = v; + wavelet.edgs = v; + wavelet.scale = v; wavelet.gamma = v; wavelet.sup = v; wavelet.sky = v; @@ -1073,6 +1075,8 @@ void ParamsEdited::initFrom(const std::vector& wavelet.resconH = wavelet.resconH && p.wavelet.resconH == other.wavelet.resconH; wavelet.reschro = wavelet.reschro && p.wavelet.reschro == other.wavelet.reschro; wavelet.tmrs = wavelet.tmrs && p.wavelet.tmrs == other.wavelet.tmrs; + wavelet.edgs = wavelet.edgs && p.wavelet.edgs == other.wavelet.edgs; + wavelet.scale = wavelet.scale && p.wavelet.scale == other.wavelet.scale; wavelet.gamma = wavelet.gamma && p.wavelet.gamma == other.wavelet.gamma; wavelet.sup = wavelet.sup && p.wavelet.sup == other.wavelet.sup; wavelet.sky = wavelet.sky && p.wavelet.sky == other.wavelet.sky; @@ -3073,6 +3077,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.tmrs = dontforceSet && options.baBehav[ADDSET_WA_TMRS] ? toEdit.wavelet.tmrs + mods.wavelet.tmrs : mods.wavelet.tmrs; } + if (wavelet.edgs) { + toEdit.wavelet.edgs = dontforceSet && options.baBehav[ADDSET_WA_EDGS] ? toEdit.wavelet.edgs + mods.wavelet.edgs : mods.wavelet.edgs; + } + + if (wavelet.scale) { + toEdit.wavelet.scale = dontforceSet && options.baBehav[ADDSET_WA_SCALE] ? toEdit.wavelet.scale + mods.wavelet.scale : mods.wavelet.scale; + } + if (wavelet.gamma) { toEdit.wavelet.gamma = dontforceSet && options.baBehav[ADDSET_WA_GAMMA] ? toEdit.wavelet.gamma + mods.wavelet.gamma : mods.wavelet.gamma; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 366703fc7..5e123e638 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -498,6 +498,8 @@ struct WaveletParamsEdited { bool resconH; bool reschro; bool tmrs; + bool edgs; + bool scale; bool gamma; bool sup; bool sky; diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index b7d10c8de..63a9315a6 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -389,6 +389,8 @@ Gtk::Widget* Preferences::getBatchProcPanel () appendBehavList (mi, M ("TP_WAVELET_THRH"), ADDSET_WA_THRRH, true); appendBehavList (mi, M ("TP_WAVELET_RESCHRO"), ADDSET_WA_RESCHRO, true); appendBehavList (mi, M ("TP_WAVELET_TMSTRENGTH"), ADDSET_WA_TMRS, true); + appendBehavList (mi, M ("TP_WAVELET_TMEDGS"), ADDSET_WA_EDGS, true); + appendBehavList (mi, M ("TP_WAVELET_TMSCALE"), ADDSET_WA_SCALE, true); appendBehavList (mi, M ("TP_WAVELET_SKY"), ADDSET_WA_SKYPROTECT, true); appendBehavList (mi, M ("TP_WAVELET_CONTRA"), ADDSET_WA_CONTRAST, true); appendBehavList (mi, M ("TP_WAVELET_STRENGTH"), ADDSET_WA_STRENGTH, true); diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 2c83319d7..165db8e94 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -81,6 +81,8 @@ Wavelet::Wavelet() : resconH(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCONH"), -100, 100, 1, 0))), reschro(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCHRO"), -100, 100, 1, 0))), tmrs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMSTRENGTH"), -1.0, 2.0, 0.01, 0.0))), + edgs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMEDGS"), 0.1, 4.0, 0.01, 1.4))), + scale(Gtk::manage(new Adjuster(M("TP_WAVELET_TMSCALE"), 0.1, 10.0, 0.01, 1.0))), gamma(Gtk::manage(new Adjuster(M("TP_WAVELET_COMPGAMMA"), 0.4, 2.0, 0.01, 1.0))), sup(Gtk::manage(new Adjuster(M("TP_WAVELET_SUPE"), -100, 350, 1, 0))), sky(Gtk::manage(new Adjuster(M("TP_WAVELET_SKY"), -100., 100.0, 1., 0.))), @@ -163,6 +165,8 @@ Wavelet::Wavelet() : EvWavsoftrad = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSOFTRAD"); EvWavsoftradend = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSOFTRADEND"); EvWavshowmask = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSHOWMASK"); + EvWavedgs = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVEDGS"); + EvWavscale = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSCALE"); expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings)); @@ -704,6 +708,16 @@ Wavelet::Wavelet() : resBox->pack_start(*gamma); gamma->setAdjusterListener(this); + //edgs->set_tooltip_text(M("TP_WAVELET_TMEDGS_TOOLTIP")); + + resBox->pack_start(*edgs); + edgs->setAdjusterListener(this); + + //scale->set_tooltip_text(M("TP_WAVELET_TMSCALE_TOOLTIP")); + + resBox->pack_start(*scale); + scale->setAdjusterListener(this); + Gtk::HSeparator* const separatorR1 = Gtk::manage(new Gtk::HSeparator()); resBox->pack_start(*separatorR1, Gtk::PACK_SHRINK, 2); @@ -1203,6 +1217,8 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) resconH->setValue(pp->wavelet.resconH); reschro->setValue(pp->wavelet.reschro); tmrs->setValue(pp->wavelet.tmrs); + edgs->setValue(pp->wavelet.edgs); + scale->setValue(pp->wavelet.scale); gamma->setValue(pp->wavelet.gamma); sup->setValue(pp->wavelet.sup); sky->setValue(pp->wavelet.sky); @@ -1350,6 +1366,8 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) resconH->setEditedState(pedited->wavelet.resconH ? Edited : UnEdited); reschro->setEditedState(pedited->wavelet.reschro ? Edited : UnEdited); tmrs->setEditedState(pedited->wavelet.tmrs ? Edited : UnEdited); + edgs->setEditedState(pedited->wavelet.edgs ? Edited : UnEdited); + scale->setEditedState(pedited->wavelet.scale ? Edited : UnEdited); gamma->setEditedState(pedited->wavelet.gamma ? Edited : UnEdited); sup->setEditedState(pedited->wavelet.sup ? Edited : UnEdited); sky->setEditedState(pedited->wavelet.sky ? Edited : UnEdited); @@ -1529,6 +1547,8 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.resconH = resconH->getValue(); pp->wavelet.reschro = reschro->getValue(); pp->wavelet.tmrs = tmrs->getValue(); + pp->wavelet.edgs = edgs->getValue(); + pp->wavelet.scale = scale->getValue(); pp->wavelet.gamma = gamma->getValue(); pp->wavelet.sup = sup->getValue(); pp->wavelet.sky = sky->getValue(); @@ -1636,6 +1656,8 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.resconH = resconH->getEditedState(); pedited->wavelet.reschro = reschro->getEditedState(); pedited->wavelet.tmrs = tmrs->getEditedState(); + pedited->wavelet.edgs = edgs->getEditedState(); + pedited->wavelet.scale = scale->getEditedState(); pedited->wavelet.gamma = gamma->getEditedState(); pedited->wavelet.sup = sup->getEditedState(); pedited->wavelet.sky = sky->getEditedState(); @@ -1867,6 +1889,8 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit resconH->setDefault(defParams->wavelet.resconH); reschro->setDefault(defParams->wavelet.reschro); tmrs->setDefault(defParams->wavelet.tmrs); + edgs->setDefault(defParams->wavelet.edgs); + scale->setDefault(defParams->wavelet.scale); gamma->setDefault(defParams->wavelet.gamma); sup->setDefault(defParams->wavelet.sup); sky->setDefault(defParams->wavelet.sky); @@ -1925,6 +1949,8 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit resconH->setDefault(defParams->wavelet.resconH); reschro->setDefault(defParams->wavelet.reschro); tmrs->setDefault(defParams->wavelet.tmrs); + edgs->setDefault(defParams->wavelet.edgs); + scale->setDefault(defParams->wavelet.scale); gamma->setDefault(defParams->wavelet.gamma); sup->setDefault(defParams->wavelet.sup); sky->setDefaultEditedState(pedited->wavelet.sky ? Edited : UnEdited); @@ -1972,6 +1998,8 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit resconH->setDefaultEditedState(Irrelevant); reschro->setDefaultEditedState(Irrelevant); tmrs->setDefaultEditedState(Irrelevant); + edgs->setDefaultEditedState(Irrelevant); + scale->setDefaultEditedState(Irrelevant); gamma->setDefaultEditedState(Irrelevant); sup->setDefaultEditedState(Irrelevant); sky->setDefaultEditedState(Irrelevant); @@ -2274,6 +2302,14 @@ void Wavelet::TMmethodUpdateUI() } } */ + if(TMmethod->get_active_row_number() == 1) { + edgs->show(); + scale->show(); + } else if (TMmethod->get_active_row_number() == 0) { + edgs->hide(); + scale->hide(); + } + } void Wavelet::TMmethodChanged() @@ -2476,6 +2512,8 @@ void Wavelet::setBatchMode(bool batchMode) resconH->showEditedCB(); reschro->showEditedCB(); tmrs->showEditedCB(); + edgs->showEditedCB(); + scale->showEditedCB(); gamma->showEditedCB(); sup->showEditedCB(); sky->showEditedCB(); @@ -2524,7 +2562,7 @@ void Wavelet::setBatchMode(bool batchMode) void Wavelet::adjusterUpdateUI(Adjuster* a) { - /* + /* if (!batchMode) { if (a == tmrs ) { float tm; @@ -2537,10 +2575,10 @@ void Wavelet::adjusterUpdateUI(Adjuster* a) tm=tmrs->getValue(); if(tm==0.f) tmr->hide(); else tmr->show(); - ); + } } - */ + */ } void Wavelet::adjusterChanged(Adjuster* a, double newval) @@ -2554,12 +2592,25 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavresconH, resconH->getTextValue()); } else if (a == reschro) { listener->panelChanged(EvWavreschro, reschro->getTextValue()); - } else if (a == tmrs) { + } else if (a == tmrs) { adjusterUpdateUI(a); listener->panelChanged(EvWavtmrs, tmrs->getTextValue()); + if(tmrs->getValue() != 0 && TMmethod->get_active_row_number() == 1) { + edgs->show(); + scale->show(); + } else if (TMmethod->get_active_row_number() == 0) { + edgs->hide(); + scale->hide(); + } } else if (a == gamma) { adjusterUpdateUI(a); listener->panelChanged(EvWavgamma, gamma->getTextValue()); + } else if (a == edgs) { + adjusterUpdateUI(a); + listener->panelChanged(EvWavedgs, edgs->getTextValue()); + } else if (a == scale) { + adjusterUpdateUI(a); + listener->panelChanged(EvWavscale, scale->getTextValue()); } else if (a == sky) { listener->panelChanged(EvWavsky, sky->getTextValue()); } else if (a == sup) { @@ -3130,7 +3181,7 @@ void Wavelet::colorForValue(double valX, double valY, enum ColorCaller::ElemType caller->ccGreen = double(G); caller->ccBlue = double(B); } -void Wavelet::setAdjusterBehavior(bool multiplieradd, bool thresholdadd, bool threshold2add, bool thresadd, bool chroadd, bool chromaadd, bool contrastadd, bool skinadd, bool reschroadd, bool tmrsadd, bool resconadd, bool resconHadd, bool thradd, bool thrHadd, bool skyadd, bool edgradadd, bool edgvaladd, bool strengthadd, bool gammaadd, bool edgedetectadd, bool edgedetectthradd, bool edgedetectthr2add) +void Wavelet::setAdjusterBehavior(bool multiplieradd, bool thresholdadd, bool threshold2add, bool thresadd, bool chroadd, bool chromaadd, bool contrastadd, bool skinadd, bool reschroadd, bool tmrsadd, bool edgsadd, bool scaleadd, bool resconadd, bool resconHadd, bool thradd, bool thrHadd, bool skyadd, bool edgradadd, bool edgvaladd, bool strengthadd, bool gammaadd, bool edgedetectadd, bool edgedetectthradd, bool edgedetectthr2add) { for (int i = 0; i < 9; i++) { @@ -3148,6 +3199,8 @@ void Wavelet::setAdjusterBehavior(bool multiplieradd, bool thresholdadd, bool th resconH->setAddMode(resconHadd); reschro->setAddMode(reschroadd); tmrs->setAddMode(tmrsadd); + edgs->setAddMode(edgsadd); + scale->setAddMode(scaleadd); thr->setAddMode(thradd); thrH->setAddMode(thrHadd); sky->setAddMode(skyadd); diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index 7dee7e955..5878a1ae4 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -50,7 +50,7 @@ public: void autoOpenCurve () override; void curveChanged (CurveEditor* ce) override; void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; - void setAdjusterBehavior (bool multiplieradd, bool thresholdadd, bool threshold2add, bool thresadd, bool chroadd, bool chromaadd, bool contrastadd, bool skinadd, bool reschroadd, bool tmrsadd, bool resconadd, bool resconHadd, bool thradd, bool thrHadd, bool skyadd, bool edgradadd, bool edgvaladd, bool strengthadd, bool gammaadd, bool edgedetectadd, bool edgedetectthradd, bool edgedetectthr2add); + void setAdjusterBehavior (bool multiplieradd, bool thresholdadd, bool threshold2add, bool thresadd, bool chroadd, bool chromaadd, bool contrastadd, bool skinadd, bool reschroadd, bool tmrsadd, bool edgsadd, bool scaleadd, bool resconadd, bool resconHadd, bool thradd, bool thrHadd, bool skyadd, bool edgradadd, bool edgvaladd, bool strengthadd, bool gammaadd, bool edgedetectadd, bool edgedetectthradd, bool edgedetectthr2add); void setBatchMode (bool batchMode) override; void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; void setEditProvider (EditDataProvider *provider) override; @@ -72,6 +72,8 @@ private: rtengine::ProcEvent EvWavsoftrad; rtengine::ProcEvent EvWavsoftradend; rtengine::ProcEvent EvWavshowmask; + rtengine::ProcEvent EvWavedgs; + rtengine::ProcEvent EvWavscale; void foldAllButMe (GdkEventButton* event, MyExpander *expander); @@ -167,6 +169,8 @@ private: Adjuster* const resconH; Adjuster* const reschro; Adjuster* const tmrs; + Adjuster* const edgs; + Adjuster* const scale; Adjuster* const gamma; Adjuster* const sup; Adjuster* const sky; From 04d6b28d2ed7cee893c0cdca9834e3b9d8fe3615 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 26 May 2019 17:28:58 +0200 Subject: [PATCH 013/154] Improve contrast residual --- rtengine/ipwavelet.cc | 52 ++++++++++++++++--------------------------- 1 file changed, 19 insertions(+), 33 deletions(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index af8adca90..51dbe149e 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1663,11 +1663,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * int H_L = WaveletCoeffs_L.level_H(0); float * WavCoeffs_L0 = WaveletCoeffs_L.coeff0; - float maxh = 2.5f; //amplification contrast above mean - float maxl = 2.5f; //reduction contrast under mean float contrast = cp.contrast; - float multL = (float)contrast * (maxl - 1.f) / 100.f + 1.f; - float multH = (float) contrast * (maxh - 1.f) / 100.f + 1.f; double avedbl = 0.0; // use double precision for large summations float max0 = 0.f; float min0 = FLT_MAX; @@ -1735,14 +1731,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * max0 /= 327.68f; min0 /= 327.68f; float ave = avedbl / (double)(W_L * H_L); - float av = ave / 327.68f; - float ah = (multH - 1.f) / (av - max0); // - float bh = 1.f - max0 * ah; - float al = (multL - 1.f) / (av - min0); - float bl = 1.f - min0 * al; - float factorx = 1.f; -// float *koeLi[9]; -// float maxkoeLi[9]; + float avg = ave / 32768.f; float *koeLi[12]; float maxkoeLi[12]; @@ -1763,35 +1752,32 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * koeLi[j][i] = 0.f; } + avg = LIM01(avg); + double contreal = 0.6 * contrast; + DiagonalCurve resid_contrast({ + DCT_NURBS, + 0, 0, + avg - avg * (0.6 - contreal / 250.0), avg - avg * (0.6 + contreal / 250.0), + avg + (1. - avg) * (0.6 - contreal / 250.0), avg + (1. - avg) * (0.6 + contreal / 250.0), + 1, 1 + }); + + #ifdef _OPENMP #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif { if (contrast != 0.f && cp.resena && max0 > 0.0) { // contrast = 0.f means that all will be multiplied by 1.f, so we can skip this step { - // + #ifdef _OPENMP - #pragma omp for + #pragma omp for #endif - - for (int i = 0; i < W_L * H_L; i++) { //contrast - if (WavCoeffs_L0[i] < 32768.f) { - float prov; - - if (WavCoeffs_L0[i] > ave) { - float kh = ah * (WavCoeffs_L0[i] / 327.68f) + bh; - prov = WavCoeffs_L0[i]; - WavCoeffs_L0[i] = ave + kh * (WavCoeffs_L0[i] - ave); - } else { - float kl = al * (WavCoeffs_L0[i] / 327.68f) + bl; - prov = WavCoeffs_L0[i]; - WavCoeffs_L0[i] = ave - kl * (ave - WavCoeffs_L0[i]); - } - - float diflc = WavCoeffs_L0[i] - prov; - diflc *= factorx; - WavCoeffs_L0[i] = prov + diflc; - } + for (int i = 0; i < W_L * H_L; i++) { + float buf = LIM01( WavCoeffs_L0[i] / 32768.f); + buf = resid_contrast.getVal(buf); + buf *= 32768.f; + WavCoeffs_L0[i] = buf; } } } From 83f487753c6da9868730126c4e9f3a09c7341f1c Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 27 May 2019 09:23:56 +0200 Subject: [PATCH 014/154] Improve shadows-Highlight Residual --- rtdata/languages/default | 2 + rtengine/improcfun.cc | 3 +- rtengine/improcfun.h | 3 +- rtengine/ipshadowshighlights.cc | 18 ++++----- rtengine/ipwavelet.cc | 68 ++++++++++++++------------------- rtengine/procparams.cc | 8 +++- rtengine/procparams.h | 1 + rtgui/addsetids.h | 1 + rtgui/batchtoolpanelcoord.cc | 5 ++- rtgui/paramsedited.h | 1 + rtgui/preferences.cc | 1 + rtgui/wavelet.cc | 26 ++++++++++--- rtgui/wavelet.h | 4 +- 13 files changed, 80 insertions(+), 61 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index f9c89888a..3bb511d2b 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -784,6 +784,7 @@ HISTORY_MSG_WAVSOFTRADEND;Soft radius final HISTORY_MSG_WAVSHOWMASK;Show wavelet mask HISTORY_MSG_WAVEDGS;Edge stopping HISTORY_MSG_WAVSCALE;Scale +HISTORY_MSG_WAVRADIUS;Radius Shadows-Highlight HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -2202,6 +2203,7 @@ TP_WAVELET_OPACITYWL;Final local contrast TP_WAVELET_OPACITYWL_TOOLTIP;Modify the final local contrast at the end of the wavelet treatment.\n\nThe left side represents the smallest local contrast, progressing to the largest local contrast on the right. TP_WAVELET_PASTEL;Pastel chroma TP_WAVELET_PROC;Process +TP_WAVELET_RADIUS;Radius Shadows - Highlight TP_WAVELET_RE1;Reinforced TP_WAVELET_RE2;Unchanged TP_WAVELET_RE3;Reduced diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index bb7c0ac6b..d1529184e 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -3649,7 +3649,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer delete vCurve; } - shadowsHighlights(lab); + // shadowsHighlights(lab); + shadowsHighlights(lab, params->sh.enabled, params->sh.lab,params->sh.highlights ,params->sh.shadows, params->sh.radius, scale, params->sh.htonalwidth, params->sh.stonalwidth); if (params->localContrast.enabled) { // Alberto's local contrast diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index cd1650f6e..68aff736b 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -351,7 +351,8 @@ public: void ToneMapFattal02(Imagefloat *rgb); void localContrast(LabImage *lab); void colorToningLabGrid(LabImage *lab, int xstart, int xend, int ystart, int yend, bool MultiThread); - void shadowsHighlights(LabImage *lab); + //void shadowsHighlights(LabImage *lab); + void shadowsHighlights(LabImage *lab, bool ena, int labmode, int hightli, int shado, int rad, int scal, int hltonal, int shtonal); void softLight(LabImage *lab); void labColorCorrectionRegions(LabImage *lab); diff --git a/rtengine/ipshadowshighlights.cc b/rtengine/ipshadowshighlights.cc index 6ce66d9b3..96b8e84ef 100644 --- a/rtengine/ipshadowshighlights.cc +++ b/rtengine/ipshadowshighlights.cc @@ -27,20 +27,20 @@ #include "sleef.c" namespace rtengine { - -void ImProcFunctions::shadowsHighlights(LabImage *lab) +//modifications to pass parameters needs by locallab, to avoid 2 functions - no change in process - J.Desmis march 2019 +void ImProcFunctions::shadowsHighlights(LabImage *lab, bool ena, int labmode, int hightli, int shado, int rad, int scal, int hltonal, int shtonal) { - if (!params->sh.enabled || (!params->sh.highlights && !params->sh.shadows)){ + if (!ena || (!hightli && !shado)){ return; } const int width = lab->W; const int height = lab->H; - const bool lab_mode = params->sh.lab; + const bool lab_mode = labmode; array2D mask(width, height); array2D L(width, height); - const float radius = float(params->sh.radius) * 10 / scale; + const float radius = float(rad) * 10 / scal; LUTf f(lab_mode ? 32768 : 65536); TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); @@ -187,12 +187,12 @@ void ImProcFunctions::shadowsHighlights(LabImage *lab) } }; - if (params->sh.highlights > 0) { - apply(params->sh.highlights * 0.7, params->sh.htonalwidth, true); + if (hightli > 0) { + apply(hightli * 0.7, hltonal, true); } - if (params->sh.shadows > 0) { - apply(params->sh.shadows * 0.6, params->sh.stonalwidth, false); + if (shado > 0) { + apply(shado * 0.6, shtonal, false); } } diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 51dbe149e..bf9a6f37e 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -71,6 +71,7 @@ struct cont_params { float thH; float conres; float conresH; + float radius; float chrores; float hueres; float sky; @@ -435,6 +436,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.conres = waparams.rescon; cp.conresH = waparams.resconH; + cp.radius = waparams.radius; cp.chrores = waparams.reschro; //cp.hueres=waparams.reshue; cp.hueres = 2.f; @@ -1782,7 +1784,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } } -// + if (cp.tonemap && cp.contmet == 1 && cp.resena) { float maxp = max0 * 256.f; float minp = min0 * 256.f; @@ -1791,54 +1793,40 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * #endif ContrastResid(WavCoeffs_L0, cp, W_L, H_L, maxp, minp); } - -#ifdef _OPENMP - #pragma omp barrier -#endif + } if ((cp.conres != 0.f || cp.conresH != 0.f) && cp.resena) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step + LabImage *temp = nullptr; + temp = new LabImage(W_L, H_L); #ifdef _OPENMP - #pragma omp for nowait + #pragma omp for #endif - - for (int i = 0; i < W_L * H_L; i++) { - float LL = WavCoeffs_L0[i]; - float LL100 = LL / 327.68f; - float tran = 5.f;//transition - //shadow - float alp = 3.f; //increase contrast sahdow in lowlights between 1 and ?? - - if (cp.th > (100.f - tran)) { - tran = 100.f - cp.th; + for (int i = 0; i < H_L; i++) { + for (int j = 0; j < W_L; j++) { + temp->L[i][j] = WavCoeffs_L0[i * W_L + j]; + } + } + { + ImProcFunctions::shadowsHighlights(temp, true, 1, cp.conresH, cp.conres, cp.radius, skip, cp.thH, cp.th); + } +#ifdef _OPENMP + #pragma omp for +#endif + for (int i = 0; i < H_L; i++) { + for (int j = 0; j < W_L; j++) { + WavCoeffs_L0[i * W_L + j] = temp->L[i][j]; + } } - if (LL100 < cp.th) { - float aalp = (1.f - alp) / cp.th; //no changes for LL100 = cp.th - float kk = aalp * LL100 + alp; - WavCoeffs_L0[i] *= (1.f + kk * cp.conres / 200.f); - } else if (LL100 < cp.th + tran) { - float ath = -cp.conres / tran; - float bth = cp.conres - ath * cp.th; - WavCoeffs_L0[i] *= (1.f + (LL100 * ath + bth) / 200.f); - } + delete temp; - //highlight - tran = 5.f; - - if (cp.thH < (tran)) { - tran = cp.thH; - } - - if (LL100 > cp.thH) { - WavCoeffs_L0[i] *= (1.f + cp.conresH / 200.f); - } else if (LL100 > (cp.thH - tran)) { - float athH = cp.conresH / tran; - float bthH = cp.conresH - athH * cp.thH; - WavCoeffs_L0[i] *= (1.f + (LL100 * athH + bthH) / 200.f); - } - } } + +#ifdef _OPENMP + #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) +#endif + { //enabled Lipschitz..replace simple by complex edge detection // I found this concept on the web (doctoral thesis on medical Imaging) // I was inspired by the principle of Canny and Lipschitz (continuity and derivability) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 1fa4d62a4..4a23e02dd 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2209,8 +2209,9 @@ WaveletParams::WaveletParams() : edgrad(15), edgval(0), edgthresh(10), - thr(35), - thrH(65), + thr(30), + thrH(70), + radius(40), skinprotect(0.0), hueskin(-5, 25, 170, 120, false), hueskin2(-260, -250, -130, -140, false), @@ -2316,6 +2317,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && edgthresh == other.edgthresh && thr == other.thr && thrH == other.thrH + && radius == other.radius && skinprotect == other.skinprotect && hueskin == other.hueskin && hueskin2 == other.hueskin2 @@ -3433,6 +3435,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.resconH, "Wavelet", "ResidualcontHighlight", wavelet.resconH, keyFile); saveToKeyfile(!pedited || pedited->wavelet.thr, "Wavelet", "ThresholdResidShadow", wavelet.thr, keyFile); saveToKeyfile(!pedited || pedited->wavelet.thrH, "Wavelet", "ThresholdResidHighLight", wavelet.thrH, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.radius, "Wavelet", "Residualradius", wavelet.radius, keyFile); saveToKeyfile(!pedited || pedited->wavelet.reschro, "Wavelet", "Residualchroma", wavelet.reschro, keyFile); saveToKeyfile(!pedited || pedited->wavelet.tmrs, "Wavelet", "ResidualTM", wavelet.tmrs, keyFile); saveToKeyfile(!pedited || pedited->wavelet.edgs, "Wavelet", "ResidualEDGS", wavelet.edgs, keyFile); @@ -4543,6 +4546,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "ThrEdg", pedited, wavelet.edgthresh, pedited->wavelet.edgthresh); assignFromKeyfile(keyFile, "Wavelet", "ThresholdResidShadow", pedited, wavelet.thr, pedited->wavelet.thr); assignFromKeyfile(keyFile, "Wavelet", "ThresholdResidHighLight", pedited, wavelet.thrH, pedited->wavelet.thrH); + assignFromKeyfile(keyFile, "Wavelet", "Residualradius", pedited, wavelet.radius, pedited->wavelet.radius); assignFromKeyfile(keyFile, "Wavelet", "ContrastCurve", pedited, wavelet.ccwcurve, pedited->wavelet.ccwcurve); assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveRG", pedited, wavelet.opacityCurveRG, pedited->wavelet.opacityCurveRG); assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveBY", pedited, wavelet.opacityCurveBY, pedited->wavelet.opacityCurveBY); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index a17a34aaa..d5d055ca1 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1243,6 +1243,7 @@ struct WaveletParams { int edgthresh; int thr; int thrH; + int radius; double skinprotect; Threshold hueskin; Threshold hueskin2; diff --git a/rtgui/addsetids.h b/rtgui/addsetids.h index 7e9f6f6cd..a03228c33 100644 --- a/rtgui/addsetids.h +++ b/rtgui/addsetids.h @@ -86,6 +86,7 @@ enum { ADDSET_WA_SKINPROTECT, ADDSET_WA_THRR, ADDSET_WA_THRRH, + ADDSET_WA_RADIUS, ADDSET_WA_THRES, ADDSET_WA_THRESHOLD, ADDSET_WA_THRESHOLD2, diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index 63934f21c..1c7e61b04 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -165,7 +165,7 @@ void BatchToolPanelCoordinator::initSession () shadowshighlights->setAdjusterBehavior (false, false); dirpyrequalizer->setAdjusterBehavior (false, false, false); - wavelet->setAdjusterBehavior (false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false); + wavelet->setAdjusterBehavior (false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false); dirpyrdenoise->setAdjusterBehavior (false, false, false, false, false, false, false); bayerprocess->setAdjusterBehavior(false, false, false, false, false, false); xtransprocess->setAdjusterBehavior(false, false); @@ -213,7 +213,7 @@ void BatchToolPanelCoordinator::initSession () blackwhite->setAdjusterBehavior (options.baBehav[ADDSET_BLACKWHITE_HUES], options.baBehav[ADDSET_BLACKWHITE_GAMMA]); shadowshighlights->setAdjusterBehavior (options.baBehav[ADDSET_SH_HIGHLIGHTS], options.baBehav[ADDSET_SH_SHADOWS]); dirpyrequalizer->setAdjusterBehavior (options.baBehav[ADDSET_DIRPYREQ], options.baBehav[ADDSET_DIRPYREQ_THRESHOLD], options.baBehav[ADDSET_DIRPYREQ_SKINPROTECT]); - wavelet->setAdjusterBehavior (options.baBehav[ADDSET_WA], options.baBehav[ADDSET_WA_THRESHOLD], options.baBehav[ADDSET_WA_THRESHOLD2], options.baBehav[ADDSET_WA_THRES], options.baBehav[ADDSET_WA_CHRO], options.baBehav[ADDSET_WA_CHROMA], options.baBehav[ADDSET_WA_CONTRAST], options.baBehav[ADDSET_WA_SKINPROTECT], options.baBehav[ADDSET_WA_RESCHRO], options.baBehav[ADDSET_WA_TMRS], options.baBehav[ADDSET_WA_EDGS], options.baBehav[ADDSET_WA_SCALE], options.baBehav[ADDSET_WA_RESCON], options.baBehav[ADDSET_WA_RESCONH], options.baBehav[ADDSET_WA_THRR], options.baBehav[ADDSET_WA_THRRH], options.baBehav[ADDSET_WA_SKYPROTECT], options.baBehav[ADDSET_WA_EDGRAD], options.baBehav[ADDSET_WA_EDGVAL], options.baBehav[ADDSET_WA_STRENGTH], options.baBehav[ADDSET_WA_GAMMA], options.baBehav[ADDSET_WA_EDGEDETECT], options.baBehav[ADDSET_WA_EDGEDETECTTHR], options.baBehav[ADDSET_WA_EDGEDETECTTHR2]); + wavelet->setAdjusterBehavior (options.baBehav[ADDSET_WA], options.baBehav[ADDSET_WA_THRESHOLD], options.baBehav[ADDSET_WA_THRESHOLD2], options.baBehav[ADDSET_WA_THRES], options.baBehav[ADDSET_WA_CHRO], options.baBehav[ADDSET_WA_CHROMA], options.baBehav[ADDSET_WA_CONTRAST], options.baBehav[ADDSET_WA_SKINPROTECT], options.baBehav[ADDSET_WA_RESCHRO], options.baBehav[ADDSET_WA_TMRS], options.baBehav[ADDSET_WA_EDGS], options.baBehav[ADDSET_WA_SCALE], options.baBehav[ADDSET_WA_RESCON], options.baBehav[ADDSET_WA_RESCONH], options.baBehav[ADDSET_WA_THRR], options.baBehav[ADDSET_WA_THRRH], options.baBehav[ADDSET_WA_RADIUS], options.baBehav[ADDSET_WA_SKYPROTECT], options.baBehav[ADDSET_WA_EDGRAD], options.baBehav[ADDSET_WA_EDGVAL], options.baBehav[ADDSET_WA_STRENGTH], options.baBehav[ADDSET_WA_GAMMA], options.baBehav[ADDSET_WA_EDGEDETECT], options.baBehav[ADDSET_WA_EDGEDETECTTHR], options.baBehav[ADDSET_WA_EDGEDETECTTHR2]); dirpyrdenoise->setAdjusterBehavior (options.baBehav[ADDSET_DIRPYRDN_LUMA], options.baBehav[ADDSET_DIRPYRDN_LUMDET], options.baBehav[ADDSET_DIRPYRDN_CHROMA], options.baBehav[ADDSET_DIRPYRDN_CHROMARED], options.baBehav[ADDSET_DIRPYRDN_CHROMABLUE], options.baBehav[ADDSET_DIRPYRDN_GAMMA], options.baBehav[ADDSET_DIRPYRDN_PASSES]); bayerprocess->setAdjusterBehavior(options.baBehav[ADDSET_BAYER_FALSE_COLOR_SUPPRESSION], options.baBehav[ADDSET_BAYER_ITER], options.baBehav[ADDSET_BAYER_DUALDEMOZCONTRAST], options.baBehav[ADDSET_BAYER_PS_SIGMA], options.baBehav[ADDSET_BAYER_PS_SMOOTH], options.baBehav[ADDSET_BAYER_PS_EPERISO]); xtransprocess->setAdjusterBehavior(options.baBehav[ADDSET_BAYER_FALSE_COLOR_SUPPRESSION], options.baBehav[ADDSET_BAYER_DUALDEMOZCONTRAST]); @@ -333,6 +333,7 @@ void BatchToolPanelCoordinator::initSession () if (options.baBehav[ADDSET_WA_SCALE]) { pparams.wavelet.scale = 0; } if (options.baBehav[ADDSET_WA_THRR]) { pparams.wavelet.thr = 0; } if (options.baBehav[ADDSET_WA_THRRH]) { pparams.wavelet.thrH = 0; } + if (options.baBehav[ADDSET_WA_RADIUS]) { pparams.wavelet.radius = 0; } if (options.baBehav[ADDSET_WA_SKYPROTECT]) { pparams.wavelet.sky = 0; } if (options.baBehav[ADDSET_WA_EDGRAD]) { pparams.wavelet.edgrad = 0; } if (options.baBehav[ADDSET_WA_EDGVAL]) { pparams.wavelet.edgval = 0; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 5e123e638..160f68feb 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -519,6 +519,7 @@ struct WaveletParamsEdited { bool edgthresh; bool thr; bool thrH; + bool radius; bool skinprotect; bool hueskin; bool hueskin2; diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 63a9315a6..2269c6749 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -387,6 +387,7 @@ Gtk::Widget* Preferences::getBatchProcPanel () appendBehavList (mi, M ("TP_WAVELET_THR"), ADDSET_WA_THRR, true); appendBehavList (mi, M ("TP_WAVELET_RESCONH"), ADDSET_WA_RESCONH, true); appendBehavList (mi, M ("TP_WAVELET_THRH"), ADDSET_WA_THRRH, true); + appendBehavList (mi, M ("TP_WAVELET_RADIUS"), ADDSET_WA_RADIUS, true); appendBehavList (mi, M ("TP_WAVELET_RESCHRO"), ADDSET_WA_RESCHRO, true); appendBehavList (mi, M ("TP_WAVELET_TMSTRENGTH"), ADDSET_WA_TMRS, true); appendBehavList (mi, M ("TP_WAVELET_TMEDGS"), ADDSET_WA_EDGS, true); diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 165db8e94..5275fa948 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -77,8 +77,8 @@ Wavelet::Wavelet() : tmr(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_BALCHRO")))), showmask(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_SHOWMASK")))), neutralchButton(Gtk::manage(new Gtk::Button(M("TP_WAVELET_NEUTRAL")))), - rescon(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCON"), -100, 100, 1, 0))), - resconH(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCONH"), -100, 100, 1, 0))), + rescon(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCON"), 0, 100, 1, 0))), + resconH(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCONH"), 0, 100, 1, 0))), reschro(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCHRO"), -100, 100, 1, 0))), tmrs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMSTRENGTH"), -1.0, 2.0, 0.01, 0.0))), edgs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMEDGS"), 0.1, 4.0, 0.01, 1.4))), @@ -90,8 +90,9 @@ Wavelet::Wavelet() : chroma(Gtk::manage(new Adjuster(M("TP_WAVELET_CHRO"), 1, 9, 1, 5))), chro(Gtk::manage(new Adjuster(M("TP_WAVELET_CHR"), 0., 100., 1., 0.))), contrast(Gtk::manage(new Adjuster(M("TP_WAVELET_CONTRA"), -100, 100, 1, 0))), - thr(Gtk::manage(new Adjuster(M("TP_WAVELET_THR"), 0, 100, 1, 35))), - thrH(Gtk::manage(new Adjuster(M("TP_WAVELET_THRH"), 0, 100, 1, 65))), + thr(Gtk::manage(new Adjuster(M("TP_WAVELET_THR"), 0, 100, 1, 30))), + thrH(Gtk::manage(new Adjuster(M("TP_WAVELET_THRH"), 0, 100, 1, 70))), + radius(Gtk::manage(new Adjuster(M("TP_WAVELET_RADIUS"), 0, 100, 1, 40))), skinprotect(Gtk::manage(new Adjuster(M("TP_WAVELET_SKIN"), -100, 100, 1, 0.))), edgrad(Gtk::manage(new Adjuster(M("TP_WAVELET_EDRAD"), 0, 100, 1, 15))), edgval(Gtk::manage(new Adjuster(M("TP_WAVELET_EDVAL"), 0, 100, 1, 0))), @@ -167,6 +168,7 @@ Wavelet::Wavelet() : EvWavshowmask = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSHOWMASK"); EvWavedgs = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVEDGS"); EvWavscale = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSCALE"); + EvWavradius = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVRADIUS"); expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings)); @@ -678,6 +680,9 @@ Wavelet::Wavelet() : thrH->setAdjusterListener(this); resBox->pack_start(*thrH, Gtk::PACK_SHRINK); + radius->setAdjusterListener(this); + resBox->pack_start(*radius, Gtk::PACK_SHRINK); + contrast->set_tooltip_text(M("TP_WAVELET_CONTRA_TOOLTIP")); contrast->setAdjusterListener(this); resBox->pack_start(*contrast); //keep the possibility to reinstall @@ -1231,6 +1236,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) edgthresh->setValue(pp->wavelet.edgthresh); thr->setValue(pp->wavelet.thr); thrH->setValue(pp->wavelet.thrH); + radius->setValue(pp->wavelet.radius); skinprotect->setValue(pp->wavelet.skinprotect); hueskin->setValue(pp->wavelet.hueskin); hueskin2->setValue(pp->wavelet.hueskin2); @@ -1406,6 +1412,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) edgval->setEditedState(pedited->wavelet.edgval ? Edited : UnEdited); thr->setEditedState(pedited->wavelet.thr ? Edited : UnEdited); thrH->setEditedState(pedited->wavelet.thrH ? Edited : UnEdited); + radius->setEditedState(pedited->wavelet.radius ? Edited : UnEdited); skinprotect->setEditedState(pedited->wavelet.skinprotect ? Edited : UnEdited); hueskin->setEditedState(pedited->wavelet.hueskin ? Edited : UnEdited); hueskin2->setEditedState(pedited->wavelet.hueskin2 ? Edited : UnEdited); @@ -1567,6 +1574,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.edgthresh = edgthresh->getValue(); pp->wavelet.thr = thr->getValue(); pp->wavelet.thrH = thrH->getValue(); + pp->wavelet.radius = radius->getValue(); pp->wavelet.hueskin = hueskin->getValue (); pp->wavelet.hueskin2 = hueskin2->getValue (); pp->wavelet.skinprotect = skinprotect->getValue(); @@ -1676,6 +1684,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.edgval = edgval->getEditedState(); pedited->wavelet.thr = thr->getEditedState(); pedited->wavelet.thrH = thrH->getEditedState(); + pedited->wavelet.radius = radius->getEditedState(); pedited->wavelet.hueskin = hueskin->getEditedState(); pedited->wavelet.hueskin2 = hueskin2->getEditedState(); pedited->wavelet.skinprotect = skinprotect->getEditedState(); @@ -1910,6 +1919,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit edgthresh->setDefault(defParams->wavelet.edgthresh); thr->setDefault(defParams->wavelet.thr); thrH->setDefault(defParams->wavelet.thrH); + radius->setDefault(defParams->wavelet.radius); hueskin->setDefault (defParams->wavelet.hueskin); hueskin2->setDefault (defParams->wavelet.hueskin2); hllev->setDefault (defParams->wavelet.hllev); @@ -1970,6 +1980,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit edgthresh->setDefault(defParams->wavelet.edgthresh); thr->setDefaultEditedState(pedited->wavelet.thr ? Edited : UnEdited); thrH->setDefaultEditedState(pedited->wavelet.thrH ? Edited : UnEdited); + radius->setDefaultEditedState(pedited->wavelet.radius ? Edited : UnEdited); skinprotect->setDefaultEditedState(pedited->wavelet.skinprotect ? Edited : UnEdited); hueskin->setDefaultEditedState(pedited->wavelet.hueskin ? Edited : UnEdited); hueskin2->setDefaultEditedState(pedited->wavelet.hueskin2 ? Edited : UnEdited); @@ -2019,6 +2030,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit edgthresh->setDefaultEditedState(Irrelevant); thr->setDefaultEditedState(Irrelevant); thrH->setDefaultEditedState(Irrelevant); + radius->setDefaultEditedState(Irrelevant); skinprotect->setDefaultEditedState(Irrelevant); hueskin->setDefaultEditedState(Irrelevant); hueskin2->setDefaultEditedState(Irrelevant); @@ -2533,6 +2545,7 @@ void Wavelet::setBatchMode(bool batchMode) edgthresh->showEditedCB(); thr->showEditedCB(); thrH->showEditedCB(); + radius->showEditedCB(); skinprotect->showEditedCB(); hueskin->showEditedCB(); hueskin2->showEditedCB(); @@ -2625,6 +2638,8 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavthr, thr->getTextValue()); } else if (a == thrH) { listener->panelChanged(EvWavthrH, thrH->getTextValue()); + } else if (a == radius) { + listener->panelChanged(EvWavradius, radius->getTextValue()); } else if (a == threshold) { listener->panelChanged(EvWavThreshold, threshold->getTextValue()); } else if (a == threshold2) { @@ -3181,7 +3196,7 @@ void Wavelet::colorForValue(double valX, double valY, enum ColorCaller::ElemType caller->ccGreen = double(G); caller->ccBlue = double(B); } -void Wavelet::setAdjusterBehavior(bool multiplieradd, bool thresholdadd, bool threshold2add, bool thresadd, bool chroadd, bool chromaadd, bool contrastadd, bool skinadd, bool reschroadd, bool tmrsadd, bool edgsadd, bool scaleadd, bool resconadd, bool resconHadd, bool thradd, bool thrHadd, bool skyadd, bool edgradadd, bool edgvaladd, bool strengthadd, bool gammaadd, bool edgedetectadd, bool edgedetectthradd, bool edgedetectthr2add) +void Wavelet::setAdjusterBehavior(bool multiplieradd, bool thresholdadd, bool threshold2add, bool thresadd, bool chroadd, bool chromaadd, bool contrastadd, bool skinadd, bool reschroadd, bool tmrsadd, bool edgsadd, bool scaleadd, bool resconadd, bool resconHadd, bool thradd, bool thrHadd, bool radiusadd, bool skyadd, bool edgradadd, bool edgvaladd, bool strengthadd, bool gammaadd, bool edgedetectadd, bool edgedetectthradd, bool edgedetectthr2add) { for (int i = 0; i < 9; i++) { @@ -3203,6 +3218,7 @@ void Wavelet::setAdjusterBehavior(bool multiplieradd, bool thresholdadd, bool th scale->setAddMode(scaleadd); thr->setAddMode(thradd); thrH->setAddMode(thrHadd); + radius->setAddMode(radiusadd); sky->setAddMode(skyadd); edgrad->setAddMode(edgradadd); edgval->setAddMode(edgvaladd); diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index 5878a1ae4..4ef36d076 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -50,7 +50,7 @@ public: void autoOpenCurve () override; void curveChanged (CurveEditor* ce) override; void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; - void setAdjusterBehavior (bool multiplieradd, bool thresholdadd, bool threshold2add, bool thresadd, bool chroadd, bool chromaadd, bool contrastadd, bool skinadd, bool reschroadd, bool tmrsadd, bool edgsadd, bool scaleadd, bool resconadd, bool resconHadd, bool thradd, bool thrHadd, bool skyadd, bool edgradadd, bool edgvaladd, bool strengthadd, bool gammaadd, bool edgedetectadd, bool edgedetectthradd, bool edgedetectthr2add); + void setAdjusterBehavior (bool multiplieradd, bool thresholdadd, bool threshold2add, bool thresadd, bool chroadd, bool chromaadd, bool contrastadd, bool skinadd, bool reschroadd, bool tmrsadd, bool edgsadd, bool scaleadd, bool resconadd, bool resconHadd, bool thradd, bool thrHadd, bool radiusadd, bool skyadd, bool edgradadd, bool edgvaladd, bool strengthadd, bool gammaadd, bool edgedetectadd, bool edgedetectthradd, bool edgedetectthr2add); void setBatchMode (bool batchMode) override; void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; void setEditProvider (EditDataProvider *provider) override; @@ -74,6 +74,7 @@ private: rtengine::ProcEvent EvWavshowmask; rtengine::ProcEvent EvWavedgs; rtengine::ProcEvent EvWavscale; + rtengine::ProcEvent EvWavradius; void foldAllButMe (GdkEventButton* event, MyExpander *expander); @@ -180,6 +181,7 @@ private: Adjuster* const contrast; Adjuster* const thr; Adjuster* const thrH; + Adjuster* const radius; Adjuster* const skinprotect; Adjuster* const edgrad; Adjuster* const edgval; From 25e66f1fc23ebf9051d98fa1f6e209b64ee5d9c5 Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 27 May 2019 11:20:14 +0200 Subject: [PATCH 015/154] Small improvments residual --- rtengine/ipwavelet.cc | 2 +- rtgui/paramsedited.cc | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index bf9a6f37e..de5d193a1 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1595,7 +1595,7 @@ void ImProcFunctions::EPDToneMapResid(float * WavCoeffs_L0, unsigned int Iterat float edgest = params->wavelet.edgs; float sca = params->wavelet.scale; float gamm = params->wavelet.gamma; - float rew = params->epd.reweightingIterates; + int rew = 0; //params->epd.reweightingIterates; EdgePreservingDecomposition epd2(W_L, H_L); cp.TMmeth = 2; //default after testing diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index f0abd04f7..3616aade1 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -520,6 +520,7 @@ void ParamsEdited::set(bool v) wavelet.edgthresh = v; wavelet.thr = v; wavelet.thrH = v; + wavelet.radius = v; wavelet.skinprotect = v; wavelet.hueskin = v; wavelet.hueskin2 = v; @@ -1096,6 +1097,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.edgthresh = wavelet.edgthresh && p.wavelet.edgthresh == other.wavelet.edgthresh; wavelet.thr = wavelet.thr && p.wavelet.thr == other.wavelet.thr; wavelet.thrH = wavelet.thrH && p.wavelet.thrH == other.wavelet.thrH; + wavelet.radius = wavelet.radius && p.wavelet.radius == other.wavelet.radius; wavelet.hueskin = wavelet.hueskin && p.wavelet.hueskin == other.wavelet.hueskin; wavelet.hueskin2 = wavelet.hueskin2 && p.wavelet.hueskin2 == other.wavelet.hueskin2; wavelet.hllev = wavelet.hllev && p.wavelet.hllev == other.wavelet.hllev; @@ -2928,6 +2930,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.thrH = dontforceSet && options.baBehav[ADDSET_WA_THRRH] ? toEdit.wavelet.thrH + mods.wavelet.thrH : mods.wavelet.thrH; } + if (wavelet.radius) { + toEdit.wavelet.radius = dontforceSet && options.baBehav[ADDSET_WA_RADIUS] ? toEdit.wavelet.radius + mods.wavelet.radius : mods.wavelet.radius; + } + if (wavelet.sup) { toEdit.wavelet.sup = mods.wavelet.sup; } From f2666dc464dae9da843baa8bd50de4a53173303f Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 14 Jun 2019 07:28:37 +0200 Subject: [PATCH 016/154] Re-enabled showmask clarity and sharp-mask --- rtengine/dcrop.cc | 14 ++++++-- rtengine/improccoordinator.cc | 14 +++++--- rtgui/wavelet.cc | 63 +++++------------------------------ 3 files changed, 30 insertions(+), 61 deletions(-) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 7a72cc1cc..e08a53a10 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -1102,6 +1102,14 @@ void Crop::update(int todo) mL0 = mL = mC0 = mC = 0.f; } + float indic = 1.f; + if(WaveParams.showmask){ + mL0 = mC0 = -1.f; + indic = -1.f; + mL = fabs(mL); + mC = fabs(mC); + } + #ifdef _OPENMP #pragma omp parallel for @@ -1109,9 +1117,9 @@ void Crop::update(int todo) for (int x = 0; x < labnCrop->H; x++) for (int y = 0; y < labnCrop->W; y++) { - labnCrop->L[x][y] = (1.f + mL0) * (unshar->L[x][y]) - mL * labnCrop->L[x][y]; - labnCrop->a[x][y] = (1.f + mC0) * (unshar->a[x][y]) - mC * labnCrop->a[x][y]; - labnCrop->b[x][y] = (1.f + mC0) * (unshar->b[x][y]) - mC * labnCrop->b[x][y]; + labnCrop->L[x][y] = (1.f + mL0) * (unshar->L[x][y]) - mL * indic * labnCrop->L[x][y]; + labnCrop->a[x][y] = (1.f + mC0) * (unshar->a[x][y]) - mC * indic * labnCrop->a[x][y]; + labnCrop->b[x][y] = (1.f + mC0) * (unshar->b[x][y]) - mC * indic * labnCrop->b[x][y]; } delete unshar; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index b9d1664cd..5b946fb8c 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -967,17 +967,23 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } else { mL0 = mL = mC0 = mC = 0.f; } + float indic = 1.f; - + if(WaveParams.showmask){ + mL0 = mC0 = -1.f; + indic = -1.f; + mL = fabs(mL); + mC = fabs(mC); + } #ifdef _OPENMP #pragma omp parallel for #endif for (int x = 0; x < pH; x++) for (int y = 0; y < pW; y++) { - nprevl->L[x][y] = (1.f + mL0) * (unshar->L[x][y]) - mL * nprevl->L[x][y]; - nprevl->a[x][y] = (1.f + mC0) * (unshar->a[x][y]) - mC * nprevl->a[x][y]; - nprevl->b[x][y] = (1.f + mC0) * (unshar->b[x][y]) - mC * nprevl->b[x][y]; + nprevl->L[x][y] = (1.f + mL0) * (unshar->L[x][y]) - mL * indic * nprevl->L[x][y]; + nprevl->a[x][y] = (1.f + mC0) * (unshar->a[x][y]) - mC * indic * nprevl->a[x][y]; + nprevl->b[x][y] = (1.f + mC0) * (unshar->b[x][y]) - mC * indic * nprevl->b[x][y]; } delete unshar; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 5275fa948..7f9164779 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -501,7 +501,7 @@ Wavelet::Wavelet() : clariBox->pack_start(*mergeL); clariBox->pack_start(*mergeC); clariBox->pack_start(*softrad); -// clariBox->pack_start(*showmask); + clariBox->pack_start(*showmask); // Edge Sharpness ToolParamBlock* const edgBox = Gtk::manage(new ToolParamBlock()); @@ -3064,46 +3064,6 @@ void Wavelet::avoidToggled() void Wavelet::showmaskToggled() { - if (ushamethod->get_active_row_number() == 1 && showmask->get_active()) { - Backmethod->set_active(2); - CLmethod->set_active(2); - Lmethod->set_active(6); - Lmethod->set_sensitive(true); - Dirmethod->set_sensitive(true); - Dirmethod->set_active(3); - expclari->setEnabled(false); - - } else if (ushamethod->get_active_row_number() == 0 && showmask->get_active()) { - Backmethod->set_active(0); - CLmethod->set_active(1); - Lmethod->set_active(2); - Dirmethod->set_active(3); - Lmethod->set_sensitive(true); - Dirmethod->set_sensitive(true); - expclari->setEnabled(false); - - } - - if (ushamethod->get_active_row_number() == 1 && !showmask->get_active()) { - Backmethod->set_active(2); - CLmethod->set_active(2); - Lmethod->set_active(6); - Lmethod->set_sensitive(true); - Dirmethod->set_sensitive(true); - Dirmethod->set_active(3); - expclari->setEnabled(true); - - } else if (ushamethod->get_active_row_number() == 0 && !showmask->get_active()) { - Backmethod->set_active(0); - CLmethod->set_active(1); - Lmethod->set_active(2); - Dirmethod->set_active(3); - Lmethod->set_sensitive(true); - Dirmethod->set_sensitive(true); - expclari->setEnabled(true); - - } - if (multiImage) { if (showmask->get_inconsistent()) { showmask->set_inconsistent(false); @@ -3306,20 +3266,15 @@ void Wavelet::enableToggled(MyExpander *expander) event = EvWavenafin; } else if (expander == expclari) { if (expclari->getEnabled() == false) { - if (! showmask->get_active()) { - Backmethod->set_active(1); - CLmethod->set_active(3); - Lmethod->set_active(3); - Dirmethod->set_active(3); - Lmethod->set_sensitive(false); - Dirmethod->set_sensitive(false); - CLmethod->set_sensitive(true); - Backmethod->set_sensitive(true); - } + Backmethod->set_active(1); + CLmethod->set_active(3); + Lmethod->set_active(3); + Dirmethod->set_active(3); + Lmethod->set_sensitive(false); + Dirmethod->set_sensitive(false); + CLmethod->set_sensitive(true); + Backmethod->set_sensitive(true); } else { - if (showmask->get_active()) { - showmask->set_active(false); - } if (ushamethod->get_active_row_number() == 1) { Backmethod->set_active(2); From 5dbc61579d9b83e26160107ab201fec84ba016f5 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 25 Jun 2019 13:56:52 +0200 Subject: [PATCH 017/154] Save provisory work for autowb ITCWB --- rtengine/color.cc | 11 + rtengine/color.h | 1 + rtengine/colortemp.cc | 2228 ++++++++++++++++++- rtengine/colortemp.h | 172 ++ rtengine/iimage.h | 5 + rtengine/imagesource.h | 2 + rtengine/improccoordinator.cc | 18 + rtengine/procparams.cc | 10 +- rtengine/rawimagesource.cc | 3777 +++++++++++++++++++++++++++++++++ rtengine/rawimagesource.h | 7 + rtengine/settings.h | 8 + rtengine/stdimagesource.cc | 26 + rtengine/stdimagesource.h | 3 + rtgui/options.cc | 44 + rtgui/whitebalance.cc | 9 + 15 files changed, 6317 insertions(+), 4 deletions(-) diff --git a/rtengine/color.cc b/rtengine/color.cc index 3f2a75788..0ee5a479c 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -939,6 +939,17 @@ void Color::rgbxyz (float r, float g, float b, float &x, float &y, float &z, con z = ((xyz_rgb[2][0] * r + xyz_rgb[2][1] * g + xyz_rgb[2][2] * b)) ; } +void Color::rgbxyY(float r, float g, float b, float &x, float &y, float &Y, float &xx, float &yy, float &zz, const double xyz_rgb[3][3]) +{ + xx = ((xyz_rgb[0][0] * r + xyz_rgb[0][1] * g + xyz_rgb[0][2] * b)) ; + yy = ((xyz_rgb[1][0] * r + xyz_rgb[1][1] * g + xyz_rgb[1][2] * b)) ; + zz = ((xyz_rgb[2][0] * r + xyz_rgb[2][1] * g + xyz_rgb[2][2] * b)) ; + float som = xx + yy + zz; + x = xx / som; + y = yy / som; + Y = yy / 65535.f; +} + void Color::rgbxyz (float r, float g, float b, float &x, float &y, float &z, const float xyz_rgb[3][3]) { x = ((xyz_rgb[0][0] * r + xyz_rgb[0][1] * g + xyz_rgb[0][2] * b)) ; diff --git a/rtengine/color.h b/rtengine/color.h index a94302e30..0963c0ff4 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -585,6 +585,7 @@ public: * @param xyz_rgb[3][3] transformation matrix to use for the conversion */ static void rgbxyz (float r, float g, float b, float &x, float &y, float &z, const double xyz_rgb[3][3]); + static void rgbxyY(float r, float g, float b, float &x, float &y, float &Y, float &xx, float &yy, float &zz, const double xyz_rgb[3][3]); static void rgbxyz (float r, float g, float b, float &x, float &y, float &z, const float xyz_rgb[3][3]); #ifdef __SSE2__ static void rgbxyz (vfloat r, vfloat g, vfloat b, vfloat &x, vfloat &y, vfloat &z, const vfloat xyz_rgb[3][3]); diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index a7a769d93..527755a03 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -23,6 +23,12 @@ #include #include "sleef.c" #include "settings.h" +#include "iccstore.h" + +#undef CLIPD +#define CLIPD(a) ((a)>0.0?((a)<1.0?(a):1.0):0.0) +#define CLIPQQ(a) ((a)>0?((a)<250?(a):250):0) +#define MAXR(a,b) ((a) > (b) ? (a) : (b)) namespace rtengine { @@ -393,6 +399,618 @@ const double ColorTemp::ColorchechGreE2_spect[97] = { 0.4297, 0.4837, 0.5142, 0.5446, 0.5541, 0.5636, 0.5608, 0.5579, 0.5480, 0.5381, 0.5258, 0.5135, 0.4959, 0.4783, 0.4570, 0.4356, 0.4124, 0.3891, 0.3710, 0.3529, 0.3425, 0.3320, 0.3266, 0.3211, 0.3180, 0.3149, 0.3129, 0.3108, 0.3123, 0.3137, 0.3193, 0.3248, 0.3335, 0.3422, 0.3518, 0.3613, 0.3693, 0.3772, 0.3810, 0.3847, 0.3838, 0.3829, 0.3838, 0.3847, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; +const double ColorTemp::ColorGreenM25_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0758, 0.0614, 0.0662, 0.0591, 0.0648, 0.0633, 0.0671, 0.0613, 0.0621, 0.0610, 0.0680, 0.0690, 0.0784, 0.0830, 0.0920, 0.1070, 0.1231, 0.1423, 0.1607, 0.1731, 0.1816, 0.1911, 0.1951, 0.1986, 0.1915, 0.1889, + 0.1758, 0.1673, 0.1606, 0.1505, 0.1384, 0.1317, 0.1230, 0.1149, 0.1081, 0.0992, 0.0882, 0.0785, 0.0709, 0.0629, 0.0550, 0.0502, 0.0486, 0.0474, 0.0445, 0.0434, 0.0429, 0.0423, 0.0411, 0.0405, 0.0397, 0.0387, 0.0399, 0.0398, 0.0398, 0.0407, 0.0408, 0.0426, 0.0445, 0.0443, 0.0468, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//0 658 45 0 0 131 98 84 123 104 131 112 121 121 139 128 148 199 296 389 476 689 945 1132 1326 1490 1674 1741 1775 1868 1914 1928 1961 1972 1992 2045 2064 2053 2048 2072 2086 2081 2069 2056 2073 2096 2114 2067 2089 2100 2061 2019 1983 1971 1961 2016 1956 1946 1922 1983 1991 +const double ColorTemp::ColorYellowkeltano_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0658, 0.0045, 0.0, 0.0, 0.0131, 0.0098, 0.0084, 0.0123, 0.0104, 0.0131, 0.0112, 0.0121, 0.0121, 0.0139, + 0.0128, 0.0148, 0.0199, 0.0296, 0.0389, 0.0476, 0.0689, 0.0945, 0.1132, 0.1326, 0.1490, 0.1674, 0.1741, 0.1775, 0.1868, + 0.1914, 0.1928, 0.1961, 0.1972, 0.1992, 0.2045, 0.2064, 0.2053, 0.2048, 0.2072, 0.2086, 0.2081, 0.2069, 0.2056, 0.2073, + 0.2096, 0.2114, 0.2067, 0.2089, 0.2100, 0.2061, 0.2019, 0.1983, 0.1971, 0.1961, 0.2016, 0.1956, 0.1946, 0.1922, 0.1983, 0.1991, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::ColorGreenalsi_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1732, 0.0292, 0.0315, 0.0533, 0.0469, 0.0359, 0.0404, 0.0356, 0.0345, 0.0374, 0.0348, 0.0336, 0.0332, 0.0333, 0.0342, + 0.0330, 0.0350, 0.0343, 0.0354, 0.0371, 0.0399, 0.0426, 0.0497, 0.0541, 0.0616, 0.0701, 0.0750, 0.0764, 0.0783, 0.0794, + 0.0784, 0.0732, 0.0708, 0.0652, 0.0612, 0.0595, 0.0570, 0.0531, 0.0507, 0.0501, 0.0488, 0.0458, 0.0437, 0.0420, 0.0436, + 0.0424, 0.0417, 0.0389, 0.0380, 0.0378, 0.0371, 0.0350, 0.0333, 0.0350, 0.0394, 0.0379, 0.0446, 0.0491, 0.0575, 0.0734, 0.0953, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//1890 1097 855 899 987 881 807 804 787 691 643 549 465 404 385 302 244 195 165 159 123 129 108 111 114 126 126 134 162 170 213 248 279 351 412 566 752 909 1069 1270 1526 +//1707 1858 1999 2112 2293 2422 2471 2611 2718 2710 2778 2807 2825 2856 2909 2901 2974 3042 3044 3075 +const double ColorTemp::ColorRedpetunia_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1890, 0.1097, 0.0855, 0.0899, 0.0987, 0.0881, 0.0807, 0.0804, 0.0787, 0.0691, 0.0643, 0.0549, 0.0465, 0.0404, 0.0385, + 0.0302, 0.0244, 0.0195, 0.0165, 0.0159, 0.0123, 0.0129, 0.0108, 0.0111, 0.0114, 0.0126, 0.0126, 0.0134, 0.0162, 0.0170, + 0.0213, 0.0248, 0.0279, 0.0351, 0.0412, 0.0566, 0.0752, 0.0909, 0.1069, 0.1270, 0.1526, 0.1707, 0.1858, 0.1999, 0.2112, + 0.2293, 0.2422, 0.2471, 0.2611, 0.2718, 0.2710, 0.2778, 0.2807, 0.2825, 0.2856, 0.2909, 0.2901, 0.2974, 0.3042, 0.3044, 0.3075, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//0.1588 0.1980 0.2789 0.4585 0.6059 0.6609 0.6674 0.6599 0.6551 0.6472 0.6423 0.6485 0.6515 0.6379 0.6193 0.6121 0.6026 0.5678 0.5310 0.5245 0.5305 0.5324 0.5262 0.5219 0.5247 0.5312 0.5436 0.5634 0.5832 0.5943 0.5953 0.5902 0.5805 0.5754 0.5901 0.6262 + +const double ColorTemp::JDC468_B14_75Redspect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1588, 0.1780, 0.1980, 0.2310, 0.2789, 0.3213, 0.4585, 0.5324, 0.6059, 0.6334, 0.6609, 0.6630, 0.6674, 0.6640, 0.6599, 0.6600, 0.6551, 0.6532, 0.6472, 0.6450, + 0.6423, 0.6467, 0.6485, 0.6500, 0.6515, 0.6456, 0.6379, 0.6285, 0.6193, 0.6150, 0.6121, 0.6056, 0.6026, 0.5812, 0.5678, 0.5490, 0.5310, 0.5307, 0.5245, 0.5300, + 0.5305, 0.5310, 0.5324, 0.5298, 0.5262, 0.5230, 0.5219, 0.5231, 0.5247, 0.5280, 0.5312, 0.5364, 0.5436, 0.5550, 0.5634, 0.5731, 0.5832, 0.5901, 0.5943, 0.5950, + 0.5953, 0.5926, 0.5902, 0.5850, 0.5805, 0.5770, 0.5754, 0.6012, 0.6262, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +const double ColorTemp::ColorRedkurttu_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0979, 0.1536, 0.0745, 0.1145, 0.0937, 0.0996, 0.0972, 0.0924, 0.0875, 0.0878, 0.0826, 0.0766, 0.0658, 0.0599, 0.0545, + 0.0509, 0.0443, 0.0381, 0.0356, 0.0327, 0.0318, 0.0304, 0.0295, 0.0288, 0.0285, 0.0271, 0.0281, 0.0282, 0.0278, 0.0280, + 0.0296, 0.0309, 0.0324, 0.0342, 0.0343, 0.0376, 0.0419, 0.0464, 0.0520, 0.0634, 0.0747, 0.0905, 0.1093, 0.1167, 0.1264, + 0.1439, 0.1650, 0.1928, 0.2183, 0.2380, 0.2537, 0.2754, 0.2893, 0.3009, 0.3115, 0.3213, 0.3173, 0.3222, 0.3237, 0.3192, 0.3210, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#light red flower (lupiini) +//1792 1553 1684 1882 1909 1847 2053 2084 2045 2052 2039 2084 2041 2044 2007 1984 1906 1876 1886 1855 1859 1875 1816 1800 1811 1780 1802 1816 1838 1915 1973 2018 2083 2114 2133 2226 2304 2385 2458 2494 2571 2689 2738 2774 2734 2759 2781 2831 2844 2857 2878 2876 2884 2920 2932 2860 2894 2934 2925 2928 2921 +const double ColorTemp::ColorRedlupiini_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1792, 0.1553, 0.1684, 0.1882, 0.1909, 0.1847, 0.2053, 0.2084, 0.2045, 0.2052, 0.2039, 0.2084, 0.2041, 0.2044, 0.2007, 0.1984, 0.1906, 0.1876, + 0.1886, 0.1855, 0.1859, 0.1875, 0.1816, 0.1800, 0.1811, 0.1780, 0.1802, 0.1816, 0.1838, 0.1915, 0.1973, 0.2018, 0.2083, 0.2114, 0.2133, 0.2226, + 0.2304, 0.2385, 0.2458, 0.2494, 0.2571, 0.2689, 0.2738, 0.2774, 0.2734, 0.2759, 0.2781, 0.2831, 0.2844, 0.2857, 0.2878, 0.2876, 0.2884, 0.2920, + 0.2932, 0.2860, 0.2894, 0.2934, 0.2925, 0.2928, 0.2921, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//#red flower (hevosminttu) +//1280 706 612 462 391 339 253 285 261 264 239 208 201 186 185 161 156 149 146 148 161 144 143 151 147 146 139 148 173 185 185 197 222 238 283 322 384 439 519 633 792 922 1061 1186 1235 1342 1538 1691 1839 1974 2024 2098 2128 2187 2204 2217 2267 2299 2339 2331 2322 +const double ColorTemp::ColorRedhevosminttu_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1280, 0.0706, 0.0612, 0.0462, 0.0391, 0.0339, 0.0253, 0.0285, 0.0261, 0.0264, 0.0239, 0.0208, 0.0201, 0.0186, 0.0185, 0.0161, 0.0156, 0.0149, + 0.0146, 0.0148, 0.0161, 0.0144, 0.0143, 0.0151, 0.0147, 0.0146, 0.0139, 0.0148, 0.0173, 0.0185, 0.0185, 0.0197, 0.0222, 0.0238, 0.0283, 0.0322, + 0.0384, 0.0439, 0.0519, 0.0633, 0.0792, 0.0922, 0.1061, 0.1186, 0.1235, 0.1342, 0.1538, 0.1691, 0.1839, 0.1974, 0.2024, 0.2098, 0.2128, 0.2187, 0.2204, + 0.2217, 0.2267, 0.2299, 0.2339, 0.2331, 0.2322, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//#red flower (neilikka) +//0 0 394 0 245 95 174 149 194 171 181 175 172 167 147 137 107 108 100 87 93 87 83 77 80 67 72 64 83 84 88 90 91 94 114 133 178 241 309 419 612 823 992 1153 1222 1366 1503 1658 1767 1841 1884 1992 2035 2007 2009 2045 2065 2229 2290 2395 2449 +const double ColorTemp::ColorRedneilikka_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0394, 0.0, 0.0245, 0.0095, 0.0174, 0.0149, 0.0194, 0.0171, 0.0181, 0.0175, 0.0172, 0.0167, 0.0147, 0.0137, 0.0107, 0.0108, 0.0100, + 0.0087, 0.0093, 0.0087, 0.0083, 0.0077, 0.0080, 0.0067, 0.0072, 0.0064, 0.0083, 0.0084, 0.0088, 0.0090, 0.0091, 0.0094, 0.0114, 0.0133, + 0.0178, 0.0241, 0.0309, 0.0419, 0.0612, 0.0823, 0.0992, 0.1153, 0.1222, 0.1366, 0.1503, 0.1658, 0.1767, 0.1841, 0.1884, 0.1992, 0.2035, 0.2007, 0.2009, + 0.2045, 0.2065, 0.2229, 0.2290, 0.2395, 0.2449, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#red petal (pelargonia) +//2529 2048 2087 2698 2452 2372 2531 2475 2296 2294 2159 2111 1986 1898 1854 1729 1586 1501 1392 1332 1343 1255 1217 1182 1183 1203 1230 1277 1381 1474 1615 1762 1876 2028 2214 2464 2657 2919 3051 3172 3293 3421 3395 3494 3438 3495 3506 3490 3454 3487 3431 3452 3484 3438 3422 3368 3325 3441 3356 3432 3320 +const double ColorTemp::ColorRedpelagornia_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2529, 0.2048, 0.2087, 0.2698, 0.2452, 0.2372, 0.2531, 0.2475, 0.2296, 0.2294, 0.2159, 0.2111, 0.1986, 0.1898, 0.1854, 0.1729, 0.1586, 0.1501, 0.1392, 0.1332, 0.1343, + 0.1255, 0.1217, 0.1182, 0.1183, 0.1203, 0.1230, 0.1277, 0.1381, 0.1474, 0.1615, 0.1762, 0.1876, 0.2028, 0.2214, 0.2464, 0.2657, 0.2919, 0.3051, 0.3172, 0.3293, 0.3421, + 0.3395, 0.3494, 0.3438, 0.3495, 0.3506, 0.3490, 0.3454, 0.3487, 0.3431, 0.3452, 0.3484, 0.3438, 0.3422, 0.3368, 0.3325, 0.3441, 0.3356, 0.3432, 0.3320, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#red flower (talvio) +//3131 2199 2559 2540 2844 2530 2694 2765 2594 2673 2617 2629 2491 2384 2308 2256 2081 1973 1857 1752 1719 1652 1527 1477 1459 1386 1341 1283 1318 1334 1354 1424 1495 1543 1634 1773 1950 2129 2272 2431 2642 2827 2941 3045 3082 3158 3216 3307 3364 3388 3387 3517 3573 3501 3499 3523 3495 3606 3493 3518 3522 +const double ColorTemp::ColorRedtalvio_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3131, 0.2199, 0.2559, 0.2540, 0.2844, 0.2530, 0.2694, 0.2765, 0.2594, 0.2673, 0.2617, 0.2629, 0.2491, 0.2384, 0.2308, 0.2256, 0.2081, 0.1973, 0.1857, 0.1752, 0.1719, + 0.1652, 0.1527, 0.1477, 0.1459, 0.1386, 0.1341, 0.1283, 0.1318, 0.1334, 0.1354, 0.1424, 0.1495, 0.1543, 0.1634, 0.1773, 0.1950, 0.2129, 0.2272, 0.2431, 0.2642, 0.2827, + 0.2941, 0.3045, 0.3082, 0.3158, 0.3216, 0.3307, 0.3364, 0.3388, 0.3387, 0.3517, 0.3573, 0.3501, 0.3499, 0.3523, 0.3495, 0.3606, 0.3493, 0.3518, 0.3522, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 + +}; + +//#brown dry leaf (poimulehti) +//964 520 223 244 261 247 196 199 200 207 202 198 209 204 207 222 205 218 213 212 224 218 230 235 251 250 245 250 263 273 271 275 281 264 274 288 287 307 303 307 323 304 335 335 346 345 347 348 370 364 380 393 384 407 419 421 419 433 431 461 465 +//RIs 67 +const double ColorTemp::ColorBrownpoimulehti_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0964, 0.0520, 0.0223, 0.0244, 0.0261, 0.0247, 0.0196, 0.0199, 0.0200, 0.0207, 0.0202, 0.0198, 0.0209, 0.0204, 0.0207, 0.0222, 0.0205, 0.0218, 0.0213, + 0.0212, 0.0224, 0.0218, 0.0230, 0.0235, 0.0251, 0.0250, 0.0245, 0.0250, 0.0263, 0.0273, 0.0271, 0.0275, 0.0281, 0.0264, 0.0274, 0.0288, 0.0287, 0.0307, + 0.0303, 0.0307, 0.0323, 0.0304, 0.0335, 0.0335, 0.0346, 0.0345, 0.0347, 0.0348, 0.0370, 0.0364, 0.0380, 0.0393, 0.0384, 0.0407, + 0.0419, 0.0421, 0.0419, 0.0433, 0.0431, 0.0461, 0.0465, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#orange leaf (koristepensas, tuntematon) +//241 195 223 489 574 565 634 605 574 613 645 636 644 628 621 603 614 654 676 719 776 795 862 879 918 918 955 980 1013 1055 1132 1225 1258 1362 1427 1579 1796 1936 2079 2258 2440 2597 2728 2790 2777 2857 2923 2991 3031 3040 3037 3094 3066 3023 3093 3044 3082 3085 3147 3226 3192 +const double ColorTemp::ColorOrangetuntematon_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0241, 0.0195, 0.0223, 0.0489, 0.0574, 0.0565, 0.0634, 0.0605, 0.0574, 0.0613, 0.0645, 0.0636, 0.0644, 0.0628, 0.0621, 0.0603, 0.0614, 0.0654, 0.0676, + 0.0719, 0.0776, 0.0795, 0.0862, 0.0879, 0.0918, 0.0918, 0.0955, 0.0980, 0.1013, 0.1055, 0.1132, 0.1225, 0.1258, 0.1362, 0.1427, 0.1579, 0.1796, 0.1936, 0.2079, + 0.2258, 0.2440, 0.2597, 0.2728, 0.2790, 0.2777, 0.2857, 0.2923, 0.2991, 0.3031, 0.3040, 0.3037, 0.3094, 0.3066, 0.3023, 0.3093, 0.3044, 0.3082, 0.3085, 0.3147, 0.3226, 0.3192, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//,#orange leaf (lehmus) +//1062 866 443 544 496 485 492 458 450 425 458 477 497 461 451 481 454 500 515 538 529 593 638 670 686 711 718 729 741 760 796 833 895 958 1016 1128 1246 1344 1450 1505 1596 1636 1621 1631 1627 1628 1658 1583 1486 1415 1322 1265 1159 1062 975 974 1063 1326 1736 2141 2568 +const double ColorTemp::ColorOrangetlehmus_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1062, 0.0866, 0.0443, 0.0544, 0.0496, 0.0485, 0.0492, 0.0458, 0.0450, 0.0425, 0.0458, 0.0477, 0.0497, 0.0461, 0.0451, 0.0481, 0.0454, 0.0500, 0.0515, + 0.0538, 0.0529, 0.0593, 0.0638, 0.0670, 0.0686, 0.0711, 0.0718, 0.0729, 0.0741, 0.0760, 0.0796, 0.0833, 0.0895, 0.0958, 0.1016, 0.1128, 0.1246, 0.1344, 0.1450, + 0.1505, 0.1596, 0.1636, 0.1621, 0.1631, 0.1627, 0.1628, 0.1658, 0.1583, 0.1486, 0.1415, 0.1322, 0.1265, 0.1159, 0.1062, 0.0975, 0.0974, 0.1063, 0.1326, 0.1736, 0.2141, 0.2568, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#orange leaf (vaahtera) +//1517 551 664 659 521 585 460 385 424 389 375 374 359 380 371 373 379 387 378 394 405 416 463 496 536 542 577 579 619 642 678 710 777 829 894 1035 1174 1334 1484 1611 1798 1941 2012 2065 2135 2229 2286 2317 2332 2357 2323 2330 2292 2236 2137 2093 2180 2240 2368 2487 2528 +const double ColorTemp::ColorOrangvaahtera_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1517, 0.0551, 0.0664, 0.0659, 0.0521, 0.0585, 0.0460, 0.0385, 0.0424, 0.0389, 0.0375, 0.0374, 0.0359, 0.0380, 0.0371, 0.0373, 0.0379, 0.0387, 0.0378, + 0.0394, 0.0405, 0.0416, 0.0463, 0.0496, 0.0536, 0.0542, 0.0577, 0.0579, 0.0619, 0.0642, 0.0678, 0.0710, 0.0777, 0.0829, 0.0894, 0.1035, 0.1174, 0.1334, 0.1484, + 0.1611, 0.1798, 0.1941, 0.2012, 0.2065, 0.2135, 0.2229, 0.2286, 0.2317, 0.2332, 0.2357, 0.2323, 0.2330, 0.2292, 0.2236, 0.2137, 0.2093, 0.2180, 0.2240, 0.2368, 0.2487, 0.2528, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#brown dry leaf (lehmus) +//758 236 148 430 347 435 438 495 439 454 472 471 461 459 458 479 492 482 499 513 520 545 567 594 623 647 698 717 744 792 803 834 864 876 916 932 963 1013 1025 1060 1099 1118 1153 1175 1207 1242 1268 1266 1284 1305 1305 1304 1353 1360 1330 1332 1413 1502 1610 1682 1737 +const double ColorTemp::ColorBrownlehmus_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0758, 0.0236, 0.0148, 0.0430, 0.0347, 0.0435, 0.0438, 0.0495, 0.0439, 0.0454, 0.0472, 0.0471, 0.0461, 0.0459, 0.0458, 0.0479, 0.0492, 0.0482, 0.0499, 0.0513, + 0.0520, 0.0545, 0.0567, 0.0594, 0.0623, 0.0647, 0.0698, 0.0717, 0.0744, 0.0792, 0.0803, 0.0834, 0.0864, 0.0876, 0.0916, 0.0932, 0.0963, 0.1013, 0.1025, 0.1060, + 0.1099, 0.1118, 0.1153, 0.1175, 0.1207, 0.1242, 0.1268, 0.1266, 0.1284, 0.1305, 0.1305, 0.1304, 0.1353, 0.1360, 0.1330, 0.1332, 0.1413, 0.1502, 0.1610, 0.1682, 0.1737, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#brown moss (nuotiosammal) +//482 260 178 92 104 88 92 40 43 52 58 64 70 63 67 67 62 76 82 82 91 96 104 116 135 141 142 155 168 179 198 199 193 201 212 218 226 240 242 238 255 265 277 266 265 283 289 275 289 277 291 288 277 252 262 260 264 299 375 411 446 +const double ColorTemp::ColorBrownuotiosammal_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0482, 0.0260, 0.0178, 0.0092, 0.0104, 0.0088, 0.0092, 0.0040, 0.0043, 0.0052, 0.0058, 0.0064, 0.0070, 0.0063, 0.0067, 0.0067, 0.0062, 0.0076, 0.0082, 0.0082, 0.0091, 0.0096, + 0.0104, 0.0116, 0.0135, 0.0141, 0.0142, 0.0155, 0.0168, 0.0179, 0.0198, 0.0199, 0.0193, 0.0201, 0.0212, 0.0218, 0.0226, 0.0240, 0.0242, 0.0238, 0.0255, 0.0265, + 0.0277, 0.0266, 0.0265, 0.0283, 0.0289, 0.0275, 0.0289, 0.0277, 0.0291, 0.0288, 0.0277, 0.0252, 0.0262, 0.0260, 0.0264, 0.0299, 0.0375, 0.0411, 0.0446, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#black soil +//0 0 89 122 52 53 104 127 130 134 137 137 134 136 138 139 134 140 142 148 154 153 152 150 151 156 153 166 154 171 163 163 166 166 169 169 166 174 174 170 170 168 176 177 176 174 179 180 180 183 177 193 178 187 194 193 182 196 184 195 195 +const double ColorTemp::ColorBlacksoil_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0089, 0.0122, 0.0052, 0.0053, 0.0104, 0.0127, 0.0130, 0.0134, 0.0137, 0.0137, 0.0134, 0.0136, 0.0138, 0.0139, 0.0134, 0.0140, 0.0142, 0.0148, 0.0154, 0.0153, + 0.0152, 0.0150, 0.0151, 0.0156, 0.0153, 0.0166, 0.0154, 0.0171, 0.0163, 0.0163, 0.0166, 0.0166, 0.0169, 0.0169, 0.0166, 0.0174, 0.0174, 0.0170, 0.0170, 0.0168, 0.0176, 0.0177, + 0.0176, 0.0174, 0.0179, 0.0180, 0.0180, 0.0183, 0.0177, 0.0193, 0.0178, 0.0187, 0.0194, 0.0193, 0.0182, 0.0196, 0.0184, 0.0195, 0.0195, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#black, dry leaf (pihlaja) +//0 79 111 172 174 201 214 211 207 207 191 200 196 206 196 194 203 207 204 208 210 212 211 208 209 219 222 224 231 241 232 244 249 250 267 264 262 269 282 277 289 284 279 302 289 308 313 315 310 325 313 319 356 340 331 347 356 352 364 373 352 +const double ColorTemp::ColorBlackpihlaja[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0079, 0.0111, 0.0172, 0.0174, 0.0201, 0.0214, 0.0211, 0.0207, 0.0207, 0.0191, 0.0200, 0.0196, 0.0206, 0.0196, 0.0194, 0.0203, 0.0207, 0.0204, 0.0208, 0.0210, 0.0212, + 0.0211, 0.0208, 0.0209, 0.0219, 0.0222, 0.0224, 0.0231, 0.0241, 0.0232, 0.0244, 0.0249, 0.0250, 0.0267, 0.0264, 0.0262, 0.0269, 0.0282, 0.0277, 0.0289, 0.0284, 0.0279, 0.0302, + 0.0289, 0.0308, 0.0313, 0.0315, 0.0310, 0.0325, 0.0313, 0.0319, 0.0356, 0.0340, 0.0331, 0.0347, 0.0356, 0.0352, 0.0364, 0.0373, 0.0352, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + + +//#gray lichen (nahkajaekaelae) +//1204 585 1113 733 600 653 715 685 726 682 713 691 719 691 683 693 711 715 701 700 720 697 706 696 723 714 726 738 729 735 737 739 742 746 746 761 743 735 722 717 728 749 721 712 705 737 733 758 780 785 775 771 755 744 743 742 755 779 849 940 1042 +//RIS 74 +const double ColorTemp::ColorGraynahjajaekaelae_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1204, 0.0585, 0.1113, 0.0733, 0.0600, 0.0653, 0.0715, 0.0685, 0.0726, 0.0682, 0.0713, 0.0691, 0.0719, 0.0691, 0.0683, 0.0693, 0.0711, 0.0715, 0.0701, 0.0700, + 0.0720, 0.0697, 0.0706, 0.0696, 0.0723, 0.0714, 0.0726, 0.0738, 0.0729, 0.0735, 0.0737, 0.0739, 0.0742, 0.0746, 0.0746, 0.0761, 0.0743, 0.0735, 0.0722, 0.0717, + 0.0728, 0.0749, 0.0721, 0.0712, 0.0705, 0.0737, 0.0733, 0.0758, 0.0780, 0.0785, 0.0775, 0.0771, 0.0755, 0.0744, 0.0743, 0.0742, 0.0755, 0.0779, 0.0849, 0.0940, 0.1042, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#green moss (nuotiosammal) +//120 65 134 31 209 124 104 96 97 95 76 79 83 93 83 95 95 104 117 127 140 161 214 252 290 310 328 343 347 373 365 351 347 343 311 301 285 283 263 256 255 251 257 235 227 224 233 208 194 186 165 160 151 149 157 161 185 243 309 425 543 +const double ColorTemp::ColorGreennuotisammal_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0120, 0.0065, 0.0134, 0.0031, 0.0209, 0.0124, 0.0104, 0.0096, 0.0097, 0.0095, 0.0076, 0.0079, 0.0083, 0.0093, 0.0083, 0.0095, 0.0095, 0.0104, 0.0117, 0.0127, 0.0140, 0.0161, + 0.0214, 0.0252, 0.0290, 0.0310, 0.0328, 0.0343, 0.0347, 0.0373, 0.0365, 0.0351, 0.0347, 0.0343, 0.0311, 0.0301, 0.0285, 0.0283, 0.0263, 0.0256, 0.0255, 0.0251, + 0.0257, 0.0235, 0.0227, 0.0224, 0.0233, 0.0208, 0.0194, 0.0186, 0.0165, 0.0160, 0.0151, 0.0149, 0.0157, 0.0161, 0.0185, 0.0243, 0.0309, 0.0425, 0.0543, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#green leaf (leskenlehti) +//525 273 0 378 318 164 224 276 316 266 303 290 305 286 290 303 323 323 352 383 405 482 614 743 920 1015 1139 1192 1175 1216 1195 1145 1116 1009 947 867 802 754 741 709 675 625 574 579 561 565 557 511 471 419 399 372 365 395 375 382 458 555 716 1002 1407 +const double ColorTemp::ColorGreenleskenlehti_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0525, 0.0273, 0.0, 0.0378, 0.0318, 0.0164, 0.0224, 0.0276, 0.0316, 0.0266, 0.0303, 0.0290, 0.0305, 0.0286, 0.0290, 0.0303, 0.0323, 0.0323, 0.0352, 0.0383, 0.0405, 0.0482, + 0.0614, 0.0743, 0.0920, 0.1015, 0.1139, 0.1192, 0.1175, 0.1216, 0.1195, 0.1145, 0.1116, 0.1009, 0.0947, 0.0867, 0.0802, 0.0754, 0.0741, 0.0709, 0.0675, 0.0625, + 0.0574, 0.0579, 0.0561, 0.0565, 0.0557, 0.0511, 0.0471, 0.0419, 0.0399, 0.0372, 0.0365, 0.0395, 0.0375, 0.0382, 0.0458, 0.0555, 0.0716, 0.1002, 0.1407, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#green leaf (linnunkaali) +//602 0 267 306 339 335 300 247 292 289 295 298 292 318 312 289 299 307 310 320 350 375 446 499 574 634 698 725 736 754 736 702 668 633 590 551 514 499 467 460 445 424 415 409 399 412 393 380 370 362 366 343 342 350 333 350 364 418 494 670 914 +//RIS 77 +const double ColorTemp::ColorGreenlinnunkaali_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0602, 0.0, 0.0267, 0.0306, 0.0339, 0.0335, 0.0300, 0.0247, 0.0292, 0.0289, 0.0295, 0.0298, 0.0292, 0.0318, 0.0312, 0.0289, 0.0299, 0.0307, 0.0310, 0.0320, + 0.0350, 0.0375, 0.0446, 0.0499, 0.0574, 0.0634, 0.0698, 0.0725, 0.0736, 0.0754, 0.0736, 0.0702, 0.0668, 0.0633, 0.0590, 0.0551, 0.0514, 0.0499, 0.0467, 0.0460, + 0.0445, 0.0424, 0.0415, 0.0409, 0.0399, 0.0412, 0.0393, 0.0380, 0.0370, 0.0362, 0.0366, 0.0343, 0.0342, 0.0350, 0.0333, 0.0350, 0.0364, 0.0418, 0.0494, 0.0670, 0.0914, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//#green leaf (pelto-ohake) +//0 366 360 233 173 179 157 175 206 205 180 179 173 178 187 189 184 171 195 204 193 219 253 297 365 431 467 489 493 516 500 466 426 406 380 343 316 295 276 282 265 253 239 228 226 229 238 237 216 221 219 217 212 219 229 258 284 309 375 487 732 +const double ColorTemp::ColorGreenpelto_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0366, 0.0360, 0.0233, 0.0173, 0.0179, 0.0157, 0.0175, 0.0206, 0.0205, 0.0180, 0.0179, 0.0173, 0.0178, 0.0187, 0.0189, 0.0184, 0.0171, 0.0195, 0.0204, 0.0193, 0.0219, + 0.0253, 0.0297, 0.0365, 0.0431, 0.0467, 0.0489, 0.0493, 0.0516, 0.0500, 0.0466, 0.0426, 0.0406, 0.0380, 0.0343, 0.0316, 0.0295, 0.0276, 0.0282, 0.0265, 0.0253, 0.0239, + 0.0228, 0.0226, 0.0229, 0.0238, 0.0237, 0.0216, 0.0221, 0.0219, 0.0217, 0.0212, 0.0219, 0.0229, 0.0258, 0.0284, 0.0309, 0.0375, 0.0487, 0.0732, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#green rod (voikukka), +//2205 1755 1710 1365 1159 1207 1024 1118 1127 1141 1134 1125 1149 1140 1120 1128 1139 1156 1212 1273 1262 1359 1461 1519 1568 1599 1660 1668 1680 1718 1697 1690 1672 1675 1663 1644 1642 1652 1626 1623 1653 1621 1614 1590 1625 1609 1615 1576 1509 1483 1418 1391 1324 1294 1267 1220 1315 1417 1650 1861 2006 +const double ColorTemp::ColorGreenrodvoikukka[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2205, 0.1755, 0.1710, 0.1365, 0.1159, 0.1207, 0.1024, 0.1118, 0.1127, 0.1141, 0.1134, 0.1125, 0.1149, 0.1140, 0.1120, 0.1128, 0.1139, 0.1156, 0.1212, 0.1273, 0.1262, 0.1359, + 0.1461, 0.1519, 0.1568, 0.1599, 0.1660, 0.1668, 0.1680, 0.1718, 0.1697, 0.1690, 0.1672, 0.1675, 0.1663, 0.1644, 0.1642, 0.1652, 0.1626, 0.1623, 0.1653, 0.1621, 0.1614, 0.1590, + 0.1625, 0.1609, 0.1615, 0.1576, 0.1509, 0.1483, 0.1418, 0.1391, 0.1324, 0.1294, 0.1267, 0.1220, 0.1315, 0.1417, 0.1650, 0.1861, 0.2006, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#green leaf (lehmus) +//2362 1024 945 666 617 604 591 580 648 631 656 607 616 653 643 626 643 656 710 753 801 929 1105 1277 1437 1601 1742 1774 1798 1848 1832 1820 1787 1730 1663 1593 1541 1461 1446 1419 1335 1298 1247 1192 1197 1199 1156 1072 1007 942 899 832 824 793 755 801 860 1031 1305 1809 2260 +const double ColorTemp::ColorGreenlehmus[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2362, 0.1024, 0.0945, 0.0666, 0.0617, 0.0604, 0.0591, 0.0580, 0.0648, 0.0631, 0.0656, 0.0607, 0.0616, 0.0653, 0.0643, 0.0626, 0.0643, 0.0656, 0.0710, 0.0753, + 0.0801, 0.0929, 0.1105, 0.1277, 0.1437, 0.1601, 0.1742, 0.1774, 0.1798, 0.1848, 0.1832, 0.1820, 0.1787, 0.1730, 0.1663, 0.1593, 0.1541, 0.1461, 0.1446, 0.1419, 0.1335, 0.1298, + 0.1247, 0.1192, 0.1197, 0.1199, 0.1156, 0.1072, 0.1007, 0.0942, 0.0899, 0.0832, 0.0824, 0.0793, 0.0755, 0.0801, 0.0860, 0.1031, 0.1305, 0.1809, 0.2260, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#green leaf (koristeherukka) +//945 292 315 433 321 294 295 321 278 261 282 272 270 278 285 274 277 268 269 283 275 309 325 389 450 493 551 557 587 585 567 554 515 487 460 424 409 387 353 349 353 333 309 309 312 315 321 298 304 304 281 273 293 311 314 333 355 392 439 595 811 +const double ColorTemp::ColorGreenkoriste[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0945, 0.0292, 0.0315, 0.0433, 0.0321, 0.0294, 0.0295, 0.0321, 0.0278, 0.0261, 0.0282, 0.0272, 0.0270, 0.0278, 0.0285, 0.0274, 0.0277, 0.0268, 0.0269, 0.0283, + 0.0275, 0.0309, 0.0325, 0.0389, 0.0450, 0.0493, 0.0551, 0.0557, 0.0587, 0.0585, 0.0567, 0.0554, 0.0515, 0.0487, 0.0460, 0.0424, 0.0409, 0.0387, 0.0353, 0.0349, + 0.0353, 0.0333, 0.0309, 0.0309, 0.0312, 0.0315, 0.0321, 0.0298, 0.0304, 0.0304, 0.0281, 0.0273, 0.0293, 0.0311, 0.0314, 0.0333, 0.0355, 0.0392, 0.0439, 0.0595, 0.0811, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#green leaf (poimulehti) +//1102 146 630 266 247 261 285 238 273 281 272 260 262 254 274 263 273 278 296 309 322 388 493 607 712 840 953 986 1006 1034 999 981 918 855 794 711 649 627 604 563 531 515 467 450 448 466 445 421 402 385 369 345 346 319 330 359 378 439 578 835 1177 +const double ColorTemp::ColorGreenpoimulehti[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1102, 0.0146, 0.0630, 0.0266, 0.0247, 0.0261, 0.0285, 0.0238, 0.0273, 0.0281, 0.0272, 0.0260, 0.0262, 0.0254, 0.0274, 0.0263, 0.0273, 0.0278, 0.0296, 0.0309, 0.0322, + 0.0388, 0.0493, 0.0607, 0.0712, 0.0840, 0.0953, 0.0986, 0.1006, 0.1034, 0.0999, 0.0981, 0.0918, 0.0855, 0.0794, 0.0711, 0.0649, 0.0627, 0.0604, 0.0563, 0.0531, 0.0515, + 0.0467, 0.0450, 0.0448, 0.0466, 0.0445, 0.0421, 0.0402, 0.0385, 0.0369, 0.0345, 0.0346, 0.0319, 0.0330, 0.0359, 0.0378, 0.0439, 0.0578, 0.0835, 0.1177, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#green leaf (hopeapaju) +//787 512 1260 1032 765 881 994 908 983 985 941 985 971 967 964 937 928 959 973 992 1004 1017 1053 1102 1180 1227 1281 1309 1317 1328 1318 1271 1238 1222 1179 1152 1131 1092 1086 1078 1083 1020 1015 1000 1027 1037 1028 970 962 977 952 963 955 935 980 979 963 1028 1059 1228 1401 +const double ColorTemp::ColorGreenhopeapaju[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0787, 0.0512, 0.1260, 0.1032, 0.0765, 0.0881, 0.0994, 0.0908, 0.0983, 0.0985, 0.0941, 0.0985, 0.0971, 0.0967, 0.0964, 0.0937, 0.0928, 0.0959, 0.0973, 0.0992, 0.1004, + 0.1017, 0.1053, 0.1102, 0.1180, 0.1227, 0.1281, 0.1309, 0.1317, 0.1328, 0.1318, 0.1271, 0.1238, 0.1222, 0.1179, 0.1152, 0.1131, 0.1092, 0.1086, 0.1078, 0.1083, 0.1020, + 0.1015, 0.1000, 0.1027, 0.1037, 0.1028, 0.0970, 0.0962, 0.0977, 0.0952, 0.0963, 0.0955, 0.0935, 0.0980, 0.0979, 0.0963, 0.1028, 0.1059, 0.1228, 0.1401, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#red flower (uuden guinean liisa) +//2288 1861 2364 2229 2783 2842 2842 2923 2902 2990 2828 2871 2772 2723 2639 2558 2424 2315 2169 2094 2064 1964 1865 1739 1680 1624 1548 1457 1424 1408 1434 1451 1492 1528 1597 1755 1951 2147 2367 2648 2986 3236 3393 3596 3665 3786 3879 3915 3926 3994 3987 4017 4026 4112 4067 4125 4139 4121 4050 4040 4095 +const double ColorTemp::ColorReduuden[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2288, 0.1861, 0.2364, 0.2229, 0.2783, 0.2842, 0.2842, 0.2923, 0.2902, 0.2990, 0.2828, 0.2871, 0.2772, 0.2723, 0.2639, 0.2558, 0.2424, 0.2315, 0.2169, 0.2094, 0.2064, + 0.1964, 0.1865, 0.1739, 0.1680, 0.1624, 0.1548, 0.1457, 0.1424, 0.1408, 0.1434, 0.1451, 0.1492, 0.1528, 0.1597, 0.1755, 0.1951, 0.2147, 0.2367, 0.2648, 0.2986, 0.3236, + 0.3393, 0.3596, 0.3665, 0.3786, 0.3879, 0.3915, 0.3926, 0.3994, 0.3987, 0.4017, 0.4026, 0.4112, 0.4067, 0.4125, 0.4139, 0.4121, 0.4050, 0.4040, 0.4095, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#red flower (pajuangervo) +//445 1024 605 833 937 959 1052 1028 1049 1029 1017 975 948 882 865 812 757 718 658 638 628 597 554 523 509 509 485 475 469 492 479 477 490 525 555 597 641 704 756 846 948 1055 1164 1221 1266 1339 1393 1491 1553 1604 1608 1650 1643 1652 1655 1658 1651 1739 1813 1818 1938 +const double ColorTemp::ColorRedpajuan[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0445, 0.1024, 0.0605, 0.0833, 0.0937, 0.0959, 0.1052, 0.1028, 0.1049, 0.1029, 0.1017, 0.0975, 0.0948, 0.0882, 0.0865, 0.0812, 0.0757, 0.0718, 0.0658, 0.0638, 0.0628, 0.0597, + 0.0554, 0.0523, 0.0509, 0.0509, 0.0485, 0.0475, 0.0469, 0.0492, 0.0479, 0.0477, 0.0490, 0.0525, 0.0555, 0.0597, 0.0641, 0.0704, 0.0756, 0.0846, 0.0948, 0.1055, 0.1164, 0.1221, + 0.1266, 0.1339, 0.1393, 0.1491, 0.1553, 0.1604, 0.1608, 0.1650, 0.1643, 0.1652, 0.1655, 0.1658, 0.1651, 0.1739, 0.1813, 0.1818, 0.1938, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#red flower (jaloangervo) +//120 152 512 635 662 538 749 713 743 792 777 785 733 726 728 749 709 674 661 657 645 635 598 570 553 544 545 538 546 514 540 567 585 577 602 651 690 765 836 907 980 1089 1147 1188 1212 1253 1318 1371 1412 1473 1459 1478 1548 1582 1564 1590 1595 1714 1728 1814 1837 +const double ColorTemp::ColorRedjaloan[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0120, 0.0152, 0.0512, 0.0635, 0.0662, 0.0538, 0.0749, 0.0713, 0.0743, 0.0792, 0.0777, 0.0785, 0.0733, 0.0726, 0.0728, 0.0749, 0.0709, 0.0674, 0.0661, 0.0657, 0.0645, 0.0635, + 0.0598, 0.0570, 0.0553, 0.0544, 0.0545, 0.0538, 0.0546, 0.0514, 0.0540, 0.0567, 0.0585, 0.0577, 0.0602, 0.0651, 0.0690, 0.0765, 0.0836, 0.0907, 0.0980, 0.1089, 0.1147, 0.1188, + 0.1212, 0.1253, 0.1318, 0.1371, 0.1412, 0.1473, 0.1459, 0.1478, 0.1548, 0.1582, 0.1564, 0.1590, 0.1595, 0.1714, 0.1728, 0.1814, 0.1837, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#blue flower (ukonhattu) +//801 682 1070 1319 1311 1420 1453 1394 1318 1292 1268 1179 1132 1054 1015 948 846 780 731 709 705 667 621 598 555 522 505 493 498 500 494 471 479 463 450 461 487 515 546 574 555 562 539 558 546 552 567 626 715 807 862 978 1086 1199 1313 1323 1350 1366 1358 1320 1365 +const double ColorTemp::ColorBlueukon[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0801, 0.0682, 0.1070, 0.1319, 0.1311, 0.1420, 0.1453, 0.1394, 0.1318, 0.1292, 0.1268, 0.1179, 0.1132, 0.1054, 0.1015, 0.0948, 0.0846, 0.0780, 0.0731, 0.0709, 0.0705, 0.0667, + 0.0621, 0.0598, 0.0555, 0.0522, 0.0505, 0.0493, 0.0498, 0.0500, 0.0494, 0.0471, 0.0479, 0.0463, 0.0450, 0.0461, 0.0487, 0.0515, 0.0546, 0.0574, 0.0555, 0.0562, 0.0539, 0.0558, + 0.0546, 0.0552, 0.0567, 0.0626, 0.0715, 0.0807, 0.0862, 0.0978, 0.1086, 0.1199, 0.1313, 0.1323, 0.1350, 0.1366, 0.1358, 0.1320, 0.1365, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#blue flower (orvokki) +//292 528 645 1000 932 1439 1752 1947 2077 2158 2169 2153 2164 2132 2091 1993 1916 1876 1803 1702 1659 1554 1503 1425 1330 1229 1186 1134 1065 1031 1014 993 989 980 939 936 945 995 1055 1104 1180 1247 1284 1343 1349 1403 1458 1538 1634 1790 1880 2006 2218 2396 2556 2612 2735 2811 2765 2840 2877 +const double ColorTemp::ColorBlueorvokki[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0292, 0.0528, 0.0645, 0.1000, 0.0932, 0.1439, 0.1752, 0.1947, 0.2077, 0.2158, 0.2169, 0.2153, 0.2164, 0.2132, 0.2091, 0.1993, 0.1916, 0.1876, 0.1803, 0.1702, 0.1659, 0.1554, + 0.1503, 0.1425, 0.1330, 0.1229, 0.1186, 0.1134, 0.1065, 0.1031, 0.1014, 0.0993, 0.0989, 0.0980, 0.0939, 0.0936, 0.0945, 0.0995, 0.1055, 0.1104, 0.1180, 0.1247, 0.1284, 0.1343, + 0.1349, 0.1403, 0.1458, 0.1538, 0.1634, 0.1790, 0.1880, 0.2006, 0.2218, 0.2396, 0.2556, 0.2612, 0.2735, 0.2811, 0.2765, 0.2840, 0.2877, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#blue flower (malvikki) +//1062 528 749 571 512 538 455 445 431 384 353 299 249 212 190 162 123 105 90 81 83 75 78 72 59 56 61 54 71 69 70 62 63 65 70 74 78 73 76 87 90 104 119 119 131 145 156 184 225 255 314 414 538 669 849 1068 1247 1467 1701 1885 2032 +const double ColorTemp::ColorBluemalvikki[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1062, 0.0528, 0.0749, 0.0571, 0.0512, 0.0538, 0.0455, 0.0445, 0.0431, 0.0384, 0.0353, 0.0299, 0.0249, 0.0212, 0.0190, 0.0162, 0.0123, 0.0105, 0.0090, 0.0081, 0.0083, 0.0075, + 0.0078, 0.0072, 0.0059, 0.0056, 0.0061, 0.0054, 0.0071, 0.0069, 0.0070, 0.0062, 0.0063, 0.0065, 0.0070, 0.0074, 0.0078, 0.0073, 0.0076, 0.0087, 0.0090, 0.0104, 0.0119, 0.0119, + 0.0131, 0.0145, 0.0156, 0.0184, 0.0225, 0.0255, 0.0314, 0.0414, 0.0538, 0.0669, 0.0849, 0.1068, 0.1247, 0.1467, 0.1701, 0.1885, 0.2032, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#black dry leaf (maitohorsma) +//256 0 172 356 213 270 203 203 195 208 202 201 210 210 203 204 209 203 209 201 205 201 194 210 206 197 203 198 207 201 204 202 198 200 198 197 186 203 202 198 200 208 206 231 235 223 244 254 278 289 297 309 338 335 338 368 412 524 686 926 1185 +const double ColorTemp::ColorBlackmaito[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0256, 0.0, 0.0172, 0.0356, 0.0213, 0.0270, 0.0203, 0.0203, 0.0195, 0.0208, 0.0202, 0.0201, 0.0210, 0.0210, 0.0203, 0.0204, 0.0209, 0.0203, 0.0209, 0.0201, 0.0205, 0.0201, + 0.0194, 0.0210, 0.0206, 0.0197, 0.0203, 0.0198, 0.0207, 0.0201, 0.0204, 0.0202, 0.0198, 0.0200, 0.0198, 0.0197, 0.0186, 0.0203, 0.0202, 0.0198, 0.0200, 0.0208, 0.0206, 0.0231, + 0.0235, 0.0223, 0.0244, 0.0254, 0.0278, 0.0289, 0.0297, 0.0309, 0.0338, 0.0335, 0.0338, 0.0368, 0.0412, 0.0524, 0.0686, 0.0926, 0.1185, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#orange berry (pihlaja) +//945 731 585 433 247 408 266 314 293 305 289 288 280 297 262 298 277 274 291 293 285 303 300 310 324 336 364 377 426 465 499 561 602 667 741 890 1028 1164 1275 1465 1602 1640 1695 1744 1812 1837 1859 1805 1791 1822 1796 1751 1715 1655 1575 1600 1560 1618 1666 1740 1838 +const double ColorTemp::ColorOrangpihlaja[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0945, 0.0731, 0.0585, 0.0433, 0.0247, 0.0408, 0.0266, 0.0314, 0.0293, 0.0305, 0.0289, 0.0288, 0.0280, 0.0297, 0.0262, 0.0298, 0.0277, 0.0274, 0.0291, 0.0293, 0.0285, 0.0303, + 0.0300, 0.0310, 0.0324, 0.0336, 0.0364, 0.0377, 0.0426, 0.0465, 0.0499, 0.0561, 0.0602, 0.0667, 0.0741, 0.0890, 0.1028, 0.1164, 0.1275, 0.1465, 0.1602, 0.1640, 0.1695, 0.1744, + 0.1812, 0.1837, 0.1859, 0.1805, 0.1791, 0.1822, 0.1796, 0.1751, 0.1715, 0.1655, 0.1575, 0.1600, 0.1560, 0.1618, 0.1666, 0.1740, 0.1838, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#green flower (lehmus=linden) +//2677 1682 1170 1032 1085 816 728 755 833 832 813 845 857 884 855 882 914 997 1084 1179 1231 1437 1661 1873 2048 2209 2378 2408 2442 2509 2503 2452 2457 2418 2383 2348 2277 2213 2221 2169 2146 2048 1977 1960 2000 1993 1961 1899 1784 1748 1625 1517 1389 1260 1165 1143 1244 1522 1870 2324 2586 +//RIS 81 +const double ColorTemp::ColorGreenlinden[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2677, 0.1682, 0.1170, 0.1032, 0.1085, 0.0816, 0.0728, 0.0755, 0.0833, 0.0832, 0.0813, 0.0845, 0.0857, 0.0884, 0.0855, 0.0882, 0.0914, 0.0997, 0.1084, 0.1179, 0.1231, 0.1437, + 0.1661, 0.1873, 0.2048, 0.2209, 0.2378, 0.2408, 0.2442, 0.2509, 0.2503, 0.2452, 0.2457, 0.2418, 0.2383, 0.2348, 0.2277, 0.2213, 0.2221, 0.2169, 0.2146, 0.2048, 0.1977, 0.1960, + 0.2000, 0.1993, 0.1961, 0.1899, 0.1784, 0.1748, 0.1625, 0.1517, 0.1389, 0.1260, 0.1165, 0.1143, 0.1244, 0.1522, 0.1870, 0.2324, 0.2586, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#yellow petal (lehmus) +//1890 1097 900 832 814 799 758 853 803 808 833 862 916 943 960 969 1039 1162 1283 1370 1427 1529 1689 1781 1894 1950 2105 2118 2140 2185 2191 2199 2234 2266 2263 2297 2328 2312 2298 2332 2344 2312 2288 2347 2384 2390 2358 2280 2306 2315 2310 2253 2274 2271 2242 2292 2254 2208 2319 2314 2264 +const double ColorTemp::ColorYellowlehmus[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1890, 0.1097, 0.0900, 0.0832, 0.0814, 0.0799, 0.0758, 0.0853, 0.0803, 0.0808, 0.0833, 0.0862, 0.0916, 0.0943, 0.0960, 0.0969, 0.1039, 0.1162, 0.1283, 0.1370, 0.1427, + 0.1529, 0.1689, 0.1781, 0.1894, 0.1950, 0.2105, 0.2118, 0.2140, 0.2185, 0.2191, 0.2199, 0.2234, 0.2266, 0.2263, 0.2297, 0.2328, 0.2312, 0.2298, 0.2332, 0.2344, 0.2312, 0.2288, + 0.2347, 0.2384, 0.2390, 0.2358, 0.2280, 0.2306, 0.2315, 0.2310, 0.2253, 0.2274, 0.2271, 0.2242, 0.2292, 0.2254, 0.2208, 0.2319, 0.2314, 0.2264, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#yellow flower (suikeroalpi) +//2048 1666 1140 1210 699 680 615 566 567 561 609 585 614 572 599 575 636 730 982 1194 1360 1766 2222 2558 2849 3048 3201 3395 3395 3484 3576 3623 3606 3672 3651 3634 3647 3669 3715 3660 3720 3692 3704 3784 3683 3731 3681 3697 3635 3694 3617 3610 3632 3663 3616 3595 3599 3584 3588 3613 3527 +const double ColorTemp::ColorYellowsuikeroalpi[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2048, 0.1666, 0.1140, 0.1210, 0.0699, 0.0680, 0.0615, 0.0566, 0.0567, 0.0561, 0.0609, 0.0585, 0.0614, 0.0572, 0.0599, 0.0575, 0.0636, 0.0730, 0.0982, 0.1194, 0.1360, 0.1766, + 0.2222, 0.2558, 0.2849, 0.3048, 0.3201, 0.3395, 0.3395, 0.3484, 0.3576, 0.3623, 0.3606, 0.3672, 0.3651, 0.3634, 0.3647, 0.3669, 0.3715, 0.3660, 0.3720, 0.3692, 0.3704, 0.3784, + 0.3683, 0.3731, 0.3681, 0.3697, 0.3635, 0.3694, 0.3617, 0.3610, 0.3632, 0.3663, 0.3616, 0.3595, 0.3599, 0.3584, 0.3588, 0.3613, 0.3527, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#yellow flower (pensashanhikki) +//356 1365 1024 902 535 387 355 247 365 307 321 330 319 332 317 336 408 487 709 963 1235 1631 2111 2436 2718 2950 3151 3262 3313 3420 3448 3475 3491 3534 3520 3565 3622 3631 3626 3657 3640 3607 3641 3627 3601 3591 3588 3667 3618 3601 3630 3613 3592 3609 3569 3590 3568 3563 3588 3480 3471 +const double ColorTemp::ColorYellowpensashanhikki1[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0356, 0.1365, 0.1024, 0.0902, 0.0535, 0.0387, 0.0355, 0.0247, 0.0365, 0.0307, 0.0321, 0.0330, 0.0319, 0.0332, 0.0317, 0.0336, 0.0408, 0.0487, 0.0709, 0.0963, 0.1235, + 0.1631, 0.2111, 0.2436, 0.2718, 0.2950, 0.3151, 0.3262, 0.3313, 0.3420, 0.3448, 0.3475, 0.3491, 0.3534, 0.3520, 0.3565, 0.3622, 0.3631, 0.3626, 0.3657, 0.3640, 0.3607, + 0.3641, 0.3627, 0.3601, 0.3591, 0.3588, 0.3667, 0.3618, 0.3601, 0.3630, 0.3613, 0.3592, 0.3609, 0.3569, 0.3590, 0.3568, 0.3563, 0.3588, 0.3480, 0.3471, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#yellow sepal (pensashanhikki) +//1068 427 326 416 428 590 503 470 539 526 546 540 539 526 497 546 555 603 753 903 1010 1268 1563 1868 2068 2226 2429 2495 2560 2625 2636 2610 2655 2667 2635 2630 2612 2560 2597 2588 2543 2478 2499 2472 2438 2431 2379 2406 2361 2319 2264 2174 2128 2010 1942 1912 1930 2148 2334 2585 2764 +const double ColorTemp::ColorYellowpensashanhikki2[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1068, 0.0427, 0.0326, 0.0416, 0.0428, 0.0590, 0.0503, 0.0470, 0.0539, 0.0526, 0.0546, 0.0540, 0.0539, 0.0526, 0.0497, 0.0546, 0.0555, 0.0603, 0.0753, 0.0903, 0.1010, 0.1268, + 0.1563, 0.1868, 0.2068, 0.2226, 0.2429, 0.2495, 0.2560, 0.2625, 0.2636, 0.2610, 0.2655, 0.2667, 0.2635, 0.2630, 0.2612, 0.2560, 0.2597, 0.2588, 0.2543, 0.2478, 0.2499, 0.2472, + 0.2438, 0.2431, 0.2379, 0.2406, 0.2361, 0.2319, 0.2264, 0.2174, 0.2128, 0.2010, 0.1942, 0.1912, 0.1930, 0.2148, 0.2334, 0.2585, 0.2764, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#blue flower (hiidenvirna) +//315 512 675 832 765 865 807 867 911 904 852 826 780 753 711 661 595 528 513 476 431 391 361 331 305 276 240 229 237 223 212 208 215 205 203 195 209 212 222 266 296 322 356 352 388 391 411 425 473 532 550 630 669 748 823 879 904 917 930 950 942 +const double ColorTemp::ColorBluehiidenvirna[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0315, 0.0512, 0.0675, 0.0832, 0.0765, 0.0865, 0.0807, 0.0867, 0.0911, 0.0904, 0.0852, 0.0826, 0.0780, 0.0753, 0.0711, 0.0661, 0.0595, 0.0528, 0.0513, 0.0476, 0.0431, 0.0391, + 0.0361, 0.0331, 0.0305, 0.0276, 0.0240, 0.0229, 0.0237, 0.0223, 0.0212, 0.0208, 0.0215, 0.0205, 0.0203, 0.0195, 0.0209, 0.0212, 0.0222, 0.0266, 0.0296, 0.0322, 0.0356, 0.0352, + 0.0388, 0.0391, 0.0411, 0.0425, 0.0473, 0.0532, 0.0550, 0.0630, 0.0669, 0.0748, 0.0823, 0.0879, 0.0904, 0.0917, 0.0930, 0.0950, 0.0942, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#blue flower (kurkkuyrtti) +//2687 1553 2181 2246 2209 2263 2442 2347 2261 2353 2292 2230 2095 2008 1896 1782 1569 1443 1333 1223 1177 1074 992 902 813 755 701 626 577 548 525 498 469 445 456 448 428 441 448 447 455 467 496 534 527 586 668 798 966 1126 1289 1469 1679 1870 2013 2040 2060 2077 2104 2155 2119 +//RIS 87 +const double ColorTemp::ColorBluekurkkuyrtti[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2687, 0.1553, 0.2181, 0.2246, 0.2209, 0.2263, 0.2442, 0.2347, 0.2261, 0.2353, 0.2292, 0.2230, 0.2095, 0.2008, 0.1896, 0.1782, 0.1569, 0.1443, 0.1333, 0.1223, 0.1177, 0.1074, + 0.0992, 0.0902, 0.0813, 0.0755, 0.0701, 0.0626, 0.0577, 0.0548, 0.0525, 0.0498, 0.0469, 0.0445, 0.0456, 0.0448, 0.0428, 0.0441, 0.0448, 0.0447, 0.0455, 0.0467, 0.0496, 0.0534, + 0.0527, 0.0586, 0.0668, 0.0798, 0.0966, 0.1126, 0.1289, 0.1469, 0.1679, 0.1870, 0.2013, 0.2040, 0.2060, 0.2077, 0.2104, 0.2155, 0.2119, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#pink (siankaersaemoe) +//585 859 758 1094 780 1012 987 1067 1059 1034 1098 1110 1097 1040 1058 1048 1028 1014 1068 1024 1023 1025 1032 1029 1011 1007 986 973 946 906 949 923 943 949 956 998 1051 1107 1166 1242 1284 1355 1394 1438 1451 1543 1589 1588 1612 1616 1562 1534 1562 1541 1494 1492 1518 1650 1749 1907 1991 +const double ColorTemp::ColorPinksiankaersaemoe[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0585, 0.0859, 0.0758, 0.1094, 0.0780, 0.1012, 0.0987, 0.1067, 0.1059, 0.1034, 0.1098, 0.1110, 0.1097, 0.1040, 0.1058, 0.1048, 0.1028, 0.1014, 0.1068, 0.1024, 0.1023, 0.1025, + 0.1032, 0.1029, 0.1011, 0.1007, 0.0986, 0.0973, 0.0946, 0.0906, 0.0949, 0.0923, 0.0943, 0.0949, 0.0956, 0.0998, 0.1051, 0.1107, 0.1166, 0.1242, 0.1284, 0.1355, 0.1394, 0.1438, + 0.1451, 0.1543, 0.1589, 0.1588, 0.1612, 0.1616, 0.1562, 0.1534, 0.1562, 0.1541, 0.1494, 0.1492, 0.1518, 0.1650, 0.1749, 0.1907, 0.1991, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#violet flower (harakankello) +//2520 1462 1890 1898 1751 1713 1555 1516 1471 1403 1282 1209 1144 1135 1069 976 895 823 782 762 713 685 661 635 603 559 551 550 541 567 562 574 580 589 586 620 670 690 718 801 786 769 773 739 800 806 837 845 971 1043 1102 1241 1359 1502 1611 1726 1793 1859 1909 1969 2014 +//RIS 89 +const double ColorTemp::ColorVioletharakankello[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2520, 0.1462, 0.1890, 0.1898, 0.1751, 0.1713, 0.1555, 0.1516, 0.1471, 0.1403, 0.1282, 0.1209, 0.1144, 0.1135, 0.1069, 0.0976, 0.0895, 0.0823, 0.0782, 0.0762, 0.0713, + 0.0685, 0.0661, 0.0635, 0.0603, 0.0559, 0.0551, 0.0550, 0.0541, 0.0567, 0.0562, 0.0574, 0.0580, 0.0589, 0.0586, 0.0620, 0.0670, 0.0690, 0.0718, 0.0801, 0.0786, 0.0769, + 0.0773, 0.0739, 0.0800, 0.0806, 0.0837, 0.0845, 0.0971, 0.1043, 0.1102, 0.1241, 0.1359, 0.1502, 0.1611, 0.1726, 0.1793, 0.1859, 0.1909, 0.1969, 0.2014, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#violet flower (alsikeapila) +//1260 585 765 1065 937 881 847 943 1075 1053 1020 994 1008 1026 1015 980 962 949 925 908 880 864 843 814 802 749 698 691 677 660 653 660 631 633 644 692 743 809 889 1005 1160 1325 1396 1450 1526 1583 1655 1674 1689 1707 1675 1674 1624 1576 1564 1591 1613 1717 1851 1962 2033 +const double ColorTemp::ColorVioletalsikeapila[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1260, 0.0585, 0.0765, 0.1065, 0.0937, 0.0881, 0.0847, 0.0943, 0.1075, 0.1053, 0.1020, 0.0994, 0.1008, 0.1026, 0.1015, 0.0980, 0.0962, 0.0949, 0.0925, 0.0908, 0.0880, 0.0864, + 0.0843, 0.0814, 0.0802, 0.0749, 0.0698, 0.0691, 0.0677, 0.0660, 0.0653, 0.0660, 0.0631, 0.0633, 0.0644, 0.0692, 0.0743, 0.0809, 0.0889, 0.1005, 0.1160, 0.1325, 0.1396, 0.1450, + 0.1526, 0.1583, 0.1655, 0.1674, 0.1689, 0.1707, 0.1675, 0.1674, 0.1624, 0.1576, 0.1564, 0.1591, 0.1613, 0.1717, 0.1851, 0.1962, 0.2033, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#violet flower (akilleija) +//843 1340 1393 1254 1290 1452 1508 1519 1454 1384 1301 1256 1178 1113 1056 985 884 827 743 720 691 664 605 578 540 507 499 475 485 494 492 479 487 493 471 495 559 595 645 689 720 732 716 723 734 750 804 849 948 1041 1169 1362 1525 1693 1761 1935 2071 2235 2376 2493 2604 +const double ColorTemp::ColorVioletakilleija[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0843, 0.1340, 0.1393, 0.1254, 0.1290, 0.1452, 0.1508, 0.1519, 0.1454, 0.1384, 0.1301, 0.1256, 0.1178, 0.1113, 0.1056, 0.0985, 0.0884, 0.0827, 0.0743, 0.0720, 0.0691, 0.0664, + 0.0605, 0.0578, 0.0540, 0.0507, 0.0499, 0.0475, 0.0485, 0.0494, 0.0492, 0.0479, 0.0487, 0.0493, 0.0471, 0.0495, 0.0559, 0.0595, 0.0645, 0.0689, 0.0720, 0.0732, 0.0716, 0.0723, + 0.0734, 0.0750, 0.0804, 0.0849, 0.0948, 0.1041, 0.1169, 0.1362, 0.1525, 0.1693, 0.1761, 0.1935, 0.2071, 0.2235, 0.2376, 0.2493, 0.2604, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#orange flower (kehaekukka) +//0 0 0 0 0 0 102 58 128 125 137 122 122 134 123 136 159 138 163 151 167 178 192 177 206 226 315 451 707 1045 1446 1707 1944 2131 2276 2524 2719 2841 2968 3052 3199 3264 3282 3429 3451 3454 3477 3556 3478 3565 3595 3569 3582 3582 3559 3610 3626 3668 3733 3692 3722 +const double ColorTemp::ColorOrangekehaekukka[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0102, 0.0058, 0.0128, 0.0125, 0.0137, 0.0122, 0.0122, 0.0134, 0.0123, 0.0136, 0.0159, 0.0138, 0.0163, 0.0151, 0.0167, 0.0178, 0.0192, + 0.0177, 0.0206, 0.0226, 0.0315, 0.0451, 0.0707, 0.1045, 0.1446, 0.1707, 0.1944, 0.2131, 0.2276, 0.2524, 0.2719, 0.2841, 0.2968, 0.3052, 0.3199, 0.3264, 0.3282, 0.3429, + 0.3451, 0.3454, 0.3477, 0.3556, 0.3478, 0.3565, 0.3595, 0.3569, 0.3582, 0.3582, 0.3559, 0.3610, 0.3626, 0.3668, 0.3733, 0.3692, 0.3722, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#red berry (pihlaja) +//0 0 0 0 25 84 128 87 165 130 167 147 155 146 148 165 158 159 164 160 158 158 157 157 173 173 179 195 210 234 264 302 349 386 461 572 735 886 1038 1216 1376 1521 1607 1691 1728 1769 1842 1843 1865 1910 1881 1920 1909 1909 1891 1879 1915 1879 1878 1843 1832 +const double ColorTemp::ColorRedpihlaja[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0025, 0.0084, 0.0128, 0.0087, 0.0165, 0.0130, 0.0167, 0.0147, 0.0155, 0.0146, 0.0148, 0.0165, 0.0158, 0.0159, 0.0164, 0.0160, 0.0158, 0.0158, + 0.0157, 0.0157, 0.0173, 0.0173, 0.0179, 0.0195, 0.0210, 0.0234, 0.0264, 0.0302, 0.0349, 0.0386, 0.0461, 0.0572, 0.0735, 0.0886, 0.1038, 0.1216, 0.1376, 0.1521, 0.1607, 0.1691, + 0.1728, 0.1769, 0.1842, 0.1843, 0.1865, 0.1910, 0.1881, 0.1920, 0.1909, 0.1909, 0.1891, 0.1879, 0.1915, 0.1879, 0.1878, 0.1843, 0.1832, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//#violet flower (petunia) +//292 66 227 313 325 332 310 319 300 268 229 193 164 137 127 104 67 50 49 37 34 34 44 32 33 31 38 41 33 34 45 44 37 42 44 49 49 67 80 89 110 130 137 145 153 171 194 223 275 321 391 464 580 720 907 1055 1230 1436 1548 1777 1933 +//RIS 94 +const double ColorTemp::ColorVioletpetunia[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0292, 0.0066, 0.0227, 0.0313, 0.0325, 0.0332, 0.0310, 0.0319, 0.0300, 0.0268, 0.0229, 0.0193, 0.0164, 0.0137, 0.0127, 0.0104, 0.0067, 0.0050, 0.0049, 0.0037, 0.0034, 0.0034, + 0.0044, 0.0032, 0.0033, 0.0031, 0.0038, 0.0041, 0.0033, 0.0034, 0.0045, 0.0044, 0.0037, 0.0042, 0.0044, 0.0049, 0.0049, 0.0067, 0.0080, 0.0089, 0.0110, 0.0130, 0.0137, 0.0145, + 0.0153, 0.0171, 0.0194, 0.0223, 0.0275, 0.0321, 0.0391, 0.0464, 0.0580, 0.0720, 0.0907, 0.1055, 0.1230, 0.1436, 0.1548, 0.1777, 0.1933, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#violet flower (orvokki) +//195 0 152 31 22 32 77 69 45 20 27 26 13 12 14 11 15 23 16 18 16 12 16 10 16 15 13 15 15 16 14 20 14 17 15 17 15 17 17 17 23 24 29 38 36 38 37 43 58 65 70 86 113 155 222 285 405 506 645 817 1035 +const double ColorTemp::ColorVioletorvokki[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0195, 0.0, 0.0152, 0.0031, 0.0022, 0.0032, 0.0077, 0.0069, 0.0045, 0.0020, 0.0027, 0.0026, 0.0013, 0.0012, 0.0014, 0.0011, 0.0015, 0.0023, 0.0016, 0.0018, 0.0016, 0.0012, 0.0016, + 0.0010, 0.0016, 0.0015, 0.0013, 0.0015, 0.0015, 0.0016, 0.0014, 0.0020, 0.0014, 0.0017, 0.0015, 0.0017, 0.0015, 0.0017, 0.0017, 0.0017, 0.0023, 0.0024, 0.0029, 0.0038, 0.0036, + 0.0038, 0.0037, 0.0043, 0.0058, 0.0065, 0.0070, 0.0086, 0.0113, 0.0155, 0.0222, 0.0285, 0.0405, 0.0506, 0.0645, 0.0817, 0.1035, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#blue flower (sinisievikki) +//801 1109 1861 2325 2329 2380 2562 2565 2558 2611 2517 2567 2475 2397 2337 2294 2195 2001 1881 1892 1854 1746 1668 1580 1491 1362 1229 1178 1110 1094 1072 1019 994 960 928 879 836 859 863 951 1046 1102 1154 1193 1174 1166 1153 1199 1275 1316 1376 1550 1739 1918 2104 2228 2364 2377 2423 2394 2334 +const double ColorTemp::ColorBluesinisievikki[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0801, 0.1109, 0.1861, 0.2325, 0.2329, 0.2380, 0.2562, 0.2565, 0.2558, 0.2611, 0.2517, 0.2567, 0.2475, 0.2397, 0.2337, 0.2294, 0.2195, 0.2001, 0.1881, 0.1892, 0.1854, 0.1746, + 0.1668, 0.1580, 0.1491, 0.1362, 0.1229, 0.1178, 0.1110, 0.1094, 0.1072, 0.1019, 0.0994, 0.0960, 0.0928, 0.0879, 0.0836, 0.0859, 0.0863, 0.0951, 0.1046, 0.1102, 0.1154, 0.1193, + 0.1174, 0.1166, 0.1153, 0.1199, 0.1275, 0.1316, 0.1376, 0.1550, 0.1739, 0.1918, 0.2104, 0.2228, 0.2364, 0.2377, 0.2423, 0.2394, 0.2334, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#blue flower (iisoppi) +//623 85 605 833 776 756 755 781 774 775 697 724 697 654 617 575 536 494 460 469 442 436 400 393 380 358 369 352 342 368 357 360 342 342 341 335 355 353 365 376 382 392 412 412 407 414 420 449 487 504 517 571 651 734 806 885 968 1088 1210 1296 1411 +const double ColorTemp::ColorBlueiisoppi[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0623, 0.0085, 0.0605, 0.0833, 0.0776, 0.0756, 0.0755, 0.0781, 0.0774, 0.0775, 0.0697, 0.0724, 0.0697, 0.0654, 0.0617, 0.0575, 0.0536, 0.0494, 0.0460, 0.0469, 0.0442, 0.0436, + 0.0400, 0.0393, 0.0380, 0.0358, 0.0369, 0.0352, 0.0342, 0.0368, 0.0357, 0.0360, 0.0342, 0.0342, 0.0341, 0.0335, 0.0355, 0.0353, 0.0365, 0.0376, 0.0382, 0.0392, 0.0412, 0.0412, + 0.0407, 0.0414, 0.0420, 0.0449, 0.0487, 0.0504, 0.0517, 0.0571, 0.0651, 0.0734, 0.0806, 0.0885, 0.0968, 0.1088, 0.1210, 0.1296, 0.1411, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//#white petal (ojakaersaemoe) +//1732 951 1800 1365 1801 1697 1762 2103 2243 2218 2200 2206 2255 2254 2269 2261 2272 2251 2254 2260 2256 2266 2247 2269 2310 2273 2345 2312 2301 2323 2302 2314 2362 2355 2348 2362 2396 2374 2362 2381 2396 2440 2383 2347 2422 2419 2472 2423 2406 2425 2377 2381 2380 2398 2390 2404 2370 2375 2364 2411 2417 +const double ColorTemp::ColorWhiteojaka[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1732, 0.0951, 0.1800, 0.1365, 0.1801, 0.1697, 0.1762, 0.2103, 0.2243, 0.2218, 0.2200, 0.2206, 0.2255, 0.2254, 0.2269, 0.2261, 0.2272, 0.2251, 0.2254, 0.2260, 0.2256, 0.2266, + 0.2247, 0.2269, 0.2310, 0.2273, 0.2345, 0.2312, 0.2301, 0.2323, 0.2302, 0.2314, 0.2362, 0.2355, 0.2348, 0.2362, 0.2396, 0.2374, 0.2362, 0.2381, 0.2396, 0.2440, 0.2383, 0.2347, + 0.2422, 0.2419, 0.2472, 0.2423, 0.2406, 0.2425, 0.2377, 0.2381, 0.2380, 0.2398, 0.2390, 0.2404, 0.2370, 0.2375, 0.2364, 0.2411, 0.2417, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#white flower (petunia) +//4095 4022 4410 4095 4095 4095 4193 4207 4388 4328 4223 4168 4221 4304 4245 4210 4212 4192 4181 4233 4207 4224 4197 4262 4243 4241 4274 4257 4204 4285 4265 4241 4267 4275 4245 4276 4260 4217 4217 4244 4240 4186 4160 4156 4227 4286 4237 4137 4202 4187 4100 4112 4103 4090 4125 4115 4098 4036 4047 4105 4050 +const double ColorTemp::ColorWhitepetunia[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.4095, 0.4022, 0.4410, 0.4095, 0.4095, 0.4095, 0.4193, 0.4207, 0.4388, 0.4328, 0.4223, 0.4168, 0.4221, 0.4304, 0.4245, 0.4210, 0.4212, 0.4192, 0.4181, 0.4233, 0.4207, 0.4224, + 0.4197, 0.4262, 0.4243, 0.4241, 0.4274, 0.4257, 0.4204, 0.4285, 0.4265, 0.4241, 0.4267, 0.4275, 0.4245, 0.4276, 0.4260, 0.4217, 0.4217, 0.4244, 0.4240, 0.4186, 0.4160, 0.4156, + 0.4227, 0.4286, 0.4237, 0.4137, 0.4202, 0.4187, 0.4100, 0.4112, 0.4103, 0.4090, 0.4125, 0.4115, 0.4098, 0.4036, 0.4047, 0.4105, 0.4050, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + + +//#blue flower (lobelia dortmanna) +//0 660 1277 1544 1612 1961 1909 1950 1901 1907 1809 1785 1685 1622 1522 1377 1178 1054 931 898 850 732 610 508 434 370 343 329 303 265 232 199 183 169 172 177 200 233 214 214 199 186 199 228 249 321 435 684 1006 1345 1703 2082 2432 2661 2843 2936 3079 3015 3003 3045 3038 +//RIS 98 +const double ColorTemp::ColorBluelobelia[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0660, 0.1277, 0.1544, 0.1612, 0.1961, 0.1909, 0.1950, 0.1901, 0.1907, 0.1809, 0.1785, 0.1685, 0.1622, 0.1522, 0.1377, 0.1178, 0.1054, 0.0931, 0.0898, 0.0850, 0.0732, + 0.0610, 0.0508, 0.0434, 0.0370, 0.0343, 0.0329, 0.0303, 0.0265, 0.0232, 0.0199, 0.0183, 0.0169, 0.0172, 0.0177, 0.0200, 0.0233, 0.0214, 0.0214, 0.0199, 0.0186, 0.0199, + 0.0228, 0.0249, 0.0321, 0.0435, 0.0684, 0.1006, 0.1345, 0.1703, 0.2082, 0.2432, 0.2661, 0.2843, 0.2936, 0.3079, 0.3015, 0.3003, 0.3045, 0.3038, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#white petal (pelargonia) +//3493 2882 2284 2730 2869 2609 2781 2869 2861 2869 2795 2810 2740 2716 2650 2631 2539 2554 2450 2453 2447 2451 2343 2408 2404 2367 2343 2401 2474 2549 2668 2759 2843 2883 2989 3106 3209 3344 3383 3404 3453 3521 3495 3571 3521 3548 3582 3557 3581 3539 3563 3589 3597 3579 3502 3546 3507 3554 3490 3561 3518 +const double ColorTemp::ColorWhitepelargonia[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3493, 0.2882, 0.2284, 0.2730, 0.2869, 0.2609, 0.2781, 0.2869, 0.2861, 0.2869, 0.2795, 0.2810, 0.2740, 0.2716, 0.2650, 0.2631, 0.2539, 0.2554, 0.2450, 0.2453, 0.2447, + 0.2451, 0.2343, 0.2408, 0.2404, 0.2367, 0.2343, 0.2401, 0.2474, 0.2549, 0.2668, 0.2759, 0.2843, 0.2883, 0.2989, 0.3106, 0.3209, 0.3344, 0.3383, 0.3404, 0.3453, 0.3521, + 0.3495, 0.3571, 0.3521, 0.3548, 0.3582, 0.3557, 0.3581, 0.3539, 0.3563, 0.3589, 0.3597, 0.3579, 0.3502, 0.3546, 0.3507, 0.3554, 0.3490, 0.3561, 0.3518, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +/* +#white petal (paeivaenkakkara) +2168 1365 1969 2095 2231 2530 2944 3092 3107 3148 3188 3207 3195 3216 3225 3261 3211 3228 3260 3237 3258 3276 3265 3316 3327 3291 3315 3324 3355 3255 3264 3308 3324 3328 3282 3253 3220 3257 3289 3265 3245 3297 3284 3292 3228 3312 3290 3277 3278 3284 3182 3244 3273 3291 3212 3256 3154 3243 3306 3234 3155 +*/ +const double ColorTemp::ColorWhitepaeivaen[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2168, 0.1365, 0.1969, 0.2095, 0.2231, 0.2530, 0.2944, 0.3092, 0.3107, 0.3148, 0.3188, 0.3207, 0.3195, 0.3216, 0.3225, 0.3261, 0.3211, 0.3228, 0.3260, 0.3237, 0.3258, + 0.3276, 0.3265, 0.3316, 0.3327, 0.3291, 0.3315, 0.3324, 0.3355, 0.3255, 0.3264, 0.3308, 0.3324, 0.3328, 0.3282, 0.3253, 0.3220, 0.3257, 0.3289, 0.3265, 0.3245, 0.3297, + 0.3284, 0.3292, 0.3228, 0.3312, 0.3290, 0.3277, 0.3278, 0.3284, 0.3182, 0.3244, 0.3273, 0.3291, 0.3212, 0.3256, 0.3154, 0.3243, 0.3306, 0.3234, 0.3155, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + //spectral data Colorchecker24 : Green B3 const double ColorTemp::ColorchechGreB3_spect[97] = { @@ -444,6 +1062,21 @@ const double ColorTemp::ColorchechGraC4_67_spect[97] = { 0.369, 0.3689, 0.368, 0.3673, 0.3678, 0.3684, 0.37, 0.3711, 0.3712, 0.3714, 0.3714, 0.3714, 0.371, 0.3707, 0.37, 0.3694, 0.3697, 0.3703, 0.3697, 0.3692, 0.3688, 0.3685, 0.3675, 0.3669, 0.3657, 0.3647, 0.3635, 0.3625, 0.361, 0.3596, 0.3585, 0.3579, 0.357, 0.3560, 0.3555, 0.3548, 0.3535, 0.3526, 0.3513, 0.3500, 0.349, 0.3475, 0.3467, 0.3460, 0.3452, 0.3444, 0.3431, 0.3421, 0.3411, 0.3403, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; +const double ColorTemp::Fictif_61greyspect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, + 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, + 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::JDC468_K15_87greyspect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1984, 0.2223, 0.2448, 0.2934, 0.3415, 0.4425, 0.5707, 0.6609, 0.7619, 0.7956, 0.8275, 0.8280, 0.8292, 0.8223, 0.8156, 0.8112, 0.8076, 0.8040, 0.7982, 0.7970, 0.7954, 0.8013, 0.8083, 0.8141, 0.8184, 0.8167, + 0.8137, 0.8080, 0.8026, 0.8013, 0.7988, 0.7963, 0.7942, 0.7855, 0.7765, 0.7680, 0.7603, 0.7640, 0.7681, 0.7750, 0.7827, 0.7876, 0.7923, 0.7935, 0.7945, 0.7955, 0.7964, 0.7975, 0.7982, 0.8000, 0.8017, 0.8051, + 0.8090, 0.8145, 0.8191, 0.8234, 0.8269, 0.8300, 0.8327, 0.8342, 0.8359, 0.8375, 0.8390, 0.8405, 0.8421, 0.8436, 0.8452, 0.8480, 0.8504, 0.8564, 0.8611, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 + +}; +//K15 275 275 0.1984 0.2448 0.3415 0.5707 0.7619 0.8275 0.8292 0.8156 0.8076 0.7982 0.7954 0.8083 0.8184 0.8137 0.8026 0.7988 0.7942 0.7765 0.7603 0.7681 0.7827 0.7923 0.7945 0.7964 0.7982 0.8017 0.8090 0.8191 0.8269 0.8327 0.8359 0.8390 0.8421 0.8452 0.8504 0.8611 //spectral data Colorchecker24 : Skin B1 //use also for palette WB @@ -476,7 +1109,7 @@ const double ColorTemp::ColorchechDCBluN881_m7_m14_spect[97] = { //spectral data ColorcheckerSG : Skin F7 //use also for palette WB const double ColorTemp::ColorchechSGSkiF763_14_26_spect[97] = { - 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0508, 0.64, 0.0776, 0.903, 0.1099, 0.1128, 0.1256, 0.128, 0.1307, 0.133, 0.1357, 0.139, 0.1425, 0.148, 0.1523, 0.159, 0.1669, 0.177, 0.1871, 0.20, 0.2118, 0.2235, 0.2355, 0.2445, 0.2537, 0.259, 0.2655, 0.268, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0508, 0.064, 0.0776, 0.903, 0.1099, 0.1128, 0.1256, 0.128, 0.1307, 0.133, 0.1357, 0.139, 0.1425, 0.148, 0.1523, 0.159, 0.1669, 0.177, 0.1871, 0.20, 0.2118, 0.2235, 0.2355, 0.2445, 0.2537, 0.259, 0.2655, 0.268, 0.2700, 0.2708, 0.2716, 0.2743, 0.2770, 0.2803, 0.2827, 0.283, 0.2832, 0.283, 0.2828, 0.295, 0.3079, 0.344, 0.3803, 0.4105, 0.4409, 0.455, 0.4694, 0.477, 0.4851, 0.4896, 0.4962, 0.501, 0.5066, 0.511, 0.5160, 0.521, 0.5256, 0.529, 0.5318, 0.535, 0.5383, 0.541, 0.5451, 0.549, 0.5524, 0.556, 0.5597, 0.562, 0.5650, 0.568, 0.5709, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; @@ -529,15 +1162,156 @@ const double ColorTemp::JDC468_GraK14_44_spect[97] = { 0.1408, 0.14330, 0.1475, 0.15170, 0.1583, 0.16500, 0.172, 0.17940, 0.1836, 0.18780, 0.188, 0.18820, 0.186, 0.18430, 0.1801, 0.17620, 0.1741, 0.17210, 0.179, 0.18420, 0.1991, 0.21430, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; +const double ColorTemp::JDC468_BluM5_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1510, 0.1802, 0.2069, 0.2550, 0.3047, 0.4055, 0.5069, 0.590, 0.6747, 0.701, 0.7351, 0.7345, 0.7338, 0.7195, 0.7063, 0.693, 0.6732, 0.6490, 0.6261, 0.5993, 0.5723, 0.5560, + 0.5401, 0.526, 0.5106, 0.4805, 0.4504, 0.42, 0.3907, 0.385, 0.3799, 0.3750, 0.3695, 0.3340, 0.3005, 0.2692, 0.2382, 0.2387, 0.2389, 0.2501, 0.2610, 0.2635, 0.2662, 0.2601, 0.2541, + 0.2450, 0.2426, 0.2430, 0.2434, 0.2490, 0.2523, 0.2612, 0.2692, 0.2694, 0.2996, 0.3145, 0.3329, 0.3413, 0.3498, 0.3467, 0.3442, 0.3355, 0.3266, 0.3131, 0.2996, 0.2911, 0.2831, 0.2950, 0.3070, 0.3430, 0.3799, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//m5 317 //0.1510 0.2069 0.3047 0.5069 0.6747 0.7351 0.7338 0.7063 0.6732 0.6261 0.5723 0.5401 +// 0.5106 0.4504 0.3907 0.3799 0.3695 0.3005 0.2382 0.2389 0.2610 0.2662 0.2541 +// 0.2426 0.2434 0.2523 0.2692 0.2996 0.3329 0.3498 0.3442 0.3266 0.2996 0.2831 0.3070 0.3799 + +const double ColorTemp::JDC468_RedG21va_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1207, 0.141, 0.1585, 0.1810, 0.2073, 0.2529, 0.2959, 0.3210, 0.3476, 0.3350, 0.3232, 0.2845, 0.2564, 0.2140, 0.1823, 0.1523, 0.1266, 0.1001, 0.0792, 0.061, 0.0439, 0.0349, 0.0295, 0.0260, 0.0222, + 0.0180, 0.0135, 0.0111, 0.0087, 0.0090, 0.0094, 0.0101, 0.0109, 0.0093, 0.0086, 0.0090, 0.0091, 0.0061, 0.0321, 0.0086, 0.1368, 0.2312, 0.3256, 0.4112, 0.4958, 0.5444, 0.5884, 0.6002, 0.6264, 0.6323, 0.6473, + 0.6546, 0.6659, 0.6775, 0.6881, 0.6982, 0.7081, 0.7150, 0.7201, 0.7217, 0.7232, 0.7222, 0.7215, 0.7187, 0.7157, 0.7144, 0.7131, 0.7196, 0.7269, 0.7303, 0.7599, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//g21 177 0.1207 0.1585 0.2073 0.2959 0.3476 0.3232 0.2564 0.1823 0.1266 0.0792 0.0439 0.0295 0.0222 0.0135 0.0087 0.0094 0.0109 0.0086 0.0091 0.0321 +// 0.1368 0.3256 0.4958 0.5884 0.6264 0.6473 0.6659 0.6881 0.7081 0.7201 0.7232 0.7215 0.7157 0.7131 0.7269 0.7599 +const double ColorTemp::JDC468_RedI9_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0258, 0.023, 0.0220, 0.0205, 0.0189, 0.0183, 0.0174, 0.0168, 0.0162, 0.0152, 0.0148, 0.0145, 0.0139, 0.0136, 0.0133, 0.0130, 0.0127, 0.0130, 0.0133, 0.0151, 0.0168, 0.0218, 0.0268, 0.0317, 0.0367, 0.0330, + 0.0313, 0.0270, 0.0227, 0.0240, 0.0255, 0.0280, 0.0302, 0.0280, 0.0225, 0.0215, 0.0209, 0.0424, 0.0639, 0.1401, 0.2131, 0.3250, 0.4369, 0.5210, 0.6265, 0.6795, 0.7336, 0.7551, 0.7784, 0.7890, 0.7994, 0.8070, + 0.8146, 0.8210, 0.8277, 0.8321, 0.8362, 0.8398, 0.8439, 0.8470, 0.8504, 0.8530, 0.8572, 0.8612, 0.8653, 0.8689, 0.8715, 0.8730, 0.8747, 0.8766, 0.8788, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//I9 RED 217 0.0258 0.0220 0.0189 0.0174 0.0162 0.0148 0.0139 0.0133 0.0127 0.0133 0.0168 0.0268 0.0367 0.0313 0.0227 0.0255 0.0302 0.0225 0.0209 0.0639 0.2131 0.4369 0.6265 0.7336 0.7784 0.7994 0.8146 0.8277 0.8362 0.8439 0.8504 0.8572 0.8653 0.8715 0.8747 0.8788 + +const double ColorTemp::JDC468_YelN10_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0531, 0.0520, 0.0504, 0.0510, 0.0518, 0.0608, 0.0628, 0.0669, 0.0699, 0.0705, 0.0716, 0.0720, 0.0735, 0.0755, 0.0775, 0.0800, 0.0825, 0.0896, 0.0969, 0.1260, 0.1563, 0.2312, 0.3096, 0.4132, 0.5177, 0.5905, 0.6637, + 0.7251, 0.7350, 0.7458, 0.7480, 0.7507, 0.7460, 0.7414, 0.7356, 0.7301, 0.7320, 0.7347, 0.7390, 0.7438, 0.7472, 0.7500, 0.7508, 0.7515, 0.7528, 0.7538, 0.7550, 0.7563, 0.7581, 0.7607, 0.7642, 0.7686, 0.7710, + 0.7791, 0.7840, 0.7872, 0.7902, 0.7935, 0.7955, 0.7979, 0.7995, 0.8021, 0.8035, 0.8058, 0.8072, 0.8090, 0.8110, 0.8143, 0.8198, 0.8259, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//n10 348 0.0531 0.0504 0.0518 0.0628 0.0699 0.0716 0.0735 0.0775 0.0825 0.0969 0.1563 0.3096 0.5177 0.6637 0.7251 0.7458 0.7507 0.7414 0.7301 0.7347 0.7438 0.7500 0.7515 0.7538 0.7563 0.7607 0.7686 0.7791 0.7872 0.7935 0.7979 0.8021 0.8058 0.8090 0.8143 0.8259 +const double ColorTemp::JDC468_GreN7_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0112, 0.0102, 0.0094, 0.0096, 0.0099, 0.0100, 0.0100, 0.0100, 0.0100, 0.0099, 0.0099, 0.0099, 0.0099, 0.0099, 0.0099, 0.0100, 0.0100, 0.0103, 0.0107, 0.0129, 0.0151, 0.0312, 0.0462, 0.1015, 0.1571, 0.2270, 0.2977, + 0.3558, 0.3441, 0.3321, 0.3020, 0.2710, 0.2312, 0.1954, 0.1602, 0.1251, 0.1003, 0.0794, 0.0672, 0.0563, 0.0513, 0.0452, 0.0418, 0.0378, 0.0356, 0.0337, 0.0336, 0.0335, 0.0345, 0.0358, 0.0383, 0.0405, 0.0445, 0.0497, + 0.0612, 0.0647, 0.0670, 0.0660, 0.0644, 0.0620, 0.0574, 0.0525, 0.0483, 0.0460, 0.0436, 0.0484, 0.0532, 0.0690, 0.0870, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//n7 345 0.0112 0.0094 0.0099 0.0100 0.0100 0.0099 0.0099 0.0099 0.0100 0.0107 0.0151 0.0462 0.1571 0.2977 0.3558 0.3321 0.2710 0.1954 0.1251 0.0794 0.0563 0.0452 0.0378 0.0337 0.0335 0.0358 0.0405 0.0497 0.0612 0.0670 0.0644 0.0574 0.0483 0.0436 0.0532 0.0870 + +const double ColorTemp::JDC468_GreA10_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0958, 0.1010, 0.1090, 0.1172, 0.1352, 0.1954, 0.1957, 0.2178, 0.2402, 0.2477, 0.2553, 0.2594, 0.2622, 0.2667, 0.2707, 0.2760, 0.2805, 0.2913, 0.3023, 0.3376, 0.3715, 0.4345, 0.5030, 0.5702, 0.6376, 0.6724, 0.7072, + 0.7216, 0.7160, 0.7110, 0.6990, 0.6865, 0.6667, 0.6446, 0.6174, 0.5921, 0.5727, 0.5511, 0.5386, 0.5238, 0.5134, 0.5070, 0.4980, 0.4918, 0.4867, 0.4830, 0.4834, 0.4838, 0.4889, 0.4906, 0.4976, 0.5046, 0.5162, 0.5279, + 0.5519, 0.5589, 0.5649, 0.5645, 0.5639, 0.5576, 0.5552, 0.5480, 0.5407, 0.5377, 0.5326, 0.5387, 0.5498, 0.5732, 0.5966, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::JDC468_GreQ7_spect[97] = { //468 Q7 + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0149, 0.0139, 0.0133, 0.0128, 0.0123, 0.01185, 0.0114, 0.011, 0.0106, 0.01045, 0.0103, 0.0104, 0.0105, 0.01065, 0.0108, 0.0109, 0.0110, 0.0117, 0.0124, 0.0205, 0.0283, 0.071, 0.1122, 0.2051, + 0.3017, 0.385, 0.4690, 0.4880, 0.5069, 0.4811, 0.4561, 0.411, 0.3687, 0.3185, 0.2673, 0.2190, 0.1703, 0.1371, 0.1042, 0.086, 0.0695, 0.598, 0.0527, 0.0475, 0.04210, 0.039, 0.03600, 0.0357, 0.0355, 0.037, + 0.0381, 0.0405, 0.0438, 0.0499, 0.0555, 0.0635, 0.0708, 0.074, 0.0789, 0.077, 0.0751, 0.071, 0.0658, 0.059, 0.0530, 0.049, 0.0458, 0.052, 0.0570, 0.077, 0.0982, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//a10 Green 10 0.0958 0.1090 0.1352 0.1957 0.2402 0.2553 0.2622 0.2707 0.2805 0.3023 0.3715 0.5030 0.6376 0.7072 0.7216 0.7110 0.6865 0.6446 0.5921 0.5511 0.5238 0.5070 0.4918 0.4830 0.4838 0.4906 0.5046 0.5279 0.5519 0.5649 0.5639 0.5552 0.5407 0.5326 0.5498 0.5966 +const double ColorTemp::JDC468_GreK7_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0114, 0.0111, 0.0109, 0.0107, 0.0105, 0.0106, 0.0108, 0.0107, 0.0106, 0.0105, 0.0104, 0.0103, 0.0103, 0.0106, 0.0109, 0.0112, 0.0118, 0.0135, 0.0153, 0.0244, 0.0334, 0.0666, 0.0984, 0.1534, 0.2082, 0.2412, 0.2835, + 0.2959, 0.2843, 0.2735, 0.2516, 0.2305, 0.2012, 0.1728, 0.1435, 0.1156, 0.0964, 0.0772, 0.0671, 0.0570, 0.0518, 0.0468, 0.0436, 0.0397, 0.0380, 0.0354, 0.0354, 0.0355, 0.0367, 0.0380, 0.0402, 0.0426, 0.0481, 0.0523, + 0.0643, 0.0678, 0.0704, 0.0693, 0.0676, 0.0639, 0.0609, 0.0567, 0.0514, 0.0487, 0.0468, 0.0518, 0.0567, 0.0730, 0.0902, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//k7 Green 267 0.0114 0.0109 0.0105 0.0108 0.0106 0.0104 0.0103 0.0109 0.0118 0.0153 0.0334 0.0984 0.2082 0.2835 0.2959 0.2735 0.2305 0.1728 0.1156 0.0772 0.0570 0.0468 0.0397 0.0354 0.0355 0.0380 0.0426 0.0523 0.0643 0.0704 0.0676 0.0609 0.0514 0.0468 0.0567 0.0902 + +const double ColorTemp::JDC468_PurE24_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0677, 0.901, 0.1043, 0.1298, 0.1534, 0.1913, 0.2297, 0.2553, 0.2756, 0.2789, 0.2620, 0.2380, 0.2135, 0.1837, 0.1536, 0.1312, 0.1068, 0.0867, 0.0663, 0.0517, 0.0368, 0.0309, 0.0247, 0.0214, 0.0186, 0.0151, 0.0116, + 0.0077, 0.0079, 0.0079, 0.0083, 0.0086, 0.0077, 0.0071, 0.0071, 0.0072, 0.0107, 0.0147, 0.0298, 0.0440, 0.0661, 0.0880, 0.1010, 0.1152, 0.1193, 0.1236, 0.1260, 0.1287, 0.1326, 0.1366, 0.1428, 0.1489, 0.1596, 0.1697, + 0.1936, 0.1996, 0.2057, 0.2036, 0.2015, 0.1954, 0.1890, 0.1798, 0.1706, 0.1651, 0.1603, 0.1692, 0.1788, 0.2075, 0.2363, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//E24 Pur 128 0.0677 0.1043 0.1534 0.2297 0.2756 0.2620 0.2135 0.1536 0.1068 0.0663 0.0368 0.0247 0.0186 0.0116 0.0077 0.0079 0.0086 0.0071 0.0072 0.0147 0.0440 0.0880 0.1152 0.1236 0.1287 0.1366 0.1489 0.1697 0.1936 0.2057 0.2015 0.1890 0.1706 0.1603 0.1788 0.2363 + //spectral data 468 color : Blue H10 - Gamut > WidegamutRGB const double ColorTemp::JDC468_BluH10_spect[97] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, - 0.01590, 0.028, 0.03970, 0.0697, 0.09970, 0.1526, 0.20550, 0.253, 0.30110, 0.3412, 0.38180, 0.423, 0.46610, 0.4683, 0.51030, 0.4999, 0.49950, 0.4785, 0.45810, 0.429, 0.39950, 0.374, 0.35010, 0.3135, 0.29630, + 0.01590, 0.028, 0.03970, 0.0697, 0.09970, 0.1526, 0.20550, 0.253, 0.30110, 0.3412, 0.38180, 0.423, 0.46610, 0.4683, 0.51030, 0.5005, 0.49950, 0.4785, 0.45810, 0.429, 0.39950, 0.374, 0.35010, 0.3135, 0.29630, 0.2587, 0.22070, 0.182, 0.14450, 0.1125, 0.09060, 0.072, 0.04810, 0.033, 0.01740, 0.0113, 0.00520, 0.004, 0.00290, 0.0028, 0.00270, 0.0027, 0.00270, 0.0027, 0.00280, 0.0027, 0.00270, 0.0028, 0.00280, - 0.0029, 0.00300, 0.0029, 0.00290, 0.0029, 0.0029, 0.00290, 0.0029, 0.00290, 0.0029, 0.00290, 0.0029, 0.00290, 0.0029, 0.00290, 0.0029, 0.0031, 0.00320, 0.0035, 0.00380, 0.047, 0.00560, + 0.0029, 0.00300, 0.0029, 0.00290, 0.0029, 0.0029, 0.00290, 0.0029, 0.00290, 0.0029, 0.00290, 0.0029, 0.00290, 0.0029, 0.00290, 0.0029, 0.0031, 0.00320, 0.0035, 0.00380, 0.0047, 0.00560, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; +//0.0159, 0.028, 0.0397, 0.0697, 0.0997, 0.1526, 0.2055, 0.253, 0.3011, 0.3412, 0.3818, 0.423, 0.4661, 0.5103 0.4995 0.4581 0.3995 0.3501 0.2963 +//0.2207 0.1445 0.0906 0.0481 0.0174 0.0052 0.0029 0.0027 0.0027 0.0028 0.0027 0.0028 0.0030 0.0029 0.0029 0.0029 0.0029 0.0029 0.0029 +//0.0029 0.0032 0.0038 0.0056 + +const double ColorTemp::JDC468_BluD6_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1127, 0.143, 0.1773, 0.223, 0.2813, 0.3987, 0.4782, 0.5665, 0.6470, 0.6870, 0.7270, 0.7403, 0.7593, 0.7592, 0.7591, 0.7480, 0.7402, 0.7234, 0.7054, 0.6876, 0.6617, 0.6512, 0.6302, 0.6124, 0.5962, 0.5660, + 0.5352, 0.5009, 0.4655, 0.4356, 0.4191, 0.3923, 0.3619, 0.3145, 0.2653, 0.2245, 0.1744, 0.1499, 0.1255, 0.1124, 0.1014, 0.0972, 0.0855, 0.0786, 0.0715, 0.0659, 0.0626, 0.0625, 0.0624, 0.0645, 0.0670, 0.0714, + 0.0769, 0.0865, 0.0964, 0.1086, 0.1200, 0.123, 0.1327, 0.1309, 0.1281, 0.1214, 0.1146, 0.1023, 0.0950, 0.0901, 0.0839, 0.0918, 0.1009, 0.1260, 0.1597, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 + + +}; +//d6 blue 84 0.1127 0.1773 0.2813 0.4782 0.6470 0.7270 0.7593 0.7591 0.7402 0.7054 0.6617 0.6302 0.5962 0.5352 0.4655 0.4191 0.3619 0.2653 0.1744 0.1255 0.1014 0.0855 0.0715 0.0626 0.0624 0.0670 0.0769 0.0964 0.1200 0.1327 0.1281 0.1146 0.0950 0.0839 0.1009 0.1597 +const double ColorTemp::JDC468_BluF4_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0180, 0.0270, 0.0324, 0.0453, 0.0611, 0.0845, 0.1066, 0.1234, 0.1446, 0.1567, 0.1718, 0.1867, 0.1954, 0.2024, 0.2083, 0.2090, 0.2096, 0.2060, 0.2036, 0.1990, 0.1947, 0.1920, 0.1901, 0.1856, 0.1794, 0.1667, 0.1516, 0.1321, + 0.1167, 0.1032, 0.0876, 0.0730, 0.0584, 0.0445, 0.0296, 0.0212, 0.0125, 0.0099, 0.0069, 0.0060, 0.0053, 0.0050, 0.0049, 0.0047, 0.0046, 0.0045, 0.0044, 0.0043, 0.0043, 0.0043, 0.0043, 0.0046, 0.0049, 0.0050, 0.0052, 0.0057, + 0.0063, 0.0066, 0.0069, 0.0067, 0.0066, 0.0063, 0.0059, 0.0056, 0.0053, 0.0054, 0.0055, 0.0062, 0.0069, 0.0099, 0.0122, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 + +}; + +// f4 blue 134 0.0180 0.0324 0.0611 0.1066 0.1446 0.1718 0.1954 0.2083 0.2096 0.2036 0.1947 0.1901 0.1794 0.1516 0.1167 0.0876 0.0584 0.0296 0.0125 0.0069 0.0053 0.0049 0.0046 0.0044 0.0043 0.0043 0.0049 0.0052 0.0063 0.0069 0.0066 0.0059 0.0053 0.0055 0.0069 0.0122 +const double ColorTemp::JDC468_GreI8_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0230, 0.0232, 0.0234, 0.0254, 0.0263, 0.0298, 0.0329, 0.0367, 0.0377, 0.0388, 0.0399, 0.0410, 0.0421, 0.0440, 0.0460, 0.0481, 0.0496, 0.0523, 0.0559, 0.0645, 0.0727, 0.0878, 0.1020, 0.1156, 0.1288, 0.1334, 0.1394, 0.1398, + 0.1402, 0.1407, 0.1413, 0.1409, 0.1396, 0.1334, 0.1276, 0.1200, 0.1129, 0.1095, 0.1064, 0.1053, 0.1043, 0.1031, 0.1021, 0.1001, 0.0980, 0.0970, 0.0952, 0.0963, 0.0967, 0.0990, 0.1009, 0.1042, 0.1078, 0.1130, 0.1188, 0.1251, + 0.1307, 0.1335, 0.1374, 0.1376, 0.1378, 0.1362, 0.1345, 0.1312, 0.1278, 0.1257, 0.1240, 0.1290, 0.1345, 0.1476, 0.1615, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 + +}; + +// i8 green215 215 0.0230 0.0234 0.0263 0.0329 0.0377 0.0399 0.0421 0.0460 0.0496 0.0559 0.0727 0.1020 0.1288 0.1394 0.1402 0.1413 0.1396 0.1276 0.1129 0.1064 0.1043 0.1021 0.0980 0.0952 0.0967 0.1009 0.1078 0.1188 0.1307 0.1374 0.1378 0.1345 0.1278 0.1240 0.1345 0.1615 + +const double ColorTemp::JDC468_OraO18_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0826, 0.0830, 0.0832, 0.0861, 0.0892, 0.0993, 0.1108, 0.1180, 0.1248, 0.1253, 0.1263, 0.1261, 0.1259, 0.1267, 0.1289, 0.1304, 0.1319, 0.1370, 0.1419, 0.1631, 0.1851, 0.2311, 0.2743, 0.3131, 0.3536, 0.3551, 0.3585, 0.3488, 0.3322, + 0.3470, 0.3575, 0.3680, 0.3498, 0.3316, 0.3224, 0.3129, 0.3578, 0.4013, 0.4734, 0.5454, 0.5978, 0.6502, 0.6745, 0.6982, 0.7080, 0.7182, 0.7273, 0.7269, 0.7308, 0.7342, 0.7393, 0.7436, 0.7498, 0.7550, 0.7597, 0.7640, 0.7680, 0.7713, + 0.7766, 0.7786, 0.7816, 0.7841, 0.7863, 0.7889, 0.7902, 0.7931, 0.7957, 0.7997, 0.8068, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 + +}; +// o18 ora 382 382 0.0826 0.0832 0.0892 0.1108 0.1248 0.1263 0.1259 0.1289 0.1319 0.1419 0.1851 0.2743 0.3536 0.3585 0.3322 0.3470 0.3680 0.3316 0.3129 0.4013 0.5454 0.6502 0.6982 0.7182 0.7269 0.7342 0.7436 0.7550 0.7640 0.7713 0.7766 0.7816 0.7863 0.7902 0.7957 0.8068 +const double ColorTemp::JDC468_OraD17_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0462, 0.0442, 0.0422, 0.0401, 0.0383, 0.0390, 0.0396, 0.0396, 0.0395, 0.0388, 0.0380, 0.0378, 0.0376, 0.0381, 0.0384, 0.0391, 0.0399, 0.0421, 0.0451, 0.0561, 0.0676, 0.0934, 0.1189, 0.1432, 0.1671, 0.1650, 0.1632, 0.1512, 0.1402, 0.1456, + 0.1521, 0.1613, 0.1696, 0.1552, 0.1409, 0.1342, 0.1283, 0.1689, 0.2084, 0.2845, 0.3575, 0.4183, 0.4797, 0.5090, 0.5389, 0.5498, 0.5617, 0.5667, 0.5728, 0.5788, 0.5822, 0.5889, 0.5938, 0.6011, 0.6081, 0.6145, 0.6212, 0.6267, 0.6304, 0.6331, + 0.6352, 0.6361, 0.6373, 0.6372, 0.6370, 0.6376, 0.6384, 0.6413, 0.6483, 0.6523, 0.6668, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 + +}; + +// d17 ora 95 95 0.0462 0.0422 0.0383 0.0396 0.0395 0.0380 0.0376 0.0384 0.0399 0.0451 0.0676 0.1189 0.1671 0.1632 0.1402 0.1521 0.1696 0.1409 0.1283 0.2084 0.3575 0.4797 0.5389 0.5617 0.5728 0.5822 0.5938 0.6081 0.6212 0.6304 0.6352 0.6373 0.6370 0.6384 0.6483 0.6668 //spectral data ColorLab : Skin 35 15 17 const double ColorTemp::ColabSkin35_15_17_spect[97] = { @@ -825,6 +1599,817 @@ const double ColorTemp::ColabSky42_0_m24_spect[97] = { 0.0979, 0.112, 0.1269, 0.134, 0.1430, 0.147, 0.1497, 0.151, 0.1529, 0.1545, 0.1561, 0.158, 0.1603, 0.1616, 0.1627, 0.1625, 0.1623, 0.1614, 0.1605, 0.159, 0.1575, 0.1567, 0.1557, 0.1563, 0.1569, 0.159, 0.1627, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; +//spectral data ColorLab : blue 77 -44 -50 + +const double ColorTemp::Colorblue_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0316, 0.0480, 0.0658, 0.0925, 0.1199, 0.1812, 0.2424, 0.2770, 0.3145, 0.3430, 0.3702, 0.4022, 0.4346, 0.4560, 0.4778, 0.4843, 0.4902, 0.4940, 0.4960, 0.4920, 0.4889, 0.4820, + 0.4764, 0.4685, 0.4606, 0.4486, 0.4379, 0.4160, 0.3955, 0.3640, 0.3330, 0.2990, 0.2660, 0.2291, 0.1991, 0.1705, 0.1403, 0.1220, 0.1067, 0.0967, 0.0907, 0.0846, 0.0785, 0.0698, + 0.0601, 0.0525, 0.0455, 0.0423, 0.0386, 0.0370, 0.0358, 0.0354, 0.0351, 0.0368, 0.0382, 0.0413, 0.0449, 0.0474, 0.0492, 0.0484, 0.0477, 0.0460, 0.0437, 0.0402, 0.0371, 0.0349, + 0.0329, 0.0341, 0.0356, 0.0410, 0.0462, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 + +}; +//0.1571 0.2150 0.3040 0.3684 0.3952 0.3965 0.3782 0.3418 0.2995 0.2543 0.2043 0.1686 0.1420 0.1070 0.0785 0.0725 0.0755 0.0695 0.0680 0.0914 0.1379 0.1833 0.2038 0.2065 0.2079 0.2110 0.2176 0.2319 0.2518 0.2632 0.2616 0.2522 0.2380 0.2290 0.2432 0.2901 + +const double ColorTemp::ColorViolA1_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1571, 0.185, 0.2150, 0.255, 0.3040, 0.332, 0.3684, 0.381, 0.3952, 0.3956, 0.3965, 0.387, 0.3782, 0.362, 0.3418, 0.322, 0.2995, 0.275, 0.2543, 0.229, 0.2043, 0.185, 0.1686, + 0.155, 0.1420, 0.131, 0.1070, 0.093, 0.0785, 0.075, 0.0725, 0.074, 0.0755, 0.072, 0.0695, 0.069, 0.0680, 0.083, 0.0914, 0.115, 0.1379, 0.162, 0.1833, 0.193, 0.2038, 0.205, + 0.2065, 0.207, 0.2079, 0.209, 0.2110, 0.214, 0.2176, 0.226, 0.2319, 0.242, 0.2518, 0.258, 0.2632, 0.263, 0.2616, 0.256, 0.2522, 0.246, 0.2380, 0.233, 0.2290, 0.235, 0.2432, 0.265, 0.2901, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//0.2270 0.2413 0.3287 0.4079 0.4469 0.4594 0.4535 0.4268 0.3886 0.3427 0.2866 0.2433 0.2087 0.1604 0.1181 0.1069 0.1098 0.0985 0.0916 0.1130 0.1496 0.1746 0.1783 0.1742 0.1738 0.1763 0.1831 0.1975 0.2169 0.2274 0.2247 0.2140 0.1990 0.1897 0.2039 0.2508 + +const double ColorTemp::ColorViolA4_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2270, 0231, 0.2413, 0.286, 0.3287, 0.367, 0.4079, 0.427, 0.4469, 0.452, 0.4594, 0.456, 0.4535, 0.432, 0.4268, 0.403, 0.3886, 0.368, 0.3427, 0.314, 0.2866, 0.265, 0.2433, 0.222, + 0.2087, 0.183, 0.1604, 0.130, 0.1181, 0.112, 0.1069, 0.108, 0.1098, 0.103, 0.0985, 0.094, 0.0916, 0.104, 0.1130, 0.131, 0.1496, 0.152, 0.1746, 0.176, 0.1783, 0.176, 0.1742, 0.174, + 0.1738, 0.175, 0.1763, 0.181, 0.1831, 0.192, 0.1975, 0.206, 0.2169, 0.222, 0.2274, 0.226, 0.2247, 0.219, 0.2140, 0.206, 0.1990, 0.195, 0.1897, 0.196, 0.2039, 0.221, 0.2508, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//0.1426 0.2660 0.3556 0.4259 0.4459 0.4317 0.3942 0.3425 0.2917 0.2413 0.1885 0.1524 0.1267 0.0948 0.0700 0.0661 0.0708 0.0671 0.0699 0.1092 0.2099 0.3582 0.4857 0.5583 0.5950 0.6146 0.6307 0.6495 0.6720 0.6825 0.6809 0.6718 0.6593 0.6517 0.6649 0.7066 +const double ColorTemp::ColorViolA6_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1426, 0.203, 0.2660, 0.315, 0.3556, 0.392, 0.4259, 0.435, 0.4459, 0.437, 0.4317, 0.417, 0.3942, 0.365, 0.3425, 0.317, 0.2917, 0.266, 0.2413, 0.218, 0.1885, 0.172, 0.1524, 0.141, + 0.1267, 0.112, 0.0948, 0.083, 0.0700, 0.068, 0.0661, 0.068, 0.0708, 0.069, 0.0671, 0.068, 0.0699, 0.900, 0.1092, 0.159, 0.2099, 0.284, 0.3582, 0.441, 0.4857, 0.525, 0.5583, 0.567, + 0.5950, 0.605, 0.6146, 0.623, 0.6307, 0.638, 0.6495, 0.661, 0.6720, 0.679, 0.6825, 0.681, 0.6809, 0.675, 0.6718, 0.667, 0.6593, 0.655, 0.6517, 0.658, 0.6649, 0.681, 0.7066, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//0.4939 0.3859 0.4198 0.4780 0.5328 0.5672 0.5880 0.5994 0.6029 0.5981 0.5808 0.5618 0.5369 0.4819 0.4190 0.3921 0.3815 0.3400 0.2991 0.2977 0.3090 0.3088 0.2930 0.2753 0.2660 0.2636 0.2678 0.2811 0.2995 0.3125 0.3153 0.3111 0.3006 0.2952 0.3116 0.3584 +const double ColorTemp::ColorBlueSkyK3_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.4939, 0.435, 0.3859, 0.403, 0.4198, 0.446, 0.4780, 0.505, 0.5328, 0.552, 0.5672, 0.578, 0.5880, 0.595, 0.5994, 0.602, 0.6029, 0.600, 0.5981, 0.588, 0.5808, 0.571, 0.5618, 0.551, + 0.5369, 0.503, 0.4819, 0.452, 0.4190, 0.404, 0.3921, 0.386, 0.3815, 0.364, 0.3400, 0.321, 0.2991, 0.298, 0.2977, 0.304, 0.3090, 0.309, 0.3088, 0.302, 0.2930, 0.284, 0.2753, 0.271, + 0.2660, 0.265, 0.2636, 0.266, 0.2678, 0.275, 0.2811, 0.290, 0.2995, 0.306, 0.3125, 0.314, 0.3153, 0.313, 0.3111, 0.307, 0.3006, 0.298, .2952, 0.306, 0.3116, 0.325, 0.3584, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//0.4058 0.4734 0.5372 0.6051 0.6698 0.6992 0.7118 0.7135 0.7071 0.6938 0.6702 0.6511 0.6282 0.5732 0.5103 0.4913 0.4926 0.4604 0.4341 0.4648 0.5111 0.5335 0.5283 0.5154 0.5098 0.5093 0.5151 0.5309 0.5520 0.5642 0.5657 0.5598 0.5489 0.5430 0.5601 0.6067 + +const double ColorTemp::ColorBlueSkyK9_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.4058, 0.441, 0.4734, 0.502, 0.5372, 0.585, 0.6051, 0.643, 0.6698, 0.685, 0.6992, 0.705, 0.7118, 0.712, 0.7135, 0.711, 0.7071, 0.702, 0.6938, 0.681, 0.6702, 0.663, 0.6511, 0.642, + 0.6282, 0.604, 0.5732, 0.542, 0.5103, 0.499, 0.4913, 0.492, 0.4926, 0.475, 0.4604, 0.452, 0.4341, 0.453, 0.4648, 0.496, 0.5111, 0.525, 0.5335, 0.531, 0.5283, 0.522, 0.5154, 0.512, + 0.5098, 0.509, 0.5093, 0.513, 0.5151, 0.523, 0.5309, 0.544, 0.5520, 0.562, 0.5642, 0.565, 0.5657, 0.562, 0.5598, 0.554, 0.5489, 0.546, 0.5430, 0.553, 0.5601, 0.576, 0.6067, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//42 C4 0.3280 0.2611 0.3781 0.4646 0.5292 0.5732 0.6112 0.6307 0.6310 0.6181 0.5847 0.5488 0.5066 0.4358 0.3585 0.3151 0.2855 0.2309 0.1786 0.1546 0.1443 0.1359 0.1245 0.1151 0.1120 0.1127 0.1169 0.1275 0.1421 0.1504 0.1488 0.1416 0.1303 0.1241 0.1355 0.1739 +const double ColorTemp::ColorBlueSkyC4_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3280, 0.2950, 0.2611, 0.304, 0.3781, 0.423, 0.4646, 0.498, 0.5292, 0.555, 0.5732, 0.591, 0.6112, 0.6221, 0.6307, 0.631, 0.6310, 0.625, 0.6181, 0.607, 0.5847, 0.563, 0.5488, 0.524, + 0.5066, 0.465, 0.4358, 0.398, 0.3585, 0.336, 0.3151, 0.302, 0.2855, 0.254, 0.2309, 0.203, 0.1786, 0.166, 0.1546, 0.149, 0.1443, 0.143, 0.1359, 0.131, 0.1245, 0.123, 0.115, 0.114, + 0.1120, 0.112, 0.1127, 0.114, 0.1169, 0.122, 0.1275, 0.133, 0.1421, 0.147, 0.1504, 0.149, 0.1488, 0.145, 0.1416, 0.136, 0.1303, 0.127, 0.1241, 0.132, 0.1355, 0.155, 0.1739, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//52 C14 0.5697 0.4660 0.5000 0.5560 0.6072 0.6402 0.6632 0.6850 0.7069 0.7292 0.7488 0.7678 0.7786 0.7721 0.7544 0.7394 0.7232 0.6889 0.6446 0.6171 0.5966 0.5743 0.5425 0.5093 0.4884 0.4784 0.4774 0.4822 0.4944 0.5076 0.5186 0.5268 0.5303 0.5332 0.5454 0.5760 +const double ColorTemp::ColorBlueSkyC14_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.5697, 0.511, 0.4660, 0.481, 0.5000, 0.528, 0.5560, 0.583, 0.6072, 0.622, 0.6402, 0.653, 0.6632, 0.674, 0.6850, 0.699, 0.7069, 0.717, 0.7292, 0.735, 0.7488, 0.757, 0.7678, 0.773, + 0.7786, 0.776, 0.7721, 0.765, 0.7544, 0.746, 0.7394, 0.731, 0.7232, 0.704, 0.6889, 0.674, 0.6446, 0.631, 0.6171, 0.606, 0.5966, 0.585, 0.5743, 0.5570, 0.5425, 0.529, 0.5093, 0.498, + 0.4884, 0.482, 0.4784, 0.478, 0.4774, 0.481, 0.4822, 0.487, 0.4944, 0.503, 0.5076, 0.512, 0.5186, 0.522, 0.5268, 0.529, 0.5303, 0.532, 0.5332, 0.539, 0.5454, 0.565, 0.5760, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//80 E4 0.1483 0.1756 0.2536 0.3084 0.3665 0.4189 0.4746 0.5127 0.5239 0.5193 0.4917 0.4569 0.4123 0.3422 0.2672 0.2179 0.1820 0.1356 0.0972 0.0784 0.0698 0.0646 0.0592 0.0556 0.0546 0.0551 0.0571 0.0611 0.0670 0.0701 0.0692 0.0661 0.0620 0.0606 0.0663 0.0834 +const double ColorTemp::ColorBlueSkyE4_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1483, 0.161, 0.1756, 0.213, 0.2536, 0.283, 0.3084, 0.331, 0.3665, 0.387, 0.4189, 0.445, 0.4746, 0.496, 0.5127, 0.519, 0.5239, 0.522, 0.5193, 0.508, 0.4917, 0.476, 0.4569, 0.431, + 0.4123, 0.375, 0.3422, 0.309, 0.2672, 0.242, 0.2179, 0.208, 0.1820, 0.162, 0.1356, 0.113, 0.0972, 0.091, 0.0784, 0.073, 0.0698, 0.066, 0.0646, 0.062, 0.0592, 0.057, 0.0556, 0.055, + 0.0546, 0.055, 0.0551, 0.056, 0.0571, 0.059, 0.0611, 0.064, 0.0670, 0.069, 0.0701, 0.070, 0.0692, 0.067, 0.0661, 0.065, 0.0620, 0.061, 0.0606, 0.063, 0.0663, 0.072, 0.0834, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//229 M1 0.3100 0.2922 0.3514 0.4042 0.4443 0.4769 0.5002 0.5133 0.5187 0.5179 0.5057 0.4928 0.4729 0.4235 0.3643 0.3371 0.3234 0.2827 0.2418 0.2338 0.2370 0.2329 0.2184 0.2028 0.1958 0.1937 0.1973 0.2084 0.2244 0.2351 0.2372 0.2331 0.2239 0.2178 0.2319 0.2731 +const double ColorTemp::ColorBlueSkyM1_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3100, 0.303, 0.2922, 0.322, 0.3514, 0.376, 0.4042, 0.424, 0.4443, 0.457, 0.4769, 0.497, 0.5002, 0.507, 0.5133, 0.516, 0.5187, 0.518, 0.5179, 0.511, 0.5057, 0.497, 0.4928, 0.483, + 0.4729, 0.454, 0.4235, 0.398, 0.3643, 0.346, 0.3371, 0.329, 0.3234, 0.301, 0.2827, 0.263, 0.2418, 0.235, 0.2338, 0.235, 0.2370, 0.236, 0.2329, 0.226, 0.2184, 0.213, 0.2028, 0.198, + 0.1958, 0.194, 0.1937, 0.196, 0.1973, 0.203, 0.2084, 0.212, 0.2244, 0.233, 0.2351, 0.236, 0.2372, 0.234, 0.2331, 0.229, 0.2239, 0.222, 0.2178, 0.224, 0.2319, 0.251, 0.2731, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//514 2B1 0.5277 0.4431 0.4972 0.5820 0.6387 0.6750 0.7001 0.7140 0.7202 0.7193 0.7053 0.6891 0.6657 0.6181 0.5614 0.5312 0.5101 0.4589 0.4045 0.3857 0.3826 0.3751 0.3574 0.3393 0.3314 0.3304 0.3368 0.3523 0.3742 0.3874 0.3883 0.3818 0.3693 0.3616 0.3800 0.4324 +const double ColorTemp::ColorBlueSky2B1_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.5277, 0.485, 0.4431, 0.476, 0.4972, 0.539, 0.5820, 0.607, 0.6387, 0.653, 0.6750, 0.691, 0.7001, 0.707, 0.7140, 0.718, 0.7202, 0.720, 0.7193, 0.713, 0.7053, 0.695, 0.6891, 0.674, + 0.6657, 0.632, 0.6181, 0.587, 0.5614, 0.543, 0.5312, 0.521, 0.5101, 0.483, 0.4589, 0.431, 0.4045, 0.398, 0.3857, 0.385, 0.3826, 0.376, 0.3751, 0.364, 0.3574, 0.346, 0.3393, 0.335, + 0.3314, 0.331, 0.3304, 0.333, 0.3368, 0.346, 0.3523, 0.363, 0.3742, 0.382, 0.3874, 0.385, 0.3883, 0.384, 0.3818, 0.375, 0.3693, 0.364, 0.3616, 0.374, 0.3800, 0.396, 0.4324, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//368 T7 0.1943 0.3199 0.4536 0.5443 0.6043 0.6499 0.6839 0.7125 0.7329 0.7482 0.7527 0.7514 0.7383 0.7028 0.6526 0.6034 0.5500 0.4708 0.3848 0.3268 0.2929 0.2712 0.2493 0.2316 0.2243 0.2234 0.2288 0.2436 0.2640 0.2762 0.2767 0.2693 0.2566 0.2489 0.2665 0.3165 +const double ColorTemp::ColorBlueSkyT7_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1943, 0.256, 0.3199, 0.376, 0.4536, 0.494, 0.5443, 0.572, 0.6043, 0.631, 0.6499, 0.664, 0.6839, 0.698, 0.7125, 0.726, 0.7329, 0.741, 0.7482, 0.751, 0.7527, 0.752, 0.7514, 0.745, + 0.7383, 0.721, 0.7028, 0.675, 0.6526, 0.631, 0.6034, 0.589, 0.5500, 0.512, 0.4708, 0.432, 0.3848, 0.342, 0.3268, 0.311, 0.2929, 0.282, 0.2712, 0.261, 0.2493, 0.236, 0.2316, 0.227, + 0.2243, 0.223, 0.2234, 0.229, 0.2288, 0.235, 0.2436, 0.255, 0.2640, 0.268, 0.2762, 0.277, 0.2767, 0.272, 0.2693, 0.263, 0.2566, 0.254, 0.2489, 0.255, 0.2665, 0.275, 0.3165, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + + +//399 U19 0.5829 0.4865 0.4927 0.5690 0.6221 0.6532 0.6728 0.6832 0.6889 0.6884 0.6771 0.6648 0.6465 0.6038 0.5524 0.5297 0.5194 0.4797 0.4387 0.4356 0.4455 0.4444 0.4282 0.4094 0.4009 0.3992 0.4046 0.4185 0.4385 0.4515 0.4545 0.4505 0.4411 0.4368 0.4539 0.5013 +const double ColorTemp::ColorBlueSkyU19_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.5829, 0.534, 0.4865, 0.489, 0.4927, 0.532, 0.5690, 0.593, 0.6221, 0.641, 0.6532, 0.662, 0.6728, 0.674, 0.6832, 0.687, 0.6889, 0.688, 0.6884, 0.683, 0.6771, 0.671, 0.6648, 0.665, + 0.6465, 0.622, 0.6038, 0.583, 0.5524, 0.542, 0.5297, 0.523, 0.5194, 0.492, 0.4797, 0.451, 0.4387, 0.436, 0.4356, 0.442, 0.4455, 0.445, 0.4444, 0.432, 0.4282, 0.413, 0.4094, 0.404, + 0.4009, 0.400, 0.3992, 0.402, 0.4046, 0.411, 0.4185, 0.426, 0.4385, 0.446, 0.4515, 0.452, 0.4545, 0.452, 0.4505, 0.446, 0.4411, 0.438, 0.4368, 0.443, 0.4539, 0.467, 0.5013, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//382 U2 0.3594 0.3425 0.3214 0.3654 0.4097 0.4360 0.4590 0.4793 0.5002 0.5234 0.5476 0.5745 0.5940 0.5901 0.5703 0.5545 0.5384 0.5029 0.4592 0.4334 0.4149 0.3947 0.3657 0.3363 0.3177 0.3087 0.3077 0.3123 0.3231 0.3351 0.3454 0.3520 0.3545 0.3562 0.3674 0.3976 +const double ColorTemp::ColorBlueSkyU2_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3594, 0.345, 0.3425, 0.333, 0.3214, 0.346, 0.3654, 0.387, 0.4097, 0.424, 0.4360, 0.446, 0.4590, 0.467, 0.4793, 0.494, 0.5002, 0.517, 0.5234, 0.538, 0.5476, 0.564, 0.5745, 0.583, + 0.5940, 0.593, 0.5901, 0.580, 0.5703, 0.563, 0.5545, 0.546, 0.5384, 0.521, 0.5029, 0.478, 0.4592, 0.444, 0.4334, 0.421, 0.4149, 0.408, 0.3947, 0.378, 0.3657, 0.352, 0.3363, 0.324, + 0.3177, 0.313, 0.3087, 0.308, 0.3077, 0.310, 0.3123, 0.317, 0.3231, 0.329, 0.3351, 0.339, 0.3454, 0.348, 0.3520, 0.353, 0.3545, 0.355, 0.3562, 0.359, 0.3674, 0.375, 0.3976, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + + +//378 T17 0.4213 0.3332 0.4205 0.5078 0.5650 0.6025 0.6223 0.6279 0.6195 0.5981 0.5578 0.5197 0.4785 0.4074 0.3325 0.3030 0.2918 0.2511 0.2125 0.2105 0.2198 0.2199 0.2083 0.1945 0.1895 0.1898 0.1954 0.2094 0.2288 0.2406 0.2399 0.2317 0.2189 0.2108 0.2261 0.2755 +const double ColorTemp::ColorBlueSkyT17_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.4213, 0.376, 0.3332, 0.387, 0.4205, 0.467, 0.5078, 0.532, 0.5650, 0.587, 0.6025, 0.611, 0.6223, 0.624, 0.6279, 0.623, 0.6195, 0.607, 0.5981, 0.576, 0.5578, 0.534, 0.5197, 0.499, + 0.4785, 0.435, 0.4074, 0.376, 0.3325, 0.317, 0.3030, 0.295, 0.2918, 0.272, 0.2511, 0.235, 0.2125, 0.212, 0.2105, 0.214, 0.2198, 0.219, 0.2199, 0.215, 0.2083, 0.202, 0.1945, 0.191, + 0.1895, 0.189, 0.1898, 0.193, 0.1954, 0.202, 0.2094, 0.215, 0.2288, 0.236, 0.2406, 0.240, 0.2399, 0.236, 0.2317, 0.225, 0.2189, 0.214, 0.2108, 0.218, 0.2261, 0.245, 0.2755, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//236 M8 -0.0593 0.0128 0.0031 0.0149 0.0197 0.0221 0.0223 0.0230 0.0232 0.0237 0.0243 0.0247 0.0249 0.0249 0.0248 0.0247 0.0244 0.0240 0.0240 0.0242 0.0244 0.0247 0.0252 0.0254 0.0262 0.0269 0.0271 0.0273 0.0278 0.0280 0.0276 0.0275 0.0282 0.0288 0.0295 0.0303 +const double ColorTemp::ColorBlackM8_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0593, 0.040, 0.0128, 0.023, 0.0031, 0.024, 0.0149, 0.017, 0.0197, 0.021, 0.0221, 0.022, 0.0223, 0.023, 0.0230, 0.023, 0.0232, 0.023, 0.0237, 0.024, 0.0243, 0.024, 0.0247, 0.024, + 0.0249, 0.025, 0.0249, 0.025, 0.0248, 0.025, 0.0247, 0.024, 0.0244, 0.024, 0.0240, 0.024, 0.0240, 0.024, 0.0242, 0.024, 0.0244, 0.024, 0.0247, 0.025, 0.0252, 0.025, 0.0254, 0.026, + 0.0262, 0.027, 0.0269, 0.027, 0.0271, 0.027, 0.0273, 0.027, 0.0278, 0.028, 0.0280, 0.028, 0.0276, 0.028, 0.0275, 0.028, 0.0282, 0.028, 0.0288, 0.029, 0.0295, 0.030, 0.0303, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//240 M12 -0.0377 0.0146 0.0167 0.0222 0.0257 0.0261 0.0270 0.0271 0.0274 0.0281 0.0287 0.0299 0.0306 0.0304 0.0297 0.0285 0.0277 0.0267 0.0257 0.0257 0.0258 0.0259 0.0263 0.0276 0.0279 0.0288 0.0297 0.0302 0.0304 0.0303 0.0302 0.0303 0.0310 0.0321 0.0337 0.0356 +const double ColorTemp::ColorBlackM12_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0377, 0.022, 0.0146, 0.015, 0.0167, 0.020, 0.0222, 0.023, 0.0257, 0.026, 0.0261, 0.027, 0.0270, 0.027, 0.0271, 0.027, 0.0274, 0.028, 0.0281, 0.028, 0.0287, 0.029, 0.0299, 0.030, + 0.0306, 0.030, 0.0304, 0.030, 0.0297, 0.029, 0.0285, 0.028, 0.0277, 0.027, 0.0267, 0.026, 0.0257, 0.026, 0.0257, 0.026, 0.0258, 0.026, 0.0259, 0.026, 0.0263, 0.027, 0.0276, 0.028, + 0.0279, 0.028, 0.0288, 0.029, 0.0297, 0.030, 0.0302, 0.030, 0.0304, 0.030, 0.0303, 0.030, 0.0302, 0.030, 0.0303, 0.031, 0.0310, 0.031, 0.0321, 0.033, 0.0337, 0.035, 0.0356, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//241 M13 0.2961 0.0487 0.0261 0.0330 0.0296 0.0305 0.0305 0.0314 0.0320 0.0322 0.0335 0.0348 0.0352 0.0347 0.0336 0.0325 0.0314 0.0299 0.0284 0.0284 0.0286 0.0288 0.0290 0.0299 0.0306 0.0314 0.0320 0.0328 0.0332 0.0331 0.0330 0.0328 0.0337 0.0350 0.0366 0.0385 +const double ColorTemp::ColorBlackM13_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2961, 0.100, 0.0487, 0.035, 0.0261, 0.030, 0.0330, 0.031, 0.0296, 0.030, 0.0305, 0.030, 0.0305, 0.031, 0.0314, 0.032, 0.0320, 0.032, 0.0322, 0.033, 0.0335, 0.034, 0.0348, 0.035, + 0.0352, 0.035, 0.0347, 0.034, 0.0336, 0.033, 0.0325, 0.032, 0.0314, 0.030, 0.0299, 0.029, 0.0284, 0.028, 0.0284, 0.029, 0.0286, 0.029, 0.0288, 0.029, 0.0290, 0.030, 0.0299, 0.030, + 0.0306, 0.031, 0.0314, 0.032, 0.0320, 0.032, 0.0328, 0.033, 0.0332, 0.033, 0.0331, 0.033, 0.0330, 0.033, 0.0328, 0.033, 0.0337, 0.034, 0.0350, 0.036, 0.0366, 0.037, 0.0385, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//525 2B12 0.3848 0.4127 0.4780 0.5375 0.5917 0.6194 0.6353 0.6485 0.6625 0.6784 0.7010 0.7367 0.7706 0.7847 0.7843 0.7826 0.7799 0.7689 0.7521 0.7463 0.7401 0.7314 0.7168 0.7008 0.6904 0.6860 0.6861 0.6896 0.6986 0.7064 0.7138 0.7185 0.7233 0.7281 0.7338 0.7498 +const double ColorTemp::ColorWhite2B12_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3848, 0.405, 0.4127, 0.435, 0.4780, 0.501, 0.5375, 0.572, 0.5917, 0.606, 0.6194, 0.627, 0.6353, 0.642, 0.6485, 0.653, 0.6625, 0.669, 0.6784, 0.692, 0.7010, 0.072, 0.7367, 0.0760, + 0.7706, 0.775, 0.7847, 0.784, 0.7843, 0.784, 0.7826, 0.781, 0.7799, 0.775, 0.7689, 0.762, 0.7521, 0.748, 0.7463, 0.743, 0.7401, 0.731, 0.7314, 0.723, 0.7168, 0.705, 0.7008, 0.701, + 0.6904, 0.689, 0.6860, 0.686, 0.6861, 0.687, 0.6896, 0.691, 0.6986, 0.701, 0.7064, 0.711, 0.7138, 0.715, 0.7185, 0.721, 0.7233, 0.725, 0.7281, 0.731, 0.7338, 0.741, 0.7498, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//527 2B14 0.6608 0.5900 0.6114 0.6747 0.7329 0.7599 0.7706 0.7776 0.7831 0.7890 0.7952 0.8074 0.8185 0.8214 0.8201 0.8218 0.8244 0.8229 0.8192 0.8281 0.8344 0.8388 0.8415 0.8445 0.8495 0.8521 0.8556 0.8604 0.8666 0.8687 0.8687 0.8672 0.8682 0.8703 0.8720 0.8803 +const double ColorTemp::ColorWhite2B14_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.6608, 0.631, 0.5900, 0.605, 0.6114, 0.634, 0.6747, 0.698, 0.7329, 0.745, 0.7599, 0.765, 0.7706, 0.775, 0.7776, 0.781, 0.7831, 0.786, 0.7890, 0.792, 0.7952, 0.797, 0.8074, 0.810, + 0.8185, 0.821, 0.8214, 0.821, 0.8201, 0.821, 0.8218, 0.822, 0.8244, 0.823, 0.8229, 0.822, 0.8192, 0.824, 0.8281, 0.831, 0.8344, 0.836, 0.8388, 0.840, 0.8415, 0.843, 0.8445, 0.847, + 0.8495, 0.851, 0.8521, 0.853, 0.8556, 0.858, 0.8604, 0.863, 0.8666, 0.867, 0.8687, 0.869, 0.8687, 0.867, 0.8672, 0.868, 0.8682, 0.870, 0.8703, 0.871, 0.8720, 0.874, 0.8803, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//97 97 0.0031 0.0047 0.0056 0.0064 0.0070 0.0070 0.0071 0.0066 0.0065 0.0065 0.0064 0.0063 0.0063 0.0058 0.0052 0.0052 0.0053 0.0047 0.0044 0.0052 0.0066 0.0077 0.0081 0.0082 0.0084 0.0089 0.0096 0.0106 0.0121 0.0127 0.0128 0.0124 0.0115 0.0117 0.0133 0.0169 +const double ColorTemp::JDC468_Blackred97_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0031, 0.0035, 0.0047, 0.0050, 0.0056, 0.0060, 0.0064, 0.0065, 0.0070, 0.007, 0.0070, 0.007, 0.0071, 0.007, 0.0066, 0.007, 0.0065, 0.006, 0.0065, 0.006, 0.0064, 0.006, 0.0063, + 0.006, 0.0063, 0.006, 0.0058, 0.005, 0.0052, 0.005, 0.0052, 0.005, 0.0053, 0.005, 0.0047, 0.005, 0.0044, 0.005, 0.0052, 0.006, 0.0066, 0.007, 0.0077, 0.008, 0.0081, 0.008, 0.008, + 0.008, 0.0084, 0.009, 0.0089, 0.009, 0.0096, 0.01, 0.0106, 0.011, 0.0121, 0.012, 0.0127, 0.012, 0.0128, 0.012, 0.0124, 0.012, 0.0115, 0.012, 0.0117, 0.013, 0.0133, 0.015, 0.0169, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//443 443 0.0067 0.0068 0.0067 0.0074 0.0083 0.0088 0.0092 0.0093 0.0098 0.0099 0.0101 0.0106 0.0109 0.0104 0.0094 0.0086 0.0075 0.0058 0.0044 0.0039 0.0037 0.0038 0.0036 0.0035 0.0036 0.0033 0.0033 0.0036 0.0038 0.0042 0.0041 0.0036 0.0033 0.0035 0.0042 0.0062 +const double ColorTemp::JDC468_Blackredbl443_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0067, 0.0067, 0.0068, 0.0068, 0.0067, 0.0070, 0.0074, 0.008, 0.0083, 0.0085, 0.0088, 0.009, 0.0092, 0.0092, 0.0093, 0.0096, 0.0098, 0.0098, 0.0099, 0.01, 0.0101, 0.0104, 0.0106, + 0.0106, 0.0109, 0.0105, 0.0104, 0.01, 0.0094, 0.09, 0.0086, 0.08, 0.0075, 0.06, 0.0058, 0.05, 0.0044, 0.04, 0.0039, 0.0038, 0.0037, 0.0037, 0.0038, 0.0037, 0.0036, 0.0036, + 0.0035, 0.0036, 0.0036, 0.0034, 0.0033, 0.0033, 0.0033, 0.0035, 0.0036, 0.0037, 0.0038, 0.004, 0.0042, 0.004, 0.0041, 0.004, 0.0036, 0.0034, 0.0033, 0.0034, 0.0035, 0.004, 0.0042, 0.005, 0.0062, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//27 27 0.0060 0.0064 0.0070 0.0076 0.0086 0.0086 0.0088 0.0089 0.0089 0.0083 0.0079 0.0078 0.0077 0.0067 0.0059 0.0057 0.0056 0.0046 0.0041 0.0045 0.0050 0.0056 0.0054 0.0053 0.0054 0.0055 0.0057 0.0065 0.0073 0.0079 0.0080 0.0075 0.0067 0.0068 0.0081 0.0114 +const double ColorTemp::JDC468_Blackbl27_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0060, 0.0062, 0.0064, 0.0066, 0.0070, 0.0073, 0.0076, 0.008, 0.0086, 0.0086, 0.0086, 0.0087, 0.0088, 0.0088, 0.0089, 0.0089, 0.0089, 0.0085, 0.0083, 0.008, 0.0079, 0.0078, 0.0078, + 0.0078, 0.0077, 0.007, 0.0067, 0.006, 0.0059, 0.0057, 0.0057, 0.0057, 0.0056, 0.005, 0.0046, 0.0045, 0.0041, 0.0043, 0.0045, 0.0047, 0.0050, 0.0053, 0.0056, 0.0055, 0.0054, 0.0055, + 0.0053, 0.0053, 0.0054, 0.0054, 0.0055, 0.0056, 0.0057, 0.006, 0.0065, 0.007, 0.0073, 0.0075, 0.0079, 0.008, 0.0080, 0.008, 0.0075, 0.007, 0.0067, 0.0067, 0.0068, 0.007, 0.0081, 0.01, 0.0114, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//28 28 0.0092 0.0118 0.0155 0.0218 0.0267 0.0296 0.0312 0.0306 0.0282 0.0244 0.0205 0.0186 0.0167 0.0126 0.0091 0.0080 0.0071 0.0050 0.0042 0.0042 0.0044 0.0045 0.0045 0.0042 0.0041 0.0039 0.0040 0.0043 0.0048 0.0050 0.0047 0.0042 0.0041 0.0042 0.0049 0.0074 +const double ColorTemp::JDC468_Blackbl28_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0092, 0.01, 0.0118, 0.012, 0.0155, 0.016, 0.0218, 0.025, 0.0267, 0.028, 0.0296, 0.03, 0.0312, 0.031, 0.0306, 0.03, 0.0282, 0.026, 0.0244, 0.022, 0.0205, 0.02, 0.0186, 0.017, 0.0167, + 0.015, 0.0126, 0.01, 0.0091, 0.0085, 0.0080, 0.0075, 0.0071, 0.006, 0.0050, 0.05, 0.0042, 0.0042, 0.0042, 0.0043, 0.0044, 0.0044, 0.0045, 0.0045, 0.0045, 0.0043, 0.0042, 0.0042, + 0.0041, 0.004, 0.0039, 0.004, 0.0040, 0.004, 0.0043, 0.0044, 0.0048, 0.005, 0.0050, 0.0048, 0.0047, 0.0045, 0.0042, 0.0041, 0.0041, 0.0041, 0.0042, 0.0045, 0.0049, 0.006, 0.0074, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//214 214 0.0072 0.0062 0.0061 0.0064 0.0069 0.0071 0.0075 0.0081 0.0082 0.0088 0.0103 0.0126 0.0145 0.0146 0.0140 0.0133 0.0118 0.0094 0.0070 0.0059 0.0051 0.0046 0.0045 0.0043 0.0045 0.0045 0.0048 0.0056 0.0065 0.0072 0.0067 0.0065 0.0057 0.0058 0.0068 0.0103 +const double ColorTemp::JDC468_Blackgr214_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0072, 0.007, 0.0062, 0.0062, 0.0061, 0.0063, 0.0064, 0.0067, 0.0069, 0.007, 0.0071, 0.0072, 0.0075, 0.008, 0.0081, 0.008, 0.0082, 0.0085, 0.0088, 0.009, 0.0103, 0.011, 0.0126, + 0.012, 0.0145, 0.0145, 0.0146, 0.014, 0.0140, 0.014, 0.0133, 0.012, 0.0118, 0.01, 0.0094, 0.008, 0.0070, 0.006, 0.0059, 0.0055, 0.0051, 0.005, 0.0046, 0.0045, 0.0045, 0.0044, + 0.0043, 0.0044, 0.0045, 0.0045, 0.0045, 0.0046, 0.0048, 0.005, 0.0056, 0.006, 0.0065, 0.007, 0.0072, 0.007, 0.0067, 0.0066, 0.0065, 0.006, 0.0057, 0.0056, 0.0058, 0.006, 0.0068, 0.008, 0.0103, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + + +//436 436 0.0095 0.0123 0.0173 0.0242 0.0293 0.0317 0.0310 0.0283 0.0246 0.0197 0.0152 0.0129 0.0112 0.0083 0.0063 0.0059 0.0056 0.0045 0.0043 0.0050 0.0059 0.0064 0.0062 0.0060 0.0060 0.0062 0.0066 0.0075 0.0086 0.0093 0.0089 0.0082 0.0073 0.0072 0.0088 0.0139 +const double ColorTemp::JDC468_Blackbl436_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0095, 0.01, 0.0123, 0.013, 0.0173, 0.02, 0.0242, 0.026, 0.0293, 0.03, 0.0317, 0.031, 0.0310, 0.03, 0.0283, 0.025, 0.0246, 0.02, 0.0197, 0.018, 0.0152, 0.014, 0.0129, 0.012, + 0.0112, 0.01, 0.0083, 0.007, 0.0063, 0.006, 0.0059, 0.0058, 0.0056, 0.005, 0.0045, 0.0045, 0.0043, 0.005, 0.0050, 0.0055, 0.0059, 0.006, 0.0064, 0.0063, 0.0062, 0.006, 0.0060, + 0.006, 0.0060, 0.006, 0.0062, 0.0064, 0.0066, 0.007, 0.0075, 0.008, 0.0086, 0.009, 0.0093, 0.009, 0.0089, 0.0086, 0.0082, 0.008, 0.0073, 0.0072, 0.0072, 0.008, 0.0088, 0.01, 0.0139, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + + +//455 455 0.1560 0.1943 0.2724 0.4469 0.5896 0.6393 0.6390 0.6239 0.6096 0.5895 0.5698 0.5662 0.5603 0.5304 0.4977 0.4975 0.4998 0.4601 0.4261 0.4520 0.4986 0.5237 0.5270 0.5260 0.5297 0.5375 0.5504 0.5711 0.5910 0.6023 0.6029 0.5977 0.5880 0.5830 0.5978 0.6345 +const double ColorTemp::JDC468_Whitebl455_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1560, 0.18, 0.1943, 0.25, 0.2724, 0.40, 0.4469, 0.50, 0.5896, 0.60, 0.6393, 0.639, 0.6390, 0.625, 0.6239, 0.61, 0.6096, 0.60, 0.5895, 0.57, 0.5698, 0.567, 0.5662, 0.56, + 0.5603, 0.55, 0.5304, 0.51, 0.4977, 0.498, 0.4975, 0.498, 0.4998, 0.47, 0.4601, 0.44, 0.4261, 0.43, 0.4520, 0.47, 0.4986, 0.51, 0.5237, 0.525, 0.5270, 0.526, 0.5260, 0.528, + 0.5297, 0.53, 0.5375, 0.54, 0.5504, 0.56, 0.5711, 0.58, 0.5910, 0.595, 0.6023, 0.602, 0.6029, 0.600, 0.5977, 0.59, 0.5880, 0.585, 0.5830, 0.59, 0.5978, 0.61, 0.6345, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//101 101 0.0076 0.0094 0.0116 0.0139 0.0158 0.0158 0.0152 0.0142 0.0130 0.0111 0.0094 0.0090 0.0085 0.0069 0.0058 0.0057 0.0058 0.0048 0.0044 0.0060 0.0094 0.0126 0.0141 0.0141 0.0148 0.0157 0.0172 0.0197 0.0227 0.0245 0.0242 0.0233 0.0215 0.0205 0.0240 0.0321 +const double ColorTemp::JDC468_Blackvio101_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0076, 0.008, 0.0094, 0.01, 0.0116, 0.012, 0.0139, 0.015, 0.0158, 0.0158, 0.0158, 0.0156, 0.0152, 0.015, 0.0142, 0.014, 0.0130, 0.012, 0.0111, 0.01, 0.0094, 0.009, 0.0090, 0.009, + 0.0085, 0.008, 0.0069, 0.006, 0.0058, 0.0057, 0.0057, 0.0058, 0.0058, 0.005, 0.0048, 0.0045, 0.0044, 0.005, 0.0060, 0.008, 0.0094, 0.011, 0.0126, 0.013, 0.0141, 0.014, 0.0141, 0.0145, 0.0148, 0.015, 0.0157, 0.016, 0.0172, 0.018, 0.0197, 0.021, 0.0227, 0.023, 0.0245, 0.0241, + 0.0242, 0.0235, 0.0233, 0.022, 0.0215, 0.021, 0.0205, 0.022, 0.0240, 0.026, 0.0321, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//92 92 0.1652 0.2036 0.2848 0.4708 0.6230 0.6758 0.6761 0.6619 0.6502 0.6343 0.6195 0.6194 0.6169 0.5939 0.5677 0.5678 0.5695 0.5373 0.5105 0.5356 0.5778 0.6020 0.6073 0.6090 0.6124 0.6187 0.6295 0.6456 0.6603 0.6693 0.6716 0.6704 0.6660 0.6640 0.6749 0.7003 +const double ColorTemp::JDC468_Whitebl92_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1652, 0.19, 0.2036, 0.24, 0.2848, 0.35, 0.4708, 0.55, 0.6230, 0.65, 0.6758, 0.6759, 0.6761, 0.665, 0.6619, 0.655, 0.6502, 0.64, 0.6343, 0.62, 0.6195, 0.6194, 0.6194, 0.618, + 0.6169, 0.605, 0.5939, 0.58, 0.5677, 0.5677, 0.5678, 0.568, 0.5695, 0.555, 0.5373, 0.52, 0.5105, 0.52, 0.5356, 0.55, 0.5778, 0.60, 0.6020, 0.605, 0.6073, 0.608, 0.6090, 0.61, + 0.6124, 0.615, 0.6187, 0.62, 0.6295, 0.64, 0.6456, 0.65, 0.6603, 0.665, 0.6693, 0.67, 0.6716, 0.671, 0.6704, 0.669, 0.6660, 0.665, 0.6640, 0.67, 0.6749, 0.69, 0.7003, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//94 94 0.0506 0.0569 0.0678 0.0906 0.1088 0.1160 0.1184 0.1195 0.1203 0.1215 0.1293 0.1474 0.1609 0.1538 0.1415 0.1466 0.1535 0.1364 0.1248 0.1494 0.1871 0.2098 0.2163 0.2179 0.2217 0.2282 0.2372 0.2500 0.2631 0.2713 0.2739 0.2725 0.2678 0.2660 0.2770 0.3025 +const double ColorTemp::JDC468_Greyredbl94_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0506, 0.053, 0.0569, 0.06, 0.0678, 0.08, 0.0906, 0.1, 0.1088, 0.11, 0.1160, 0.117, 0.1184, 0.119, 0.1195, 0.12, 0.1203, 0.1205, 0.1215, 0.125, 0.1293, 0.133, 0.1474, 0.15, + 0.1609, 0.155, 0.1538, 0.145, 0.1415, 0.143, 0.1466, 0.15, 0.1535, 0.14, 0.1364, 0.13, 0.1248, 0.14, 0.1494, 0.17, 0.1871, 0.200, 0.2098, 0.21, 0.2163, 0.217, 0.2179, 0.22, + 0.2217, 0.222, 0.2282, 0.23, 0.2372, 0.24, 0.2500, 0.256, 0.2631, 0.27, 0.2713, 0.272, 0.2739, 0.273, 0.2725, 0.27, 0.2678, 0.267, 0.2660, 0.272, 0.2770, 0.28, 0.3025, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + + + +//32 32 0.0933 0.1333 0.1967 0.3132 0.4096 0.4556 0.4763 0.4845 0.4870 0.4852 0.4868 0.4959 0.4971 0.4755 0.4407 0.4085 0.3643 0.2922 0.2161 0.1658 0.1370 0.1190 0.1040 0.0947 0.0949 0.1001 0.1106 0.1306 0.1536 0.1652 0.1609 0.1480 0.1291 0.1188 0.1370 0.1933 +const double ColorTemp::JDC468_Blue32_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0933, 0.11, 0.1333, 0.17, 0.1967, 0.265, 0.3132, 0.35, 0.4096, 0.43, 0.4556, 0.465, 0.4763, 0.48, 0.4845, 0.486, .4870, 0.486, 0.4852, 0.486, 0.4868, 0.49, 0.4959, 0.496, + 0.4971, 0.48, 0.4755, 0.46, 0.4407, 0.42, 0.4085, 0.38, 0.3643, 0.32, 0.2922, 0.25, 0.2161, 0.19, 0.1658, 0.15, 0.1370, 0.12, 0.1190, 0.11, 0.1040, 0.10, 0.0947, 0.0948, + 0.0949, 0.097, 0.1001, 0.105, 0.1106, 0.12, 0.1306, 0.14, 0.1536, 0.16, 0.1652, 0.162, 0.1609, 0.154, 0.1480, 0.135, 0.1291, 0.12, 0.1188, 0.125, 0.1370, 0.16, 0.1933, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + + +//236 236 0.0165 0.0259 0.0432 0.0684 0.0858 0.0895 0.0828 0.0683 0.0527 0.0365 0.0235 0.0177 0.0143 0.0096 0.0067 0.0063 0.0060 0.0052 0.0053 0.0061 0.0074 0.0083 0.0085 0.0080 0.0078 0.0076 0.0081 0.0095 0.0112 0.0121 0.0114 0.0100 0.0086 0.0083 0.0102 0.0180 +const double ColorTemp::JDC468_Blue236_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0165, 0.021, 0.0259, 0.035, 0.0432, 0.05, 0.0684, 0.075, 0.0858, 0.087, 0.0895, 0.085, 0.0828, 0.075, 0.0683, 0.058, 0.0527, 0.045, 0.0365, 0.031, 0.0235, 0.021, 0.0177, 0.016, + 0.0143, 0.012, 0.0096, 0.0085, 0.0067, 0.0065, 0.0063, 0.0062, 0.0060, 0.006, 0.0052, 0.0052, 0.0053, 0.006, 0.0061, 0.007, 0.0074, 0.008, 0.0083, 0.0084, 0.0085, 0.0083, + 0.0080, 0.008, 0.0078, 0.0077, 0.0076, 0.008, 0.0081, 0.009, 0.0095, 0.01, 0.0112, 0.012, 0.0121, 0.012, 0.0114, 0.011, 0.0100, 0.009, 0.0086, 0.0085, 0.0083, 0.009, 0.0102, 0.0015, 0.0180, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//300 300 0.0079 0.0085 0.0087 0.0092 0.0094 0.0093 0.0093 0.0095 0.0097 0.0110 0.0158 0.0544 0.1907 0.3753 0.4883 0.5181 0.5044 0.4631 0.4070 0.3594 0.3262 0.3054 0.2873 0.2772 0.2790 0.2875 0.3029 0.3292 0.3571 0.3719 0.3693 0.3573 0.3371 0.3253 0.3471 0.4087 +const double ColorTemp::JDC468_Gre300_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0079, 0.008, 0.0085, 0.0086, 0.0087, 0.009, 0.0092, 0.0093, 0.0094, 0.0094, 0.0093, 0.0093, 0.0093, 0.0094, 0.0095, 0.0096, 0.0097, 0.01, 0.0110, 0.012, 0.0158, 0.045, + 0.0544, 0.134, 0.1907, 0.25, 0.3753, 0.435, 0.4883, 0.505, 0.5181, 0.512, 0.5044, 0.485, 0.4631, 0.433, 0.4070, 0.387, 0.3594, 0.334, 0.3262, 0.31, 0.3054, 0.295, 0.2873, 0.292, + 0.2772, 0.278, 0.2790, 0.281, 0.2875, 0.291, 0.3029, 0.3121, 0.3292, 0.333, 0.3571, 0.365, 0.3719, 0.365, 0.3693, 0.362, 0.3573, 0.342, 0.3371, 0.325, 0.3253, 0.336, 0.3471, 0.367, 0.4087, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//340 340 0.0175 0.0320 0.0587 0.0989 0.1267 0.1322 0.1210 0.0978 0.0732 0.0487 0.0297 0.0212 0.0167 0.0106 0.0069 0.0064 0.0062 0.0051 0.0052 0.0061 0.0073 0.0081 0.0080 0.0076 0.0075 0.0072 0.0077 0.0088 0.0105 0.0112 0.0104 0.0092 0.0079 0.0075 0.0092 0.0167 +const double ColorTemp::JDC468_Blue340_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0175, 0.02, 0.0320, 0.04, 0.0587, 0.08, 0.0989, 0.11, 0.1267, 0.13, 0.1322, 0.125, 0.1210, 0.111, 0.0978, 0.08, 0.0732, 0.06, 0.0487, 0.04, 0.0297, 0.025, 0.0212, 0.02, + 0.0167, 0.012, 0.0106, 0.008, 0.0069, 0.0065, 0.0064, 0.0063, 0.0062, 0.0055, 0.0051, 0.0051, 0.0052, 0.006, 0.0061, 0.007, 0.0073, 0.008, 0.0081, 0.008, 0.0080, 0.0078, + 0.0076, 0.0076, 0.0075, 0.0074, 0.0072, 0.0075, 0.0077, 0.008, 0.0088, 0.0092, 0.0105, 0.011, 0.0112, 0.0108, 0.0104, 0.01, 0.0092, 0.008, 0.0079, 0.0075, 0.0075, 0.008, + 0.0092, 0.01, 0.0167, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//110 110 0.0954 0.1234 0.1702 0.2631 0.3363 0.3664 0.3799 0.3905 0.4002 0.4160 0.4582 0.5262 0.5798 0.5915 0.5742 0.5465 0.5035 0.4364 0.3581 0.2977 0.2589 0.2349 0.2152 0.2030 0.2032 0.2106 0.2249 0.2511 0.2799 0.2951 0.2915 0.2776 0.2552 0.2419 0.2638 0.3287 +const double ColorTemp::JDC468_Gree110_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0954, 0.11, 0.1234, 0.15, 0.1702, 0.22, 0.2631, 0.312, 0.3363, 0.352, 0.3664, 0.372, 0.3799, 0.385, 0.3905, 0.395, 0.4002, 0.41, 0.4160, 0.43, 0.4582, 0.511, 0.5262, 0.544, + 0.5798, 0.585, 0.5915, 0.585, 0.5742, 0.563, 0.5465, 0.523, 0.5035, 0.465, 0.4364, 0.389, 0.3581, 0.3334, 0.2977, 0.275, 0.2589, 0.245, 0.2349, 0.223, 0.2152, 0.211, 0.2030, 0.204, + 0.2032, 0.206, 0.2106, 0.221, 0.2249, 0.243, 0.2511, 0.271, 0.2799, 0.286, 0.2951, 0.294, 0.2915, 0.2876, 0.2776, 0.2657, 0.2552, 0.2456, 0.2419, 0.253, 0.2638, 0.275, 0.3287, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//457 457 0.0127 0.0126 0.0112 0.0110 0.0109 0.0106 0.0105 0.0104 0.0110 0.0136 0.0318 0.1246 0.3262 0.5051 0.5566 0.5181 0.4406 0.3429 0.2411 0.1647 0.1202 0.0968 0.0804 0.0709 0.0703 0.0747 0.0840 0.1023 0.1243 0.1355 0.1311 0.1179 0.0993 0.0884 0.1043 0.1590 +const double ColorTemp::JDC468_Gree457_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0127, 0.0126, 0.0126, 0.012, 0.0112, 0.011, 0.0110, 0.011, 0.0109, 0.0107, 0.0106, 0.0105, 0.0105, 0.0105, 0.0104, 0.0107, 0.0110, 0.0124, 0.0136, 0.0234, 0.0318, 0.09, + 0.1246, 0.22, 0.3262, 0.43, 0.5051, 0.52, 0.5566, 0.54, 0.5181, 0.476, 0.4406, 0.398, 0.3429, 0.296, 0.2411, 0.203, 0.1647, 0.142, 0.1202, 0.1, 0.0968, 0.09, 0.0804, 0.08, + 0.0709, 0.0708, 0.0703, 0.0723, 0.0747, 0.08, 0.0840, 0.09, 0.1023, 0.11, 0.1243, 0.13, 0.1355, 0.132, 0.1311, 0.12, 0.1179, 0.10, 0.0993, 0.09, 0.0884, 0.09, 0.1043, 0.12, 0.1590, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//241 241 0.0134 0.0106 0.0110 0.0108 0.0111 0.0114 0.0114 0.0115 0.0114 0.0122 0.0192 0.0731 0.2455 0.4689 0.6183 0.6852 0.7107 0.7112 0.7059 0.7177 0.7335 0.7445 0.7487 0.7523 0.7555 0.7606 0.7683 0.7779 0.7855 0.7915 0.7964 0.8011 0.8056 0.8097 0.8144 0.8239 +const double ColorTemp::JDC468_Yel241_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0134, 0.012, 0.0106, 0.011, 0.0110, 0.011, 0.0108, 0.011, 0.0111, 0.0112, 0.0114, 0.0114, 0.0114, 0.0114, 0.0115, 0.0114, 0.0114, 0.012, 0.0122, 0.017, 0.0192, 0.05, 0.0731, 0.12, + 0.2455, 0.355, 0.4689, 0.556, 0.6183, 0.645, 0.6852, 0.698, 0.7107, 0.711, 0.7112, 0.708, 0.7059, 0.712, 0.7177, 0.724, 0.7335, 0.742, 0.7445, 0.746, 0.7487, 0.751, 0.7523, 0.753, + 0.7555, 0.758, 0.760, 0.7626, 0.7683, 0.771, 0.7779, 0.782, 0.7855, 0.791, 0.7915, 0.794, 0.7964, 0.799, 0.8011, 0.804, 0.8056, 0.807, 0.8097, 0.811, 0.8144, 0.820, 0.8239, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//321 321 0.0247 0.0203 0.0182 0.0183 0.0182 0.0179 0.0182 0.0188 0.0199 0.0249 0.0529 0.1519 0.3116 0.4138 0.4410 0.4679 0.4906 0.4655 0.4517 0.5203 0.6238 0.6952 0.7270 0.7406 0.7469 0.7527 0.7607 0.7708 0.7786 0.7849 0.7897 0.7940 0.7984 0.8025 0.8069 0.8160 +const double ColorTemp::JDC468_Ora321_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0247, 0.022, 0.0203, 0.019, 0.0182, 0.0182, 0.0183, 0.0182, 0.0182, 0.018, 0.0179, 0.018, 0.0182, 0.0185, 0.0188, 0.019, 0.0199, 0.022, 0.0249, 0.035, 0.0529, 0.112, + 0.1519, 0.231, 0.3116, 0.365, 0.4138, 0.421, 0.4410, 0.451, 0.4679, 0.485, 0.4906, 0.473, 0.4655, 0.455, 0.4517, 0.487, 0.5203, 0.578, 0.6238, 0.667, 0.6952, 0.711, 0.7270, 0.735, + 0.7406, 0.743, 0.7469, .751, 0.7527, 0.756, 0.7607, 0.765, 0.7708, 0.774, 0.7786, 0.782, 0.7849, 0.786, 0.7897, 0.79, 0.7940, 0.794, 0.7984, 0.799, 0.8025, 0.805, 0.8069, 0.811, 0.8160, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//353 353 0.0260 0.0294 0.0331 0.0420 0.0490 0.0517 0.0541 0.0572 0.0608 0.0664 0.0813 0.1070 0.1291 0.1344 0.1317 0.1356 0.1390 0.1289 0.1195 0.1278 0.1420 0.1493 0.1500 0.1500 0.1527 0.1576 0.1651 0.1759 0.1870 0.1942 0.1963 0.1952 0.1910 0.1898 0.1995 0.2209 +const double ColorTemp::JDC468_Yellow353_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0260, 0.027, 0.0294, 0.031, 0.0331, 0.037, 0.0420, 0.045, 0.0490, 0.051, 0.0517, 0.053, 0.0541, 0.056, 0.0572, 0.059, 0.0608, 0.063, 0.0664, 0.072, 0.0813, 0.096, 0.1070, 0.112, + 0.1291, 0.132, 0.1344, 0.133, 0.1317, 0.134, 0.1356, 0.137, 0.1390, 0.134, 0.1289, 0.123, 0.1195, 0.122, 0.1278, 0.134, 0.1420, 0.145, 0.1493, 0.15, 0.1500, 0.15, 0.1500, 0.153, + 0.1527, 0.154, 0.1576, 0.162, 0.1651, 0.172, 0.1759, 0.182, 0.1870, 0.191, 0.1942, 0.195, 0.1963, 0.196, 0.1952, 0.193, 0.1910, 0.19, 0.1898, 0.195, 0.1995, 0.21, 0.2209, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//465 465 0.0388 0.0654 0.1020 0.1557 0.1880 0.1783 0.1434 0.1013 0.0684 0.0410 0.0219 0.0149 0.0117 0.0080 0.0062 0.0062 0.0062 0.0056 0.0063 0.0098 0.0230 0.0440 0.0577 0.0617 0.0645 0.0690 0.0766 0.0903 0.1064 0.1144 0.1113 0.1022 0.0898 0.0833 0.0962 0.1377 +const double ColorTemp::JDC468_Mag465_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0388, 0.05, 0.0654, 0.09, 0.1020, 0.12, 0.1557, 0.17, 0.1880, 0.182, 0.1783, 0.162, 0.1434, 0.12, 0.1013, 0.09, 0.0684, 0.05, 0.0410, 0.03, 0.0219, 0.02, 0.0149, 0.012, + 0.0117, 0.009, 0.0080, 0.007, 0.0062, 0.0062, 0.0062, 0.0062, 0.0062, 0.006, 0.0056, 0.006, 0.0063, 0.008, 0.0098, 0.018, 0.0230, 0.03, 0.0440, 0.05, 0.0577, 0.06, 0.0617, 0.062, + 0.0645, 0.065, 0.0690, 0.07, 0.0766, 0.08, 0.0903, 0.1, 0.1064, 0.111, 0.1144, 0.112, 0.1113, 0.104, 0.1022, 0.09, 0.0898, 0.088, 0.0833, 0.09, 0.0962, 0.111, 0.1377, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//333 333 0.1030 0.1508 0.2133 0.3191 0.3910 0.3895 0.3424 0.2770 0.2184 0.1593 0.1074 0.0825 0.0669 0.0430 0.0265 0.0278 0.0315 0.0212 0.0163 0.0355 0.0861 0.1365 0.1565 0.1589 0.1629 0.1713 0.1852 0.2099 0.2378 0.2517 0.2469 0.2322 0.2102 0.1973 0.2191 0.2855 +const double ColorTemp::JDC468_Mag333_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1030, 0.12, 0.1508, 0.18, 0.2133, 0.26, 0.3191, 0.364, 0.3910, 0.39, 0.3895, 0.375, 0.3424, 0.312, 0.2770, 0.251, 0.2184, 0.183, 0.1593, 0.122, 0.1074, 0.1, 0.0825, 0.07, + 0.0669, 0.05, 0.0430, 0.03, 0.0265, 0.027, 0.0278, 0.03, 0.0315, 0.025, 0.0212, 0.02, 0.0163, 0.03, 0.0355, 0.05, 0.0861, 0.112, 0.1365, 0.143, 0.1565, 0.157, 0.1589, 0.16, + 0.1629, 0.165, 0.1713, 0.175, 0.1852, 0.19, 0.2099, 0.221, 0.2378, 0.245, 0.2517, 0.25, 0.2469, 0.238, 0.2322, 0.224, 0.2102, 0.206, 0.1973, 0.209, 0.2191, 0.231, 0.2855, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//203 203 0.0833 0.1329 0.2005 0.3099 0.3855 0.3916 0.3530 0.2926 0.2346 0.1741 0.1201 0.0934 0.0759 0.0495 0.0306 0.0308 0.0330 0.0214 0.0150 0.0256 0.0510 0.0723 0.0769 0.0748 0.0761 0.0813 0.0911 0.1087 0.1295 0.1399 0.1353 0.1232 0.1064 0.0971 0.1137 0.1677 +const double ColorTemp::JDC468_Mag203_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0833, 0.11, 0.1329, 0.16, 0.2005, 0.25, 0.3099, 0.342, 0.3855, 0.39, 0.3916, 0.374, 0.3530, 0.321, 0.2926, 0.267, 0.2346, 0.21, 0.1741, 0.153, 0.1201, 0.1, 0.0934, 0.08, + 0.0759, 0.06, 0.0495, 0.04, 0.0306, 0.0307, 0.0308, 0.032, 0.0330, 0.025, 0.0214, 0.018, 0.0150, 0.02, 0.0256, 0.04, 0.0510, 0.06, 0.0723, 0.074, 0.0769, 0.075, 0.0748, 0.076, + 0.0761, 0.08, 0.0813, 0.09, 0.0911, 0.1, 0.1087, 0.115, 0.1295, 0.134, 0.1399, 0.136, 0.1353, 0.131, 0.1232, 0.114, 0.1064, 0.1, 0.0971, 0.105, 0.1137, 0.123, 0.1677, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//blue cyan +const double ColorTemp::J570_BlueB6_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1611, 0.18, 0.1947, 0.23, 0.2639, 0.31, 0.3488, 0.37, 0.4022, 0.43, 0.4517, 0.49, 0.501, 0.52, 0.5317, 0.534, 0.5367, 0.53, 0.5246, 0.51, 0.4905, 0.47, 0.4510, 0.43, 0.4059, + 0.37, 0.3351, 0.31, 0.2612, 0.24, 0.2177, 0.205, 0.1883, 0.16, 0.1444, 0.123, 0.1065, 0.1, 0.0889, 0.085, 0.0811, 0.08, 0.0757, 0.071, 0.0695, 0.067, 0.0648, 0.064, 0.0634, + 0.063, 0.0637, 0.065, 0.0662, 0.068, 0.0714, 0.075, 0.0787, 0.08, 0.0828, 0.082, 0.0822, 0.08, 0.0781, 0.075, 0.0726, 0.071, 0.0698, 0.075, 0.0770, 0.08, 0.0973, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueB15_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2207, 0.2, 0.1897, 0.21, 0.2274, 0.25, 0.2805, 0.30, 0.3216, 0.34, 0.3596, 0.38, 0.4003, 0.42, 0.4438, 0.47, 0.4909, 0.52, 0.5469, 0.57, 0.6009, 0.62, 0.6414, 0.65, 0.6557, + 0.64, 0.6275, 0.59, 0.5675, 0.53, 0.5022, 0.48, 0.4348, 0.39, 0.3473, 0.31, 0.2613, 0.24, 0.2039, 0.18, 0.1696, 0.15, 0.1465, 0.13, 0.1243, 0.11, 0.1055, 0.10, 0.0952, 0.094, + 0.0911, 0.091, 0.0906, 0.092, 0.0940, 0.1, 0.1006, 0.104, 0.1075, 0.11, 0.1125, 0.113, 0.1146, 0.113, 0.1129, 0.112, 0.1120, 0.115, 0.1198, 0.13, 0.1431, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueC2_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2534, 0.25, 0.2454, 0.28, 0.3101, 0.33, 0.3567, 0.37, 0.3981, 0.41, 0.4258, 0.43, 0.4472, 0.45, 0.4574, 0.455, 0.4571, 0.45, 0.4468, 0.43, 0.4205, 0.41, 0.3947, 0.38, + 0.3647, 0.33, 0.3074, 0.27, 0.2471, 0.23, 0.2221, 0.22, 0.2128, 0.20, 0.1810, 0.17, 0.1510, 0.15, 0.1486, 0.15, 0.1546, 0.154, 0.1532, 0.15, 0.1426, 0.135, 0.1310, 0.125, + 0.1257, 0.125, 0.1246, 0.126, 0.1276, 0.13, 0.1360, 0.14, 0.1483, 0.15, 0.1566, 0.157, 0.1575, 0.155, 0.1535, 0.15, 0.1453, 0.143, 0.1403, 0.146, 0.1510, 0.16, 0.1855, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueC14_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.5697, 0.51, 0.4660, 0.49, 0.5000, 0.53, 0.5560, 0.58, 0.6072, 0.62, 0.6402, 0.65, 0.6632, 0.67, 0.6850, 0.69, 0.7069, 0.71, 0.7292, 0.74, 0.7488, 0.75, 0.7678, 0.77, 0.7786, + 0.775, 0.7721, 0.76, 0.7544, 0.75, 0.7394, 0.73, 0.7232, 0.70, 0.6889, 0.66, 0.6446, 0.63, 0.6171, 0.61, 0.5966, 0.58, 0.5743, 0.56, 0.5425, 0.53, 0.5093, 0.50, 0.4884, 0.48, + 0.4784, 0.475, 0.4774, 0.48, 0.4822, 0.49, 0.4944, 0.50, 0.5076, 0.51, 0.5186, 0.52, 0.5268, 0.53, 0.5303, 0.532, 0.5332, 0.54, 0.5454, 0.56, 0.5760, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueC16_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1909, 0.10, 0.0635, 0.06, 0.0554, 0.056, 0.0571, 0.057, 0.0580, 0.06, 0.0608, 0.063, 0.0662, 0.07, 0.0712, 0.072, 0.0742, 0.08, 0.0811, 0.09, 0.0985, 0.11, 0.1363, 0.15, + 0.1743, 0.173, 0.1720, 0.15, 0.1372, 0.12, 0.1005, 0.09, 0.0731, 0.06, 0.0509, 0.04, 0.0374, 0.036, 0.0322, 0.032, 0.0308, 0.031, 0.0309, 0.031, 0.0319, 0.033, + 0.0333, 0.034, 0.0349, 0.035, 0.0364, 0.037, 0.0377, 0.038, 0.0386, 0.0386, 0.0386, 0.0384, 0.0383, 0.038, 0.0377, 0.0377, 0.0378, 0.038, 0.0386, 0.04, 0.0417, 0.043, + 0.0461, 0.049, 0.0514, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueF1_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.0060, 0.04, 0.0975, 0.11, 0.1297, 0.13, 0.1426, 0.15, 0.1538, 0.16, 0.1624, 0.165, 0.1684, 0.17, 0.1727, 0.175, 0.1761, 0.178, 0.1798, 0.18, 0.1863, 0.19, 0.1993, 0.20, + 0.2091, 0.205, 0.2041, 0.20, 0.1902, 0.19, 0.1836, 0.182, 0.1809, 0.17, 0.1675, 0.16, 0.1527, 0.151, 0.1511, 0.153, 0.1541, 0.154, 0.1545, 0.153, 0.1516, 0.15, + 0.1484, 0.149, 0.1489, 0.15, 0.1516, 0.153, 0.1563, 0.16, 0.1654, 0.17, 0.1766, 0.18, 0.1827, 0.182, 0.1817, 0.18, 0.1766, 0.17, 0.1693, 0.166, 0.1643, 0.17, 0.1726, 0.18, 0.1978, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueF2_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1613, 0.20, 0.2384, 0.30, 0.3288, 0.35, 0.4026, 0.43, 0.4630, 0.48, 0.4992, 0.51, 0.5294, 0.53, 0.5377, 0.53, 0.5261, 0.51, 0.4995, 0.48, 0.4513, 0.43, 0.4064, 0.38, + 0.3620, 0.31, 0.2935, 0.25, 0.2263, 0.21, 0.1977, 0.19, 0.1851, 0.17, 0.1519, 0.14, 0.1213, 0.12, 0.1149, 0.113, 0.1162, 0.114, 0.1133, 0.11, 0.1053, 0.10, 0.0976, 0.095, + 0.0947, 0.095, 0.0953, 0.097, 0.0985, 0.1, 0.1070, 0.11, 0.1188, 0.12, 0.1256, 0.124, 0.1246, 0.12, 0.1187, 0.11, 0.1099, 0.105, 0.1048, 0.11, 0.1145, 0.12, 0.145, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueF10_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3003, 0.20, 0.1512, 0.20, 0.2149, 0.25, 0.2709, 0.30, 0.3127, 0.32, 0.3534, 0.37, 0.4001, 0.42, 0.4456, 0.46, 0.4882, 0.51, 0.5343, 0.55, 0.5728, 0.58, 0.5968, 0.595, + 0.5932, 0.56, 0.5490, 0.51, 0.4756, 0.43, 0.3989, 0.37, 0.3256, 0.28, 0.2424, 0.21, 0.1691, 0.15, 0.1239, 0.10, 0.0998, 0.09, 0.0866, 0.08, 0.0752, 0.07, 0.0664, 0.065, + 0.0623, 0.062, 0.0616, 0.062, 0.0626, 0.064, 0.0662, 0.07, 0.0720, 0.075, 0.0767, 0.077, 0.0784, 0.078, 0.0770, 0.075, 0.0734, 0.073, 0.0716, 0.075, 0.0779, 0.08, 0.0968, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueF13_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3075, 0.22, 0.1514, 0.13, 0.1216, 0.125, 0.1264, 0.13, 0.1312, 0.14, 0.1448, 0.15, 0.1665, 0.17, 0.1850, 0.19, 0.1922, 0.195, 0.1970, 0.20, 0.2036, 0.21, + 0.2136, 0.213, 0.2122, 0.19, 0.1832, 0.16, 0.1412, 0.12, 0.1066, 0.09, 0.0810, 0.07, 0.0579, 0.05, 0.0422, 0.04, 0.0358, 0.035, 0.0336, 0.033, 0.0335, 0.0335, + 0.0339, 0.034, 0.0348, 0.035, 0.0358, 0.036, 0.0371, 0.038, 0.0384, 0.039, 0.0394, 0.04, 0.0405, 0.0404, 0.0405, 0.04, 0.0399, 0.039, 0.0387, 0.039, + 0.0396, 0.04, 0.0422, 0.045, 0.0467, 0.05, 0.0527, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueG9_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0937, 0.09, 0.0891, 0.07, 0.0621, 0.07, 0.0735, 0.08, 0.0842, 0.09, 0.0918, 0.1, 0.1009, 0.105, 0.1091, 0.11, 0.1158, 0.12, 0.1254, 0.13, 0.1452, 0.16, + 0.1805, 0.20, 0.2126, 0.213, 0.2128, 0.20, 0.1863, 0.17, 0.1550, 0.14, 0.1270, 0.1, 0.0973, 0.08, 0.0725, 0.06, 0.0585, 0.055, 0.0521, 0.05, 0.0486, 0.047, + 0.0458, 0.045, 0.0441, 0.044, 0.0439, 0.044, 0.0443, 0.045, 0.0455, 0.046, 0.0478, 0.049, 0.0500, 0.051, 0.0512, 0.051, 0.0511, 0.05, 0.0498, 0.049, + 0.0487, 0.049, 0.0495, 0.05, 0.0531, 0.055, 0.0620, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueG19_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1198, 0.12, 0.1376, 0.15, 0.1735, 0.18, 0.1903, 0.20, 0.2116, 0.22, 0.2322, 0.24, 0.2555, 0.27, 0.2802, 0.29, 0.3077, 0.32, 0.3420, 0.36, 0.3822, 0.41, + 0.4261, 0.43, 0.4565, 0.45, 0.4481, 0.43, 0.4109, 0.39, 0.3736, 0.35, 0.3368, 0.30, 0.2811, 0.25, 0.2228, 0.19, 0.1839, 0.17, 0.1592, 0.15, 0.1394, 0.12, + 0.1183, 0.1, 0.0998, 0.09, 0.0897, 0.085, 0.0851, 0.085, 0.0844, 0.085, 0.0863, 0.09, 0.0912, 0.095, 0.0977, 0.1, 0.1027, 0.105, 0.1064, 0.106, 0.1064, 0.106, + 0.1067, 0.11, 0.1135, 0.12, 0.1319, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueI5_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1096, 012, 0.1546, 0.16, 0.1855, 0.2, 0.2350, 0.25, 0.2720, 0.29, 0.3065, 0.32, 0.3404, 0.36, 0.3782, 0.4, 0.4229, 0.45, 0.4801, 0.51, 0.5416, 0.57, + 0.5962, 0.61, 0.6281, 0.62, 0.6144, 0.58, 0.5680, 0.55, 0.5211, 0.5, 0.4726, 0.43, 0.3991, 0.37, 0.3209, 0.29, 0.2674, 0.25, 0.2311, 0.22, 0.2000, 0.18, + 0.1656, 0.15, 0.1349, 0.12, 0.1161, 0.11, 0.1078, 0.105, 0.1046, 0.105, 0.1049, 0.107, 0.1097, 0.11, 0.1179, 0.12, 0.1264, 0.13, 0.1337, 0.135, 0.1378, 0.14, 0.1402, 0.145, 0.1474, 0.15, 0.1662, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueH15_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1047, 0.105, 0.1078, 0.12, 0.1550, 0.20, 0.2110, 0.23, 0.2487, 0.27, 0.2893, 0.31, 0.3386, 0.35, 0.3723, 0.375, 0.3773, 0.37, 0.3665, 0.35, 0.3373, 0.32, + 0.3037, 0.28, 0.2663, 0.24, 0.2106, 0.17, 0.1540, 0.13, 0.1200, 0.11, 0.0980, 0.08, 0.0721, 0.06, 0.0527, 0.05, 0.0448, 0.043, 0.0418, 0.041, 0.0403, 0.04, + 0.0390, 0.039, 0.0386, 0.039, 0.0392, 0.04, 0.0401, 0.041, 0.0413, 0.042, 0.0435, 0.044, 0.0456, 0.046, 0.0465, 0.046, 0.0457, 0.045, 0.0447, 0.044, 0.0435, 0.044, + 0.0442, 0.046, 0.0485, 0.05, 0.0576, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueI3_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1759, 0.21, 0.2647, 0.31, 0.3209, 0.36, 0.4249, 0.45, 0.4957, 0.52, 0.5536, 0.57, 0.6073, 0.62, 0.6431, 0.65, 0.6538, 0.653, 0.6506, 0.64, 0.6282, 0.61, + 0.5973, 0.57, 0.5559, 0.52, 0.4856, 0.43, 0.4033, 0.37, 0.3417, 0.32, 0.2901, 0.26, 0.2211, 0.19, 0.1585, 0.14, 0.1236, 0.11, 0.1062, 0.1, 0.0959, 0.09, + 0.0865, 0.085, 0.0801, 0.08, 0.0780, 0.079, 0.0788, 0.08, 0.0819, 0.09, 0.0903, 0.1, 0.1009, 0.105, 0.1073, 0.106, 0.1055, 0.1, 0.0998, 0.095, 0.0914, 0.09, 0.0863, 0.09, 0.0961, 0.11, 0.1250, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueI19_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3031, 0.28, 0.2588, 0.25, 0.2472, 0.26, 0.2738, 0.29, 0.3035, 0.31, 0.3271, 0.33, 0.3496, 0.36, 0.3724, 0.38, 0.3968, 0.41, 0.4252, 0.44, 0.4562, 0.47, + 0.4899, 0.5, 0.5147, 0.512, 0.5100, 0.49, 0.4841, 0.47, 0.4608, 0.45, 0.4373, 0.42, 0.3934, 0.37, 0.3420, 0.32, 0.3086, 0.30, 0.2850, 0.27, 0.2622, 0.25, + 0.2334, 0.22, 0.2054, 0.19, 0.1887, 0.185, 0.1806, 0.18, 0.1791, 0.18, 0.1825, 0.185, 0.1909, 0.2, 0.2018, 0.21, 0.2108, 0.213, 0.2164, 0.217, 0.2180, 0.219, + 0.2198, 0.22, 0.2295, 0.24, 0.2562, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueJ4_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.0290, 0.02, 0.0598, 0.1, 0.1278, 0.15, 0.1764, 0.19, 0.2052, 0.21, 0.2331, 0.25, 0.2642, 0.28, 0.2906, 0.3, 0.3093, 0.31, 0.3263, 0.33, 0.3413, 0.35, + 0.3550, 0.354, 0.3532, 0.33, 0.3206, 0.3, 0.2685, 0.24, 0.2212, 0.2, 0.1802, 0.16, 0.1346, 0.1, 0.0965, 0.08, 0.0751, 0.07, 0.0646, 0.06, 0.0586, 0.055, + 0.0535, 0.052, 0.0504, 0.05, 0.0491, 0.0495, 0.0493, 0.05, 0.0504, 0.051, 0.0529, 0.053, 0.0565, 0.057, 0.0591, 0.059, 0.0593, 0.058, 0.0576, 0.056, 0.0556, 0.055, + 0.0553, 0.06, 0.0602, 0.065, 0.0727, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueJ6_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3039, 0.3, 0.2571, 0.27, 0.2960, 0.31, 0.3446, 0.37, 0.3937, 0.41, 0.4405, 0.47, 0.4884, 0.51, 0.5337, 0.56, 0.5771, 0.59, 0.6221, 0.64, 0.6589, 0.67, + 0.6808, 0.68, 0.6770, 0.65, 0.6375, 0.59, 0.5693, 0.53, 0.4933, 0.45, 0.4160, 0.39, 0.3223, 0.26, 0.2338, 0.21, 0.1761, 0.16, 0.1447, 0.13, 0.1258, 0.12, + 0.1090, 0.1, 0.0961, 0.09, 0.0899, 0.089, 0.0877, 0.088, 0.0892, 0.09, 0.0949, 0.1, 0.1045, 0.11, 0.1115, 0.112, 0.1131, 0.112, 0.1115, 0.11, 0.1065, 0.105, + 0.1033, 0.11, 0.1122, 0.12, 0.1400, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueJ11_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1274, 0.1, 0.091, 0.08, 0.0656, 0.064, 0.0604, 0.06, 0.0570, 0.06, 0.0604, 0.061, 0.0644, 0.065, 0.0668, 0.07, 0.0700, 0.072, 0.0754, 0.08, 0.0874, 0.1, + 0.1111, 0.12, 0.1327, 0.132, 0.1313, 0.12, 0.1127, 0.1, 0.0931, 0.08, 0.0758, 0.06, 0.0580, 0.05, 0.0449, 0.04, 0.0385, 0.036, 0.0360, 0.035, 0.0351, 0.035, + 0.0351, 0.035, 0.0355, 0.036, 0.0371, 0.0375, 0.0379, 0.038, 0.0388, 0.04, 0.0406, 0.041, 0.0414, 0.0415, 0.0416, 0.041, 0.0409, 0.04, + 0.0398, 0.04, 0.0397, 0.04, 0.0424, 0.043, 0.0458, 0.05, 0.0522, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_BlueJ13_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2802, 0.28, 0.2820, 0.3, 0.3461, 0.4, 0.4357, 0.45, 0.5027, 0.53, 0.5528, 0.58, 0.6001, 0.62, 0.6402, 0.66, 0.6730, 0.69, 0.7019, 0.71, 0.7216, 0.725, + 0.7288, 0.72, 0.7172, 0.7, 0.6779, 0.65, 0.6160, 0.58, 0.5478, 0.52, 0.4751, 0.43, 0.3816, 0.35, 0.2882, 0.25, 0.2260, 0.2, 0.1905, 0.18, 0.1699, 0.16, + 0.1514, 0.14, 0.1361, 0.13, 0.1295, 0.129, 0.1281, 0.13, 0.1309, 0.135, 0.1408, 0.145, 0.1546, 0.16, 0.1644, 0.165, 0.1656, 0.162, + 0.1606, 0.155, 0.1516, 0.15, 0.1461, 0.15, 0.1585, 0.16, 0.1975, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_BlueK5_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1727, 0.18, 0.1814, 0.19, 0.1931, 0.21, 0.2379, 0.25, 0.2728, 0.29, 0.3054, 0.31, 0.3396, 0.36, 0.3780, 0.4, 0.4243, 0.45, 0.4829, 0.51, 0.5464, 0.57, + 0.6024, 0.62, 0.6348, 0.63, 0.6209, 0.59, 0.5741, 0.55, 0.5258, 0.49, 0.4755, 0.43, 0.4003, 0.37, 0.3204, 0.3, 0.2656, 0.25, 0.2282, 0.21, 0.1966, 0.17, + 0.1624, 0.15, 0.1322, 0.12, 0.1137, 0.11, 0.1052, 0.105, 0.1025, 0.102, 0.1028, 0.105, 0.1075, 0.11, 0.1155, 0.12, 0.1237, 0.13, 0.1310, 0.133, + 0.1352, 0.136, 0.1370, 0.14, 0.1444, 0.15, 0.1632, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_BlueN1_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1936, 0.194, 0.1942, 0.22, 0.2692, 0.29, 0.3102, 0.33, 0.3535, 0.37, 0.3885, 0.4, 0.4230, 0.44, 0.4594, 0.48, 0.5011, 0.52, 0.5510, 0.58, 0.6022, 0.62, 0.6479, 0.66, + 0.6748, 0.67, 0.6640, 0.65, 0.6268, 0.61, 0.5919, 0.58, 0.5549, 0.53, 0.4921, 0.46, 0.4209, 0.39, 0.3723, 0.35, 0.3364, 0.32, 0.3005, 0.28, 0.2569, 0.23, 0.2154, 0.19, + 0.1897, 0.18, 0.1768, 0.175, 0.1723, 0.173, 0.1722, 0.175, 0.1785, 0.18, 0.1892, 0.19, 0.2017, 0.21, 0.2134, 0.22, 0.2202, 0.222, 0.2247, 0.23, 0.2333, 0.24, 0.2566, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_BlueN4_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3138, 0.25, 0.2038, 0.19, 0.1787, 0.18, 0.1840, 0.2, 0.2109, 0.23, 0.2400, 0.26, 0.2715, 0.29, 0.3075, 0.33, 0.3534, 0.39, 0.4149, 0.45, 0.4863, 0.52, + 0.5520, 0.57, 0.5904, 0.58, 0.5750, 0.55, 0.5198, 0.48, 0.4602, 0.43, 0.3997, 0.36, 0.3199, 0.27, 0.2411, 0.2, 0.1883, 0.17, 0.1553, 0.14, 0.1307, 0.12, + 0.1062, 0.1, 0.0859, 0.08, 0.0746, 0.07, 0.0697, 0.069, 0.0678, 0.068, 0.0683, 0.07, 0.0715, 0.075, 0.0765, 0.08, 0.0818, 0.085, 0.0862, 0.087, 0.0885, 0.089, + 0.0899, 0.09, 0.0951, 0.1, 0.1090, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_BlueO19_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1231, 0.13, 0.1348, 0.12, 0.1152, 0.12, 0.1368, 0.15, 0.1627, 0.17, 0.1860, 0.2, 0.2130, 0.23, 0.2462, 0.26, 0.2859, 0.31, 0.3425, 0.38, 0.4152, 0.45, 0.4902, 0.51, + 0.5386, 0.53, 0.5259, 0.49, 0.4652, 0.43, 0.3950, 0.35, 0.3266, 0.28, 0.2469, 0.21, 0.1750, 0.15, 0.1293, 0.12, 0.1033, 0.09, 0.0859, 0.08, 0.0703, 0.06, 0.0578, 0.055, + 0.0521, 0.05, 0.0494, 0.049, 0.0492, 0.049, 0.0498, 0.05, 0.0522, 0.053, 0.0558, 0.058, 0.0590, 0.06, 0.0615, 0.062, 0.0625, 0.063, 0.0634, 0.065, 0.0670, 0.07, 0.0776, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_BlueU8_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0776, 0.1, 0.1703, 0.23, 0.2942, 0.35, 0.4022, 0.45, 0.4795, 0.51, 0.5389, 0.56, 0.5968, 0.6, 0.6362, 0.64, 0.6512, 0.652, 0.6523, 0.64, 0.6340, 0.62, 0.6052, 0.58, + 0.5645, 0.53, 0.4952, 0.45, 0.4124, 0.38, 0.3457, 0.32, 0.2883, 0.25, 0.2164, 0.19, 0.1529, 0.14, 0.1168, 0.1, 0.0983, 0.09, 0.0883, 0.08, 0.0798, 0.075, 0.0735, 0.073, + 0.0720, 0.072, 0.0726, 0.074, 0.0757, 0.08, 0.0830, 0.09, 0.0930, 0.095, 0.0989, 0.097, 0.0971, 0.095, 0.0911, 0.085, 0.0832, 0.08, 0.0795, 0.082, 0.0877, 0.09, 0.1140, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//N8 +const double ColorTemp::J570_NeuN8_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.0632, -0.04, -0.0244, 0.01, 0.0125, 0.02, 0.0294, 0.03, 0.0326, 0.033, 0.0352, 0.036, 0.0361, 0.037, 0.0374, 0.0374, 0.0373, 0.038, 0.0378, 0.039, 0.0397, 0.04, + 0.0421, 0.043, 0.0431, 0.042, 0.0417, 0.04, 0.0391, 0.038, 0.0378, 0.037, 0.0368, 0.035, 0.0347, 0.034, 0.0335, 0.034, 0.0341, 0.035, 0.0350, 0.035, 0.0355, 0.036, + 0.0357, 0.0357, 0.0358, 0.036, 0.0369, 0.037, 0.0372, 0.0376, 0.0378, 0.038, 0.0388, 0.039, 0.0397, 0.04, 0.0400, 0.0395, 0.0394, 0.039, 0.0386, 0.0385, 0.0384, 0.039, + 0.0395, 0.04, 0.0415, 0.043, 0.0448, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuN9_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0573, 0.054, 0.0516, 0.053, 0.0548, 0.05, 0.0401, 0.041, 0.0424, 0.043, 0.0449, 0.046, 0.0467, 0.047, 0.0473, 0.0473, 0.0474, 0.048, 0.0483, 0.05, 0.0508, 0.053, + 0.0558, 0.057, 0.0584, 0.058, 0.0550, 0.05, 0.0495, 0.048, 0.0468, 0.0465, 0.0460, 0.044, 0.0430, 0.042, 0.0411, 0.042, 0.0425, 0.044, 0.0457, 0.046, 0.0473, 0.0474, + 0.0475, 0.0475, 0.0474, 0.0475, 0.0476, 0.048, 0.0487, 0.049, 0.0499, 0.05, 0.0515, 0.052, 0.0533, 0.054, 0.0544, 0.054, 0.0539, 0.053, 0.0526, 0.052, 0.0512, 0.0515, + 0.0515, 0.053, 0.0538, 0.056, 0.0597, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuO8_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.0014, 0.02, 0.0806, 0.07, 0.0673, 0.07, 0.0854, 0.09, 0.0901, 0.095, 0.0960, 0.098, 0.0992, 0.1, 0.1017, 0.102, 0.1030, 0.104, 0.1052, 0.107, 0.1098, 0.11, + 0.1176, 0.12, 0.1230, 0.12, 0.1176, 0.11, 0.1071, 0.105, 0.1032, 0.103, 0.1032, 0.1, 0.0963, 0.09, 0.0899, 0.09, 0.0939, 0.095, 0.1007, 0.102, 0.1037, 0.104, + 0.1029, 0.102, 0.1014, 0.102, 0.1020, 0.103, 0.1039, 0.105, 0.1072, 0.11, 0.1134, 0.12, 0.1207, 0.122, 0.1245, 0.123, 0.1236, 0.121, 0.1205, 0.12, 0.1158, 0.115, + 0.1132, 0.115, 0.1185, 0.12, 0.1345, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuO11_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2926, 0.2, 0.1863, 0.16, 0.1428, 0.14, 0.1322, 0.134, 0.1396, 0.14, 0.1450, 0.146, 0.1498, 0.15, 0.1527, 0.155, 0.1554, 0.157, 0.1583, 0.16, 0.1631, 0.17, + 0.1754, 0.18, 0.1841, 0.18, 0.1761, 0.17, 0.1600, 0.155, 0.1549, 0.155, 0.1555, 0.15, 0.1449, 0.14, 0.1352, 0.14, 0.1414, 0.15, 0.1519, 0.153, 0.1568, 0.156, + 0.1556, 0.154, 0.1534, 0.154, 0.1547, 0.156, 0.1573, 0.16, 0.1622, 0.17, 0.1713, 0.18, 0.1823, 0.185, 0.1886, 0.188, 0.1873, 0.183, 0.1829, 0.18, 0.1753, 0.174, + 0.1716, 0.175, 0.1800, 0.2, 0.2039, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuD5_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0840, 0.1, 0.1627, 0.18, 0.1934, 0.2, 0.2234, 0.23, 0.2430, 0.25, 0.2547, 0.26, 0.2618, 0.264, 0.2651, 0.265, 0.2655, 0.2655, 0.2659, 0.266, 0.2674, 0.27, + 0.2776, 0.28, 0.2841, 0.27, 0.2654, 0.25, 0.2351, 0.23, 0.2246, 0.225, 0.2247, 0.22, 0.2074, 0.20, 0.1913, 0.20, 0.2029, 0.21, 0.2231, 0.23, 0.2337, 0.233, + 0.2327, 0.23, 0.2291, 0.23, 0.2305, 0.232, 0.2344, 0.24, 0.2417, 0.25, 0.2553, 0.26, 0.2724, 0.28, 0.2816, 0.28, 0.2797, 0.276, 0.2720, 0.27, + 0.2603, 0.26, 0.2536, 0.26, 0.2660, 0.28, 0.3027, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_NeuE11_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1699, 0.18, 0.1971, 0.21, 0.2276, 0.23, 0.2483, 0.25, 0.2690, 0.28, 0.2820, 0.29, 0.2916, 0.295, 0.2992, 0.3, 0.3064, 0.31, 0.3151, 0.32, 0.3301, 0.34, 0.3593, 0.37, + 0.3873, 0.39, 0.3913, 0.38, 0.3793, 0.375, 0.3723, 0.37, 0.3678, 0.35, 0.3482, 0.33, 0.3249, 0.32, 0.3188, 0.319, 0.3188, 0.318, 0.3179, 0.315, 0.3128, 0.31, + 0.3086, 0.31, 0.3105, 0.312, 0.3148, 0.313, 0.3222, 0.33, 0.3364, 0.34, 0.3535, 0.36, 0.3629, 0.362, 0.3621, 0.36, 0.3549, 0.35, 0.3444, 0.34, 0.3394, 0.35, 0.3511, 0.36, 0.3862, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_NeuK16_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.5837, 0.45, 0.4117, 0.43, 0.4427, 0.47, 0.5098, 0.52, 0.5451, 0.55, 0.5698, 0.57, 0.5828, 0.59, 0.5939, 0.6, 0.6045, 0.607, 0.6140, 0.62, 0.6219, 0.63, 0.6330, 0.64, + 0.6419, 0.643, 0.6440, 0.642, 0.6417, 0.64, 0.6379, 0.631, 0.6309, 0.62, 0.6154, 0.6, 0.5911, 0.58, 0.5736, 0.57, 0.5612, 0.56, 0.5539, 0.55, 0.5462, 0.543, + 0.5406, 0.542, 0.5418, 0.543, 0.5452, 0.55, 0.5529, 0.56, 0.5654, 0.57, 0.5806, 0.584, 0.5888, 0.589, 0.5898, 0.586, 0.5858, 0.58, 0.5796, 0.577, 0.5770, 0.58, 0.5883, 0.59, 0.6190, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuM3_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2659, 0.255, 0.2526, 0.26, 0.2616, 0.27, 0.2854, 0.29, 0.3088, 0.31, 0.3231, 0.33, 0.3336, 0.34, 0.3421, 0.345, 0.347, 0.35, 0.3542, 0.36, 0.3647, 0.37, + 0.3854, 0.4, 0.4041, 0.402, 0.4012, 0.39, 0.3856, 0.38, 0.3769, 0.375, 0.3725, 0.36, 0.3525, 0.34, 0.3286, 0.325, 0.3247, 0.326, 0.3279, 0.328, 0.3285, 0.325, + 0.3240, 0.322, 0.3202, 0.321, 0.3220, 0.323, 0.3267, 0.33, 0.3342, 0.34, 0.3487, 0.35, 0.3667, 0.37, 0.3761, 0.375, 0.3746, 0.37, 0.3670, 0.36, 0.3559, 0.35, 0.3498, 0.35, 0.3630, 0.37, 0.3998, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuN18_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1284, 0.11, 0.1090, 0.13, 0.1573, 0.17, 0.1837, 0.19, 0.1971, 0.2, 0.2059, 0.21, 0.2143, 0.22, 0.2213, 0.225, 0.2271, 0.23, 0.2341, 0.24, 0.2487, 0.26, 0.2764, 0.29, + 0.3025, 0.303, 0.3052, 0.3, 0.2919, 0.29, 0.2843, 0.283, 0.2800, 0.27, 0.2612, 0.24, 0.2394, 0.235, 0.2339, 0.234, 0.2340, 0.233, 0.2326, 0.23, 0.2277, 0.225, + 0.2235, 0.224, 0.2246, 0.226, 0.2282, 0.23, 0.2349, 0.24, 0.2477, 0.25, 0.2632, 0.27, 0.2714, 0.271, 0.2702, 0.27, 0.2637, 0.26, 0.2538, 0.25, 0.2479, 0.25, 0.2589, 0.26, 0.2918, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuQ1_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0610, 0.06, 0.0592, 0.04, 0.0339, 0.04, 0.0338, 0.034, 0.0350, 0.036, 0.0363, 0.037, 0.0380, 0.038, 0.0383, 0.0383, 0.0385, 0.04, 0.0408, 0.042, 0.0451, 0.05, + 0.0524, 0.055, 0.0589, 0.058, 0.0585, 0.055, 0.0529, 0.05, 0.0456, 0.04, 0.0390, 0.035, 0.0330, 0.03, 0.0286, 0.028, 0.0275, 0.0276, 0.0275, 0.0278, 0.0279, 0.028, + 0.0289, 0.03, 0.0304, 0.031, 0.0320, 0.032, 0.0328, 0.033, 0.0341, 0.0345, 0.0346, 0.0346, 0.0347, 0.034, 0.0341, 0.034, 0.0336, 0.034, 0.0340, 0.035, + 0.0351, 0.036, 0.0373, 0.038, 0.0411, 0.042, 0.0446, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuS7_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1447, 0.06, 0.0448, 0.042, 0.0411, 0.03, 0.0282, 0.028, 0.0270, 0.029, 0.0298, 0.03, 0.0319, 0.032, 0.0331, 0.0333, 0.0335, 0.036, 0.0361, 0.038, 0.0403, 0.045, + 0.0493, 0.05, 0.0599, 0.06, 0.0636, 0.062, 0.0606, 0.06, 0.0547, 0.05, 0.0488, 0.045, 0.0421, 0.04, 0.0366, 0.035, 0.0335, 0.033, 0.0323, 0.032, 0.0320, 0.032, + 0.0321, 0.0322, 0.0324, 0.033, 0.0333, 0.034, 0.0345, 0.035, 0.0356, 0.036, 0.0364, 0.037, 0.0372, 0.037, 0.0367, 0.0365, 0.0363, 0.0364, + 0.0361, 0.0362, 0.0363, 0.037, 0.0376, 0.04, 0.0412, 0.042, 0.0450, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuV10_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1439, 0.07, 0.0583, 0.04, 0.0372, 0.037, 0.0362, 0.035, 0.0344, 0.034, 0.0340, 0.035, 0.0351, 0.036, 0.0361, 0.0361, 0.0361, 0.037, 0.0377, 0.039, 0.0404, 0.042, + 0.0450, 0.047, 0.0483, 0.048, 0.0475, 0.045, 0.0436, 0.04, 0.0387, 0.036, 0.0343, 0.03, 0.0299, 0.028, 0.0271, 0.027, 0.0262, 0.0262, 0.0262, 0.0267, 0.0269, 0.027, + 0.0283, 0.029, 0.0299, 0.03, 0.0308, 0.031, 0.0319, 0.032, 0.0331, 0.0333, 0.0337, 0.0337, 0.0337, 0.0333, 0.0332, 0.0332, 0.0331, 0.0331, 0.0331, 0.034, + 0.0341, 0.035, 0.0371, 0.038, 0.0399, 0.041, 0.0432, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuW18_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.4685, 0.45, 0.4262, 0.5, 0.5061, 0.55, 0.5898, 0.6, 0.6487, 0.66, 0.6781, 0.68, 0.6947, 0.7, 0.7070, 0.71, 0.7185, 0.72, 0.7294, 0.73, 0.7383, 0.74, 0.7499, 0.75, + 0.7582, 0.758, 0.7582, 0.755, 0.7531, 0.75, 0.7484, 0.745, 0.7422, 0.73, 0.7263, 0.72, 0.7033, 0.7, 0.6913, 0.69, 0.6820, 0.68, 0.6738, 0.67, 0.6628, 0.66, + 0.6512, 0.65, 0.6462, 0.645, 0.6448, 0.645, 0.6485, 0.65, 0.6569, 0.66, 0.6698, 0.67, 0.6781, 0.68, 0.6822, 0.682, 0.6820, 0.682, 0.6815, 0.682, 0.6820, 0.69, 0.6907, 0.7, 0.7152, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuZ14_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2765, 0.2, 0.1352, 0.13, 0.1222, 0.121, 0.1206, 0.13, 0.1300, 0.134, 0.1357, 0.14, 0.1407, 0.142, 0.1455, 0.147, 0.1485, 0.15, 0.1539, 0.16, 0.1648, 0.17, + 0.1844, 0.2, 0.2015, 0.202, 0.2024, 0.2, 0.1922, 0.19, 0.1868, 0.185, 0.1841, 0.18, 0.1715, 0.16, 0.1566, 0.155, 0.1536, 0.154, 0.1545, 0.154, 0.1536, 0.151, + 0.1500, 0.148, 0.1471, 0.1472, 0.1478, 0.15, 0.1505, 0.153, 0.1552, 0.16, 0.1641, 0.17, 0.1751, 0.18, 0.1813, 0.181, 0.1801, 0.18, + 0.1757, 0.17, 0.1683, 0.165, 0.1642, 0.17, 0.1728, 0.18, 0.1970, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_NeuC18_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0555, 0.055, 0.0545, 0.055, 0.0585, 0.058, 0.0577, 0.056, 0.0554, 0.056, 0.0564, 0.058, 0.0590, 0.06, 0.0611, 0.062, 0.0638, 0.065, 0.0685, 0.07, 0.0797, 0.09, + 0.1009, 0.11, 0.1222, 0.124, 0.1298, 0.127, 0.1257, 0.123, 0.1208, 0.12, 0.1164, 0.11, 0.1067, 0.1, 0.0954, 0.09, 0.0895, 0.088, 0.0862, 0.085, 0.0834, 0.082, + 0.0806, 0.08, 0.0782, 0.078, 0.0780, 0.078, 0.0789, 0.08, 0.0813, 0.084, 0.0858, 0.09, 0.0911, 0.092, 0.0944, 0.093, 0.0938, 0.092, 0.0914, 0.09, 0.0878, 0.086, + 0.0858, 0.09, 0.0903, 0.1, 0.1037, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuD17_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1980, 0.1, 0.0793, 0.06, 0.0578, 0.05, 0.0476, 0.046, 0.0454, 0.046, 0.0471, 0.048, 0.0499, 0.05, 0.0518, 0.052, 0.0533, 0.055, 0.0574, 0.06, 0.0676, 0.07, + 0.0897, 0.1, 0.1129, 0.113, 0.1140, 0.1, 0.0958, 0.08, 0.0743, 0.06, 0.0566, 0.05, 0.0422, 0.04, 0.0332, 0.03, 0.0297, 0.0295, 0.0292, 0.0293, 0.0294, 0.03, + 0.0306, 0.031, 0.0319, 0.032, 0.0339, 0.034, 0.0353, 0.036, 0.0363, 0.037, 0.0370, 0.037, 0.0372, 0.037, 0.0368, 0.0365, 0.0363, 0.036, + 0.0360, 0.037, 0.0376, 0.039, 0.0406, 0.042, 0.0448, 0.046, 0.0499, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuJ11_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1274, 0.1, 0.0916, 0.08, 0.0656, 0.061, 0.0604, 0.06, 0.0570, 0.06, 0.0604, 0.062, 0.0644, 0.065, 0.0668, 0.069, 0.0700, 0.072, 0.0754, 0.08, 0.0874, 0.1, + 0.1111, 0.12, 0.1327, 0.132, 0.1313, 0.12, 0.1127, 0.1, 0.0931, 0.08, 0.0758, 0.06, 0.0580, 0.05, 0.0449, 0.04, 0.0385, 0.037, 0.0360, 0.036, 0.0351, 0.035, + 0.0351, 0.0354, 0.0355, 0.036, 0.0371, 0.0375, 0.0379, 0.038, 0.0388, 0.04, 0.0406, 0.041, 0.0414, 0.0415, 0.0416, 0.041, 0.0409, 0.04, 0.0398, 0.0397, 0.0397, 0.04, + 0.0424, 0.043, 0.0458, 0.048, 0.0522, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuL4_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0348, 0.05, 0.0700, 0.09, 0.1043, 0.11, 0.1320, 0.14, 0.1505, 0.16, 0.1622, 0.17, 0.1721, 0.18, 0.1805, 0.185, 0.1877, 0.19, 0.1955, 0.2, 0.2068, 0.21, + 0.2226, 0.23, 0.2350, 0.235, 0.2352, 0.23, 0.2251, 0.22, 0.2128, 0.2, 0.1990, 0.18, 0.1761, 0.16, 0.1494, 0.13, 0.1296, 0.12, 0.1171, 0.11, 0.1089, 0.105, + 0.1010, 0.1, 0.0949, 0.093, 0.0926, 0.093, 0.0937, 0.095, 0.0961, 0.1, 0.1020, 0.11, 0.1104, 0.112, 0.1150, 0.115, 0.1155, 0.113, 0.1123, 0.11, + 0.1070, 0.105, 0.1040, 0.11, 0.1110, 0.12, 0.1323, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::Colorlab_n72_n2_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.0116, 0.01, 0.0171, 0.05, 0.0625, 0.08, 0.1486, 0.16, 0.1963, 0.2, 0.2409, 0.26, 0.2974, 0.31, 0.3468, 0.36, 0.3790, 0.39, 0.4075, 0.41, 0.4216, 0.43, + 0.4399, 0.47, 0.4878, 0.50, 0.5589, 0.57, 0.5882, 0.57, 0.5566, 0.52, 0.5030, 0.46, 0.4451, 0.42, 0.3928, 0.37, 0.3625, 0.35, 0.3396, 0.29, 0.2670, 0.15, + 0.1028, 0.05, -0.0397, -0.08, -0.1151, -0.12, -0.1464, -0.15, -0.1582, -0.16, -0.1609, -0.16, -0.1581, -0.155, -0.1556, -0.156, + -0.1582, -0.16, -0.1621, -0.165, -0.1683, -0.17, -0.1719, -0.17, -0.1696, -0.165, -0.1623, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::Colorlab_10_n70_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0964, 0.1, 0.1534, 0.2, 0.2437, 0.33, 0.4663, 0.5, 0.6005, 0.65, 0.6958, 0.75, 0.8010, 0.83, 0.8598, 0.858, 0.8579, 0.85, 0.8432, 0.83, 0.8102, 0.79, + 0.7607, 0.7, 0.6760, 0.6, 0.5530, 0.5, 0.4212, 0.3, 0.2974, 0.2, 0.1839, 0.1, 0.0743, 0.03, -0.0208, -0.05, -0.0747, -0.08, -0.0913, -0.05, -0.0458, 0.03, + 0.0806, 0.1, 0.1936, 0.2, 0.2556, 0.27, 0.2816, 0.29, 0.2925, 0.3, 0.3033, 0.31, 0.3175, 0.32, 0.3257, 0.325, 0.3246, 0.32, + 0.3187, 0.31, 0.3082, 0.305, 0.3014, 0.304, 0.3059, 0.31, 0.3253, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::Colorlab_n33_n70_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0615, 0.1, 0.1219, 0.2, 0.2179, 0.3, 0.4397, 0.5, 0.5722, 0.6, 0.6714, 0.7, 0.7834, 0.8, 0.8535, 0.86, 0.8647, 0.864, 0.8642, 0.864, 0.8429, 0.82, + 0.8035, 0.75, 0.7316, 0.7, 0.6238, 0.55, 0.4996, 0.45, 0.3717, 0.3, 0.2487, 0.2, 0.1299, 0.06, 0.0272, 0.01, -0.0315, -0.04, -0.0557, -0.051, + -0.0519, -0.03, -0.0234, 0.001, 0.0041, 0.01, 0.0201, 0.021, 0.0269, 0.028, 0.0298, 0.03, 0.0371, 0.04, 0.0497, 0.05, 0.0578, 0.056, + 0.0557, 0.05, 0.0490, 0.04, 0.0374, 0.03, 0.0299, 0.03, 0.0348, 0.04, 0.0537, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::Colorlab_n8_n74_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0603, 0.08, 0.1069, 0.15, 0.1810, 0.25, 0.3573, 0.4, 0.4634, 0.5, 0.5406, 0.6, 0.6266, 0.65, 0.6772, 0.679, 0.6800, 0.68, 0.6732, 0.66, 0.6511, 0.63, + 0.6136, 0.6, 0.5444, 0.5, 0.4415, 0.4, 0.3317, 0.3, 0.2286, 0.2, 0.1336, 0.1, 0.0425, 0.01, -0.0360, -0.05, -0.0807, -0.09, -0.0967, -0.08, + -0.0761, -0.05, -0.0119, 0.02, 0.0462, 0.05, 0.0784, 0.08, 0.0919, 0.095, 0.0974, 0.1, 0.1046, 0.11, 0.1152, 0.12, 0.1217, 0.121, + 0.1205, 0.12, 0.1155, 0.11, 0.1067, 0.104, 0.1010, 0.103, 0.1047, 0.11, 0.1199, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::Colorlab_19_n69_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1281, 0.16, 0.1941, 0.24, 0.2982, 0.4, 0.5607, 0.65, 0.7192, 0.8, 0.8299, 0.9, 0.9517, 1.0, 1.0174, 1.014, 1.0115, 1.0, 0.9899, 0.96, 0.9475, 0.91, + 0.8877, 0.82, 0.7902, 0.7, 0.6508, 0.57, 0.5008, 0.45, 0.3595, 0.3, 0.2302, 0.15, 0.1049, 0.02, -0.0045, -0.03, -0.0662, -0.07, -0.0832, -0.05, -0.0161, 0.05, + 0.1648, 0.2, 0.3257, 0.37, 0.4137, 0.43, 0.4506, 0.46, 0.4661, 0.47, 0.4801, 0.49, 0.4974, 0.5, 0.5072, 0.505, 0.5062, 0.5, 0.4995, 0.49, 0.4876, 0.48, + 0.4799, 0.48, 0.4849, 0.49, 0.5081, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::Colorlab_n80_10_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.0247, -0.01, -0.0057, 0.01, 0.0242, 0.05, 0.0736, 0.08, 0.0996, 0.1, 0.1281, 0.14, 0.1660, 0.19, 0.2037, 0.21, 0.2337, 0.25, 0.2618, 0.27, 0.2793, 0.29, + 0.3024, 0.32, 0.3564, 0.4, 0.4360, 0.44, 0.4788, 0.47, 0.4655, 0.45, 0.4308, 0.42, 0.3920, 0.37, 0.3564, 0.34, 0.3357, 0.32, 0.3167, 0.28, 0.2434, 0.1, + 0.0745, 0.01, -0.0725, -0.09, -0.1506, -0.18, -0.1831, -0.19, -0.1955, -0.195, -0.1995, -0.199, -0.1989, -0.198, + -0.1976, -0.198, -0.1999, -0.2, -0.2027, -0.208, -0.2070, -0.208, -0.2094, -0.208, -0.2080, -0.207, -0.2038, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::Colorlab_n80_26_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.0325, -0.03, -0.0203, -0.01, -0.0012, 0.01, 0.0228, 0.03, 0.0332, 0.04, 0.0506, 0.06, 0.0762, 0.09, 0.1069, 0.12, 0.1370, 0.15, 0.1666, 0.17, 0.1877, 0.2, + 0.2174, 0.25, 0.2849, 0.33, 0.3849, 0.4, 0.4477, 0.45, 0.4509, 0.44, 0.4305, 0.42, 0.4049, 0.39, 0.3806, 0.37, 0.3664, 0.35, 0.3495, 0.29, 0.2724, 0.1, + 0.0921, 0.01, -0.0651, -0.09, -0.1489, -0.15, -0.1837, -0.19, -0.1970, -0.2, -0.2020, -0.202, -0.2029, -0.203, -0.2026, -0.204, + -0.2047, -0.205, -0.2069, -0.208, -0.2099, -0.21, -0.2115, -0.21, -0.2106, -0.209, -0.2086, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; /* * Name: XYZtoCorColorTemp.c @@ -1022,6 +2607,197 @@ void ColorTemp::cieCAT02(double Xw, double Yw, double Zw, double &CAM02BB00, dou } +void ColorTemp::cieCAT02float(float Xw, float Yw, float Zw, float &CAM02BB00, float &CAM02BB01, float &CAM02BB02, float &CAM02BB10, float &CAM02BB11, float &CAM02BB12, float &CAM02BB20, float &CAM02BB21, float &CAM02BB22, float adap) +{ + +// CIECAT02 - J.Desmis January 2012 review September 2012 + const float whiteD50p[3] = {0.9646019585, 1.0, 0.8244507152}; //calculate with these tools + + float cam_dest[3] = {0., 0., 0.}; + float cam_orig[3] = {0., 0., 0.}; + const float CAT02[3][3] = {{0.7328, 0.4296, -0.1624},//CAT02 2002 + { -0.7036, 1.6975, 0.0061}, + {0.0030, 0.0136, 0.9834} + }; + const float INVCAT02[3][3] = {{1.09612382083551, -0.278869000218287, 0.182745179382773}, //Inverse CAT02 + {0.454369041975359, 0.4735331543070412, 0.0720978037172291}, + { -0.009627608738442936, -0.00569803121611342, 1.01532563995454} + }; + + float inv_white_orig[3][3] = {{0., 0., 0.}, + {0., 0., 0.}, + {0., 0., 0.} + }; + float intermed[3][3] = {{0., 0., 0.}, + {0., 0., 0.}, + {0., 0., 0.} + }; + + float intermed_2[3][3] = {{0., 0., 0.}, + {0., 0., 0.}, + {0., 0., 0.} + }; + float CAM02[3][3] = {{0., 0., 0.}, + {0., 0., 0.}, + {0., 0., 0.} + }; + float D = adap; + + //white destination Wd : RT use always D50 + cam_dest[0] = CAT02[0][0] * whiteD50p[0] + CAT02[0][1] * whiteD50p[1] + CAT02[0][2] * whiteD50p[2]; //Cone response RoD + cam_dest[1] = CAT02[1][0] * whiteD50p[0] + CAT02[1][1] * whiteD50p[1] + CAT02[1][2] * whiteD50p[2]; //GaD + cam_dest[2] = CAT02[2][0] * whiteD50p[0] + CAT02[2][1] * whiteD50p[1] + CAT02[2][2] * whiteD50p[2]; //BeD + + //origin white Ws : A, D65, custom, etc. + cam_orig[0] = CAT02[0][0] * Xw + CAT02[0][1] * Yw + CAT02[0][2] * Zw; //Cone response RoS + cam_orig[1] = CAT02[1][0] * Xw + CAT02[1][1] * Yw + CAT02[1][2] * Zw; + cam_orig[2] = CAT02[2][0] * Xw + CAT02[2][1] * Yw + CAT02[2][2] * Zw; + + //inverse white + inv_white_orig[0][0] = 1. / cam_orig[0]; // 1/RoS + inv_white_orig[1][1] = 1. / cam_orig[1]; // 1/GaS + inv_white_orig[2][2] = 1. / cam_orig[2]; // 1/BeS + + //intermediates computation + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3 ; j++) { + intermed[i][j] = inv_white_orig[i][i] * CAT02[i][j]; + } + + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3 ; j++) { + intermed_2[i][j] = cam_dest[i] * intermed[i][j]; + } + + //and CAM02 + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) { + CAM02[i][j] += INVCAT02[i][k] * intermed_2[k][j]; + } + + //adaptation jdc : slightly different from CIECAM02 : Rc=(Yw(D/Rw)+(1-D))*R , but it's work ! true at 0 and 1 + CAM02[1][1] = (CAM02[1][1] - 1.0) * D + 1.0; + CAM02[0][0] = (CAM02[0][0] - 1.0) * D + 1.0; + CAM02[2][2] = (CAM02[2][2] - 1.0) * D + 1.0; +// CAM02[1][1] *= D; +// CAM02[0][0] *= D; +// CAM02[2][2] *= D; + CAM02[0][1] *= D; + CAM02[0][2] *= D; + CAM02[1][0] *= D; + CAM02[1][2] *= D; + CAM02[2][0] *= D; + CAM02[2][1] *= D; + //CAT02 matrix with D adaptation + CAM02BB00 = CAM02[0][0]; + CAM02BB01 = CAM02[0][1]; + CAM02BB02 = CAM02[0][2]; + CAM02BB10 = CAM02[1][0]; + CAM02BB11 = CAM02[1][1]; + CAM02BB12 = CAM02[1][2]; + CAM02BB20 = CAM02[2][0]; + CAM02BB21 = CAM02[2][1]; + CAM02BB22 = CAM02[2][2]; + +} + +void ColorTemp::icieCAT02float(float Xw, float Yw, float Zw, float &iCAM02BB00, float &iCAM02BB01, float &iCAM02BB02, float &iCAM02BB10, float &iCAM02BB11, float &iCAM02BB12, float &iCAM02BB20, float &iCAM02BB21, float &iCAM02BB22, float adap) +{ + +// CIECAT02 - J.Desmis January 2012 review September 2017 + const float whiteD50p[3] = {0.9646019585, 1.0, 0.8244507152}; //calculate with these tools + + float cam_dest[3] = {0., 0., 0.}; + float cam_orig[3] = {0., 0., 0.}; + const float CAT02[3][3] = {{0.7328, 0.4296, -0.1624},//CAT02 2002 + { -0.7036, 1.6975, 0.0061}, + {0.0030, 0.0136, 0.9834} + }; + const float INVCAT02[3][3] = {{1.09612382083551, -0.278869000218287, 0.182745179382773}, //Inverse CAT02 + {0.454369041975359, 0.4735331543070412, 0.0720978037172291}, + { -0.009627608738442936, -0.00569803121611342, 1.01532563995454} + }; + + float inv_white_orig[3][3] = {{0., 0., 0.}, + {0., 0., 0.}, + {0., 0., 0.} + }; + float intermed[3][3] = {{0., 0., 0.}, + {0., 0., 0.}, + {0., 0., 0.} + }; + + float intermed_2[3][3] = {{0., 0., 0.}, + {0., 0., 0.}, + {0., 0., 0.} + }; + float INVCAM02[3][3] = {{0., 0., 0.}, + {0., 0., 0.}, + {0., 0., 0.} + }; + float D = adap / 2.; + + //white destination Wd : RT use always D50 + cam_dest[0] = INVCAT02[0][0] * whiteD50p[0] + INVCAT02[0][1] * whiteD50p[1] + INVCAT02[0][2] * whiteD50p[2]; //Cone reponse RoD + cam_dest[1] = INVCAT02[1][0] * whiteD50p[0] + INVCAT02[1][1] * whiteD50p[1] + INVCAT02[1][2] * whiteD50p[2]; //GaD + cam_dest[2] = INVCAT02[2][0] * whiteD50p[0] + INVCAT02[2][1] * whiteD50p[1] + INVCAT02[2][2] * whiteD50p[2]; //BeD + + //origin white Ws : A, D65, custom, etc. + cam_orig[0] = INVCAT02[0][0] * Xw + INVCAT02[0][1] * Yw + INVCAT02[0][2] * Zw; //Cone reponse RoS + cam_orig[1] = INVCAT02[1][0] * Xw + INVCAT02[1][1] * Yw + INVCAT02[1][2] * Zw; + cam_orig[2] = INVCAT02[2][0] * Xw + INVCAT02[2][1] * Yw + INVCAT02[2][2] * Zw; +// cam_orig[0] = CAT02[0][0] * Xw + CAT02[0][1] * Yw + CAT02[0][2] * Zw; //Cone reponse RoS +// cam_orig[1] = CAT02[1][0] * Xw + CAT02[1][1] * Yw + CAT02[1][2] * Zw; + // cam_orig[2] = CAT02[2][0] * Xw + CAT02[2][1] * Yw + CAT02[2][2] * Zw; + + //inverse white + inv_white_orig[0][0] = 1. / cam_orig[0]; // 1/RoS + inv_white_orig[1][1] = 1. / cam_orig[1]; // 1/GaS + inv_white_orig[2][2] = 1. / cam_orig[2]; // 1/BeS + + //intermediates computation + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3 ; j++) { + // intermed[i][j] = inv_white_orig[i][i] * INVCAT02[i][j]; + intermed[i][j] = inv_white_orig[i][i] * CAT02[i][j]; + } + + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3 ; j++) { + intermed_2[i][j] = cam_dest[i] * intermed[i][j]; + } + + //and CAM02 + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) { + INVCAM02[i][j] += INVCAT02[i][k] * intermed_2[k][j]; + } + + //adaptation jdc : slightly different from CIECAM02 : Rc=(Yw(D/Rw)+(1-D))*R , but it's work ! true at 0 and 1 + INVCAM02[0][0] = (INVCAM02[0][0] - 1.0) * D + 1.0; + INVCAM02[2][2] = (INVCAM02[2][2] - 1.0) * D + 1.0; + INVCAM02[0][1] *= D; + INVCAM02[0][2] *= D; + INVCAM02[1][0] *= D; + INVCAM02[1][2] *= D; + INVCAM02[2][0] *= D; + INVCAM02[2][1] *= D; + //CAT02 matrix with D adaptation + iCAM02BB00 = INVCAM02[0][0]; + iCAM02BB01 = INVCAM02[0][1]; + iCAM02BB02 = INVCAM02[0][2]; + iCAM02BB10 = INVCAM02[1][0]; + iCAM02BB11 = INVCAM02[1][1]; + iCAM02BB12 = INVCAM02[1][2]; + iCAM02BB20 = INVCAM02[2][0]; + iCAM02BB21 = INVCAM02[2][1]; + iCAM02BB22 = INVCAM02[2][2]; + +} + + void ColorTemp::temp2mulxyz (double temp, const std::string &method, double &Xxyz, double &Zxyz) { double x, y, z; @@ -1645,6 +3421,452 @@ double ColorTemp::daylight_spect(double wavelength, double m1, double m2) return (s0[wlm] + m1 * s1[wlm] + m2 * s2[wlm]); } +//tempxy : return x and y of xyY for 200 or more refreence color, and for T temperature from 2000K to 12000K +// we can change step for temperature and increase number for T > 7500K if necessary +//these values Temp, x, y are references for all calculations and very precise. +//copyright J.Desmis august 2017 and june 2018 +void ColorTemp::tempxy(bool separated, int &repref, float **Tx, float **Ty, float **Tz, float **Ta, float **Tb, float **TL, double *TX, double *TY, double *TZ, const procparams::WBParams & wbpar) +{ + const double* spec_colorforxcyc[] = {//color references + JDC468_BluH10_spect, JDC468_BluD6_spect, ColorchechCyaF3_spect, JDC468_BluM5_spect, // 0 3 + ColorGreenM25_spect, JDC468_GreK7_spect, ColabSky42_0_m24_spect, ColabSky60_0_m31_spect, ColorchechBluC150_m5_m22_spect,//8 + JDC468_GreQ7_spect, ColorchechDCBluN881_m7_m14_spect, ColorchechGreB3_spect, ColorchechPurD2_spect, //12 + ColorchechSGBlaN3_6_spect, ColorchechGraC4_67_spect, JDC468_K15_87greyspect,//15 + JDC468_GraK14_44_spect, ColorGreenalsi_spect, Fictif_61greyspect, ColorchechGreD1_spect,//19 + ColorchechWhiA496_spect, JDC468_GreA10_spect, JDC468_GreI8_spect,//22 + ColabSkin91_4_14_spect, JDC468_PurE24_spect, //24 + ColorchechSGSkiK285_11_17_spect, ColorchechGreE2_spect, ColorchechMagE3_spect, //27 + ColorchechSkiB166_18_18_spect, ColabSkin70_7_32_spect, ColorchechSGSkiF763_14_26_spect,//30 + ColorchechSkiA138_13_14_spect, ColabSkin57_22_18_spect, JDC468_YelN10_spect,//33 + ColabSkin35_15_17_spect, ColabSkin40_17_17_spect, ColorRedkurttu_spect, ColorYellowkeltano_spect, ColorchechYelD3_spect, JDC468_OraO18_spect,//39 + JDC468_GreN7_spect, JDC468_RedG21va_spect, JDC468_OraD17_spect,//42 + ColorchechredC3_spect, JDC468_RedI9_spect, ColorRedpetunia_spect, ColorchechOraA2_spect,//46 + ColabSkin87_8_8_spect, ColabSkin89_8_21_spect, ColabSkin75_8_4_spect, ColabSkin75_10_33_spect,//50 + ColabSkin65_33_11_spect, ColabSkin65_7_24_spect, ColabSkin57_19_6_spect, ColabSkin57_4_19_spect, ColabSkin57_10_28_spect, ColabSkin40_17_6_spect,//56 + ColabSkin26_18_18_spect, ColabSkin90_m1_20_spect, ColorRedlupiini_spect, ColorRedhevosminttu_spect, //60 + ColorRedneilikka_spect, ColorRedpelagornia_spect, ColorRedtalvio_spect, ColorBrownpoimulehti_spect, ColorOrangetuntematon_spect,//65 + ColorOrangetlehmus_spect, ColorOrangvaahtera_spect, ColorBrownlehmus_spect, ColorBrownuotiosammal_spect,//69 + ColorBlacksoil_spect, ColorGraynahjajaekaelae_spect, //71 + ColorGreennuotisammal_spect, ColorGreenleskenlehti_spect, ColorGreenlinnunkaali_spect, //74 + ColorGreenpelto_spect, ColorGreenrodvoikukka, ColorGreenlehmus, ColorGreenlinden, ColorYellowlehmus, ColorYellowsuikeroalpi, //80 + ColorYellowpensashanhikki1, ColorYellowpensashanhikki2, ColorBluehiidenvirna, ColorBluekurkkuyrtti, //84 + ColorPinksiankaersaemoe, ColorVioletharakankello, ColorVioletalsikeapila, ColorVioletakilleija, ColorOrangekehaekukka,//89 + ColorRedpihlaja, ColorVioletpetunia, ColorVioletorvokki, ColorBluesinisievikki, ColorBlueiisoppi, ColorBluelobelia, //95 + ColorWhiteojaka, ColorWhitepetunia, ColorWhitepelargonia, ColorWhitepaeivaen, JDC468_B14_75Redspect,//100 + ColorGreenkoriste, ColorGreenpoimulehti, ColorGreenhopeapaju, //103 + ColorReduuden, ColorRedpajuan, ColorRedjaloan, ColorBlueukon, ColorBlueorvokki, ColorBluemalvikki, //109 + ColorBlackmaito, ColorOrangpihlaja, ColorBlackpihlaja, //112 + ColorViolA1_spect, ColorViolA4_spect, ColorViolA6_spect, ColorBlueSkyK3_spect, ColorBlueSkyK9_spect, //117 + ColorBlueSkyC4_spect, ColorBlueSkyC14_spect, ColorBlueSkyE4_spect, //120 + ColorBlueSkyM1_spect, ColorBlueSky2B1_spect, ColorBlueSkyT7_spect, //123 + ColorBlueSkyU19_spect, ColorBlueSkyU2_spect, ColorBlueSkyT17_spect, //126 + ColorBlackM8_spect, ColorBlackM12_spect, ColorBlackM13_spect, ColorWhite2B12_spect, ColorWhite2B14_spect, //131 + JDC468_Blackred97_spect, JDC468_Blackredbl443_spect, JDC468_Blackbl27_spect, JDC468_Blackbl28_spect, //135 + JDC468_Blackgr214_spect, JDC468_Blackbl436_spect, JDC468_Whitebl455_spect, JDC468_Blackvio101_spect, JDC468_Whitebl92_spect, JDC468_Greyredbl94_spect, //141 + JDC468_Blue32_spect, JDC468_Blue236_spect, JDC468_Gre300_spect, //144 + JDC468_Blue340_spect, JDC468_Gree110_spect, JDC468_Gree457_spect, JDC468_Yel241_spect, JDC468_Ora321_spect, JDC468_Yellow353_spect, JDC468_Mag465_spect, //151 + JDC468_Mag333_spect, JDC468_Mag203_spect, J570_BlueB6_spect, J570_BlueB15_spect, J570_BlueC2_spect, J570_BlueC14_spect, J570_BlueC16_spect,//158 + J570_BlueF1_spect, J570_BlueF2_spect, J570_BlueF10_spect, J570_BlueF13_spect, J570_BlueG9_spect, J570_BlueG19_spect, J570_BlueI5_spect,//165 + J570_BlueI3_spect, J570_BlueI19_spect, J570_BlueJ4_spect, J570_BlueJ6_spect, J570_BlueJ11_spect, J570_BlueK5_spect, //171 + J570_BlueN1_spect, J570_BlueN4_spect, J570_BlueO19_spect, J570_BlueU8_spect, J570_NeuN8_spect,//176 + J570_NeuN9_spect, J570_NeuO8_spect, J570_NeuO11_spect, J570_NeuD5_spect,//180 + J570_NeuE11_spect, J570_NeuK16_spect, J570_NeuM3_spect, J570_NeuN18_spect, + J570_NeuQ1_spect, J570_NeuS7_spect, + J570_NeuV10_spect, J570_NeuW18_spect, J570_NeuZ14_spect, //189 + J570_NeuC18_spect, J570_NeuD17_spect, J570_NeuJ11_spect, J570_NeuL4_spect, Colorlab_n72_n2_spect, + Colorlab_10_n70_spect, Colorlab_n33_n70_spect, Colorlab_n8_n74_spect, Colorlab_19_n69_spect, Colorlab_n80_10_spect, Colorlab_n80_26_spect + }; + + + typedef struct WbTxyz { + double Tem; + double XX; + double ZZ; + } WbTxyz; + //probbaly can be "passed" with rawimagesource.cc but I don't know how to do. + WbTxyz Txyz[118] = {//temperature Xwb Zwb 118 values x wb and y wb are calculated after + {2001., 1.273842, 0.145295}, + {2101., 1.244008, 0.167533}, + {2201., 1.217338, 0.190697}, + {2301., 1.193444, 0.214632}, + {2401., 1.171996, 0.239195}, + {2501., 1.152883, 0.264539}, + {2605., 1.134667, 0.290722}, + {2655., 1.126659, 0.303556}, + {2705., 1.119049, 0.316446}, + {2755., 1.111814, 0.329381}, + {2803., 1.105381, 0.342193}, + {2856., 1.098258, 0.355599}, + {2910., 1.091550, 0.369645}, + {2960., 1.085649, 0.382655}, + {3003., 1.080982, 0.394258}, + {3050., 1.075727, 0.406057}, + {3103., 1.070277, 0.419815}, + {3153., 1.065384, 0.432769}, + {3203., 1.060906, 0.446161}, + {3250., 1.056535, 0.457806}, + {3303., 1.052034, 0.471422}, + {3353., 1.047990, 0.484218}, + {3400., 1.044547, 0.496719}, + {3450., 1.040667, 0.508891}, + {3500., 1.037145, 0.521523}, + {3550., 1.033783, 0.534090}, + {3600., 1.030574, 0.546590}, + {3650., 1.027510, 0.559020}, + {3699., 1.024834, 0.571722}, + {3801., 1.019072, 0.596102}, + {3851., 1.016527, 0.608221}, + {3902., 1.014244, 0.621136}, + {3952., 1.011729, 0.632447}, + {4002., 0.996153, 0.609518}, + {4052., 0.993720, 0.620805}, + {4102., 0.993908, 0.631520}, + {4152., 0.989179, 0.643262}, + {4202., 0.989283, 0.653999}, + {4252., 0.985039, 0.665536}, + {4302., 0.985067, 0.676288}, + {4352., 0.981271, 0.687599}, + {4402., 0.981228, 0.698349}, + {4452., 0.977843, 0.709425}, + {4502., 0.977736, 0.720159}, + {4552., 0.974728, 0.730993}, + {4602., 0.974562, 0.741698}, + {4652., 0.971899, 0.752284}, + {4702., 0.971681, 0.762949}, + {4752., 0.969335, 0.773285}, + {4802., 0.969069, 0.783899}, + {4827., 0.967570, 0.788836}, + {4852., 0.967011, 0.793982}, + {4877., 0.966465, 0.799108}, + {4902., 0.965933, 0.804214}, + {4927., 0.965414, 0.809229}, + {4952., 0.964908, 0.814366}, + {4977., 0.964415, 0.819412}, + {5002., 0.963934, 0.824438}, + {5027., 0.963465, 0.829444}, + {5052., 0.963008, 0.834429}, + {5077., 0.962563, 0.839395}, + {5102., 0.962129, 0.844339}, + {5127., 0.961706, 0.849263}, + {5152., 0.961294, 0.854166}, + {5177., 0.960893, 0.859049}, + {5202., 0.960501, 0.863911}, + {5252., 0.959749, 0.873572}, + {5302., 0.959313, 0.883815}, + {5352., 0.958361, 0.892644}, + {5402., 0.957903, 0.902793}, + {5452., 0.957116, 0.911379}, + {5502., 0.956639, 0.921431}, + {5552., 0.956002, 0.929779}, + {5602., 0.955509, 0.939728}, + {5652., 0.955008, 0.947842}, + {5702., 0.954502, 0.957685}, + {5752., 0.954124, 0.965569}, + {5802., 0.953608, 0.975303}, + {5852., 0.953342, 0.982963}, + {5902., 0.952818, 0.992584}, + {5952., 0.952652, 1.000025}, + {6002., 0.952122, 1.009532}, + {6052., 0.952047, 1.016759}, + {6102., 0.951514, 1.026149}, + {6152., 0.951520, 1.033168}, + {6202., 0.950985, 1.042439}, + {6252., 0.951064, 1.049256}, + {6302., 0.950530, 1.058406}, + {6352., 0.950674, 1.065027}, + {6402., 0.950143, 1.074055}, + {6452., 0.950345, 1.080484}, + {6502., 0.950201, 1.088097}, + {6552., 0.950070, 1.095633}, + {6602., 0.949952, 1.103094}, + {6652., 0.949846, 1.110479}, + {6702., 0.949752, 1.119138}, + {6752., 0.949668, 1.125027}, + {6802., 0.949596, 1.132190}, + {6902., 0.949033, 1.147691}, + {7002., 0.949402, 1.160129}, + {7152., 0.949348, 1.180429}, + {7301., 0.948896, 1.201432}, + {7451., 0.949434, 1.219076}, + {7601., 0.949099, 1.239061}, + {7751., 0.949729, 1.255559}, + {7901., 0.949498, 1.274460}, + {8151., 0.950361, 1.300912}, + {8301., 0.950253, 1.318464}, + {8451., 0.950966, 1.332651}, + {8601., 0.950941, 1.349261}, + {8801., 0.951772, 1.367421}, + {9001., 0.951969, 1.387639}, + {9201., 0.952784, 1.404422}, + {9401., 0.953081, 1.423213}, + {9901., 0.954537, 1.464134}, + {10501., 0.956321, 1.508623}, + {11001., 0.957747, 1.541281}, + {12001., 0.960440, 1.601019} + }; + + int N_c = sizeof(spec_colorforxcyc) / sizeof(spec_colorforxcyc[0]); //number of color + int N_t = sizeof(Txyz) / sizeof(Txyz[0]); //number of temperature White point + typedef struct XYZref { + double Xref; + double Yref; + double Zref; + } XYZref; + XYZref Refxyz[N_c + 1]; + typedef struct XYZrefcat02 { + double Xrefcat; + double Yrefcat; + double Zrefcat; + } XYZrefcat02; + XYZrefcat02 Refxyzcat02[N_c + 1]; + + for (int i = 0; i < N_c; i++) { + Refxyz[i].Xref = 0.f; + Refxyz[i].Yref = 0.f; + Refxyz[i].Zref = 0.f; + Refxyzcat02[i].Xrefcat = 0.f; + Refxyzcat02[i].Yrefcat = 0.f; + Refxyzcat02[i].Zrefcat = 0.f; + } + + + struct chrom { + float chroab; + float chroa; + float chrob; + int nn; + float L; + bool operator()(const chrom& lchro, const chrom& rchro) + { + return lchro.chroab < rchro.chroab; + } + + } ; + + // chrom wbchro[N_c + 1]; + + double tempw = 5000.; + + if (separated) { + tempw = Txyz[repref].Tem; + // tempw = 5004.; + + if (tempw <= INITIALBLACKBODY) { + // float aa = 0.f; + // float bb = 0.f; + + for (int i = 0; i < N_c; i++) { + spectrum_to_color_xyz_blackbody(spec_colorforxcyc[i], tempw, TX[i], TY[i], TZ[i]); + /* float XX = TX[i] * 65535.f; + float YY = TY[i] * 65535.f; + float ZZ = TZ[i] * 65535.f; + float L, a, b; + Color::XYZ2Lab(XX, YY, ZZ, L, a, b);//only to see Lab values in console + printf("N=%i L=%f a=%f b=%f\n", i, L / 327.68f, a / 327.68f, b / 327.68f); + aa += (a / 327.68f); + bb += (b / 327.68f); + */ + } + + /* + aa /= N_c; + bb /= N_c; + printf("aa=%f bb=%f\n", aa, bb); + */ + // } + + } else { + double m11, m22, x_DD, y_DD, interm2; + + if (tempw <= 7000) { + x_DD = -4.6070e9 / (tempw * tempw * tempw) + 2.9678e6 / (tempw * tempw) + 0.09911e3 / tempw + 0.244063; + } else { + x_DD = -2.0064e9 / (tempw * tempw * tempw) + 1.9018e6 / (tempw * tempw) + 0.24748e3 / tempw + 0.237040; + } + + y_DD = -3.0 * x_DD * x_DD + 2.87 * x_DD - 0.275; + //calculate D -daylight in function of s0, s1, s2 and temp ==> x_D y_D + //S(lamda)=So(lambda)+m1*s1(lambda)+m2*s2(lambda) + interm2 = (0.0241 + 0.2562 * x_DD - 0.734 * y_DD); + m11 = (-1.3515 - 1.7703 * x_DD + 5.9114 * y_DD) / interm2; + m22 = (0.03 - 31.4424 * x_DD + 30.0717 * y_DD) / interm2; + // float aa = 0.f; + // float bb = 0.f; + + for (int i = 0; i < N_c; i++) { + spectrum_to_color_xyz_daylight(spec_colorforxcyc[i], m11, m22, TX[i], TY[i], TZ[i]); + +/* float XX = TX[i] * 65535.f; + float YY = TY[i] * 65535.f; + float ZZ = TZ[i] * 65535.f; + float L, a, b; + Color::XYZ2Lab(XX, YY, ZZ, L, a, b);//only to see Lab values in console + // printf("N=%i L=%f a=%f b=%f\n", i, L / 327.68f, a / 327.6 8f, b / 327.68f); + aa += (a / 327.68f); + bb += (b / 327.68f); + wbchro[i].chroab = (sqrt(SQR(a) + SQR(b))) / 327.68f; + wbchro[i].chroa = a / 327.68f; + wbchro[i].chrob = b / 327.68f; + wbchro[i].nn = i; +*/ + + + } +/* + std::sort(wbchro, wbchro + N_c + 1, wbchro[0]); + float ab5 = 0.f; + int n5 = 0; + float ab15 = 0.f; + int n15 = 0; + float ab30 = 0.f; + int n30 = 0; + float ab50 = 0.f; + int n50 = 0; + float ab70 = 0.f; + int n70 = 0; + float ab120 = 0.f; + int n120 = 0; + + for (int i = 0; i < N_c; i++) { + if (wbchro[i].chroab < 5.f) { + ab5 += (wbchro[i].chroa + wbchro[i].chrob); + n5++; + } else if (wbchro[i].chroab < 15.f) { + ab15 += (wbchro[i].chroa + wbchro[i].chrob); + n15++; + } else if (wbchro[i].chroab < 30.f) { + ab30 += (wbchro[i].chroa + wbchro[i].chrob); + n30++; + } else if (wbchro[i].chroab < 50.f) { + ab50 += (wbchro[i].chroa + wbchro[i].chrob); + n50++; + } else if (wbchro[i].chroab < 70.f) { + ab70 += (wbchro[i].chroa + wbchro[i].chrob); + n70++; + } else if (wbchro[i].chroab < 120.f) { + ab120 += (wbchro[i].chroa + wbchro[i].chrob); + n120++; + } + + printf("N=%i nn=%i chr=%f cha=%f chb=%f\n", i, wbchro[i].nn, wbchro[i].chroab, wbchro[i].chroa, wbchro[i].chrob); + } + + printf("ab5=%f n5=%i\n", ab5 / n5, n5); + printf("ab15=%f n15=%i\n", ab15 / n15, n15); + printf("ab30=%f n30=%i\n", ab30 / n30, n30); + printf("ab50=%f n50=%i\n", ab50 / n50, n50); + printf("ab70=%f n70=%i\n", ab70 / n70, n70); + printf("ab120=%f n120=%i\n", ab120 / n120, n120); + aa /= N_c; + bb /= N_c; + printf("aa=%f bb=%f\n", aa, bb); + //very low 15 --, 16 -+, 17 + -, 18 +-, 20 ++, 22 -+, 73 ++, 98 ++, 99 -+, 101 -+, 129 ++, 130 -+, 131 --, + //low 8 +-, 9 --, 10 --, 12 --, 19 -+, 21 -+, 24 -+, 25 ++, 27 ++, 30 ++, 33++, 34 ++, 36 ++, 37++,38 +-, + */ + } + } + + if (!separated) { + // std::string wbcat02Method = wbpar.wbcat02Method; + std::string wbcat02Method = "none"; + + for (int tt = 0; tt < N_t; tt++) { + tempw = Txyz[tt].Tem; + + if (tempw <= INITIALBLACKBODY) { + + for (int i = 0; i < N_c; i++) { + spectrum_to_color_xyz_blackbody(spec_colorforxcyc[i], tempw, Refxyz[i].Xref, Refxyz[i].Yref, Refxyz[i].Zref); + } + + } else { + double m11, m22, x_DD, y_DD, interm2; + + if (tempw <= 7000) { + x_DD = -4.6070e9 / (tempw * tempw * tempw) + 2.9678e6 / (tempw * tempw) + 0.09911e3 / tempw + 0.244063; + } else { + x_DD = -2.0064e9 / (tempw * tempw * tempw) + 1.9018e6 / (tempw * tempw) + 0.24748e3 / tempw + 0.237040; + } + + y_DD = -3.0 * x_DD * x_DD + 2.87 * x_DD - 0.275; + //calculate D -daylight in function of s0, s1, s2 and temp ==> x_D y_D + //S(lamda)=So(lambda)+m1*s1(lambda)+m2*s2(lambda) + interm2 = (0.0241 + 0.2562 * x_DD - 0.734 * y_DD); + m11 = (-1.3515 - 1.7703 * x_DD + 5.9114 * y_DD) / interm2; + m22 = (0.03 - 31.4424 * x_DD + 30.0717 * y_DD) / interm2; + + for (int i = 0; i < N_c; i++) { + spectrum_to_color_xyz_daylight(spec_colorforxcyc[i], m11, m22, Refxyz[i].Xref, Refxyz[i].Yref, Refxyz[i].Zref); + } + } + +//CAT02 + + float CAM02BB00 = 1.0, CAM02BB01 = 1.0, CAM02BB02 = 1.0, CAM02BB10 = 1.0, CAM02BB11 = 1.0, CAM02BB12 = 1.0, CAM02BB20 = 1.0, CAM02BB21 = 1.0, CAM02BB22 = 1.0; //for CIECAT02 + float Xwb = Txyz[tt].XX; + float Ywb = 1.; + float Zwb = Txyz[tt].ZZ; + + if (wbcat02Method == "icam") {//not used + icieCAT02float(Xwb, Ywb, Zwb, CAM02BB00, CAM02BB01, CAM02BB02, CAM02BB10, CAM02BB11, CAM02BB12, CAM02BB20, CAM02BB21, CAM02BB22, 1.0); + } + + if (wbcat02Method == "cam") { + + cieCAT02float(Xwb, Ywb, Zwb, CAM02BB00, CAM02BB01, CAM02BB02, CAM02BB10, CAM02BB11, CAM02BB12, CAM02BB20, CAM02BB21, CAM02BB22, 1.0); + } + + if (wbcat02Method == "none") { + + for (int i = 0; i < N_c; i++) { + Refxyzcat02[i].Xrefcat = CAM02BB00 * Refxyz[i].Xref + CAM02BB01 * Refxyz[i].Yref + CAM02BB02 * Refxyz[i].Zref ; + Refxyzcat02[i].Yrefcat = CAM02BB10 * Refxyz[i].Xref + CAM02BB11 * Refxyz[i].Yref + CAM02BB12 * Refxyz[i].Zref ; + Refxyzcat02[i].Zrefcat = CAM02BB20 * Refxyz[i].Xref + CAM02BB21 * Refxyz[i].Yref + CAM02BB22 * Refxyz[i].Zref; + } + } + +//end CAT02 + + for (int i = 0; i < N_c; i++) { + /* float X = 65535.f * Refxyzcat02[i].Xrefcat; + float Y = 65535.f * Refxyzcat02[i].Yrefcat; + float Z = 65535.f * Refxyzcat02[i].Zrefcat; + float L, a, b; + Color::XYZ2Lab(X, Y, Z, L, a, b); + + double som = (Refxyzcat02[i].Xrefcat + Refxyzcat02[i].Yrefcat + Refxyzcat02[i].Zrefcat); + L /= 327.68f; + a /= 327.68f; + b /= 327.68f; + Ta[i][tt] = a; + Tb[i][tt] = b; + TL[i][tt] = L; + TX[i][tt] = X; + TY[i][tt] = Y; + TZ[i][tt] = Z; + */ + //som = 1.; +// Tx[i][tt] = (float) Refxyz[i].Xref; +// Ty[i][tt] = (float) Refxyz[i].Yref; +// Tz[i][tt] = (float) Refxyz[i].Zref; + +// if (wbpar.wbcat02Method == "none") { + if (wbcat02Method == "none") { + + Tx[i][tt] = (float) Refxyz[i].Xref; + Ty[i][tt] = (float) Refxyz[i].Yref; + Tz[i][tt] = (float) Refxyz[i].Zref; + } else { + Tx[i][tt] = (float) Refxyzcat02[i].Xrefcat; + Ty[i][tt] = (float) Refxyzcat02[i].Yrefcat; + Tz[i][tt] = (float) Refxyzcat02[i].Zrefcat; + } + + } + } + } +} + } diff --git a/rtengine/colortemp.h b/rtengine/colortemp.h index d529d844e..1c50f282a 100644 --- a/rtengine/colortemp.h +++ b/rtengine/colortemp.h @@ -22,6 +22,7 @@ #include #include #include +#include "procparams.h" namespace rtengine { @@ -54,6 +55,7 @@ public: explicit ColorTemp (double e) : temp(-1.), green(-1.), equal (e), method("Custom") {} ColorTemp (double t, double g, double e, const std::string &m); ColorTemp (double mulr, double mulg, double mulb, double e); + static void tempxy(bool separated, int &repref, float **Tx, float **Ty, float **Tz, float **Ta, float **Tb, float **TL, double *TX, double *TY, double *TZ, const procparams::WBParams & wbpar); void update (const double rmul, const double gmul, const double bmul, const double equal, const double tempBias=0.0) { @@ -96,6 +98,8 @@ public: static void temp2mulxyz (double tem, const std::string &method, double &Xxyz, double &Zxyz); static void cieCAT02(double Xw, double Yw, double Zw, double &CAM02BB00, double &CAM02BB01, double &CAM02BB02, double &CAM02BB10, double &CAM02BB11, double &CAM02BB12, double &CAM02BB20, double &CAM02BB21, double &CAM02BB22, double adap ); + static void cieCAT02float(float Xw, float Yw, float Zw, float &CAM02BB00, float &CAM02BB01, float &CAM02BB02, float &CAM02BB10, float &CAM02BB11, float &CAM02BB12, float &CAM02BB20, float &CAM02BB21, float &CAM02BB22, float adap); + static void icieCAT02float(float Xw, float Yw, float Zw, float &iCAM02BB00, float &iCAM02BB01, float &iCAM02BB02, float &iCAM02BB10, float &iCAM02BB11, float &iCAM02BB12, float &iCAM02BB20, float &iCAM02BB21, float &iCAM02BB22, float adap); bool operator== (const ColorTemp& other) const { @@ -163,6 +167,125 @@ public: static const double ColorchechGreD1_spect[97]; static const double ColorchechSGBlaN3_6_spect[97];//ColorChecker SG N3 static const double JDC468_GraK14_44_spect[97];//468 K14 + static const double JDC468_BluM5_spect[97]; //468 M5 + static const double JDC468_BluD6_spect[97]; //468 D6 + static const double JDC468_BluF4_spect[97]; //468 F4 + static const double JDC468_RedG21va_spect[97]; //468 G21 modifié + static const double JDC468_RedI9_spect[97]; //468 I9 + static const double JDC468_GreI8_spect[97]; //468 I8 + static const double JDC468_GreQ7_spect[97]; //468 Q7 + static const double ColorGreenM25_spect[97]; + static const double ColorYellowkeltano_spect[97]; + static const double ColorGreenalsi_spect[97]; + static const double ColorRedpetunia_spect[97]; + static const double ColorRedkurttu_spect[97]; + static const double ColorRedlupiini_spect[97]; + static const double ColorRedhevosminttu_spect[97]; + static const double ColorRedneilikka_spect[97]; + static const double ColorRedpelagornia_spect[97]; + static const double ColorRedtalvio_spect[97]; + static const double ColorBrownpoimulehti_spect[97]; + static const double ColorOrangetuntematon_spect[97]; + static const double ColorOrangetlehmus_spect[97]; + static const double ColorOrangvaahtera_spect[97]; + static const double ColorBrownlehmus_spect[97]; + static const double ColorBrownuotiosammal_spect[97]; + static const double ColorBlacksoil_spect[97]; + static const double ColorGraynahjajaekaelae_spect[97]; + static const double ColorGreennuotisammal_spect[97]; + static const double ColorGreenleskenlehti_spect[97]; + static const double ColorGreenlinnunkaali_spect[97]; + static const double ColorGreenpelto_spect[97]; + static const double ColorGreenrodvoikukka[97]; + static const double ColorGreenlehmus[97]; + static const double ColorGreenlinden[97]; + static const double ColorYellowlehmus[97]; + static const double ColorYellowsuikeroalpi[97]; + static const double ColorYellowpensashanhikki1[97]; + static const double ColorYellowpensashanhikki2[97]; + static const double ColorBluehiidenvirna[97]; + static const double ColorBluekurkkuyrtti[97]; + static const double ColorPinksiankaersaemoe[97]; + static const double ColorVioletharakankello[97]; + static const double ColorVioletalsikeapila[97]; + static const double ColorVioletakilleija[97]; + static const double ColorOrangekehaekukka[97]; + static const double ColorRedpihlaja[97]; + static const double ColorVioletpetunia[97]; + static const double ColorVioletorvokki[97]; + static const double ColorBluesinisievikki[97]; + static const double ColorBlueiisoppi[97]; + static const double ColorBluelobelia[97]; + static const double ColorWhiteojaka[97]; + static const double ColorWhitepetunia[97]; + static const double ColorWhitepelargonia[97]; + static const double ColorWhitepaeivaen[97]; + static const double JDC468_B14_75Redspect[97]; + static const double Colorblue_spect[97]; + static const double ColorGreenkoriste[97]; + static const double ColorGreenpoimulehti[97]; + static const double ColorGreenhopeapaju[97]; + static const double ColorReduuden[97]; + static const double ColorRedpajuan[97]; + static const double ColorRedjaloan[97]; + static const double ColorBlueukon[97]; + static const double ColorBlueorvokki[97]; + static const double ColorBluemalvikki[97]; + static const double ColorBlackmaito[97]; + static const double ColorOrangpihlaja[97]; + static const double ColorBlackpihlaja[97]; + static const double ColorViolA1_spect[97]; + static const double ColorViolA4_spect[97]; + static const double ColorViolA6_spect[97]; + static const double ColorBlueSkyK3_spect[97]; + static const double ColorBlueSkyK9_spect[97]; + static const double ColorBlueSkyC4_spect[97]; + static const double ColorBlueSkyC14_spect[97]; + static const double ColorBlueSkyE4_spect[97]; + static const double ColorBlueSkyM1_spect[97]; + static const double ColorBlueSky2B1_spect[97]; + static const double ColorBlueSkyT7_spect[97]; + static const double ColorBlueSkyU19_spect[97]; + static const double ColorBlueSkyU2_spect[97]; + static const double ColorBlueSkyT17_spect[97]; + static const double ColorBlackM8_spect[97]; + static const double ColorBlackM12_spect[97]; + static const double ColorBlackM13_spect[97]; + static const double ColorWhite2B12_spect[97]; + static const double ColorWhite2B14_spect[97]; + static const double JDC468_Blackred97_spect[97]; + static const double JDC468_Blackredbl443_spect[97]; + static const double JDC468_Blackbl27_spect[97]; + static const double JDC468_Blackbl28_spect[97]; + static const double JDC468_Blackgr214_spect[97]; + static const double JDC468_Blackbl436_spect[97]; + static const double JDC468_Whitebl455_spect[97]; + static const double JDC468_Blackvio101_spect[97]; + static const double JDC468_Whitebl92_spect[97]; + static const double JDC468_Greyredbl94_spect[97]; + static const double JDC468_Blue32_spect[97]; + static const double JDC468_Blue236_spect[97]; + static const double JDC468_Gre300_spect[97]; + static const double JDC468_Blue340_spect[97]; + static const double JDC468_Gree110_spect[97]; + static const double JDC468_Gree457_spect[97]; + static const double JDC468_Yel241_spect[97]; + static const double JDC468_Ora321_spect[97]; + static const double JDC468_Yellow353_spect[97]; + static const double JDC468_Mag465_spect[97]; + static const double JDC468_Mag333_spect[97]; + static const double JDC468_Mag203_spect[97]; + + + static const double JDC468_OraO18_spect[97]; //468 O18 + static const double JDC468_OraD17_spect[97]; //468 D17 + static const double Fictif_61greyspect[97];//468 K15 + static const double JDC468_K15_87greyspect[97]; + static const double JDC468_YelN10_spect[97]; //468 N10 + static const double JDC468_GreN7_spect[97]; //468 N7 + static const double JDC468_GreA10_spect[97]; //468 A10 + static const double JDC468_GreK7_spect[97]; //468 K7 + static const double JDC468_PurE24_spect[97]; //468 E24 static const double JDC468_BluH10_spect[97];//468 H10 static const double ColabSkin35_15_17_spect[97];//Skin L 35 static const double ColabSkin57_22_18_spect[97];//Skin L 57 @@ -196,6 +319,55 @@ public: static const double ColabSkin70_7_32_spect[97];//Skin L 77 static const double ColabSky60_0_m31_spect[97];//Sky L=60 static const double ColabSky42_0_m24_spect[97];//Sky L=42 + static const double J570_BlueB6_spect[97];//blue Cyan + static const double J570_BlueB15_spect[97];//blue Cyan + static const double J570_BlueC2_spect[97];//blue Cyan + static const double J570_BlueC14_spect[97];//blue Cyan + static const double J570_BlueC16_spect[97];//blue Cyan + static const double J570_BlueF1_spect[97];//blue Cyan + static const double J570_BlueF2_spect[97];//blue Cyan + static const double J570_BlueF10_spect[97];//blue Cyan + static const double J570_BlueF13_spect[97];//blue Cyan + static const double J570_BlueG9_spect[97];//blue Cyan + static const double J570_BlueG19_spect[97];//blue Cyan + static const double J570_BlueI5_spect[97];//blue Cyan + static const double J570_BlueH15_spect[97];//blue Cyan + static const double J570_BlueI3_spect[97];//blue Cyan + static const double J570_BlueI19_spect[97];//blue Cyan + static const double J570_BlueJ4_spect[97];//blue Cyan + static const double J570_BlueJ6_spect[97];//blue Cyan + static const double J570_BlueJ11_spect[97];//blue Cyan + static const double J570_BlueJ13_spect[97];//blue Cyan + static const double J570_BlueK5_spect[97];//blue Cyan + static const double J570_BlueN1_spect[97];//blue Cyan + static const double J570_BlueN4_spect[97];//blue Cyan + static const double J570_BlueO19_spect[97];//blue Cyan + static const double J570_BlueU8_spect[97];//blue Cyan + static const double J570_NeuN8_spect[97];//neutral + static const double J570_NeuN9_spect[97];//neutral + static const double J570_NeuO8_spect[97];//neutral + static const double J570_NeuO11_spect[97];//neutral + static const double J570_NeuD5_spect[97];//neutral + static const double J570_NeuE11_spect[97];//neutral + static const double J570_NeuK16_spect[97];//neutral + static const double J570_NeuM3_spect[97];//neutral + static const double J570_NeuN18_spect[97];//neutral + static const double J570_NeuQ1_spect[97];//neutral + static const double J570_NeuS7_spect[97];//neutral + static const double J570_NeuV10_spect[97];//neutral + static const double J570_NeuW18_spect[97];//neutral + static const double J570_NeuZ14_spect[97];//neutral + static const double J570_NeuC18_spect[97];//neutral + static const double J570_NeuD17_spect[97];//neutral + static const double J570_NeuJ11_spect[97];//neutral + static const double J570_NeuL4_spect[97];//neutral + static const double Colorlab_n72_n2_spect[97]; + static const double Colorlab_10_n70_spect[97]; + static const double Colorlab_n33_n70_spect[97]; + static const double Colorlab_n8_n74_spect[97]; + static const double Colorlab_19_n69_spect[97]; + static const double Colorlab_n80_10_spect[97]; + static const double Colorlab_n80_26_spect[97]; static void spectrum_to_xyz_daylight (double _m1, double _m2, double &x, double &y, double &z); static void spectrum_to_xyz_blackbody (double _temp, double &x, double &y, double &z); diff --git a/rtengine/iimage.h b/rtengine/iimage.h index ff016df1a..bda390895 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -26,6 +26,7 @@ #include "imagedimensions.h" #include "LUT.h" #include "coord2d.h" +#include "procparams.h" #include "color.h" #include "../rtgui/threadutils.h" @@ -102,6 +103,10 @@ public: { rm = gm = bm = 1.0; } + virtual void getAutoWBMultipliersloc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const procparams::WBParams & wbpar, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw) + { + rm = gm = bm = 1.0; + } }; diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index a18cca9d7..089cb3bae 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -105,6 +105,8 @@ public: virtual void getAutoWBMultipliers (double &rm, double &gm, double &bm) = 0; virtual ColorTemp getWB () const = 0; virtual ColorTemp getSpotWB (std::vector &red, std::vector &green, std::vector &blue, int tran, double equal) = 0; + virtual void WBauto(double &tempref, double &greenref, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const ColorManagementParams &cmp, const RAWParams &raw) = 0; + virtual void getrgbloc(bool local, bool gamma, bool cat02, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w) = 0; virtual double getDefGain () const { diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 01f9892bf..e718087ec 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -330,6 +330,21 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) // if a demosaic happened we should also call getimage later, so we need to set the M_INIT flag todo |= M_INIT; + bool autowb0 = false; + // bool autoitc = false; + autowb0 = (params->wb.method == "autold" || params->wb.method == "aut" || params->wb.method == "autosdw" || params->wb.method == "autedgsdw" || params->wb.method == "autitcgreen" || params->wb.method == "autedgrob" || params->wb.method == "autedg" || params->wb.method == "autorobust"); + // autoitc = (params.wb.method == "autitcgreen"); + // bool gamma = false; + // bool cat = false; +// if (params.wb.wbcat02Method == "cam" && autoitc) { +// cat = true; +// } + + if (autowb0) { + imgsrc->getrgbloc(false, false, false, 0, 0, fh, fw, 0, 0, fh, fw); + } + + if (highDetailNeeded) { highDetailRawComputed = true; } else { @@ -360,6 +375,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } } + bool autowb = false; + autowb = (params->wb.method == "autold" || params->wb.method == "aut" || params->wb.method == "autosdw" || params->wb.method == "autedgsdw" || params->wb.method == "autitcgreen" || params->wb.method == "autedgrob" || params->wb.method == "autedg" || params->wb.method == "autorobust"); + if (todo & (M_INIT | M_LINDENOISE | M_HDR)) { MyMutex::MyLock initLock(minit); // Also used in crop window diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 1c05fbbad..cfa35ee01 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1230,7 +1230,15 @@ const std::vector& WBParams::getWbEntries() { static const std::vector wb_entries = { {"Camera", WBEntry::Type::CAMERA, M("TP_WBALANCE_CAMERA"), 0, 1.f, 1.f, 0.f}, - {"Auto", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTO"), 0, 1.f, 1.f, 0.f}, + // {"Auto", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTO"), 0, 1.f, 1.f, 0.f}, + {"autitcgreen", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOITCGREEN"), 0, 1.f, 1.f, 0.f}, + {"autold", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOOLD"), 0, 1.f, 1.f, 0.f}, + {"aut", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTODEM"), 0, 1.f, 1.f, 0.f}, + {"autedg", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOEDGE"), 0, 1.f, 1.f, 0.f}, + {"autorobust", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOROB"), 0, 1.f, 1.f, 0.f}, + {"autosdw", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOSDW"), 0, 1.f, 1.f, 0.f}, + {"autedgsdw", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOEDGESW"), 0, 1.f, 1.f, 0.f}, + {"autedgrob", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOEDGEROB"), 0, 1.f, 1.f, 0.f}, {"Daylight", WBEntry::Type::DAYLIGHT, M("TP_WBALANCE_DAYLIGHT"), 5300, 1.f, 1.f, 0.f}, {"Cloudy", WBEntry::Type::CLOUDY, M("TP_WBALANCE_CLOUDY"), 6200, 1.f, 1.f, 0.f}, {"Shade", WBEntry::Type::SHADE, M("TP_WBALANCE_SHADE"), 7600, 1.f, 1.f, 0.f}, diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 3b2738405..7d4f613f9 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -37,6 +37,9 @@ #include "pdaflinesfilter.h" #include "camconst.h" #include "procparams.h" +#define BENCHMARK +#include "StopWatch.h" + #ifdef _OPENMP #include #endif @@ -450,8 +453,11 @@ RawImageSource::RawImageSource () , ri(nullptr) , rawData(0, 0) , green(0, 0) + , greenloc(0, 0) , red(0, 0) + , redloc(0, 0) , blue(0, 0) + , blueloc(0, 0) , rawDirty(true) , histMatchingParams(new procparams::ColorManagementParams) { @@ -2285,6 +2291,19 @@ void RawImageSource::flushRGB() if (blue) { blue(0, 0); } + + if (greenloc) { + greenloc(0, 0); + } + + if (redloc) { + redloc(0, 0); + } + + if (blueloc) { + blueloc(0, 0); + } + } void RawImageSource::HLRecovery_Global(const ToneCurveParams &hrp) @@ -4350,6 +4369,3764 @@ void RawImageSource::getRowStartEnd (int x, int &start, int &end) } } + +static void histoxyY(int bfhitc, int bfwitc, array2D & xc, array2D & yc, array2D & Yc, float *xxx, float * yyy, float * YYY, int * histxy, float * area, int * inter) + +{ + int nh = 0; +// int nc = 0; + // int nc2 = 0; + + for (int y = 0; y < bfhitc ; y++) { + for (int x = 0; x < bfwitc ; x++) { + + if (xc[y][x] < 0.12f && xc[y][x] > 0.03f) { // near Prophoto + + if (yc[y][x] < 0.2f && yc[y][x] > 0.1f) { + nh = 0; + histxy[nh]++; + area[nh] = 50.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + + YYY[nh] += Yc[y][x]; + + // nc = 0; + //blue hard + } else if (yc[y][x] < 0.3f) { + nh = 1; + histxy[nh]++; + area[nh] = 60.f; + inter[nh] = 1; + YYY[nh] += Yc[y][x]; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + + // nc = 1; + + //blue + } else if (yc[y][x] < 0.4f) { + nh = 2; + histxy[nh]++; + area[nh] = 80.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + // nc = 1; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.5f) { + //blue green + nh = 3; + histxy[nh]++; + area[nh] = 100.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + // nc = 1; + + } else if (yc[y][x] < 0.6f) { + nh = 4; + histxy[nh]++; + area[nh] = 120.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + // nc = 1; + + } else if (yc[y][x] < 0.82f) { + //green + nh = 5; + histxy[nh]++; + area[nh] = 240.f; + inter[nh] = 1; + // nc = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + + } + } else if (xc[y][x] < 0.24f) { + if (yc[y][x] < 0.2f && yc[y][x] > 0.05f) { + nh = 6; + histxy[nh]++; + area[nh] = 230.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + // nc = 2; + + } else if (yc[y][x] < 0.3f) { + nh = 7; + histxy[nh]++; + area[nh] = 240.f; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + // nc = 2; + + } else if (yc[y][x] < 0.4f) { + nh = 8; + histxy[nh]++; + area[nh] = 240.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + // nc = 2; + + } else if (yc[y][x] < 0.5f) { + nh = 9; + histxy[nh]++; + area[nh] = 240.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + // nc = 2; + // nc2 = 3; + + } else if (yc[y][x] < 0.6f) { + nh = 10; + histxy[nh]++; + area[nh] = 240.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + // nc = 3; + + } else if (yc[y][x] < 0.75f) { + nh = 11; + histxy[nh]++; + area[nh] = 400.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + // nc = 3; + + } + + } else if (xc[y][x] < 0.28f) {//blue sky and other + if (yc[y][x] < 0.2f && yc[y][x] > 0.1f) { + nh = 12; + histxy[nh]++; + area[nh] = 80.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.25f) { + nh = 13; + histxy[nh]++; + area[nh] = 20.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.29f) { + nh = 14; + histxy[nh]++; + area[nh] = 20.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.33f) { + nh = 15; + histxy[nh]++; + area[nh] = 20.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.37f) { + nh = 16; + histxy[nh]++; + area[nh] = 20.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.4f) { + nh = 17; + histxy[nh]++; + area[nh] = 15.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.45f) { + nh = 18; + histxy[nh]++; + area[nh] = 25.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + + } else if (yc[y][x] < 0.5f) { + nh = 19; + histxy[nh]++; + area[nh] = 25.f; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.6f) { + nh = 20; + histxy[nh]++; + area[nh] = 50.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.75f) { + nh = 21; + histxy[nh]++; + area[nh] = 60.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } + } else if (xc[y][x] < 0.31f) {//near neutral others + if (yc[y][x] < 0.2f && yc[y][x] > 0.1f) { + nh = 22; + histxy[nh]++; + area[nh] = 50.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.24f) { + nh = 23; + histxy[nh]++; + area[nh] = 12.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.29f) { + nh = 24; + histxy[nh]++; + area[nh] = 15.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + + } else if (yc[y][x] < 0.32f) { + nh = 25; + histxy[nh]++; + area[nh] = 9.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.36f) { + nh = 26; + histxy[nh]++; + area[nh] = 12.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.4f) { + nh = 27; + histxy[nh]++; + area[nh] = 12.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + + } else if (yc[y][x] < 0.5f) { + nh = 28; + histxy[nh]++; + area[nh] = 30.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.7f) { + nh = 29; + histxy[nh]++; + area[nh] = 45.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } + } else if (xc[y][x] < 0.325f) {//neutral 34 + if (yc[y][x] < 0.2f && yc[y][x] > 0.1f) { + nh = 30; + histxy[nh]++; + area[nh] = 25.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.24f) { + nh = 31; + histxy[nh]++; + area[nh] = 6.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.29f) { + nh = 32; + histxy[nh]++; + area[nh] = 7.5f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.32f) { + nh = 33; + histxy[nh]++; + area[nh] = 4.5f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.34f) { + nh = 34; + histxy[nh]++; + area[nh] = 3.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.37f) { + nh = 35; + histxy[nh]++; + area[nh] = 4.5f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.4f) { + nh = 36; + histxy[nh]++; + area[nh] = 4.5f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.45f) { + nh = 37; + histxy[nh]++; + area[nh] = 7.5f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.5f) { + nh = 38; + histxy[nh]++; + area[nh] = 7.5f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.55f) { + nh = 39; + histxy[nh]++; + area[nh] = 7.5f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.7f) { + nh = 40; + histxy[nh]++; + area[nh] = 20.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } + + } else if (xc[y][x] < 0.335f) {//neutral + if (yc[y][x] < 0.2f && yc[y][x] > 0.1f) { + nh = 41; + histxy[nh]++; + area[nh] = 15.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.24f) { + nh = 42; + histxy[nh]++; + area[nh] = 4.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.29f) { + nh = 43; + histxy[nh]++; + area[nh] = 5.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.32f) { + nh = 44; + histxy[nh]++; + area[nh] = 3.f; + inter[nh] = 5; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.33f) { + nh = 45; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 5; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + } else if (yc[y][x] < 0.34f) { + nh = 46; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 5; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + } else if (yc[y][x] < 0.35f) { + nh = 47; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 5; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + } else if (yc[y][x] < 0.36f) { + nh = 48; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 5; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.37f) { + nh = 47; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + } else if (yc[y][x] < 0.38f) { + nh = 48; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.4f) { + nh = 49; + histxy[nh]++; + area[nh] = 2.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.45f) { + nh = 50; + histxy[nh]++; + area[nh] = 5.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.5f) { + nh = 51; + histxy[nh]++; + area[nh] = 5.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.55f) { + nh = 52; + histxy[nh]++; + area[nh] = 5.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.7f) { + nh = 53; + histxy[nh]++; + area[nh] = 10.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } + + } else if (xc[y][x] < 0.345f) {//neutral 37 + if (yc[y][x] < 0.2f && yc[y][x] > 0.1f) { + nh = 54; + histxy[nh]++; + area[nh] = 20.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.24f) { + nh = 55; + histxy[nh]++; + area[nh] = 4.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.29f) { + nh = 56; + histxy[nh]++; + area[nh] = 5.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.32f) { + nh = 57; + histxy[nh]++; + area[nh] = 3.f; + inter[nh] = 5; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.33f) {//34 + nh = 58; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 5; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + } else if (yc[y][x] < 0.34f) { + nh = 59; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 5; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.35f) {//34 + nh = 60; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 5; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + } else if (yc[y][x] < 0.36f) {//34 + nh = 61; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 5; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.37f) { + nh = 62; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + } else if (yc[y][x] < 0.38f) { + nh = 63; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + } else if (yc[y][x] < 0.39f) { + nh = 64; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.4f) { + nh = 65; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + } else if (yc[y][x] < 0.42f) { + nh = 66; + histxy[nh]++; + area[nh] = 2.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.45f) { + nh = 67; + histxy[nh]++; + area[nh] = 3.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + } else if (yc[y][x] < 0.48f) { + nh = 68; + histxy[nh]++; + area[nh] = 3.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.5f) { + nh = 69; + histxy[nh]++; + area[nh] = 2.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.55f) { + nh = 70; + histxy[nh]++; + area[nh] = 5.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.65f) { + nh = 71; + histxy[nh]++; + area[nh] = 2.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } + + } else if (xc[y][x] < 0.355f) {//neutral 37 + if (yc[y][x] < 0.2f && yc[y][x] > 0.1f) { + nh = 72; + histxy[nh]++; + area[nh] = 20.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.24f) { + nh = 73; + histxy[nh]++; + area[nh] = 4.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.29f) { + nh = 74; + histxy[nh]++; + area[nh] = 5.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.32f) { + nh = 75; + histxy[nh]++; + area[nh] = 3.f; + inter[nh] = 5; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.33f) {//34 + nh = 76; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 5; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + } else if (yc[y][x] < 0.34f) { + nh = 77; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 5; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.35f) {//34 + nh = 78; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 5; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + } else if (yc[y][x] < 0.36f) {//34 + nh = 79; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 5; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.37f) { + nh = 80; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + } else if (yc[y][x] < 0.38f) { + nh = 81; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + } else if (yc[y][x] < 0.39f) { + nh = 82; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.4f) { + nh = 83; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + } else if (yc[y][x] < 0.42f) { + nh = 84; + histxy[nh]++; + area[nh] = 2.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.45f) { + nh = 85; + histxy[nh]++; + area[nh] = 3.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + } else if (yc[y][x] < 0.48f) { + nh = 68; + histxy[nh]++; + area[nh] = 3.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.5f) { + nh = 86; + histxy[nh]++; + area[nh] = 2.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.55f) { + nh = 87; + histxy[nh]++; + area[nh] = 5.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.65f) { + nh = 88; + histxy[nh]++; + area[nh] = 2.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } + + } else if (xc[y][x] < 0.365f) { //0.4 + if (yc[y][x] < 0.2f && yc[y][x] > 0.15f) { + nh = 89; + histxy[nh]++; + area[nh] = 20.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + + } else if (yc[y][x] < 0.24f) { + nh = 90; + histxy[nh]++; + area[nh] = 4.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.29f) { + nh = 91; + histxy[nh]++; + area[nh] = 5.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.32f) { + nh = 92; + histxy[nh]++; + area[nh] = 3.f; + inter[nh] = 5; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + } else if (yc[y][x] < 0.33f) { + nh = 93; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 5; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.34f) { + nh = 94; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 5; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + } else if (yc[y][x] < 0.36f) { + nh = 95; + histxy[nh]++; + area[nh] = 2.f; + inter[nh] = 5; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.37f) { + nh = 96; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + } else if (yc[y][x] < 0.38f) { + nh = 97; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + } else if (yc[y][x] < 0.39f) { + nh = 98; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.4f) { + nh = 99; + histxy[nh]++; + area[nh] = 1.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + } else if (yc[y][x] < 0.42f) { + nh = 100; + histxy[nh]++; + area[nh] = 2.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.45f) { + nh = 101; + histxy[nh]++; + area[nh] = 3.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.5f) { + nh = 102; + histxy[nh]++; + area[nh] = 5.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.55f) { + nh = 103; + histxy[nh]++; + area[nh] = 5.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + + } else if (yc[y][x] < 0.63f) { + nh = 104; + histxy[nh]++; + area[nh] = 10.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } + + } else if (xc[y][x] < 0.405f) {//45 + if (yc[y][x] < 0.2f && yc[y][x] > 0.15f) { + nh = 105; + histxy[nh]++; + area[nh] = 40.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.24f) { + nh = 106; + histxy[nh]++; + area[nh] = 16.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.29f) { + nh = 107; + histxy[nh]++; + area[nh] = 20.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.32f) { + nh = 108; + histxy[nh]++; + area[nh] = 12.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.34f) { + nh = 109; + histxy[nh]++; + area[nh] = 8.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.37f) { + nh = 110; + histxy[nh]++; + area[nh] = 12.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.4f) { + nh = 111; + histxy[nh]++; + area[nh] = 12.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.45f) { + nh = 112; + histxy[nh]++; + area[nh] = 20.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.5f) { + nh = 113; + histxy[nh]++; + area[nh] = 20.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.55f) { + nh = 114; + histxy[nh]++; + area[nh] = 20.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + + } else if (yc[y][x] < 0.6f) { + nh = 115; + histxy[nh]++; + area[nh] = 16.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } + + } else if (xc[y][x] < 0.445f) {//45 + if (yc[y][x] < 0.2f && yc[y][x] > 0.15f) { + nh = 116; + histxy[nh]++; + area[nh] = 40.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.24f) { + nh = 117; + histxy[nh]++; + area[nh] = 16.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.29f) { + nh = 118; + histxy[nh]++; + area[nh] = 20.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.32f) { + nh = 119; + histxy[nh]++; + area[nh] = 12.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.34f) { + nh = 120; + histxy[nh]++; + area[nh] = 8.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.37f) { + nh = 121; + histxy[nh]++; + area[nh] = 12.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.4f) { + nh = 122; + histxy[nh]++; + area[nh] = 12.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.45f) { + nh = 123; + histxy[nh]++; + area[nh] = 20.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.5f) { + nh = 124; + histxy[nh]++; + area[nh] = 20.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.55f) { + nh = 125; + histxy[nh]++; + area[nh] = 20.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + + } else if (yc[y][x] < 0.58f) { + nh = 126; + histxy[nh]++; + area[nh] = 16.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } + + } else if (xc[y][x] < 0.495f) { + if (yc[y][x] < 0.2f && yc[y][x] > 0.15f) { + nh = 127; + histxy[nh]++; + area[nh] = 40.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.24f) { + nh = 128; + histxy[nh]++; + area[nh] = 20.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.29f) { + nh = 129; + histxy[nh]++; + area[nh] = 25.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.32f) { + nh = 130; + histxy[nh]++; + area[nh] = 15.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.34f) { + nh = 131; + histxy[nh]++; + area[nh] = 10.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.37f) { + nh = 132; + histxy[nh]++; + area[nh] = 15.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.4f) { + nh = 133; + histxy[nh]++; + area[nh] = 15.f; + inter[nh] = 3; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.45f) { + nh = 134; + histxy[nh]++; + area[nh] = 25.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.5f) { + nh = 135; + histxy[nh]++; + area[nh] = 25.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.55f) { + nh = 136; + histxy[nh]++; + area[nh] = 20.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } + } else if (xc[y][x] < 0.545f) { + if (yc[y][x] < 0.2f && yc[y][x] > 0.15f) { + nh = 137; + histxy[nh]++; + area[nh] = 25.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.24f) { + nh = 138; + histxy[nh]++; + area[nh] = 20.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.29f) { + nh = 139; + histxy[nh]++; + area[nh] = 25.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.32f) { + nh = 140; + histxy[nh]++; + area[nh] = 15.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.34f) { + nh = 141; + histxy[nh]++; + area[nh] = 10.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.37f) { + nh = 142; + histxy[nh]++; + area[nh] = 15.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.4f) { + nh = 143; + histxy[nh]++; + area[nh] = 15.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.45f) { + nh = 144; + histxy[nh]++; + area[nh] = 25.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.5f) { + nh = 145; + histxy[nh]++; + area[nh] = 25.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + + + } + + } else if (xc[y][x] < 0.595f) { + if (yc[y][x] < 0.22f && yc[y][x] > 0.15f) { + nh = 146; + histxy[nh]++; + area[nh] = 15.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.25f) { + nh = 147; + histxy[nh]++; + area[nh] = 25.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.3f) { + nh = 148; + histxy[nh]++; + area[nh] = 25.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.35f) { + nh = 149; + histxy[nh]++; + area[nh] = 25.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.4f) { + nh = 160; + histxy[nh]++; + area[nh] = 25.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + + } else if (yc[y][x] < 0.45f) { + nh = 161; + histxy[nh]++; + area[nh] = 15.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } + + } else if (xc[y][x] < 0.65f) { + if (yc[y][x] < 0.25f && yc[y][x] > 0.12f) { + nh = 162; + histxy[nh]++; + area[nh] = 15.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + + } else if (yc[y][x] < 0.3f) { + nh = 163; + histxy[nh]++; + area[nh] = 25.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } else if (yc[y][x] < 0.35f) { + nh = 164; + histxy[nh]++; + area[nh] = 25.f; + inter[nh] = 2; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + + } else if (yc[y][x] < 0.45f) { + nh = 165; + histxy[nh]++; + area[nh] = 15.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + } + + } else if (xc[y][x] < 0.75f && yc[y][x] > 0.1f) { + nh = 166; + histxy[nh]++; + area[nh] = 25.f; + inter[nh] = 1; + xxx[nh] += xc[y][x]; + yyy[nh] += yc[y][x]; + YYY[nh] += Yc[y][x]; + + + } + + } + } +} + + + + +void static studentXY(array2D & YYcurr, array2D & reffYY, int sizcurr, int Nc, int tt, float & student) +{ + //calculate Student coeff YY + float somcurrY = 0.f; + float somreffY = 0.f; + float somcurr2Y = 0.f; + float somreff2Y = 0.f; + float somsqueccurrY = 0.f; + float somsquecreffY = 0.f; + int sizestucurrY = sizcurr; + int sizestureffY = Nc; + + for (int i = 0; i < sizestucurrY; i++) { + somcurrY += 100.f * YYcurr[i][tt]; + //sum observations first group + } + + for (int i = 0; i < sizestureffY; i++) { + somreffY += 100.f * reffYY[i][tt]; + //sum observations second group + + } + + + for (int i = 0; i < sizestucurrY; i++) { + somcurr2Y += SQR(100.f * YYcurr[i][tt]); + //sum sqr observations first group + + } + + for (int i = 0; i < sizestureffY; i++) { + somreff2Y += SQR(100.f * reffYY[i][tt]); + //sum sqr observations second group + + } + + somsqueccurrY = somcurr2Y - (SQR(somcurrY)) / sizestucurrY; + //sum sqr differences first + somsquecreffY = somreff2Y - (SQR(somreffY)) / sizestureffY; + //sum sqr differences second + + float diviY = sqrt(((somsqueccurrY + somsquecreffY) * (1.f / (float)sizestucurrY + 1.f / (float)sizestureffY)) / (sizestucurrY + sizestureffY - 2)); + //divisor student + float numerY = ((float)somcurrY / (float)sizestucurrY) - ((float)somreffY / (float)sizestureffY); + //numerator student +// printf("num=%f divY=%f \n", numerY, diviY); + + student = numerY / diviY ; + //student coeeficient +} + +/* +static void SdwWB(const array2D &redloc, const array2D &greenloc, const array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm) +{ + //Standard deviation weighted Gary World - from Lan rt al. + constexpr float clipHigh = 64000.f; + constexpr float clipLow = 1500.f; + + float MeanG[12] = { }; + float SigmaG[12] = { }; + + float MeanR[12] = { }; + float SigmaR[12] = { }; + + float MeanB[12] = { }; + float SigmaB[12] = { }; + + //divide in 12 areas + int partw, parth; + int yh, xw; + + if (bfw > bfh) { + partw = bfw / 4; + parth = bfh / 3; + xw = 4; + yh = 3; + } else { + partw = bfw / 3; + parth = bfh / 4; + xw = 3; + yh = 4; + } + + float SigmaGG = 0.f, SigmaRR = 0.f, SigmaBB = 0.f; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic) collapse(2) +#endif + + for (int w = 0; w < xw ; ++w) { + for (int h = 0; h < yh ; ++h) { + float meanr = 0.f; + float meang = 0.f; + float meanb = 0.f; + int nr = 0; + int ng = 0; + int nb = 0; + + for (int y = h * parth; y < (h + 1) * parth; ++y) { + for (int x = w * partw; x < (w + 1) * partw; ++x) { + if (greenloc[y][x] > clipLow && greenloc[y][x] < clipHigh) { + meang += greenloc[y][x]; + ng++; + } + + if (redloc[y][x] > clipLow && redloc[y][x] < clipHigh) { + meanr += redloc[y][x]; + nr++; + } + + if (blueloc[y][x] > clipLow && blueloc[y][x] < clipHigh) { + meanb += blueloc[y][x]; + nb++; + } + } + } + + int i = w + h * xw; + + if (ng > 0) { + meang /= ng; + } + + if (nr > 0) { + meanr /= nr; + } + + if (nb > 0) { + meanb /= nb; + } + + MeanG[i] = meang; + MeanR[i] = meanr; + MeanB[i] = meanb; + + float sigmar = 0.f; + float sigmag = 0.f; + float sigmab = 0.f; + + for (int y = h * parth; y < (h + 1) * parth; ++y) { + for (int x = w * partw; x < (w + 1) * partw; ++x) { + if (greenloc[y][x] > clipLow && greenloc[y][x] < clipHigh) { + sigmag += SQR(meang - greenloc[y][x]) ; + } + + if (redloc[y][x] > clipLow && redloc[y][x] < clipHigh) { + sigmar += SQR(meanr - redloc[y][x]); + } + + if (blueloc[y][x] > clipLow && blueloc[y][x] < clipHigh) { + sigmab += SQR(meanb - blueloc[y][x]); + } + } + } + + SigmaG[i] = sigmag; + SigmaR[i] = sigmar; + SigmaB[i] = sigmab; + + if (ng > 0) { + SigmaG[i] = sqrt(SigmaG[i] / ng); + } + + if (nr > 0) { + SigmaR[i] = sqrt(SigmaR[i] / nr); + } + + if (nb > 0) { + SigmaB[i] = sqrt(SigmaB[i] / nb); + } + +#ifdef _OPENMP + #pragma omp critical +#endif + { + SigmaGG += SigmaG[i]; + SigmaRR += SigmaR[i]; + SigmaBB += SigmaB[i]; + } + } + } + + float StdavgG = 0.f, StdavgR = 0.f, StdavgB = 0.f; + constexpr float epsilo = 0.01f; + + for (int k = 0; k < 12 ; k++) { + StdavgG += (SigmaG[k] * MeanG[k]) / (SigmaGG + epsilo); + StdavgR += (SigmaR[k] * MeanR[k]) / (SigmaRR + epsilo); + StdavgB += (SigmaB[k] * MeanB[k]) / (SigmaBB + epsilo); + + } + + avg_gm = (StdavgG + StdavgB + StdavgR) / (3 * StdavgG); + avg_rm = (StdavgG + StdavgB + StdavgR) / (3 * StdavgR); + avg_bm = (StdavgG + StdavgB + StdavgR) / (3 * StdavgB); + + avg_gm *= 10000.f; + avg_rm *= 10000.f; + avg_bm *= 10000.f; + +} +*/ + +/* +static void RobustWB(array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm) +{ + BENCHFUN + // inspired by "Robust automatic WB algorithm using grey colour points in Images" + // Jy Huo, Yl Chang, J.Wang Xx Wei + // robust = true; +// printf("Robust WB\n"); + const int bfwr = bfw / 4 + 1 ;//5 middle value to keep good result and reduce time + const int bfhr = bfh / 4 + 1; + + array2D rl(bfwr, bfhr); + array2D gl(bfwr, bfhr); + array2D bl(bfwr, bfhr); + + // copy data to smaller arrays to reduce memory pressure in do-while loop +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int y = 0; y < bfh ; y += 4) { + int yy = y / 4; + + for (int x = 0; x < bfw ; x += 4) { + int xx = x / 4; + rl[yy][xx] = redloc[y][x]; + gl[yy][xx] = greenloc[y][x]; + bl[yy][xx] = blueloc[y][x]; + } + } + + float *Uba = new float [204]; + float *Vba = new float [204]; + + constexpr float Th = 0.1321f; //Threshold 0.1321f 0.097f 0.2753f if necessary + //wr, wb, wg multipliers for each channel RGB + float wr = 1.f; + float wg = 1.f; + float wb = 1.f; + constexpr float mu = 0.002f;//std variation + constexpr float mu2 = 0.0012f;//first reduce variation + constexpr float mu3 = 0.0007f;//second variation + int itera = 0; + int minim = 1; + int realitera = 1; + + int Kx = 0; + + do {//iterative WB + float Ubarohm = 0.f, Vbarohm = 0.f; + itera++; + int Nf = 0; +#ifdef _OPENMP + #pragma omp parallel for reduction(+:Ubarohm, Vbarohm, Nf) schedule(dynamic,16) +#endif + + for (int y = 0; y < bfhr ; ++y) { + for (int x = 0; x < bfwr ; ++x) { + + //calculate YUV from RGB and wr, wg, wb + float Y0 = 0.299f * wr * rl[y][x] + 0.587f * wg * gl[y][x] + 0.114f * wb * bl[y][x]; + float U0 = -0.14713f * wr * rl[y][x] - 0.28886f * wg * gl[y][x] + 0.436f * wb * bl[y][x]; + float V0 = 0.615f * wr * rl[y][x] - 0.51498f * wg * gl[y][x] - 0.10001f * wb * bl[y][x]; + + //FYUX function to detect grey points + if (fabs(U0) + fabs(V0) < Th * Y0) {//grey values + Nf++; + Ubarohm += U0; + Vbarohm += V0; + } + + + } + } + + Ubarohm /= Nf; + Uba[itera] = Ubarohm;//stock value Ubarohm + Vba[itera] = Vbarohm;//stock value Vbarohm + + if (itera > 5 && minim < 2) { + if ((fabs(Uba[itera] - Uba[itera - 2]) < 0.001f) && (fabs(Vba[itera] - Vba[itera - 2]) < 0.001f)) { + //printf("DUba=%f Dvba=%f\n", Uba[itera] - Uba[itera - 2], Vba[itera] - Vba[itera - 2]); + realitera = itera; + minim = 2; //accelerate convergence - not in original algorithm + } + } + + if (itera > 10 && minim == 2 && itera > realitera + 3) { + if ((fabs(Uba[itera] - Uba[itera - 2]) < 0.001f) && (fabs(Vba[itera] - Vba[itera - 2]) < 0.001f)) { + minim = 3; //accelerate second time if necessary convergence, - not in original algorithm + } + + } + + Vbarohm /= Nf; // QUESTION INGO: why is this not done before the value is saved to Vba[itera]? Bug or intentional? + // printf ("Nf=%i max=%i U=%f V=%f\n", Nf, bfh*bfw, Ubarohm, Vbarohm); + Kx = 0; + constexpr float aa = 0.8f;//superior limit if epsil > aa increase variation + constexpr float bb = 0.15f;//inferior limit if epsil < bb exit + int ind = 1; + + float phi = 0.f; + + if ((fabs(Ubarohm) > fabs(Vbarohm)) || (Ubarohm != 0.f && fabs(Ubarohm) == fabs(Vbarohm))) { + phi = Ubarohm; + ind = 1; + } else if (fabs(Ubarohm) < fabs(Vbarohm)) { + phi = Vbarohm; + ind = 2; + } else if (Ubarohm == 0.f && Vbarohm == 0.f) { + phi = 0.f; + ind = 3; + } + + int sign = SGN(-phi); + + if (fabs(phi) >= aa) { + Kx = 2 * sign; + } + + if (fabs(phi) < aa && fabs(phi) >= bb) { + Kx = sign; + } + + if (fabs(phi) < bb) { + Kx = 0; + } + + // + float mur = mu; + + if (minim == 2) { + mur = mu2; + } else if (minim == 3) { + mur = mu3; + } + + if (ind == 1) { + wb += mur * Kx; + } else if (ind == 2) { + wr += mur * Kx; + } + + //printf ("epsil=%f iter=%i wb=%f wr=%f U=%f V=%f mu=%f\n", fabs (epsil), itera, wb, wr, Ubarohm, Vbarohm, mur); + } while (Kx != 0 && itera <= 200); //stop iterations in normal case Kx =0, or if WB iteration do not converge + + delete Uba; + delete Vba; +// printf("epsil=%f iter=%i wb=%f wr=%f mu=%f\n", fabs(epsil), itera, wb, wr, mur); + + avg_rm = 10000.* wr; + avg_gm = 10000.* wg; + avg_bm = 10000.* wb; + // printf("Robust ar%f ag=%f ab=%f\n", avg_rm, avg_gm, avg_bm); + +} +*/ +/* +static void SobelWB(array2D &redsobel, array2D &greensobel, array2D &bluesobel, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh) +{ + BENCHFUN + int GX[3][3]; + int GY[3][3]; + + //Sobel Horizontal + GX[0][0] = 1; + GX[0][1] = 0; + GX[0][2] = -1; + GX[1][0] = 2; + GX[1][1] = 0; + GX[1][2] = -2; + GX[2][0] = 1; + GX[2][1] = 0; + GX[2][2] = -1; + + //Sobel Vertical + GY[0][0] = 1; + GY[0][1] = 2; + GY[0][2] = 1; + GY[1][0] = 0; + GY[1][1] = 0; + GY[1][2] = 0; + GY[2][0] = -1; + GY[2][1] = -2; + GY[2][2] = -1; + // inspired from Chen Guanghua Zhang Xiaolong + // edge detection to improve auto WB + + { +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw ; x++) { + if (y == 0 || y == bfh - 1 || x == 0 || x == bfw - 1) { + redsobel[y][x] = 0.f; + greensobel[y][x] = 0.f; + bluesobel[y][x] = 0.f; + } else { + float sumXr = 0.f; + float sumYr = 0.f; + float sumXg = 0.f; + float sumYg = 0.f; + float sumXb = 0.f; + float sumYb = 0.f; + + for (int i = -1; i < 2; i++) { + for (int j = -1; j < 2; j++) { + sumXr += GX[j + 1][i + 1] * redloc[y + i][x + j]; + sumXg += GX[j + 1][i + 1] * greenloc[y + i][x + j]; + sumXb += GX[j + 1][i + 1] * blueloc[y + i][x + j]; + sumYr += GY[j + 1][i + 1] * redloc[y + i][x + j]; + sumYg += GY[j + 1][i + 1] * greenloc[y + i][x + j]; + sumYb += GY[j + 1][i + 1] * blueloc[y + i][x + j]; + } + } + + //Edge strength + //we can add if need teta = atan2 (sumYr, sumXr) + redsobel[y][x] = CLIP(sqrt(SQR(sumXr) + SQR(sumYr))); + greensobel[y][x] = CLIP(sqrt(SQR(sumXg) + SQR(sumYg))); + bluesobel[y][x] = CLIP(sqrt(SQR(sumXb) + SQR(sumYb))); + } + } + } + } +} +*/ + +void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, const ColorManagementParams &cmp, const RAWParams &raw, const WBParams & wbpar) +{ + /* + copyright Jacques Desmis 6 - 2018 jdesmis@gmail.com + + This algorithm try to find temperature correlation between 20 to 200 color between 200 spectral color and about 20 to 55 color found in the image, I just found the idea in the web "correlate with chroma" instead of RGB grey point,but I don't use any algo found on the web. + + I have test many many algo to find the first one that work :) + Probably (sure) there are improvment to do... + + I have create a table temperature with temp and white point with 100 values between 2000K and 12000K we can obviously change these values, more...with different steps + I have create or recuparate and transformed 200 spectral colors from Colorchecker24, others color and my 468 colors target, or from web flowers, etc. with a step of 5nm, I think it is largey enough. + I think this value of 200 is now complete: I tested correlation with 60, 90, 100, 120, 155...better student increase with number of color, but now it seems stabilized + Of course we can increase this number :) + + 1) for the cuurent raw file we create a table for each temp of RGB multipliers + 2) then, I choose the "camera temp" to initialize calculation (why not) + 3) for this temp, I calculated XYZ values for the 200 spectrals datas + 4) then I create for the image an "histogram", but for xyY (Cie 1931 color space) + 5) for each pixel (in fact to accelerate only 1/10 for and 1/10 for y), I determine for each couple xy, the number of occurences + 6) I sort this result in ascending order + 7) in option we can sort in another maner to take into account chroma : chromax = x - white point x, chromay = y - white point y + 8) then I compare this result, with spectral datas found above in 3) with deltaE (limited to chroma) + 9) at this point we have xyY values that match Camera temp, and spectral datas associated + 10) then I recalculate RGB values from xyY histogram + 11) after, I vary temp, between 2000K to 12000K + 12) RGB values are recalcualted from 10) with RGB multipliers, and then xyY are calcualted for each temp + 13) spectral datas choose are recalculated with temp betwen 2000K to 12000K with matrix spectral calculation, that leeds to xyY values + 14) I calculated for each couple xy, Student correlation (without Snedecor test) + 15) the good result, is the best correlation + 16) we have found the best temperature where color image and color refences are correlate + 17) after we pass this value to improccoordinator + + 18) in a second part if camera green is out, I used an "extra" algorithm + 19) we make vary green between 2 limits (settings in option) + 20) betwen these green limits, we make slightly vary temp (settings in options) and recalculated RGB multipliers + 21) with this multipliers for the RGB color find in histogram we recalculate xyY + 22) we re-adjust references color for these xyY from 20) + 23) we add if chroma image is very low, k colors to degrad correlation + 24) then find all Student correlation for each couple green / temp + 25) sort these Student values, and choose the minimum + 26) then for the 3 better couple "temp / green" choose the one wher grren is neraest from 1. + + Some variables or function are not used, keep in case of + I have test with cat02 but result are not stable enough ! why ??, therefore cat02 neutralized + This operation is done (actually) 100 times and compare Student coefficient, and keep the absolute minimum, We can probably optimize.... + But actually the goal is to find the good algorithm ! + + I think, this algo is very good in most cases :) ...to verify of course. + You can used it in images :flowers, landscape, portrait, skin, where illuminants are "normal" (daylight, blackbody) + You must avoid when illuminant is non standard (fluorescent, LED...) and also, when the subject is lost in the image (some target to generate profiles). + + You can change 4 parameters in option.cc + Itcwb_thres : 34 by default ==> number of color used in final algorithm - between 10 and max 55 + Itcwb_sort : false by default, can improve algo if true, ==> sort value in something near chroma order, instead of histogram number + Itcwb_greenrange : 0 amplitude of green variation - between 0 to 2 + Itcwb_greendeltatemp : 1 - delta temp in green iterate loop for "extra" - between 0 to 4 + Itcwb_forceextra : false - if true force algorithm "extra" ("extra" is used when cmaera wbsettings are wrong) to all images + Itcwb_sizereference : 3 by default, can be set to 5 ==> size of reference color comapre to size of histogram real color + itcwb_delta : 1 by defaut can be set between 0 to 5 ==> delta temp to build histogram xy - if camera temp is not probably good + */ + // BENCHFUN + BENCHFUN + + + TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix("sRGB"); + double wp[3][3] = { + {wprof[0][0], wprof[0][1], wprof[0][2]}, + {wprof[1][0], wprof[1][1], wprof[1][2]}, + {wprof[2][0], wprof[2][1], wprof[2][2]} + }; + + TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix("sRGB"); + //inverse matrix user select + double wip[3][3] = { + {wiprof[0][0], wiprof[0][1], wiprof[0][2]}, + {wiprof[1][0], wiprof[1][1], wiprof[1][2]}, + {wiprof[2][0], wiprof[2][1], wiprof[2][2]} + }; + + array2D xc; + array2D yc; + array2D Yc; + + + + array2D histcurr; + array2D histcurrref; + + array2D xxyycurr; + array2D xxyycurr_reduc; + array2D xx_curref; + array2D yy_curref; + array2D YY_curref; + array2D xx_curref_reduc; + array2D yy_curref_reduc; + array2D R_curref_reduc; + array2D G_curref_reduc; + array2D B_curref_reduc; + + array2D reff_spect_xxyy; + array2D reff_spect_xxyy_prov; + array2D YYcurr; + array2D YY_curref_reduc; + array2D YYcurr_reduc; + // array2D reffYY; + // array2D reffYY_prov; + + array2D reff_spect_yy_camera; + array2D reff_spect_xx_camera; + + + int bfwitc = bfw / 10 + 1 ;// 10 arbitrary value ; perhaps 4 or 5 or 20 + int bfhitc = bfh / 10 + 1; + + xc(bfwitc, bfhitc); + yc(bfwitc, bfhitc); + Yc(bfwitc, bfhitc); + + typedef struct WbGreen { + double green; + float snedecor;//1. actually but put in case of confiance interval + } WbGreen; + + WbGreen gree[118] = {//symetric coefficient between 0.717 and 1.40 + {0.400, 1.f}, + {0.500, 1.f}, + {0.550, 1.f}, + {0.600, 1.f}, + {0.625, 1.f}, + {0.650, 1.f}, + {0.675, 1.f}, + {0.700, 1.f}, + {0.714, 1.f}, + {0.727, 1.f}, + {0.741, 1.f}, + {0.755, 1.f}, + {0.769, 1.f}, + {0.784, 1.f}, + {0.800, 1.f}, + {0.806, 1.f}, + {0.813, 1.f}, + {0.820, 1.f}, + {0.826, 1.f}, + {0.833, 1.f}, + {0.840, 1.f}, + {0.847, 1.f}, + {0.855, 1.f}, + {0.862, 1.f}, + {0.870, 1.f}, + {0.877, 1.f}, + {0.885, 1.f}, + {0.893, 1.f}, + {0.901, 1.f}, + {0.909, 1.f}, + {0.917, 1.f}, + {0.926, 1.f}, + {0.935, 1.f}, + {0.943, 1.f}, + {0.952, 1.f}, + {0.962, 1.f}, + {0.971, 1.f}, + {0.980, 1.f}, + {0.990, 1.f}, + {1.000, 1.f},//39 + {1.010, 1.f}, + {1.020, 1.f}, + {1.030, 1.f}, + {1.040, 1.f}, + {1.050, 1.f}, + {1.060, 1.f}, + {1.070, 1.f}, + {1.080, 1.f}, + {1.090, 1.f}, + {1.100, 1.f}, + {1.110, 1.f}, + {1.120, 1.f}, + {1.130, 1.f}, + {1.140, 1.f}, + {1.150, 1.f}, + {1.160, 1.f}, + {1.170, 1.f}, + {1.180, 1.f}, + {1.190, 1.f}, + {1.200, 1.f}, + {1.210, 1.f}, + {1.220, 1.f}, + {1.230, 1.f}, + {1.240, 1.f}, + {1.250, 1.f}, + {1.275, 1.f}, + {1.300, 1.f}, + {1.325, 1.f}, + {1.350, 1.f}, + {1.375, 1.f}, + {1.400, 1.f}, + {1.425, 1.f}, + {1.450, 1.f}, + {1.475, 1.f}, + {1.500, 1.f}, + {1.525, 1.f}, + {1.550, 1.f}, + {1.575, 1.f}, + {1.600, 1.f}, + {1.633, 1.f}, + {1.666, 1.f}, + {1.700, 1.f}, + {1.733, 1.f}, + {1.766, 1.f}, + {1.800, 1.f}, + {1.833, 1.f}, + {1.866, 1.f}, + {1.900, 1.f}, + {1.933, 1.f}, + {1.966, 1.f}, + {2.000, 1.f}, + {2.033, 1.f}, + {2.066, 1.f}, + {2.100, 1.f}, + {2.133, 1.f}, + {2.166, 1.f}, + {2.200, 1.f}, + {2.250, 1.f}, + {2.300, 1.f}, + {2.350, 1.f}, + {2.400, 1.f}, + {2.450, 1.f}, + {2.500, 1.f}, + {2.550, 1.f}, + {2.600, 1.f}, + {2.650, 1.f}, + {2.700, 1.f}, + {2.750, 1.f}, + {2.800, 1.f}, + {2.850, 1.f}, + {2.900, 1.f}, + {2.950, 1.f}, + {3.000, 1.f}, + {3.200, 1.f}, + {3.400, 1.f}, + {3.600, 1.f}, + {3.800, 1.f}, + {4.000, 1.f} + }; + int N_g = sizeof(gree) / sizeof(gree[0]); //number of green + + typedef struct RangeGreen { + int begin; + int end; + int ng; + } RangeGreen; + + RangeGreen Rangestandard; + Rangestandard.begin = 8; + Rangestandard.end = 70; + Rangestandard.ng = 62; + + RangeGreen Rangeextand; + Rangeextand.begin = 4; + Rangeextand.end = 77; + Rangeextand.ng = 73; + + RangeGreen Rangemax; + Rangemax.begin = 0; + Rangemax.end = N_g; + Rangemax.ng = N_g; + + RangeGreen Rangegreenused; + + if (settings->itcwb_greenrange == 0) { + Rangegreenused = Rangestandard; + } + + else if (settings->itcwb_greenrange == 1) { + Rangegreenused = Rangeextand; + } else { + Rangegreenused = Rangemax; + } + + // printf("rangemin=%i rangmax=%i\n", Rangegreenused.begin, Rangegreenused.end); + + + + typedef struct WbTxyz { + double Tem; + double XX; + double ZZ; + } WbTxyz; + //we can change step to increase precision if need - also in Colortemp.cc with same changes + //I don't know how to pass this structure to Colortemp ! + WbTxyz Txyz[118] = {//temperature Xwb Zwb 118 values x wb and y wb are calculated after + {2001., 1.273842, 0.145295}, + {2101., 1.244008, 0.167533}, + {2201., 1.217338, 0.190697}, + {2301., 1.193444, 0.214632}, + {2401., 1.171996, 0.239195}, + {2501., 1.152883, 0.264539}, + {2605., 1.134667, 0.290722}, + {2655., 1.126659, 0.303556}, + {2705., 1.119049, 0.316446}, + {2755., 1.111814, 0.329381}, + {2803., 1.105381, 0.342193}, + {2856., 1.098258, 0.355599}, + {2910., 1.091550, 0.369645}, + {2960., 1.085649, 0.382655}, + {3003., 1.080982, 0.394258}, + {3050., 1.075727, 0.406057}, + {3103., 1.070277, 0.419815}, + {3153., 1.065384, 0.432769}, + {3203., 1.060906, 0.446161}, + {3250., 1.056535, 0.457806}, + {3303., 1.052034, 0.471422}, + {3353., 1.047990, 0.484218}, + {3400., 1.044547, 0.496719}, + {3450., 1.040667, 0.508891}, + {3500., 1.037145, 0.521523}, + {3550., 1.033783, 0.534090}, + {3600., 1.030574, 0.546590}, + {3650., 1.027510, 0.559020}, + {3699., 1.024834, 0.571722}, + {3801., 1.019072, 0.596102}, + {3851., 1.016527, 0.608221}, + {3902., 1.014244, 0.621136}, + {3952., 1.011729, 0.632447}, + {4002., 0.996153, 0.609518}, + {4052., 0.993720, 0.620805}, + {4102., 0.993908, 0.631520}, + {4152., 0.989179, 0.643262}, + {4202., 0.989283, 0.653999}, + {4252., 0.985039, 0.665536}, + {4302., 0.985067, 0.676288}, + {4352., 0.981271, 0.687599}, + {4402., 0.981228, 0.698349}, + {4452., 0.977843, 0.709425}, + {4502., 0.977736, 0.720159}, + {4552., 0.974728, 0.730993}, + {4602., 0.974562, 0.741698}, + {4652., 0.971899, 0.752284}, + {4702., 0.971681, 0.762949}, + {4752., 0.969335, 0.773285}, + {4802., 0.969069, 0.783899}, + {4827., 0.967570, 0.788836}, + {4852., 0.967011, 0.793982}, + {4877., 0.966465, 0.799108}, + {4902., 0.965933, 0.804214}, + {4927., 0.965414, 0.809229}, + {4952., 0.964908, 0.814366}, + {4977., 0.964415, 0.819412}, + {5002., 0.963934, 0.824438}, + {5027., 0.963465, 0.829444}, + {5052., 0.963008, 0.834429}, + {5077., 0.962563, 0.839395}, + {5102., 0.962129, 0.844339}, + {5127., 0.961706, 0.849263}, + {5152., 0.961294, 0.854166}, + {5177., 0.960893, 0.859049}, + {5202., 0.960501, 0.863911}, + {5252., 0.959749, 0.873572}, + {5302., 0.959313, 0.883815}, + {5352., 0.958361, 0.892644}, + {5402., 0.957903, 0.902793}, + {5452., 0.957116, 0.911379}, + {5502., 0.956639, 0.921431}, + {5552., 0.956002, 0.929779}, + {5602., 0.955509, 0.939728}, + {5652., 0.955008, 0.947842}, + {5702., 0.954502, 0.957685}, + {5752., 0.954124, 0.965569}, + {5802., 0.953608, 0.975303}, + {5852., 0.953342, 0.982963}, + {5902., 0.952818, 0.992584}, + {5952., 0.952652, 1.000025}, + {6002., 0.952122, 1.009532}, + {6052., 0.952047, 1.016759}, + {6102., 0.951514, 1.026149}, + {6152., 0.951520, 1.033168}, + {6202., 0.950985, 1.042439}, + {6252., 0.951064, 1.049256}, + {6302., 0.950530, 1.058406}, + {6352., 0.950674, 1.065027}, + {6402., 0.950143, 1.074055}, + {6452., 0.950345, 1.080484}, + {6502., 0.950201, 1.088097}, + {6552., 0.950070, 1.095633}, + {6602., 0.949952, 1.103094}, + {6652., 0.949846, 1.110479}, + {6702., 0.949752, 1.119138}, + {6752., 0.949668, 1.125027}, + {6802., 0.949596, 1.132190}, + {6902., 0.949033, 1.147691}, + {7002., 0.949402, 1.160129}, + {7152., 0.949348, 1.180429}, + {7301., 0.948896, 1.201432}, + {7451., 0.949434, 1.219076}, + {7601., 0.949099, 1.239061}, + {7751., 0.949729, 1.255559}, + {7901., 0.949498, 1.274460}, + {8151., 0.950361, 1.300912}, + {8301., 0.950253, 1.318464}, + {8451., 0.950966, 1.332651}, + {8601., 0.950941, 1.349261}, + {8801., 0.951772, 1.367421}, + {9001., 0.951969, 1.387639}, + {9201., 0.952784, 1.404422}, + {9401., 0.953081, 1.423213}, + {9901., 0.954537, 1.464134}, + {10501., 0.956321, 1.508623}, + {11001., 0.957747, 1.541281}, + {12001., 0.960440, 1.601019} + }; + int N_t = sizeof(Txyz) / sizeof(Txyz[0]); //number of temperature White point + + int nbt = N_t; + float **Tx = nullptr; + float **Ty = nullptr; + float **Tz = nullptr; + float **Ta = nullptr; + float **Tb = nullptr; + float **TL = nullptr; + double *TX = nullptr; + double *TY = nullptr; + double *TZ = nullptr; + int *good_spectral = nullptr; + // float studgood = 1000.f; + + int Nc = 200 + 1;//200 number of reference spectral colors, I think it is enough to retrieve good values + Tx = new float*[Nc]; + + for (int i = 0; i < Nc; i++) { + Tx[i] = new float[nbt]; + } + + Ty = new float*[Nc]; + + for (int i = 0; i < Nc; i++) { + Ty[i] = new float[nbt]; + } + + Tz = new float*[Nc]; + + for (int i = 0; i < Nc; i++) { + Tz[i] = new float[nbt]; + } + + Ta = new float*[Nc]; + + for (int i = 0; i < Nc; i++) { + Ta[i] = new float[nbt]; + } + + Tb = new float*[Nc]; + + for (int i = 0; i < Nc; i++) { + Tb[i] = new float[nbt]; + } + + TL = new float*[Nc]; + + for (int i = 0; i < Nc; i++) { + TL[i] = new float[nbt]; + } + + TX = new double [Nc]; + + + TY = new double [Nc]; + + + TZ = new double [Nc]; + + good_spectral = new int [Nc]; + + for (int i = 0; i < Nc; i++) { + good_spectral[i] = 0; + } + + float *rmm = nullptr; + rmm = new float [N_t]; + + float *gmm = nullptr; + gmm = new float [N_t]; + + float *bmm = nullptr; + bmm = new float [N_t]; + + int siza = 167;//size of histogram + int maxval = 25; + + //tempref and greenref are camera wb values. + // I used them by default to select good spectral values !! + if (tempref > 12000.f) { + tempref = 12000.f; + } + + int repref = 0; + + for (int tt = 0; tt < N_t; tt++) { + if (Txyz[tt].Tem > tempref) { + repref = tt;//show the select temp + break; + } + } + + + //calculate R G B multiplier in function illuminant and temperature + for (int tt = 0; tt < N_t; tt++) { + double r, g, b; + float rm, gm, bm; + ColorTemp WBiter = ColorTemp(Txyz[tt].Tem, greenitc, 1.f, "Custom"); + WBiter.getMultipliers(r, g, b); + rm = imatrices.cam_rgb[0][0] * r + imatrices.cam_rgb[0][1] * g + imatrices.cam_rgb[0][2] * b; + gm = imatrices.cam_rgb[1][0] * r + imatrices.cam_rgb[1][1] * g + imatrices.cam_rgb[1][2] * b; + bm = imatrices.cam_rgb[2][0] * r + imatrices.cam_rgb[2][1] * g + imatrices.cam_rgb[2][2] * b; + + const float new_pre_mul[4] = { ri->get_pre_mul(0) / rm, ri->get_pre_mul(1) / gm, ri->get_pre_mul(2) / bm, ri->get_pre_mul(3) / gm }; + float new_scale_mul[4]; + bool isMono = (ri->getSensorType() == ST_FUJI_XTRANS && raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::MONO)) + || (ri->getSensorType() == ST_BAYER && raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::MONO)); + float gain = calculate_scale_mul(new_scale_mul, new_pre_mul, c_white, cblacksom, isMono, ri->get_colors()); + + rm = new_scale_mul[0] / scale_mul[0] * gain; + gm = new_scale_mul[1] / scale_mul[1] * gain; + bm = new_scale_mul[2] / scale_mul[2] * gain; + rmm[tt] = rm / gm; + gmm[tt] = gm / gm; + bmm[tt] = bm / gm; + } + + struct hiss { + int histnum; + int index; + int interest; + bool operator()(const hiss& lhis, const hiss& rhis) + { + return lhis.histnum < rhis.histnum; + } + + } ; + + //intermediate structure + struct chrom { + float chroxy_number; + float chroxy; + float chrox; + float chroy; + float Y; + int index; + int interest; + bool operator()(const chrom& lchro, const chrom& rchro) + { + return lchro.chroxy_number < rchro.chroxy_number; + } + + } ; + + int histxy[siza] = {};//number of values for each pair xy + + float area[siza] = {};//multiplier for compensation differences area ==> big areas are rare near limit prophotos or more + + int inter[siza] = {}; //interest for photographie 1 = small (limit gamut) 2 = normal 3 = major (skin, sky, neutral) + + float xxx[siza] = {};//for color references calculated ==> max in images "like histogram" + + float yyy[siza] = {}; + + float YYY[siza] = {};//not used directly, but necessary to keep good range + + for (int p = 0; p < siza; p++) { + histxy[p] = 0; + area[p] = 20.f; + inter[p] = 1; + } + + float estimchrom = 0.f; + + bool separated = true; + int w = -1; + //printf("greenrefraw=%f\n", greenref); + reff_spect_xxyy(N_t, 2 * Nc + 2); + reff_spect_xxyy_prov(N_t, 2 * Nc + 2); + reff_spect_yy_camera(N_t, 2 * Nc + 2); + reff_spect_xx_camera(N_t, 2 * Nc + 2); + + // reffYY(N_t, 2 * Nc);//in case of + //reffYY_prov(N_t, 2 * Nc); + + //here we select the good spectral color inside the 113 values + //call tempxy to calculate for 114 color references Temp and XYZ with cat02 + + if (separated) { + ColorTemp::tempxy(separated, repref, Tx, Ty, Tz, Ta, Tb, TL, TX, TY, TZ, wbpar); //calculate chroma xy (xyY) for Z known colors on under 90 illuminants + + //find the good spectral values + //calculate xy reference spectral for tempref + for (int j = 0; j < Nc ; j++) { + reff_spect_xx_camera[j][repref] = TX[j] / (TX[j] + TY[j] + TZ[j]); // x from xyY + reff_spect_yy_camera[j][repref] = TY[j] / (TX[j] + TY[j] + TZ[j]); // y from xyY + } + + int deltarepref = settings->itcwb_delta; + + for (int nn = 0; nn <= 2; nn++) { + //three loop to refine color if temp camera is probably not very good + int drep = 0; + + if (nn == 0) { + drep = -deltarepref; + } + + if (nn == 2) { + drep = +deltarepref; + } + + int rep = repref + drep; + + if (rep > N_t) { + rep = N_t; + } + + if (rep < 0) { + rep = 0; + } + + //initialize calculation of xy current for tempref + for (int y = 0; y < bfh ; y += 10) { + for (int x = 0; x < bfw ; x += 10) { + int yy = y / 10; + int xx = x / 10 ; + float x_c = 0.f, y_c = 0.f, Y_c = 0.f; + float x_x = 0.f, y_y = 0.f, z_z = 0.f; + float RR = rmm[rep] * redloc[y][x]; + float GG = gmm[rep] * greenloc[y][x]; + float BB = bmm[rep] * blueloc[y][x]; + Color::rgbxyY(RR, GG, BB, x_c, y_c, Y_c, x_x, y_y, z_z, wp); + xc[yy][xx] = x_c; + yc[yy][xx] = y_c; + Yc[yy][xx] = Y_c; + } + + } + + //histogram xy depend of temp...but in most cases D45 ..D65.. + //calculate for this image the mean values for each family of color, near histogram x y (number) + //xy vary from x 0..0.77 y 0..0.82 + //neutral values are near x=0.34 0.33 0.315 0.37 y =0.35 0.36 0.34 + //skin are about x 0.45 0.49 y 0.4 0.47 + //blue sky x=0.25 y=0.28 and x=0.29 y=0.32 + // step about 0.02 x 0.32 0.34 y= 0.34 0.36 skin -- sky x 0.24 0.30 y 0.28 0.32 + //big step about 0.2 + + histoxyY(bfhitc, bfwitc, xc, yc, Yc, xxx, yyy, YYY, histxy, area, inter); + } + + //calculate x y Y + int sizcurrref = siza;//choice of number of correlate colors in image + histcurrref(N_t, sizcurrref); + xx_curref(N_t, sizcurrref); + yy_curref(N_t, sizcurrref); + YY_curref(N_t, sizcurrref); + xx_curref_reduc(N_t, sizcurrref); + yy_curref_reduc(N_t, sizcurrref); + YY_curref_reduc(N_t, sizcurrref); + R_curref_reduc(N_t, sizcurrref); + G_curref_reduc(N_t, sizcurrref); + B_curref_reduc(N_t, sizcurrref); + + + hiss Wbhis [siza]; + int n1 = 0; + int n4 = 0; + int n15 = 0; + int n30 = 0; + int ntr = 0; + + for (int nh = 0; nh < siza; nh++) { + Wbhis[nh].histnum = histxy[nh]; + Wbhis[nh].index = nh; + Wbhis[nh].interest = inter[nh]; + } + + //sort in ascending order + std::sort(Wbhis, Wbhis + siza, Wbhis[0]); + + for (int nh = 0; nh < siza; nh++) { +// printf("nh=%i", Wbhis[nh].index); + } + + //part to improve + for (int nh = 0; nh < siza; nh++) { + if (Wbhis[nh].histnum < 1) { + n1++; //keep only existing color but avoid to small + } + + if (Wbhis[nh].histnum < 4) { + n4++; //keep only existing color but avoid to small + } + + if (Wbhis[nh].histnum < 15) { + n15++; //keep only existing color but avoid to small + } + + if (Wbhis[nh].histnum < 30) { + n30++; //keep only existing color but avoid to small + } + + + } + + + ntr = n30; + + if (ntr > (siza - 25)) { + ntr = n15; //if to less elements 25 elements mini + } + + if (ntr > (siza - 23)) { + ntr = n4; //if to less elements 25 elements mini + } + + if (ntr > (siza - 20)) { + ntr = n1; //if to less elements 20 elements mini - normally never be used ! + } + + int sizcurr2ref = sizcurrref - ntr; + int sizcu30 = sizcurrref - n30; + int sizcu4 = sizcurrref - n4; + +// printf("sizcurr2ref=%i sizcur_30=%i siecur_4=%i \n", sizcurr2ref, sizcu30, sizcu4); + sizcu4 = sizcu30;//arbitrary mini size if 30 result, ==> in full image 3000 pixels + + if (sizcu4 > 55) { + sizcu4 = 55; + } + + chrom wbchro[sizcu4]; + double swpr = (Txyz[repref].XX + Txyz[repref].ZZ + 1.); + double xwpr = Txyz[repref].XX / swpr;//white point for tt in xy coordiantes + double ywpr = 1. / swpr; + + + for (int i = 0; i < sizcu4; i++) { //take the max values + int j = i; + histcurrref[j][repref] = (float) Wbhis[siza - (j + 1)].histnum; + xx_curref[j][repref] = xxx[Wbhis[siza - (j + 1)].index] / histcurrref[j][repref]; + yy_curref[j][repref] = yyy[Wbhis[siza - (j + 1)].index] / histcurrref[j][repref]; + YY_curref[j][repref] = YYY[Wbhis[siza - (j + 1)].index] / histcurrref[j][repref]; +// printf("xx=%f yy=%f\n", xx_curref[j][repref], yy_curref[j][repref]); + } + + estimchrom = 0.f; + + for (int nh = 0; nh < sizcu4; nh++) { + float chxy = sqrt(SQR(xx_curref[nh][repref] - xwpr) + SQR(yy_curref[nh][repref] - ywpr)); + wbchro[nh].chroxy_number = chxy * sqrt(histcurrref[nh][repref]); + wbchro[nh].chroxy = sqrt(chxy); + wbchro[nh].chrox = xx_curref[nh][repref]; + wbchro[nh].chroy = yy_curref[nh][repref]; + wbchro[nh].Y = YY_curref[nh][repref]; + wbchro[nh].index = nh; + estimchrom += chxy; + } + + estimchrom /= sizcu4; + //printf("estimchrom=%f \n", estimchrom); + + if (settings->itcwb_sort) { //sort in ascending with chroma values + + std::sort(wbchro, wbchro + sizcu4, wbchro[0]); + } + + /* + for (int nh = 0; nh < sizcu4; nh++) { + printf("nh=%i chroma_xy=%f chrox=%f chroy=%f\n", nh, wbchro[nh].chroxy, wbchro[nh].chrox, wbchro[nh].chroy); + } + */ + maxval = settings->itcwb_thres;//max values of color to find correllation + + if (maxval < 10) { + maxval = 10; + } + + if (maxval > 55) { + maxval = 55; + } + + if (sizcurr2ref > maxval) { + sizcurr2ref = maxval; //keep about the biggest values, + } + + + for (int i = 0; i < sizcurr2ref; i++) { + //is condition chroxy necessary ? + if (((wbchro[sizcu4 - (i + 1)].chrox > 0.1f) && (wbchro[sizcu4 - (i + 1)].chroy > 0.1f)) && wbchro[sizcu4 - (i + 1)].chroxy > 0.0f) { //suppress value too far from reference spectral + w++; + xx_curref_reduc[w][repref] = wbchro[sizcu4 - (i + 1)].chrox; + yy_curref_reduc[w][repref] = wbchro[sizcu4 - (i + 1)].chroy; + YY_curref_reduc[w][repref] = wbchro[sizcu4 - (i + 1)].Y; + // printf("xx_cu=%f yy_cu=%f Y=%f chro=%f\n", xx_curref_reduc[w][repref], yy_curref_reduc[w][repref], YY_curref_reduc[w][repref],sqrt(wbchro[sizcu4 - (i + 1)].chroxy)); + } + } + + //calculate deltaE xx to find best values of spectrals datas + int maxnb = settings->itcwb_sizereference; + + if (maxnb > 5) { + maxnb = 5; + } + + if (maxnb < 1) { + maxnb = 1; + } + + + if (settings->itcwb_thres > 39) { + maxnb = 200 / settings->itcwb_thres; + } + + for (int nb = 1; nb <= maxnb; nb ++) { //max 5 iterations for Itcwb_thres=33, after trial 3 is good in most cases but in some cases 5 + for (int i = 0; i < w; i++) { + float mindeltaE = 100000.f; + int kN = 0; + + for (int j = 0; j < Nc ; j++) { + if (good_spectral[j] == 0) { + float deltaE = SQR(xx_curref_reduc[i][repref] - reff_spect_xx_camera[j][repref]) + SQR(yy_curref_reduc[i][repref] - reff_spect_yy_camera[j][repref]); + + if (deltaE < mindeltaE) { + mindeltaE = deltaE; + kN = j; + } + } + } + + good_spectral[kN] = 1;//good spectral are spectral color that match color histogram xy + //printf("k=%i ", kN); + } + } + +//reconvert to RGB for "reduction" + for (int i = 0; i < w; i++) { + float X = 65535.f * xx_curref_reduc[i][repref] * YY_curref_reduc[i][repref] / yy_curref_reduc[i][repref]; + float Y = 65535.f * YY_curref_reduc[i][repref]; + float Z = 65535.f * (1.f - xx_curref_reduc[i][repref] - yy_curref_reduc[i][repref]) * YY_curref_reduc[i][repref] / yy_curref_reduc[i][repref]; + float r, g, b; + Color::xyz2rgb(X, Y, Z, r, g, b, wip); + r /= rmm[repref]; + g /= gmm[repref]; + b /= bmm[repref]; + R_curref_reduc[i][repref] = r; + G_curref_reduc[i][repref] = g; + B_curref_reduc[i][repref] = b; + + } + + } + +//end first part + + + + //Now begin real calculations + separated = false; + ColorTemp::tempxy(separated, repref, Tx, Ty, Tz, Ta, Tb, TL, TX, TY, TZ, wbpar); //calculate chroma xy (xyY) for Z known colors on under 90 illuminants + + int kk = -1; + + //calculate x y Y + int sizcurr = siza;//choice of number of correlate colors in image + histcurr(N_t, sizcurr); + xxyycurr(N_t, 2 * sizcurr); + xxyycurr_reduc(N_t, 2 * sizcurr); + float minstud = 100000.f; + int goodref = 1; + + YYcurr(N_t, sizcurr); + YYcurr_reduc(N_t, sizcurr); + +//calculate x y z for each pixel with multiplier rmm gmm bmm + kk = -1; + + for (int tt = 0; tt < N_t; tt++) {//N_t + // double swp = (Txyz[tt].XX + Txyz[tt].ZZ + 1.); + // double xwp = Txyz[tt].XX / swp; + // double ywp = 1. / swp; + + + for (int i = 0; i < w; i++) { + float x_c = 0.f, y_c = 0.f, Y_c = 0.f; + float x_x = 0.f, y_y = 0.f, z_z = 0.f; + + float RR = rmm[tt] * R_curref_reduc[i][repref]; + float GG = gmm[tt] * G_curref_reduc[i][repref]; + float BB = bmm[tt] * B_curref_reduc[i][repref]; + Color::rgbxyY(RR, GG, BB, x_c, y_c, Y_c, x_x, y_y, z_z, wp); + // xxyycurr_reduc[2 * i][tt] = fabs(x_c - xwp); + // xxyycurr_reduc[2 * i + 1][tt] = fabs(y_c - ywp); + xxyycurr_reduc[2 * i][tt] = x_c; + xxyycurr_reduc[2 * i + 1][tt] = y_c; + // printf("w=%i tt=%i xx=%f yy=%f\n",i, tt, xxyycurr_reduc[2 * i][tt], xxyycurr_reduc[2 * i +1][tt]); + + } + + for (int j = 0; j < Nc ; j++) { + reff_spect_xxyy_prov[2 * j][tt] = Tx[j][tt] / (Tx[j][tt] + Ty[j][tt] + Tz[j][tt]); // x from xyY + reff_spect_xxyy_prov[2 * j + 1][tt] = Ty[j][tt] / (Tx[j][tt] + Ty[j][tt] + Tz[j][tt]); // y from xyY + //reffYY_prov[j][tt] = Ty[j][tt];//Y + // printf("w=%i tt=%i xx=%f yy=%f\n",j, tt,reffxxyy_prov[2 * kk][tt] ,reffxxyy_prov[2 * kk + 1][tt]); + + } + + kk = -1; + + for (int i = 0; i < Nc ; i++) { + if (good_spectral[i] == 1) { + kk++; + //we calculate now absolute chroma for each spectral color + // reffxxyy[2 * kk][tt] = fabs(reffxxyy_prov[2 * i][tt] - xwp); + // reffxxyy[2 * kk + 1][tt] = fabs(reffxxyy_prov[2 * i + 1][tt] - ywp); + reff_spect_xxyy[2 * kk][tt] = reff_spect_xxyy_prov[2 * i][tt]; + reff_spect_xxyy[2 * kk + 1][tt] = reff_spect_xxyy_prov[2 * i + 1][tt]; + //printf("w=%i tt=%i xx=%f yy=%f\n",i, tt,reffxxyy[2 * kk][tt] ,reffxxyy[2 * kk + 1][tt]); + // reffYY[kk][tt] = reffYY_prov[i][tt]; + } + } + + + /* + //cat02 not need and does not work well + float nnx, nny, nnz; + + if(wbpar.wbcat02Method == "cam") {//code no update... + for(int k=0;k < sizcurr3; k++) { + float nnx = xxyycurr[2 * k][tt]*YYcurr[k][tt] / xxyycurr[2 * k + 1][tt]; + float nny = YYcurr[k][tt]; + float nnz = (1.f -xxyycurr[2 * k][tt] - xxyycurr[2 * k + 1][tt] )*YYcurr[k][tt]/xxyycurr[2 * k + 1][tt]; + float CAM02BB00 = 1.0f, CAM02BB01=1.0f, CAM02BB02=1.0f, CAM02BB10=1.0f, CAM02BB11=1.0f, CAM02BB12=1.0f, CAM02BB20=1.0f, CAM02BB21=1.0f, CAM02BB22=1.0f; //for CIECAT02 + float Xwb = Txyz[20].XX; + float Ywb = 1.; + float Zwb = Txyz[20].ZZ; + float xn, yn, zn; + ColorTemp::icieCAT02float(Xwb, Ywb, Zwb, CAM02BB00, CAM02BB01, CAM02BB02, CAM02BB10, CAM02BB11, CAM02BB12, CAM02BB20, CAM02BB21, CAM02BB22, 1.0f); + + xn = CAM02BB00 * nnx + CAM02BB01 * nny + CAM02BB02 * nnz ; + yn = CAM02BB10 * nnx + CAM02BB11 * nny + CAM02BB12 * nnz ; + zn = CAM02BB20 * nnx + CAM02BB21 * nny + CAM02BB22 * nnz; + float som = xn + yn + zn; + xxyycurr[2 * k][tt] = xn / som; + xxyycurr[2 * k + 1][tt] = yn / som; + YYcurr[k][tt] = yn; + } + } + */ + + float student = 0.f; + + + studentXY(xxyycurr_reduc, reff_spect_xxyy, 2 * w, 2 * kk, tt, student); //for xy + //printf("tt=%i st=%f\n", tt, student); + float abstud = fabs(student); + + if (abstud < minstud) { // find the minimum Student + minstud = abstud; + goodref = tt; + } + + } + + if (extra) { + struct Tempgreen { + float student; + int tempref; + int greenref; + bool operator()(const Tempgreen& ltg, const Tempgreen& rtg) + { + return ltg.student < rtg.student; + } + }; + Tempgreen Tgstud[N_g]; + + for (int i = 0; i < N_g; i++) {//init variables with + Tgstud[i].student = 1000.f;//max value to initialize + Tgstud[i].tempref = 57; + Tgstud[i].greenref = 39; + + } + + int dgoodref = settings->itcwb_greendeltatemp; + + if (dgoodref > 4) { + dgoodref = 4; + } + + int scantempbeg = goodref - (dgoodref + 1); + + if (scantempbeg < 1) { + scantempbeg = 1; + } + + int scantempend = goodref + dgoodref; + + if (scantempend > N_t - 1) { + scantempend = N_t - 1; + } + + int kkg = -1; + + for (int gr = Rangegreenused.begin; gr < Rangegreenused.end; gr++) { + float minstudgr = 100000.f; + int goodrefgr = 1; + + for (int tt = scantempbeg; tt < scantempend; tt++) { + double r, g, b; + float rm, gm, bm; + ColorTemp WBiter = ColorTemp(Txyz[tt].Tem, gree[gr].green, 1.f, "Custom"); + WBiter.getMultipliers(r, g, b); + rm = imatrices.cam_rgb[0][0] * r + imatrices.cam_rgb[0][1] * g + imatrices.cam_rgb[0][2] * b; + gm = imatrices.cam_rgb[1][0] * r + imatrices.cam_rgb[1][1] * g + imatrices.cam_rgb[1][2] * b; + bm = imatrices.cam_rgb[2][0] * r + imatrices.cam_rgb[2][1] * g + imatrices.cam_rgb[2][2] * b; + + const float new_pre_mul[4] = { ri->get_pre_mul(0) / rm, ri->get_pre_mul(1) / gm, ri->get_pre_mul(2) / bm, ri->get_pre_mul(3) / gm }; + float new_scale_mul[4]; + bool isMono = (ri->getSensorType() == ST_FUJI_XTRANS && raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::MONO)) + || (ri->getSensorType() == ST_BAYER && raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::MONO)); + float gain = calculate_scale_mul(new_scale_mul, new_pre_mul, c_white, cblacksom, isMono, ri->get_colors()); + + rm = new_scale_mul[0] / scale_mul[0] * gain; + gm = new_scale_mul[1] / scale_mul[1] * gain; + bm = new_scale_mul[2] / scale_mul[2] * gain; + rmm[tt] = rm / gm; + gmm[tt] = gm / gm; + bmm[tt] = bm / gm; + } + + + for (int tt = scantempbeg; tt < scantempend; tt++) {//N_t + // double swp = (Txyz[tt].XX + Txyz[tt].ZZ + 1.); + // double xwp = Txyz[tt].XX / swp; + // double ywp = 1. / swp; + + + for (int i = 0; i < w; i++) { + float x_c = 0.f, y_c = 0.f, Y_c = 0.f; + float x_x = 0.f, y_y = 0.f, z_z = 0.f; + + float RR = rmm[tt] * R_curref_reduc[i][repref]; + float GG = gmm[tt] * G_curref_reduc[i][repref]; + float BB = bmm[tt] * B_curref_reduc[i][repref]; + Color::rgbxyY(RR, GG, BB, x_c, y_c, Y_c, x_x, y_y, z_z, wp); + xxyycurr_reduc[2 * i][tt] = x_c; + xxyycurr_reduc[2 * i + 1][tt] = y_c; + // printf("w=%i tt=%i xx=%f yy=%f\n",i, tt, xxyycurr_reduc[2 * i][tt], xxyycurr_reduc[2 * i +1][tt]); + + } + + for (int j = 0; j < Nc ; j++) { + reff_spect_xxyy_prov[2 * j][tt] = Tx[j][tt] / (Tx[j][tt] + Ty[j][tt] + Tz[j][tt]); // x from xyY + reff_spect_xxyy_prov[2 * j + 1][tt] = Ty[j][tt] / (Tx[j][tt] + Ty[j][tt] + Tz[j][tt]); // y from xyY + // reffYY_prov[j][tt] = Ty[j][tt];//Y + // printf("w=%i tt=%i xx=%f yy=%f\n",j, tt,reffxxyy_prov[2 * kk][tt] ,reffxxyy_prov[2 * kk + 1][tt]); + + } + + kkg = -1; + + //degrade correllation with color high chroma, but not too much...seems not good, but keep in case of?? + if (estimchrom < 0.025f) {//very smal value of chroma for image + + good_spectral[0] = 1;//blue + //good_spectral[1] = 1;//blue + // good_spectral[97] = 1;//blue + // good_spectral[93] = 1;//purple + // good_spectral[7] = 1;//green + good_spectral[11] = 1;//green + //good_spectral[42] = 1;//green + // good_spectral[75] = 1;//green + // good_spectral[46] = 1;//red + good_spectral[62] = 1;//red + // good_spectral[63] = 1;//red + // good_spectral[91] = 1;//ora + + } + + for (int i = 0; i < Nc ; i++) { + if (good_spectral[i] == 1) { + kkg++; + reff_spect_xxyy[2 * kkg][tt] = reff_spect_xxyy_prov[2 * i][tt]; + reff_spect_xxyy[2 * kkg + 1][tt] = reff_spect_xxyy_prov[2 * i + 1][tt]; + // reffYY[kkg][tt] = reffYY_prov[i][tt]; + } + } + + float studentgr = 0.f; + + studentXY(xxyycurr_reduc, reff_spect_xxyy, 2 * w, 2 * kkg, tt, studentgr); //for xy + float abstudgr = fabs(studentgr); + + if (abstudgr < minstudgr) { // find the minimum Student + minstudgr = abstudgr; + goodrefgr = tt; + } + + Tgstud[gr].tempref = goodrefgr; + Tgstud[gr].greenref = gr; + Tgstud[gr].student = minstudgr; + + } + + } + + std::sort(Tgstud, Tgstud + N_g, Tgstud[0]); + + for (int j = 0; j < 20; j++) { + // printf("reftemp=%i refgreen=%i stud=%f \n", Tgstud[j].tempref, Tgstud[j].greenref, Tgstud[j].student); + } + + //now search the value of green the nearest of 1 with a good student value + // I take the 3 first values + //I admit a symetrie in green coefiicient for rgb multiplier...probably not excatly true + //perhaps we can used a Snedecor test ? but why...at least we have confidence interval > 90% + int greengood; + int greengoodprov; + int goodrefprov; + float studprov; + int goodref0 = Tgstud[0].tempref; + int greengood0 = Tgstud[0].greenref - 39;//39 green = 1 + float stud0 = Tgstud[0].student; + int goodref1 = Tgstud[1].tempref; + float stud1 = Tgstud[1].student; + int greengood1 = Tgstud[1].greenref - 39; + int goodref2 = Tgstud[2].tempref; + int greengood2 = Tgstud[2].greenref - 39; + float stud2 = Tgstud[2].student; + + if (fabs(greengood2) < fabs(greengood1)) { + greengoodprov = greengood2; + goodrefprov = goodref2; + studprov = stud2; + } else { + greengoodprov = greengood1; + goodrefprov = goodref1; + studprov = stud1; + + } + + if (fabs(greengoodprov) < fabs(greengood0)) { + goodref = goodrefprov; + greengood = greengoodprov + 39; + studgood = studprov; + + } else { + goodref = goodref0; + greengood = greengood0 + 39; + studgood = stud0; + } + + tempitc = Txyz[goodref].Tem; + greenitc = gree[greengood].green; + + } + + histcurr(0, 0); + histcurrref(0, 0); + xxyycurr(0, 0); + xxyycurr_reduc(0, 0); + xx_curref(0, 0); + yy_curref(0, 0); + YY_curref(0, 0); + + reff_spect_xxyy(0, 0); + YYcurr(0, 0); + YYcurr_reduc(0, 0); + reff_spect_yy_camera(0, 0); + reff_spect_xx_camera(0, 0); + xx_curref_reduc(0, 0); + yy_curref_reduc(0, 0); + YY_curref_reduc(0, 0); + + R_curref_reduc(0, 0); + G_curref_reduc(0, 0); + B_curref_reduc(0, 0); + + reff_spect_xxyy_prov(0, 0); + +// reffYY(0, 0); +// reffYY_prov(0, 0); + + avg_rm = 10000.f * rmm[goodref]; + avg_gm = 10000.* gmm[goodref]; + avg_bm = 10000.f * bmm[goodref]; + + if (!extra) { + tempitc = Txyz[goodref].Tem; + } + + + printf("ITCWB tempitc=%f gritc=%f stud=%f \n", tempitc, greenitc, studgood); + + + xc(0, 0); + yc(0, 0); + Yc(0, 0); + + + + for (int i = 0; i < Nc; i++) { + delete [] Tx[i]; + delete [] Ty[i]; + delete [] Tz[i]; + delete [] Ta[i]; + delete [] Tb[i]; + delete [] TL[i]; + + } + + delete [] Tx; + delete [] Ty; + delete [] Tz; + delete [] Ta; + delete [] Tb; + delete [] TL; + delete [] TX; + delete [] TY; + delete [] TZ; + delete [] good_spectral; + + + delete [] rmm; + delete [] gmm; + delete [] bmm; + + + + +} + +void RawImageSource::WBauto(double & tempref, double & greenref, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double & avg_rm, double & avg_gm, double & avg_bm, double & tempitc, double & greenitc, float & studgood, bool & twotimes, const WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const ColorManagementParams & cmp, const RAWParams & raw) +{ + BENCHFUN + //auto white balance +// printf ("AUtoWB OK\n"); +/* + array2D redsobel; + array2D greensobel; + array2D bluesobel; + + redsobel(bfw, bfh); + greensobel(bfw, bfh); + bluesobel(bfw, bfh); +*/ + double avg_r = 0.; + double avg_g = 0.; + double avg_b = 0.; + int rn = 0, gn = 0, bn = 0; +// constexpr double clipHigh = 65500.0; +// constexpr double clipLow = 0; //1500.0; + bool edg = false; + bool greyn = false; + bool robust = false; + bool itc = false; + + if (wbpar.method == "autorobust") { + // printf("autorob\n"); + // RobustWB(redloc, greenloc, blueloc, bfw, bfh, avg_rm, avg_gm, avg_bm); + + } + + if (wbpar.method == "autedg") { + // printf("autoedge\n"); + // edg = true; + } + + if (wbpar.method == "aut") { +// greyn = true; + } + + + + if (wbpar.method == "autitcgreen") { + bool extra = false; + + if (greenref > 0.77 && greenref < 1.3) { + greenitc = greenref; + extra = false; + + if (settings->itcwb_forceextra) { + extra = true; + } + } else { + greenitc = 1.; + extra = true; + } + + // greenref = wbpar.green; +// printf("gree=%f\n", greenref); + tempitc = 5000.; +// greenitc = greenref; + itc = true; + + if (itc) { + ItcWB(extra, tempref, greenref, tempitc, greenitc, studgood, redloc, greenloc, blueloc, bfw, bfh, avg_rm, avg_gm, avg_bm, cmp, raw, wbpar); + } + } + + if (wbpar.method == "autedgsdw") { + // SobelWB(redsobel, greensobel, bluesobel, redloc, greenloc, blueloc, bfw, bfh); + // SdwWB(redsobel, greensobel, bluesobel, bfw, bfh, avg_rm, avg_gm, avg_bm); + + } + + if (wbpar.method == "autedgrob") { + // SobelWB(redsobel, greensobel, bluesobel, redloc, greenloc, blueloc, bfw, bfh); + // RobustWB(redsobel, greensobel, bluesobel, bfw, bfh, avg_rm, avg_gm, avg_bm); + + } + + if (wbpar.method == "autosdw") { + // SdwWB(redloc, greenloc, blueloc, bfw, bfh, avg_rm, avg_gm, avg_bm); + + + // printf("bfw=%i bfh=%i begx=%i begy=%i xEn=%i yEn=%i cx=%i\n", bfw, bfh, begx, begy, xEn, yEn, cx); + } + +/* + if (edg) { + SobelWB(redsobel, greensobel, bluesobel, redloc, greenloc, blueloc, bfw, bfh); + +#ifdef _OPENMP + #pragma omp parallel for reduction(+:avg_r, avg_g, avg_b, rn, gn, bn) +#endif + + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw ; x++) { + if (redsobel[y][x] < clipHigh && redsobel[y][x] > clipLow) { + avg_r += redsobel[y][x]; + rn++; + } + + if (greensobel[y][x] < clipHigh && greensobel[y][x] > clipLow) { + avg_g += greensobel[y][x]; + gn++; + } + + if (bluesobel[y][x] < clipHigh && bluesobel[y][x] > clipLow) { + avg_b += bluesobel[y][x]; + bn++; + } + } + } + } +*/ +/* + if (greyn) { +#ifdef _OPENMP + #pragma omp parallel for reduction(+:avg_r, avg_g, avg_b, rn, gn, bn) +#endif + + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw ; x++) { + if (redloc[y][x] < clipHigh && redloc[y][x] > clipLow) { + avg_r += redloc[y][x]; + rn++; + } + + if (greenloc[y][x] < clipHigh && greenloc[y][x] > clipLow) { + avg_g += greenloc[y][x]; + gn++; + } + + if (blueloc[y][x] < clipHigh && blueloc[y][x] > clipLow) { + avg_b += blueloc[y][x]; + bn++; + } + } + } + } +*/ +// float varir = localr.equal; +// float varib = 1.f - (varir - 1.f); + + + +//CAT02 inverse + +// + if (greyn || edg) { + avg_rm = avg_r / rn; + avg_gm = avg_g / gn; + avg_bm = avg_b / bn; + } + + /* + //inverse cat02 + if (localr.wbcamMethod == "cat" || localr.wbcamMethod == "gamcat") { + //printf("Inverse CAT02\n"); + float x, y, z; + // cat02_to_xyzfloatraw ( x, y, z, avg_rm, avg_gm, avg_bm); + Color::xyz2rgbraw (x, y, z, avg_rm, avg_gm, avg_bm, wip); + } + */ + if (edg) { + // printf("Local sobel avgr = % f avgg = % f avgb = % f \n", avg_rm, avg_gm, avg_bm); + } + + if (greyn || robust) { + // printf("Local rgb avgr = % f avgg = % f avgb = % f \n", avg_rm, avg_gm, avg_bm); + } + +/* + redsobel(0, 0); + greensobel(0, 0); + bluesobel(0, 0); +*/ +} + + +void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w) +{ + //used by auto WB local to calculate red, green, blue in local region + // int bfh = bf_h + 3, bfw = bf_w + 3; + int bfh = H, bfw = W; + + if (local) { + bfh = bf_h + 3; + bfw = bf_w + 3; + } + + // printf ("bfh=%i bfw=%i H=%i W=%i \n", bf_h, bf_w, H, W); + ColorManagementParams cmp; + + //TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(cmp.working); + // TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (cmp.working); + /* + float toxyz[3][3] = { + { + static_cast ( wprof[0][0] / Color::D50x), + static_cast ( wprof[0][1] / Color::D50x), + static_cast ( wprof[0][2] / Color::D50x) + }, { + static_cast ( wprof[1][0]), + static_cast ( wprof[1][1]), + static_cast ( wprof[1][2]) + }, { + static_cast ( wprof[2][0] / Color::D50z), + static_cast ( wprof[2][1] / Color::D50z), + static_cast ( wprof[2][2] / Color::D50z) + } + }; + */ + /* + double wp[3][3] = { + {wprof[0][0], wprof[0][1], wprof[0][2]}, + {wprof[1][0], wprof[1][1], wprof[1][2]}, + {wprof[2][0], wprof[2][1], wprof[2][2]} + }; + */ +// printf("wp00=%f wp02=%f\n", wp[0][0], wp[0][2]); + if (! greenloc) { + greenloc(bfw, bfh); + } + + if (! redloc) { + redloc(bfw, bfh); + } + + if (! blueloc) { + blueloc(bfw, bfh); + } + + float avgL = 0.f; + float redmm = 0.f, greenmm = 0.f, bluemm = 0.f; + + //center data on normal values + int nn = 0; + + for (int i = 0; i < H; i ++) + for (int j = 0; j < W; j++) { + int lox = cx + j; + int loy = cy + i; + + if (!local) { + redmm = redloc[i][j] = red[i][j]; + greenmm = greenloc[i][j] = green[i][j]; + bluemm = blueloc[i][j] = blue[i][j]; + float LL = (0.299f * redmm + 0.587f * greenmm + 0.114f * bluemm); + avgL += LL; + nn++; + } else { + + if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) { + redmm = redloc[loy - begy][lox - begx] = red[i][j]; + greenmm = greenloc[loy - begy][lox - begx] = green[i][j]; + bluemm = blueloc[loy - begy][lox - begx] = blue[i][j]; + float LL = (0.299f * redmm + 0.587f * greenmm + 0.114f * bluemm); + avgL += LL; + nn++; + } + } + } + + avgL /= nn; + + float sig = 0.f; + float vari = 0.f; + int mm = 0; + + for (int i = 0; i < bfh; i++) + for (int j = 0; j < bfw; j++) { + float LL = (0.299f * redloc[i][j] + 0.587f * greenloc[i][j] + 0.114f * blueloc[i][j]); + vari += SQR(LL - avgL); + mm++; + } + + sig = sqrt(vari / mm); + float multip = 60000.f / (avgL + 2.f * sig); + + // printf("multip=%f \n", multip); + for (int i = 0; i < bfh; i++) + for (int j = 0; j < bfw; j++) { + redloc[i][j] *= multip; + greenloc[i][j] *= multip; + blueloc[i][j] *= multip; + } + + if (gamma) { + // printf("gamma loc\n"); + + for (int i = 0; i < bfh; i++) + for (int j = 0; j < bfw; j++) { + redloc[i][j] = Color::gammatab_srgb[redloc[i][j]]; + greenloc[i][j] = Color::gammatab_srgb[greenloc[i][j]]; + blueloc[i][j] = Color::gammatab_srgb[blueloc[i][j]]; + } + } + + if (cat02) {//CAT02 + /* + //not good threatment, I must wait merge branch cat02wb + for (int i = 0; i < bfh; i++) + for (int j = 0; j < bfw; j++) { + float X = 0.f, Y = 0.f, Z = 0.f; + Color::rgbxyz(redloc[i][j], greenloc[i][j], blueloc[i][j], X, Y, Z, wp); + double temp; + double Xr = X / 65535.; + double Yr = Y / 65535.; + double Zr = Z / 65535.; + + Ciecam02::xyz_to_cat02float ( redloc[i][j], greenloc[i][j], blueloc[i][j], Xr, Yr, Zr, 1); + redloc[i][j] *= 65535.f; + greenloc[i][j] *= 65535.f; + blueloc[i][j] *= 65535.f; + //to do ciecam adaptation + } + */ + } + +} + +//void RawImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) +void RawImageSource::getAutoWBMultipliersloc(double & tempref, double & greenref, double & tempitc, double & greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double & rm, double & gm, double & bm, const WBParams & wbpar, const ColorManagementParams & cmp, const RAWParams & raw) +{ + BENCHFUN + constexpr double clipHigh = 64000.0; + + if (ri->get_colors() == 1) { + rm = gm = bm = 1; + return; + } +/* + if (redAWBMul != -1.) { + rm = redAWBMul; + gm = greenAWBMul; + bm = blueAWBMul; + return; + } + + if (!isWBProviderReady()) { + rm = -1.0; + gm = -1.0; + bm = -1.0; + return; + } +*/ + double avg_r = 0; + double avg_g = 0; + double avg_b = 0; + int rn = 0, gn = 0, bn = 0; + double avg_rm, avg_gm, avg_bm; + // int bfh = bf_h + 3, bfw = bf_w + 3; + int bfh = H, bfw = W; + if (wbpar.method == "autold") { + + if (fuji) { + for (int i = 32; i < H - 32; i++) { + int fw = ri->get_FujiWidth(); + int start = ABS(fw - i) + 32; + int end = min(H + W - fw - i, fw + i) - 32; + + for (int j = start; j < end; j++) { + if (ri->getSensorType() != ST_BAYER) { + double dr = CLIP(initialGain * (rawData[i][3 * j] )); + double dg = CLIP(initialGain * (rawData[i][3 * j + 1])); + double db = CLIP(initialGain * (rawData[i][3 * j + 2])); + + if (dr > clipHigh || dg > clipHigh || db > clipHigh) { + continue; + } + + avg_r += dr; + avg_g += dg; + avg_b += db; + rn = gn = ++bn; + } else { + int c = FC( i, j); + double d = CLIP(initialGain * (rawData[i][j])); + + if (d > clipHigh) { + continue; + } + + // Let's test green first, because they are more numerous + if (c == 1) { + avg_g += d; + gn++; + } else if (c == 0) { + avg_r += d; + rn++; + } else { /*if (c==2)*/ + avg_b += d; + bn++; + } + } + } + } + } else { + if (ri->getSensorType() != ST_BAYER) { + if(ri->getSensorType() == ST_FUJI_XTRANS) { + const double compval = clipHigh / initialGain; +#ifdef _OPENMP + #pragma omp parallel +#endif + { + double avg_c[3] = {0.0}; + int cn[3] = {0}; +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) nowait +#endif + + for (int i = 32; i < H - 32; i++) { + for (int j = 32; j < W - 32; j++) { + // each loop read 1 rgb triplet value + double d = rawData[i][j]; + + if (d > compval) { + continue; + } + + int c = ri->XTRANSFC(i, j); + avg_c[c] += d; + cn[c]++; + } + } + +#ifdef _OPENMP + #pragma omp critical +#endif + { + avg_r += avg_c[0]; + avg_g += avg_c[1]; + avg_b += avg_c[2]; + rn += cn[0]; + gn += cn[1]; + bn += cn[2]; + } + } + avg_r *= initialGain; + avg_g *= initialGain; + avg_b *= initialGain; + } else { + for (int i = 32; i < H - 32; i++) + for (int j = 32; j < W - 32; j++) { + // each loop read 1 rgb triplet value + + double dr = CLIP(initialGain * (rawData[i][3 * j] )); + double dg = CLIP(initialGain * (rawData[i][3 * j + 1])); + double db = CLIP(initialGain * (rawData[i][3 * j + 2])); + + if (dr > clipHigh || dg > clipHigh || db > clipHigh) { + continue; + } + + avg_r += dr; + rn++; + avg_g += dg; + avg_b += db; + } + + gn = rn; + bn = rn; + } + } else { + //determine GRBG coset; (ey,ex) is the offset of the R subarray + int ey, ex; + + if (ri->ISGREEN(0, 0)) { //first pixel is G + if (ri->ISRED(0, 1)) { + ey = 0; + ex = 1; + } else { + ey = 1; + ex = 0; + } + } else {//first pixel is R or B + if (ri->ISRED(0, 0)) { + ey = 0; + ex = 0; + } else { + ey = 1; + ex = 1; + } + } + + const double compval = clipHigh / initialGain; +#ifdef _OPENMP + #pragma omp parallel for reduction(+:avg_r,avg_g,avg_b,rn,gn,bn) schedule(dynamic,8) +#endif + + for (int i = 32; i < H - 32; i += 2) + for (int j = 32; j < W - 32; j += 2) { + //average each Bayer quartet component individually if non-clipped + double d[2][2]; + d[0][0] = rawData[i][j]; + d[0][1] = rawData[i][j + 1]; + d[1][0] = rawData[i + 1][j]; + d[1][1] = rawData[i + 1][j + 1]; + + if (d[ey][ex] <= compval) { + avg_r += d[ey][ex]; + rn++; + } + + if (d[1 - ey][ex] <= compval) { + avg_g += d[1 - ey][ex]; + gn++; + } + + if (d[ey][1 - ex] <= compval) { + avg_g += d[ey][1 - ex]; + gn++; + } + + if (d[1 - ey][1 - ex] <= compval) { + avg_b += d[1 - ey][1 - ex]; + bn++; + } + } + + avg_r *= initialGain; + avg_g *= initialGain; + avg_b *= initialGain; + + } + } + } + + if (wbpar.method == "aut" || wbpar.method == "autosdw" || wbpar.method == "autedgsdw" || wbpar.method == "autitcgreen" || wbpar.method == "autedgrob" || wbpar.method == "autedg" || wbpar.method == "autorobust") { + bool twotimes = false; + WBauto(tempref, greenref, redloc, greenloc, blueloc, bfw, bfh, avg_rm, avg_gm, avg_bm, tempitc, greenitc, studgood, twotimes, wbpar, begx, begy, yEn, xEn, cx, cy, cmp, raw); + + } + + redloc(0, 0); + greenloc(0, 0); + blueloc(0, 0); + + if( settings->verbose ) { + printf ("AVG: %g %g %g\n", avg_r / std::max(1, rn), avg_g / std::max(1, gn), avg_b / std::max(1, bn)); + } + + // return ColorTemp (pow(avg_r/rn, 1.0/6.0)*img_r, pow(avg_g/gn, 1.0/6.0)*img_g, pow(avg_b/bn, 1.0/6.0)*img_b); + double reds = 0., greens = 0., blues = 0.; + + if (wbpar.method == "aut" || wbpar.method == "autosdw" || wbpar.method == "autedgsdw" || wbpar.method == "autedgrob" || wbpar.method == "autedg" || wbpar.method == "autorobust") { + //twotimes = true; + reds = avg_rm * refwb_red; + greens = avg_gm * refwb_green; + blues = avg_bm * refwb_blue; + } + + if (wbpar.method == "autold") { + reds = avg_r / std::max(1, rn) * refwb_red; + greens = avg_g / std::max(1, gn) * refwb_green; + blues = avg_b / std::max(1, bn) * refwb_blue; + } + + if (wbpar.method == "autitcgreen") { + //not used + redAWBMul = rm = avg_rm * refwb_red; + greenAWBMul = gm = avg_gm * refwb_green; + blueAWBMul = bm = avg_bm * refwb_blue; + } else { + redAWBMul = rm = imatrices.rgb_cam[0][0] * reds + imatrices.rgb_cam[0][1] * greens + imatrices.rgb_cam[0][2] * blues; + greenAWBMul = gm = imatrices.rgb_cam[1][0] * reds + imatrices.rgb_cam[1][1] * greens + imatrices.rgb_cam[1][2] * blues; + blueAWBMul = bm = imatrices.rgb_cam[2][0] * reds + imatrices.rgb_cam[2][1] * greens + imatrices.rgb_cam[2][2] * blues; + } + +} + + + + + + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% void RawImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) { diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 4c7b0ba21..477519c1f 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -85,10 +85,13 @@ protected: // the interpolated green plane: array2D green; + array2D greenloc; // the interpolated red plane: array2D red; + array2D redloc; // the interpolated blue plane: array2D blue; + array2D blueloc; bool rawDirty; float psRedBrightness[4]; float psGreenBrightness[4]; @@ -101,6 +104,7 @@ protected: void hlRecovery (const std::string &method, float* red, float* green, float* blue, int width, float* hlmax); void transformRect (const PreviewProps &pp, int tran, int &sx1, int &sy1, int &width, int &height, int &fw); void transformPosition (int x, int y, int tran, int& tx, int& ty); + void ItcWB(bool extra, double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, const ColorManagementParams &cmp, const RAWParams &raw, const WBParams & wbpar); unsigned FC(int row, int col) const { @@ -136,6 +140,9 @@ public: void copyOriginalPixels(const RAWParams &raw, RawImage *ri, RawImage *riDark, RawImage *riFlatFile, array2D &rawData ); void cfaboxblur (RawImage *riFlatFile, float* cfablur, int boxH, int boxW); void scaleColors (int winx, int winy, int winw, int winh, const RAWParams &raw, array2D &rawData); // raw for cblack + void WBauto(double &tempref, double &greenref, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const ColorManagementParams &cmp, const RAWParams &raw); + void getAutoWBMultipliersloc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const WBParams & wbpar, const ColorManagementParams &cmp, const RAWParams &raw); + void getrgbloc(bool local, bool gamma, bool cat02, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w); void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const procparams::ToneCurveParams &hrp, const procparams::RAWParams &raw) override; eSensorType getSensorType () const override diff --git a/rtengine/settings.h b/rtengine/settings.h index 1fc3b222c..1986ee69f 100644 --- a/rtengine/settings.h +++ b/rtengine/settings.h @@ -80,6 +80,14 @@ public: // bool bw_complementary; double level0_cbdl; double level123_cbdl; + int itcwb_thres; + bool itcwb_sort; + int itcwb_greenrange; + int itcwb_greendeltatemp; + bool itcwb_forceextra; + int itcwb_sizereference; + int itcwb_delta; + Glib::ustring lensfunDbDirectory; ///< The directory containing the lensfun database. If empty, the system defaults will be used (as described in http://lensfun.sourceforge.net/manual/dbsearch.html) enum class ThumbnailInspectorMode { diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index 6ca3091a3..ce101bd7a 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -29,6 +29,8 @@ namespace rtengine { +using namespace procparams; +ProcParams* params; extern const Settings* settings; @@ -309,6 +311,30 @@ void StdImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr) } } +void StdImageSource::WBauto(double &tempref, double &greenref, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const ColorManagementParams &cmp, const RAWParams &raw) +{ +} + +void StdImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w) +{} + +void StdImageSource::getAutoWBMultipliersloc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const WBParams & wbpar, const ColorManagementParams &cmp, const RAWParams &raw) +{ + if (redAWBMul != -1.) { + rm = redAWBMul; + gm = greenAWBMul; + bm = blueAWBMul; + return; + } + + img->getAutoWBMultipliersloc(tempref, greenref, tempitc, greenitc,studgood, begx, begy, yEn, xEn, cx, cy, bf_h, bf_w, rm, gm, bm, params->wb, params->icm, params->raw); + + redAWBMul = rm; + greenAWBMul = gm; + blueAWBMul = bm; +} + + void StdImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) { if (redAWBMul != -1.) { diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h index 8f16880dc..ba75efbb9 100644 --- a/rtengine/stdimagesource.h +++ b/rtengine/stdimagesource.h @@ -44,12 +44,15 @@ public: int load (const Glib::ustring &fname) override; void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const RAWParams &raw) override; + void getrgbloc(bool local, bool gamma, bool cat02, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w); ColorTemp getWB () const override { return wb; } void getAutoWBMultipliers (double &rm, double &gm, double &bm) override; ColorTemp getSpotWB (std::vector &red, std::vector &green, std::vector &blue, int tran, double equal) override; + void WBauto(double &tempref, double &greenref, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const ColorManagementParams &cmp, const RAWParams &raw); + void getAutoWBMultipliersloc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const WBParams & wbpar, const ColorManagementParams &cmp, const RAWParams &raw); eSensorType getSensorType() const override {return ST_NONE;} bool isMono() const override {return false;} diff --git a/rtgui/options.cc b/rtgui/options.cc index 2437f5313..89a490a68 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -583,6 +583,13 @@ void Options::setDefaults() rtSettings.amchroma = 40;//between 20 and 140 low values increase effect..and also artifacts, high values reduces rtSettings.level0_cbdl = 0; rtSettings.level123_cbdl = 30; + rtSettings.itcwb_thres = 34;//between 10 to 55 + rtSettings.itcwb_sort = false; + rtSettings.itcwb_greenrange = 0;//between 0 to 2 + rtSettings.itcwb_greendeltatemp = 2;//between 0 and 4 + rtSettings.itcwb_forceextra = true; + rtSettings.itcwb_sizereference = 3;//between 1 and 5 + rtSettings.itcwb_delta = 1;//between 0 and 5 rtSettings.protectred = 60; rtSettings.protectredh = 0.3; @@ -1485,6 +1492,35 @@ void Options::readFromFile(Glib::ustring fname) rtSettings.level123_cbdl = keyFile.get_double("Color Management", "CBDLlevel123"); } + if (keyFile.has_key("Color Management", "Itcwb_thres")) { + rtSettings.itcwb_thres = keyFile.get_integer("Color Management", "Itcwb_thres"); + } + + if (keyFile.has_key("Color Management", "Itcwb_sort")) { + rtSettings.itcwb_sort = keyFile.get_boolean("Color Management", "Itcwb_sort"); + } + + if (keyFile.has_key("Color Management", "Itcwb_forceextra")) { + rtSettings.itcwb_forceextra = keyFile.get_boolean("Color Management", "Itcwb_forceextra"); + } + + if (keyFile.has_key("Color Management", "Itcwb_greenrange")) { + rtSettings.itcwb_greenrange = keyFile.get_integer("Color Management", "Itcwb_greenrange"); + } + + if (keyFile.has_key("Color Management", "Itcwb_greendeltatemp")) { + rtSettings.itcwb_greendeltatemp = keyFile.get_integer("Color Management", "Itcwb_greendeltatemp"); + } + + if (keyFile.has_key("Color Management", "Itcwb_sizereference")) { + rtSettings.itcwb_sizereference = keyFile.get_integer("Color Management", "Itcwb_sizereference"); + } + + if (keyFile.has_key("Color Management", "Itcwb_delta")) { + rtSettings.itcwb_delta = keyFile.get_integer("Color Management", "Itcwb_delta"); + } + + //if (keyFile.has_key ("Color Management", "Colortoningab")) rtSettings.colortoningab = keyFile.get_double("Color Management", "Colortoningab"); //if (keyFile.has_key ("Color Management", "Decaction")) rtSettings.decaction = keyFile.get_double("Color Management", "Decaction"); @@ -2148,6 +2184,14 @@ void Options::saveToFile(Glib::ustring fname) //keyFile.set_boolean ("Color Management", "Ciebadpixgauss", rtSettings.ciebadpixgauss); keyFile.set_double("Color Management", "CBDLlevel0", rtSettings.level0_cbdl); keyFile.set_double("Color Management", "CBDLlevel123", rtSettings.level123_cbdl); + keyFile.set_integer("Color Management", "Itcwb_thres", rtSettings.itcwb_thres); + keyFile.set_boolean("Color Management", "Itcwb_sort", rtSettings.itcwb_sort); + keyFile.set_integer("Color Management", "Itcwb_greenrange", rtSettings.itcwb_greenrange); + keyFile.set_integer("Color Management", "Itcwb_greendeltatemp", rtSettings.itcwb_greendeltatemp); + keyFile.set_boolean("Color Management", "Itcwb_forceextra", rtSettings.itcwb_forceextra); + keyFile.set_integer("Color Management", "Itcwb_sizereference", rtSettings.itcwb_sizereference); + keyFile.set_integer("Color Management", "Itcwb_delta", rtSettings.itcwb_delta); + //keyFile.set_double ("Color Management", "Colortoningab", rtSettings.colortoningab); //keyFile.set_double ("Color Management", "Decaction", rtSettings.decaction); keyFile.set_string("Color Management", "ClutsDirectory", clutsDir); diff --git a/rtgui/whitebalance.cc b/rtgui/whitebalance.cc index 3c3382bc3..226edab0b 100644 --- a/rtgui/whitebalance.cc +++ b/rtgui/whitebalance.cc @@ -175,6 +175,14 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WB row[methodColumns.colId] = i + 100; } + if (currType == WBEntry::Type::AUTO) { + // Creating the auto category + row = *(refTreeModel->append()); + row[methodColumns.colIcon] = wbPixbufs[toUnderlying(currType)]; + row[methodColumns.colLabel] = M("TP_WBALANCE_AUTO_HEADER"); + row[methodColumns.colId] = i + 100; + } + if (currType == WBEntry::Type::WATER) { // Creating the under water subcategory header row = *(refTreeModel->append()); @@ -213,6 +221,7 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WB || currType == WBEntry::Type::WATER || currType == WBEntry::Type::FLASH || currType == WBEntry::Type::LED + || currType == WBEntry::Type::AUTO ) { childrow = *(refTreeModel->append(row.children())); childrow[methodColumns.colIcon] = wbPixbufs[toUnderlying(currType)]; From 07d74501f2b52f627b351750c317d00a0fe45ba4 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 25 Jun 2019 17:40:16 +0200 Subject: [PATCH 018/154] Second part ITCWB --- rtdata/languages/default | 5 ++ rtengine/imagesource.h | 1 + rtengine/improccoordinator.cc | 87 ++++++++++++++++++++++++++++------- rtengine/improccoordinator.h | 4 ++ rtengine/procparams.cc | 12 ++--- rtengine/rawimagesource.cc | 8 +++- rtengine/rtengine.h | 2 +- rtgui/whitebalance.cc | 25 +++++++++- rtgui/whitebalance.h | 5 +- 9 files changed, 120 insertions(+), 29 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 5ea726218..8a650d4ba 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2222,6 +2222,8 @@ TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast c TP_WAVELET_TMTYPE;Compression method TP_WAVELET_TON;Toning TP_WBALANCE_AUTO;Auto +TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation\nThe lower the student value, the better the correlation\nValues below 0.002 are excellent\nValues below 0.005 are very good\nValues below 0.01 are good\nValues below 0.05 are good enough\nValues above 0.5 are poor\nVery good Student test results does not mean that the WB is good, if the illuminant is non-standard the results are erratic. +TP_WBALANCE_STUDLABEL;Student Itcwb: %1 TP_WBALANCE_CAMERA;Camera TP_WBALANCE_CLOUDY;Cloudy TP_WBALANCE_CUSTOM;Custom @@ -2231,6 +2233,9 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behavior of "whi TP_WBALANCE_FLASH55;Leica TP_WBALANCE_FLASH60;Standard, Canon, Pentax, Olympus TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta +TP_WBALANCE_AUTO_HEADER;Autos +TP_WBALANCE_AUTOOLD;Auto grey old +TP_WBALANCE_AUTOITCGREEN;Auto iterate temperature correlation TP_WBALANCE_FLASH_HEADER;Flash TP_WBALANCE_FLUO1;F1 - Daylight TP_WBALANCE_FLUO2;F2 - Cool White diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 089cb3bae..11fdb1a66 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -103,6 +103,7 @@ public: virtual void convertColorSpace (Imagefloat* image, const ColorManagementParams &cmp, const ColorTemp &wb) = 0; // DIRTY HACK: this method is derived in rawimagesource and strimagesource, but (...,RAWParams raw) will be used ONLY for raw images virtual void getAutoWBMultipliers (double &rm, double &gm, double &bm) = 0; + virtual void getAutoWBMultipliersloc(double &tempref, double &greenref, double &tempitc, double & greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const WBParams & wbpar, const ColorManagementParams &cmp, const RAWParams &raw) = 0; virtual ColorTemp getWB () const = 0; virtual ColorTemp getSpotWB (std::vector &red, std::vector &green, std::vector &blue, int tran, double equal) = 0; virtual void WBauto(double &tempref, double &greenref, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const ColorManagementParams &cmp, const RAWParams &raw) = 0; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index e718087ec..2ee24f750 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -332,17 +332,17 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) bool autowb0 = false; // bool autoitc = false; - autowb0 = (params->wb.method == "autold" || params->wb.method == "aut" || params->wb.method == "autosdw" || params->wb.method == "autedgsdw" || params->wb.method == "autitcgreen" || params->wb.method == "autedgrob" || params->wb.method == "autedg" || params->wb.method == "autorobust"); - // autoitc = (params.wb.method == "autitcgreen"); - // bool gamma = false; - // bool cat = false; -// if (params.wb.wbcat02Method == "cam" && autoitc) { -// cat = true; -// } + // autowb0 = (params->wb.method == "autold" || params->wb.method == "aut" || params->wb.method == "autosdw" || params->wb.method == "autedgsdw" || params->wb.method == "autitcgreen" || params->wb.method == "autedgrob" || params->wb.method == "autedg" || params->wb.method == "autorobust"); + autowb0 = (params->wb.method == "autold" || params->wb.method == "autitcgreen"); + if(autowb0) printf("autoOKOKOK\n"); + if(!autowb0) printf("NOOOOOOONNNNNN\n"); - if (autowb0) { + + // if (autowb0) { + // printf("OK rgbloc avant\n"); imgsrc->getrgbloc(false, false, false, 0, 0, fh, fw, 0, 0, fh, fw); - } + // printf("OK rgbloc apres\n"); + // } if (highDetailNeeded) { @@ -377,7 +377,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) bool autowb = false; autowb = (params->wb.method == "autold" || params->wb.method == "aut" || params->wb.method == "autosdw" || params->wb.method == "autedgsdw" || params->wb.method == "autitcgreen" || params->wb.method == "autedgrob" || params->wb.method == "autedg" || params->wb.method == "autorobust"); - + if(autowb) printf("AUTOAUTO\n"); + if(!autowb) printf("PAS--NON\n"); + if (todo & (M_INIT | M_LINDENOISE | M_HDR)) { MyMutex::MyLock initLock(minit); // Also used in crop window @@ -389,16 +391,27 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } currWB = ColorTemp(params->wb.temperature, params->wb.green, params->wb.equal, params->wb.method); + float studgood = 1000.f; if (!params->wb.enabled) { currWB = ColorTemp(); } else if (params->wb.method == "Camera") { currWB = imgsrc->getWB(); - } else if (params->wb.method == "Auto") { + // } else if (params->wb.method == "Auto") { + } else if (autowb) { if (lastAwbEqual != params->wb.equal || lastAwbTempBias != params->wb.tempBias) { double rm, gm, bm; - imgsrc->getAutoWBMultipliers(rm, gm, bm); + double tempitc = 5000.f; + double greenitc = 1.; + // imgsrc->getAutoWBMultipliers(rm, gm, bm); + currWBitc = imgsrc->getWB(); + double tempref = currWBitc.getTemp() * (1. + params->wb.tempBias); + double greenref = currWBitc.getGreen(); + printf("tempref=%f greref=%f\n", tempref, greenref); + imgsrc->getAutoWBMultipliersloc(tempref, greenref, tempitc, greenitc, studgood, 0, 0, fh, fw, 0, 0, fh, fw, rm, gm, bm, params->wb, params->icm, params->raw); + +/* if (rm != -1.) { autoWB.update(rm, gm, bm, params->wb.equal, params->wb.tempBias); lastAwbEqual = params->wb.equal; @@ -408,9 +421,39 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lastAwbTempBias = 0.0; autoWB.useDefaults(params->wb.equal); } - +*/ //double rr,gg,bb; //autoWB.getMultipliers(rr,gg,bb); + if (params->wb.method == "autitcgreen") { + params->wb.temperature = tempitc; + params->wb.green = greenitc; + currWB = ColorTemp(params->wb.temperature, params->wb.green, 1., params->wb.method); + currWB.getMultipliers(rm, gm, bm); + } + + if (rm != -1.) { + double bias = params->wb.tempBias; + + if (params->wb.method == "autitcgreen") { + bias = 0.; + } + + autoWB.update(rm, gm, bm, params->wb.equal, bias); + //double temper = autoWB.getTemp(); + //double gre = autoWB.getGreen(); + //printf("temper=%f gre=%f \n", temper, gre); + + lastAwbEqual = params->wb.equal; + lastAwbTempBias = params->wb.tempBias; + lastAwbauto = params->wb.method; + } else { + lastAwbEqual = -1.; + lastAwbTempBias = 0.0; + lastAwbauto = ""; + autoWB.useDefaults(params->wb.equal); + } + + } currWB = autoWB; @@ -421,8 +464,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) params->wb.green = currWB.getGreen(); } - if (params->wb.method == "Auto" && awbListener && params->wb.enabled) { - awbListener->WBChanged(params->wb.temperature, params->wb.green); + // if (params->wb.method == "Auto" && awbListener && params->wb.enabled) { + if (autowb && awbListener) { + awbListener->WBChanged(params->wb.temperature, params->wb.green, studgood); } /* @@ -1198,18 +1242,27 @@ bool ImProcCoordinator::getAutoWB(double& temp, double& green, double equal, dou { if (imgsrc) { - if (lastAwbEqual != equal || lastAwbTempBias != tempBias) { + if (lastAwbEqual != equal || lastAwbTempBias != tempBias || lastAwbauto != params->wb.method) { // Issue 2500 MyMutex::MyLock lock(minit); // Also used in crop window double rm, gm, bm; - imgsrc->getAutoWBMultipliers(rm, gm, bm); + params->wb.method = "autold";//same result as before muliple Auto WB + + // imgsrc->getAutoWBMultipliers(rm, gm, bm); + double tempitc = 5000.; + double greenitc = 1.; + float studgood = 1000.f; + double tempref, greenref; + imgsrc->getAutoWBMultipliersloc(tempref, greenref, tempitc, greenitc, studgood, 0, 0, fh, fw, 0, 0, fh, fw, rm, gm, bm, params->wb, params->icm, params->raw); if (rm != -1) { autoWB.update(rm, gm, bm, equal, tempBias); lastAwbEqual = equal; lastAwbTempBias = tempBias; + lastAwbauto = params->wb.method; } else { lastAwbEqual = -1.; autoWB.useDefaults(equal); + lastAwbauto = ""; lastAwbTempBias = 0.0; } } diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index c293f0c16..dd91187db 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -68,9 +68,13 @@ protected: ColorTemp currWB; ColorTemp autoWB; + ColorTemp currWBloc; + ColorTemp autoWBloc; + ColorTemp currWBitc; double lastAwbEqual; double lastAwbTempBias; + Glib::ustring lastAwbauto; Glib::ustring monitorProfile; RenderingIntent monitorIntent; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index cfa35ee01..21124f7bf 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1233,12 +1233,12 @@ const std::vector& WBParams::getWbEntries() // {"Auto", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTO"), 0, 1.f, 1.f, 0.f}, {"autitcgreen", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOITCGREEN"), 0, 1.f, 1.f, 0.f}, {"autold", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOOLD"), 0, 1.f, 1.f, 0.f}, - {"aut", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTODEM"), 0, 1.f, 1.f, 0.f}, - {"autedg", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOEDGE"), 0, 1.f, 1.f, 0.f}, - {"autorobust", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOROB"), 0, 1.f, 1.f, 0.f}, - {"autosdw", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOSDW"), 0, 1.f, 1.f, 0.f}, - {"autedgsdw", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOEDGESW"), 0, 1.f, 1.f, 0.f}, - {"autedgrob", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOEDGEROB"), 0, 1.f, 1.f, 0.f}, + // {"aut", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTODEM"), 0, 1.f, 1.f, 0.f}, + // {"autedg", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOEDGE"), 0, 1.f, 1.f, 0.f}, + // {"autorobust", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOROB"), 0, 1.f, 1.f, 0.f}, + // {"autosdw", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOSDW"), 0, 1.f, 1.f, 0.f}, + // {"autedgsdw", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOEDGESW"), 0, 1.f, 1.f, 0.f}, + // {"autedgrob", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOEDGEROB"), 0, 1.f, 1.f, 0.f}, {"Daylight", WBEntry::Type::DAYLIGHT, M("TP_WBALANCE_DAYLIGHT"), 5300, 1.f, 1.f, 0.f}, {"Cloudy", WBEntry::Type::CLOUDY, M("TP_WBALANCE_CLOUDY"), 6200, 1.f, 1.f, 0.f}, {"Shade", WBEntry::Type::SHADE, M("TP_WBALANCE_SHADE"), 7600, 1.f, 1.f, 0.f}, diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 7d4f613f9..e6f50336b 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -6726,7 +6726,6 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double {12001., 0.960440, 1.601019} }; int N_t = sizeof(Txyz) / sizeof(Txyz[0]); //number of temperature White point - int nbt = N_t; float **Tx = nullptr; float **Ty = nullptr; @@ -7591,7 +7590,7 @@ void RawImageSource::WBauto(double & tempref, double & greenref, array2D } - +printf("ok avant itc\n"); if (wbpar.method == "autitcgreen") { bool extra = false; @@ -7612,9 +7611,11 @@ void RawImageSource::WBauto(double & tempref, double & greenref, array2D tempitc = 5000.; // greenitc = greenref; itc = true; +printf("ok avant itc 2\n"); if (itc) { ItcWB(extra, tempref, greenref, tempitc, greenitc, studgood, redloc, greenloc, blueloc, bfw, bfh, avg_rm, avg_gm, avg_bm, cmp, raw, wbpar); +printf("ok apres itc \n"); } } @@ -7733,6 +7734,7 @@ void RawImageSource::WBauto(double & tempref, double & greenref, array2D void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w) { //used by auto WB local to calculate red, green, blue in local region + printf("OK RGBLOC\n"); // int bfh = bf_h + 3, bfw = bf_w + 3; int bfh = H, bfw = W; @@ -8081,7 +8083,9 @@ void RawImageSource::getAutoWBMultipliersloc(double & tempref, double & greenref if (wbpar.method == "aut" || wbpar.method == "autosdw" || wbpar.method == "autedgsdw" || wbpar.method == "autitcgreen" || wbpar.method == "autedgrob" || wbpar.method == "autedg" || wbpar.method == "autorobust") { bool twotimes = false; + printf("OK avant auto\n"); WBauto(tempref, greenref, redloc, greenloc, blueloc, bfw, bfh, avg_rm, avg_gm, avg_bm, tempitc, greenitc, studgood, twotimes, wbpar, begx, begy, yEn, xEn, cx, cy, cmp, raw); + printf("OK apres auto\n"); } diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index 6264d43ae..e08a2a613 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -376,7 +376,7 @@ class AutoWBListener { public: virtual ~AutoWBListener() = default; - virtual void WBChanged(double temp, double green) = 0; + virtual void WBChanged(double temp, double green, float studgood) = 0; }; class FrameCountListener diff --git a/rtgui/whitebalance.cc b/rtgui/whitebalance.cc index 226edab0b..b04b1f136 100644 --- a/rtgui/whitebalance.cc +++ b/rtgui/whitebalance.cc @@ -324,6 +324,9 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WB Gtk::Image* itempbiasL = Gtk::manage (new RTImage ("circle-blue-small.png")); Gtk::Image* itempbiasR = Gtk::manage (new RTImage ("circle-yellow-small.png")); + StudLabel = Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER)); + StudLabel->set_tooltip_text(M("TP_WBALANCE_STUDLABEL_TOOLTIP")); + temp = Gtk::manage (new Adjuster (M("TP_WBALANCE_TEMPERATURE"), MINTEMP, MAXTEMP, 5, CENTERTEMP, itempL, itempR, &wbSlider2Temp, &wbTemp2Slider)); green = Gtk::manage (new Adjuster (M("TP_WBALANCE_GREEN"), MINGREEN, MAXGREEN, 0.001, 1.0, igreenL, igreenR)); equal = Gtk::manage (new Adjuster (M("TP_WBALANCE_EQBLUERED"), MINEQUAL, MAXEQUAL, 0.001, 1.0, iblueredL, iblueredR)); @@ -344,6 +347,7 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WB boxgreen->pack_start(*igreenL); boxgreen->pack_start(*green); boxgreen->pack_start(*igreenR);*/ + pack_start(*StudLabel); pack_start (*temp); //pack_start (*boxgreen); @@ -477,6 +481,12 @@ void WhiteBalance::optChanged () const WBEntry& currMethod = WBParams::getWbEntries()[methodId]; tempBias->set_sensitive(currMethod.type == WBEntry::Type::AUTO); + bool autit = (currMethod.ppLabel == "autitcgreen"); + if (autit) { + StudLabel->show(); + } else { + StudLabel->hide(); + } switch (currMethod.type) { case WBEntry::Type::CAMERA: @@ -697,6 +707,13 @@ void WhiteBalance::read (const ProcParams* pp, const ParamsEdited* pedited) } tempBias->set_sensitive(wbValues.type == WBEntry::Type::AUTO); + bool autit = (wbValues.ppLabel == "autitcgreen"); + if (autit) { + StudLabel->show(); + } else { + StudLabel->hide(); + } + } setEnabled(pp->wb.enabled); @@ -915,15 +932,19 @@ inline Gtk::TreeRow WhiteBalance::getActiveMethod () return *(method->get_active()); } -void WhiteBalance::WBChanged(double temperature, double greenVal) +void WhiteBalance::WBChanged(double temperature, double greenVal, float studgood) { idle_register.add( - [this, temperature, greenVal]() -> bool + [this, temperature, greenVal, studgood]() -> bool { disableListener(); setEnabled(true); temp->setValue(temperature); green->setValue(greenVal); + StudLabel->set_text( + Glib::ustring::compose(M("TP_WBALANCE_STUDLABEL"), + Glib::ustring::format(std::fixed, std::setprecision(4), studgood)) + ); temp->setDefault(temperature); green->setDefault(greenVal); enableListener(); diff --git a/rtgui/whitebalance.h b/rtgui/whitebalance.h index 2db46b7af..71dce989d 100644 --- a/rtgui/whitebalance.h +++ b/rtgui/whitebalance.h @@ -41,6 +41,9 @@ class WhiteBalance : public ToolParamBlock, public AdjusterListener, public Fold WBLT_PP }; +private: + Gtk::Label* StudLabel; + protected: class MethodColumns : public Gtk::TreeModel::ColumnRecord { @@ -118,7 +121,7 @@ public: wblistener = l; } void setWB (int temp, double green); - void WBChanged (double temp, double green) override; + void WBChanged (double temp, double green, float studgood) override; void setAdjusterBehavior (bool tempadd, bool greenadd, bool equaladd, bool tempbiasadd); void trimValues (rtengine::procparams::ProcParams* pp) override; From ee63f51e5c38969f43078cf93b162382fd2d13d9 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 25 Jun 2019 20:31:59 +0200 Subject: [PATCH 019/154] Some improvment and bug fixed --- rtengine/improccoordinator.cc | 34 ++++++++++++++++++---------------- rtengine/rawimagesource.cc | 2 +- rtgui/whitebalance.cc | 2 +- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 2ee24f750..fff5af8b8 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -49,6 +49,7 @@ ImProcCoordinator::ImProcCoordinator() : imgsrc (nullptr), lastAwbEqual (0.), lastAwbTempBias (0.0), + lastAwbauto(""), monitorIntent (RI_RELATIVE), softProof(false), gamutCheck(false), @@ -221,6 +222,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) int readyphase = 0; bool highDetailNeeded = options.prevdemo == PD_Sidecar ? true : (todo & M_HIGHQUAL); + printf("metwb=%s \n", params->wb.method.c_str()); // Check if any detail crops need high detail. If not, take a fast path short cut if (!highDetailNeeded) { @@ -242,6 +244,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) RAWParams rp = params->raw; ColorManagementParams cmp = params->icm; LCurveParams lcur = params->labCurve; + printf("metwb2=%s \n", params->wb.method.c_str()); if (!highDetailNeeded) { // if below 100% magnification, take a fast path @@ -330,21 +333,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) // if a demosaic happened we should also call getimage later, so we need to set the M_INIT flag todo |= M_INIT; - bool autowb0 = false; - // bool autoitc = false; - // autowb0 = (params->wb.method == "autold" || params->wb.method == "aut" || params->wb.method == "autosdw" || params->wb.method == "autedgsdw" || params->wb.method == "autitcgreen" || params->wb.method == "autedgrob" || params->wb.method == "autedg" || params->wb.method == "autorobust"); - autowb0 = (params->wb.method == "autold" || params->wb.method == "autitcgreen"); - if(autowb0) printf("autoOKOKOK\n"); - if(!autowb0) printf("NOOOOOOONNNNNN\n"); - - - // if (autowb0) { - // printf("OK rgbloc avant\n"); - imgsrc->getrgbloc(false, false, false, 0, 0, fh, fw, 0, 0, fh, fw); - // printf("OK rgbloc apres\n"); - // } - - if (highDetailNeeded) { highDetailRawComputed = true; } else { @@ -359,6 +347,19 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } } + bool autowb0 = false; + // autowb0 = (params->wb.method == "autold" || params->wb.method == "aut" || params->wb.method == "autosdw" || params->wb.method == "autedgsdw" || params->wb.method == "autitcgreen" || params->wb.method == "autedgrob" || params->wb.method == "autedg" || params->wb.method == "autorobust"); + autowb0 = (params->wb.method == "autold" || params->wb.method == "autitcgreen"); + printf("autowb0=%s \n", params->wb.method.c_str()); + + + + // if (autowb0) { + // printf("OK rgbloc avant\n"); + imgsrc->getrgbloc(false, false, false, 0, 0, fh, fw, 0, 0, fh, fw); + // printf("OK rgbloc apres\n"); + // } + if ((todo & (M_RETINEX | M_INIT)) && params->retinex.enabled) { bool dehacontlutili = false; bool mapcontlutili = false; @@ -379,6 +380,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) autowb = (params->wb.method == "autold" || params->wb.method == "aut" || params->wb.method == "autosdw" || params->wb.method == "autedgsdw" || params->wb.method == "autitcgreen" || params->wb.method == "autedgrob" || params->wb.method == "autedg" || params->wb.method == "autorobust"); if(autowb) printf("AUTOAUTO\n"); if(!autowb) printf("PAS--NON\n"); + printf("auto=%s \n", params->wb.method.c_str()); if (todo & (M_INIT | M_LINDENOISE | M_HDR)) { MyMutex::MyLock initLock(minit); // Also used in crop window @@ -399,7 +401,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) currWB = imgsrc->getWB(); // } else if (params->wb.method == "Auto") { } else if (autowb) { - if (lastAwbEqual != params->wb.equal || lastAwbTempBias != params->wb.tempBias) { + if (lastAwbEqual != params->wb.equal || lastAwbTempBias != params->wb.tempBias || lastAwbauto != params->wb.method) { double rm, gm, bm; double tempitc = 5000.f; double greenitc = 1.; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index e6f50336b..72131e793 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -7907,7 +7907,7 @@ void RawImageSource::getAutoWBMultipliersloc(double & tempref, double & greenref // int bfh = bf_h + 3, bfw = bf_w + 3; int bfh = H, bfw = W; if (wbpar.method == "autold") { - + printf("OK auto OLD\n"); if (fuji) { for (int i = 32; i < H - 32; i++) { int fw = ri->get_FujiWidth(); diff --git a/rtgui/whitebalance.cc b/rtgui/whitebalance.cc index b04b1f136..86cbe2e7a 100644 --- a/rtgui/whitebalance.cc +++ b/rtgui/whitebalance.cc @@ -142,7 +142,7 @@ static double wbTemp2Slider(double temp) return sval; } -WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WBALANCE_LABEL"), false, true), wbp(nullptr), wblistener(nullptr) +WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WBALANCE_LABEL"), true, true), wbp(nullptr), wblistener(nullptr) { Gtk::Grid* methodgrid = Gtk::manage(new Gtk::Grid()); From 7ac9629a7e91a6bc6b45c4f725f0bf82cbd1469e Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 26 Jun 2019 06:47:19 +0200 Subject: [PATCH 020/154] Some improvments --- rtengine/iimage.h | 2 +- rtengine/imagesource.h | 2 +- rtengine/improccoordinator.cc | 38 ++++++++--------------------------- rtengine/rawimagesource.cc | 13 +++++------- rtengine/rawimagesource.h | 2 +- rtengine/stdimagesource.cc | 4 ++-- rtengine/stdimagesource.h | 2 +- 7 files changed, 19 insertions(+), 44 deletions(-) diff --git a/rtengine/iimage.h b/rtengine/iimage.h index bda390895..03c8a9023 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -103,7 +103,7 @@ public: { rm = gm = bm = 1.0; } - virtual void getAutoWBMultipliersloc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const procparams::WBParams & wbpar, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw) + virtual void getAutoWBMultipliersitc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const procparams::WBParams & wbpar, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw) { rm = gm = bm = 1.0; } diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 11fdb1a66..d7f0d1b25 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -103,7 +103,7 @@ public: virtual void convertColorSpace (Imagefloat* image, const ColorManagementParams &cmp, const ColorTemp &wb) = 0; // DIRTY HACK: this method is derived in rawimagesource and strimagesource, but (...,RAWParams raw) will be used ONLY for raw images virtual void getAutoWBMultipliers (double &rm, double &gm, double &bm) = 0; - virtual void getAutoWBMultipliersloc(double &tempref, double &greenref, double &tempitc, double & greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const WBParams & wbpar, const ColorManagementParams &cmp, const RAWParams &raw) = 0; + virtual void getAutoWBMultipliersitc(double &tempref, double &greenref, double &tempitc, double & greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const WBParams & wbpar, const ColorManagementParams &cmp, const RAWParams &raw) = 0; virtual ColorTemp getWB () const = 0; virtual ColorTemp getSpotWB (std::vector &red, std::vector &green, std::vector &blue, int tran, double equal) = 0; virtual void WBauto(double &tempref, double &greenref, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const ColorManagementParams &cmp, const RAWParams &raw) = 0; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index fff5af8b8..471638c16 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -222,7 +222,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) int readyphase = 0; bool highDetailNeeded = options.prevdemo == PD_Sidecar ? true : (todo & M_HIGHQUAL); - printf("metwb=%s \n", params->wb.method.c_str()); + // printf("metwb=%s \n", params->wb.method.c_str()); // Check if any detail crops need high detail. If not, take a fast path short cut if (!highDetailNeeded) { @@ -244,7 +244,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) RAWParams rp = params->raw; ColorManagementParams cmp = params->icm; LCurveParams lcur = params->labCurve; - printf("metwb2=%s \n", params->wb.method.c_str()); + printf("metwb2=%s \n", params->wb.method.c_str()); if (!highDetailNeeded) { // if below 100% magnification, take a fast path @@ -349,15 +349,13 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) bool autowb0 = false; // autowb0 = (params->wb.method == "autold" || params->wb.method == "aut" || params->wb.method == "autosdw" || params->wb.method == "autedgsdw" || params->wb.method == "autitcgreen" || params->wb.method == "autedgrob" || params->wb.method == "autedg" || params->wb.method == "autorobust"); - autowb0 = (params->wb.method == "autold" || params->wb.method == "autitcgreen"); + autowb0 = (params->wb.method == "autold" || params->wb.method == "autitcgreen");//in some cases autowb0 does not work ....params->wb.method still at "camera" instead of auto !!! printf("autowb0=%s \n", params->wb.method.c_str()); // if (autowb0) { - // printf("OK rgbloc avant\n"); imgsrc->getrgbloc(false, false, false, 0, 0, fh, fw, 0, 0, fh, fw); - // printf("OK rgbloc apres\n"); // } if ((todo & (M_RETINEX | M_INIT)) && params->retinex.enabled) { @@ -378,9 +376,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) bool autowb = false; autowb = (params->wb.method == "autold" || params->wb.method == "aut" || params->wb.method == "autosdw" || params->wb.method == "autedgsdw" || params->wb.method == "autitcgreen" || params->wb.method == "autedgrob" || params->wb.method == "autedg" || params->wb.method == "autorobust"); - if(autowb) printf("AUTOAUTO\n"); - if(!autowb) printf("PAS--NON\n"); - printf("auto=%s \n", params->wb.method.c_str()); + printf("automethod=%s \n", params->wb.method.c_str()); if (todo & (M_INIT | M_LINDENOISE | M_HDR)) { MyMutex::MyLock initLock(minit); // Also used in crop window @@ -399,33 +395,19 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) currWB = ColorTemp(); } else if (params->wb.method == "Camera") { currWB = imgsrc->getWB(); - // } else if (params->wb.method == "Auto") { + lastAwbauto = ""; //reinitialize auto } else if (autowb) { if (lastAwbEqual != params->wb.equal || lastAwbTempBias != params->wb.tempBias || lastAwbauto != params->wb.method) { double rm, gm, bm; double tempitc = 5000.f; double greenitc = 1.; - // imgsrc->getAutoWBMultipliers(rm, gm, bm); currWBitc = imgsrc->getWB(); double tempref = currWBitc.getTemp() * (1. + params->wb.tempBias); double greenref = currWBitc.getGreen(); - printf("tempref=%f greref=%f\n", tempref, greenref); + printf("tempref=%f greref=%f\n", tempref, greenref); - imgsrc->getAutoWBMultipliersloc(tempref, greenref, tempitc, greenitc, studgood, 0, 0, fh, fw, 0, 0, fh, fw, rm, gm, bm, params->wb, params->icm, params->raw); + imgsrc->getAutoWBMultipliersitc(tempref, greenref, tempitc, greenitc, studgood, 0, 0, fh, fw, 0, 0, fh, fw, rm, gm, bm, params->wb, params->icm, params->raw); -/* - if (rm != -1.) { - autoWB.update(rm, gm, bm, params->wb.equal, params->wb.tempBias); - lastAwbEqual = params->wb.equal; - lastAwbTempBias = params->wb.tempBias; - } else { - lastAwbEqual = -1.; - lastAwbTempBias = 0.0; - autoWB.useDefaults(params->wb.equal); - } -*/ - //double rr,gg,bb; - //autoWB.getMultipliers(rr,gg,bb); if (params->wb.method == "autitcgreen") { params->wb.temperature = tempitc; params->wb.green = greenitc; @@ -441,10 +423,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } autoWB.update(rm, gm, bm, params->wb.equal, bias); - //double temper = autoWB.getTemp(); - //double gre = autoWB.getGreen(); - //printf("temper=%f gre=%f \n", temper, gre); - lastAwbEqual = params->wb.equal; lastAwbTempBias = params->wb.tempBias; lastAwbauto = params->wb.method; @@ -1254,7 +1232,7 @@ bool ImProcCoordinator::getAutoWB(double& temp, double& green, double equal, dou double greenitc = 1.; float studgood = 1000.f; double tempref, greenref; - imgsrc->getAutoWBMultipliersloc(tempref, greenref, tempitc, greenitc, studgood, 0, 0, fh, fw, 0, 0, fh, fw, rm, gm, bm, params->wb, params->icm, params->raw); + imgsrc->getAutoWBMultipliersitc(tempref, greenref, tempitc, greenitc, studgood, 0, 0, fh, fw, 0, 0, fh, fw, rm, gm, bm, params->wb, params->icm, params->raw); if (rm != -1) { autoWB.update(rm, gm, bm, equal, tempBias); diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 72131e793..153578756 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -7590,7 +7590,6 @@ void RawImageSource::WBauto(double & tempref, double & greenref, array2D } -printf("ok avant itc\n"); if (wbpar.method == "autitcgreen") { bool extra = false; @@ -7611,11 +7610,9 @@ printf("ok avant itc\n"); tempitc = 5000.; // greenitc = greenref; itc = true; -printf("ok avant itc 2\n"); if (itc) { ItcWB(extra, tempref, greenref, tempitc, greenitc, studgood, redloc, greenloc, blueloc, bfw, bfh, avg_rm, avg_gm, avg_bm, cmp, raw, wbpar); -printf("ok apres itc \n"); } } @@ -7734,7 +7731,7 @@ printf("ok apres itc \n"); void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w) { //used by auto WB local to calculate red, green, blue in local region - printf("OK RGBLOC\n"); + // printf("OK RGBLOC\n"); // int bfh = bf_h + 3, bfw = bf_w + 3; int bfh = H, bfw = W; @@ -7875,7 +7872,7 @@ void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, in } //void RawImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) -void RawImageSource::getAutoWBMultipliersloc(double & tempref, double & greenref, double & tempitc, double & greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double & rm, double & gm, double & bm, const WBParams & wbpar, const ColorManagementParams & cmp, const RAWParams & raw) +void RawImageSource::getAutoWBMultipliersitc(double & tempref, double & greenref, double & tempitc, double & greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double & rm, double & gm, double & bm, const WBParams & wbpar, const ColorManagementParams & cmp, const RAWParams & raw) { BENCHFUN constexpr double clipHigh = 64000.0; @@ -7907,7 +7904,7 @@ void RawImageSource::getAutoWBMultipliersloc(double & tempref, double & greenref // int bfh = bf_h + 3, bfw = bf_w + 3; int bfh = H, bfw = W; if (wbpar.method == "autold") { - printf("OK auto OLD\n"); + // printf("OK auto OLD\n"); if (fuji) { for (int i = 32; i < H - 32; i++) { int fw = ri->get_FujiWidth(); @@ -8083,9 +8080,9 @@ void RawImageSource::getAutoWBMultipliersloc(double & tempref, double & greenref if (wbpar.method == "aut" || wbpar.method == "autosdw" || wbpar.method == "autedgsdw" || wbpar.method == "autitcgreen" || wbpar.method == "autedgrob" || wbpar.method == "autedg" || wbpar.method == "autorobust") { bool twotimes = false; - printf("OK avant auto\n"); + // printf("OK avant auto\n"); WBauto(tempref, greenref, redloc, greenloc, blueloc, bfw, bfh, avg_rm, avg_gm, avg_bm, tempitc, greenitc, studgood, twotimes, wbpar, begx, begy, yEn, xEn, cx, cy, cmp, raw); - printf("OK apres auto\n"); + // printf("OK apres auto\n"); } diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 477519c1f..d1619fb7c 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -141,7 +141,7 @@ public: void cfaboxblur (RawImage *riFlatFile, float* cfablur, int boxH, int boxW); void scaleColors (int winx, int winy, int winw, int winh, const RAWParams &raw, array2D &rawData); // raw for cblack void WBauto(double &tempref, double &greenref, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const ColorManagementParams &cmp, const RAWParams &raw); - void getAutoWBMultipliersloc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const WBParams & wbpar, const ColorManagementParams &cmp, const RAWParams &raw); + void getAutoWBMultipliersitc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const WBParams & wbpar, const ColorManagementParams &cmp, const RAWParams &raw); void getrgbloc(bool local, bool gamma, bool cat02, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w); void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const procparams::ToneCurveParams &hrp, const procparams::RAWParams &raw) override; diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index ce101bd7a..ce61441c5 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -318,7 +318,7 @@ void StdImageSource::WBauto(double &tempref, double &greenref, array2D &r void StdImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w) {} -void StdImageSource::getAutoWBMultipliersloc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const WBParams & wbpar, const ColorManagementParams &cmp, const RAWParams &raw) +void StdImageSource::getAutoWBMultipliersitc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const WBParams & wbpar, const ColorManagementParams &cmp, const RAWParams &raw) { if (redAWBMul != -1.) { rm = redAWBMul; @@ -327,7 +327,7 @@ void StdImageSource::getAutoWBMultipliersloc(double &tempref, double &greenref, return; } - img->getAutoWBMultipliersloc(tempref, greenref, tempitc, greenitc,studgood, begx, begy, yEn, xEn, cx, cy, bf_h, bf_w, rm, gm, bm, params->wb, params->icm, params->raw); + img->getAutoWBMultipliersitc(tempref, greenref, tempitc, greenitc,studgood, begx, begy, yEn, xEn, cx, cy, bf_h, bf_w, rm, gm, bm, params->wb, params->icm, params->raw); redAWBMul = rm; greenAWBMul = gm; diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h index ba75efbb9..d62b52dc7 100644 --- a/rtengine/stdimagesource.h +++ b/rtengine/stdimagesource.h @@ -52,7 +52,7 @@ public: void getAutoWBMultipliers (double &rm, double &gm, double &bm) override; ColorTemp getSpotWB (std::vector &red, std::vector &green, std::vector &blue, int tran, double equal) override; void WBauto(double &tempref, double &greenref, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const ColorManagementParams &cmp, const RAWParams &raw); - void getAutoWBMultipliersloc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const WBParams & wbpar, const ColorManagementParams &cmp, const RAWParams &raw); + void getAutoWBMultipliersitc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const WBParams & wbpar, const ColorManagementParams &cmp, const RAWParams &raw); eSensorType getSensorType() const override {return ST_NONE;} bool isMono() const override {return false;} From 9338bef4c69e3825147aed007e0691efc22da4a4 Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 24 Jul 2019 07:23:51 +0200 Subject: [PATCH 021/154] Change limit Lmethod for clarity and sharp-mask --- rtgui/wavelet.cc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 7f9164779..b66d61e93 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -248,7 +248,6 @@ Wavelet::Wavelet() : levdirMainHBox->pack_start(*levdirMainLabel, Gtk::PACK_SHRINK, 4); levdirMainHBox->pack_start(*CLmethod); //same - Lmethod->set_sensitive(false); Lmethod->set_sensitive(false); Lmethod->append(M("TP_WAVELET_1")); Lmethod->append(M("TP_WAVELET_2")); @@ -2491,6 +2490,14 @@ void Wavelet::LmethodUpdateUI() { void Wavelet::LmethodChanged() { //LmethodUpdateUI(); + if(ushamethod->get_active_row_number() == 0 && expclari->getEnabled() == true) { + if(Lmethod->get_active_row_number() > 3) Lmethod->set_active(3); + } + + if(ushamethod->get_active_row_number() == 1 && expclari->getEnabled() == true) { + if(Lmethod->get_active_row_number() < 4) Lmethod->set_active(4); + } + if (listener && (multiImage || getEnabled())) { listener->panelChanged(EvWavLmet, Lmethod->get_active_text()); } From 7d9edc4681ea806d36ebe93b87d90599aa08c4ea Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 24 Jul 2019 08:54:17 +0200 Subject: [PATCH 022/154] Change clarity tooltip --- rtdata/languages/default | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 3014ce83d..146a5c2c1 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2249,7 +2249,7 @@ TP_WAVELET_TMSCALE;Scale TP_WAVELET_TON;Toning TP_WAVELET_USHARP;Clarity method TP_WAVELET_USH;None -TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, wavelet settings will be automatically positioned :\nBackground=black, Process=below, level=3...you can change level.\n\nIf you select Clarity, wavelet settings will be automatically positioned :\nBackground=residual, Process=above, level=7..you can change level and wavelet levels. +TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, wavelet settings will be automatically positioned :\nBackground=black, Process=below, level=3...you can change level between 1 and 4.\n\nIf you select Clarity, wavelet settings will be automatically positioned :\nBackground=residual, Process=above, level=7..you can change level between 5 and 10 and wavelet levels. TP_WAVELET_SHA;Sharp mask TP_WAVELET_SHOWMASK;Show wavelet 'mask' TP_WAVELET_CLA;Clarity From ee27f6778b782d5c2126a012d03b1bf27256d892 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 17 Aug 2019 17:51:42 +0200 Subject: [PATCH 023/154] Change label auto grey --- rtdata/languages/default | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index c68054a87..0e1da6e25 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2243,7 +2243,7 @@ TP_WBALANCE_FLASH55;Leica TP_WBALANCE_FLASH60;Standard, Canon, Pentax, Olympus TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta TP_WBALANCE_AUTO_HEADER;Autos -TP_WBALANCE_AUTOOLD;Auto grey old +TP_WBALANCE_AUTOOLD;Auto RGB grey TP_WBALANCE_AUTOITCGREEN;Auto iterate temperature correlation TP_WBALANCE_FLASH_HEADER;Flash TP_WBALANCE_FLUO1;F1 - Daylight From 6636c484a6e29111b9cdba1d3ec05fb34a841e2f Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 17 Aug 2019 18:03:11 +0200 Subject: [PATCH 024/154] Suppress warning --- rtengine/improccoordinator.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 88878c5b4..a7f2a4cb3 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -359,10 +359,10 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } } - bool autowb0 = false; + // bool autowb0 = false; // autowb0 = (params->wb.method == "autold" || params->wb.method == "aut" || params->wb.method == "autosdw" || params->wb.method == "autedgsdw" || params->wb.method == "autitcgreen" || params->wb.method == "autedgrob" || params->wb.method == "autedg" || params->wb.method == "autorobust"); - autowb0 = (params->wb.method == "autold" || params->wb.method == "autitcgreen");//in some cases autowb0 does not work ....params->wb.method still at "camera" instead of auto !!! - printf("autowb0=%s \n", params->wb.method.c_str()); + // autowb0 = (params->wb.method == "autold" || params->wb.method == "autitcgreen");//in some cases autowb0 does not work ....params->wb.method still at "camera" instead of auto !!! + // printf("autowb0=%s \n", params->wb.method.c_str()); From 9cd4ca51d317e2bd246d3dc34cb87ae41c461568 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 27 Aug 2019 08:56:15 +0200 Subject: [PATCH 025/154] Change Guidedfilter Guid reference from L to Y --- rtengine/improccoordinator.cc | 9 ++++++++- rtengine/ipwavelet.cc | 10 +++++++++- rtgui/wavelet.cc | 4 ++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index bbc37cd2a..6a93d1d82 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -934,8 +934,15 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) for (int ir = 0; ir < pH; ir++) for (int jr = 0; jr < pW; jr++) { + float X, Y, Z; + float L = provradius->L[ir][jr]; + float a = provradius->a[ir][jr]; + float b = provradius->b[ir][jr]; + Color::Lab2XYZ(L, a, b, X, Y, Z); + + guid[ir][jr] = Y / 32768.f; + ble[ir][jr] = (nprevl->L[ir][jr]) / 32768.f; - guid[ir][jr] = provradius->L[ir][jr] / 32768.f; } double epsilmax = 0.0001; double epsilmin = 0.00001; diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 4b46c9742..8a2e3eeda 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1285,7 +1285,15 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const for (int ir = 0; ir < lab->H; ir++) for (int jr = 0; jr < lab->W; jr++) { ble[ir][jr] = dst->L[ir][jr] / 32768.f; - guid[ir][jr] = provradius->L[ir][jr] / 32768.f; + float X, Y, Z; + float L = provradius->L[ir][jr]; + float a = provradius->a[ir][jr]; + float b = provradius->b[ir][jr]; + Color::Lab2XYZ(L, a, b, X, Y, Z); + + guid[ir][jr] = Y / 32768.f; + +// guid[ir][jr] = provradius->L[ir][jr] / 32768.f; } double epsilmax = 0.001; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 4aa18f5bd..375e0a8cf 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -120,8 +120,8 @@ Wavelet::Wavelet() : edgeampli(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGEAMPLI"), 0, 100, 1, 10))), mergeL(Gtk::manage(new Adjuster(M("TP_WAVELET_MERGEL"), -50, 100, 1, 40))), mergeC(Gtk::manage(new Adjuster(M("TP_WAVELET_MERGEC"), -50, 100, 1, 20))), - softrad(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.1, 0.))), - softradend(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.1, 0.))), + softrad(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.5, 0.))), + softradend(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.5, 0.))), Lmethod(Gtk::manage(new MyComboBoxText())), CHmethod(Gtk::manage(new MyComboBoxText())), CHSLmethod(Gtk::manage(new MyComboBoxText())), From 8fc55ea70c3cdce41d91509fb8cd543b31c67574 Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 29 Aug 2019 13:29:14 +0200 Subject: [PATCH 026/154] Change GUI for residual chroma --- rtdata/languages/default | 3 ++- rtgui/wavelet.cc | 14 +++++++++++--- rtgui/wavelet.h | 1 + 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 146a5c2c1..977f40149 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2109,6 +2109,7 @@ TP_WAVELET_CH3;Link contrast levels TP_WAVELET_CHCU;Curve TP_WAVELET_CHR;Chroma-contrast link strength TP_WAVELET_CHRO;Saturated/pastel threshold +TP_WAVELET_CHROMAFRAME;Chroma TP_WAVELET_CHRO_TOOLTIP;Sets the wavelet level which will be the threshold between saturated and pastel colors.\n1-x: saturated\nx-9: pastel\n\nIf the value exceeds the amount of wavelet levels you are using then it will be ignored. TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of "contrast levels" and "chroma-contrast link strength" TP_WAVELET_CHSL;Sliders @@ -2216,7 +2217,7 @@ TP_WAVELET_RADIUS;Radius Shadows - Highlight TP_WAVELET_RE1;Reinforced TP_WAVELET_RE2;Unchanged TP_WAVELET_RE3;Reduced -TP_WAVELET_RESCHRO;Chroma +TP_WAVELET_RESCHRO;Intensity TP_WAVELET_RESCON;Shadows TP_WAVELET_RESCONH;Highlights TP_WAVELET_RESID;Residual Image diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 375e0a8cf..775205bdb 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -140,6 +140,7 @@ Wavelet::Wavelet() : chanMixerHLFrame(Gtk::manage(new Gtk::Frame(M("TP_COLORTONING_HIGHLIGHT")))), chanMixerMidFrame(Gtk::manage(new Gtk::Frame(M("TP_COLORTONING_MIDTONES")))), chanMixerShadowsFrame(Gtk::manage(new Gtk::Frame(M("TP_COLORTONING_SHADOWS")))), + chromaFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_CHROMAFRAME")))), wavLabels(Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER))), labmC(Gtk::manage(new Gtk::Label(M("TP_WAVELET_CTYPE") + ":"))), labmNP(Gtk::manage(new Gtk::Label(M("TP_WAVELET_NPTYPE") + ":"))), @@ -687,8 +688,14 @@ Wavelet::Wavelet() : resBox->pack_start(*contrast); //keep the possibility to reinstall reschro->setAdjusterListener(this); - resBox->pack_start(*reschro); +// resBox->pack_start(*reschro); + chromaFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const chromaBox = Gtk::manage(new ToolParamBlock()); + chromaBox->pack_start(*reschro); + chromaBox->pack_start(*hueskin2); + chromaBox->pack_start(*sky); + chromaFrame->add(*chromaBox); Gtk::Label* const labmTM = Gtk::manage(new Gtk::Label(M("TP_WAVELET_TMTYPE") + ":")); Gtk::HBox* const ctboxTM = Gtk::manage(new Gtk::HBox()); @@ -727,18 +734,19 @@ Wavelet::Wavelet() : hueskin2->set_tooltip_markup(M("TP_WAVELET_HUESKY_TOOLTIP")); hueskin2->setBgGradient(milestones); - resBox->pack_start(*hueskin2); +// resBox->pack_start(*hueskin2); hueskin2->setAdjusterListener(this); sky->set_tooltip_text(M("TP_WAVELET_SKY_TOOLTIP")); sky->setAdjusterListener(this); - resBox->pack_start(*sky); +// resBox->pack_start(*sky); // whole hue range const std::vector milestones3 = makeWholeHueRange(); curveEditorRES->setCurveListener(this); + resBox->pack_start(*chromaFrame); hhshape = static_cast(curveEditorRES->addCurve(CT_Flat, M("TP_WAVELET_CURVEEDITOR_HH"))); hhshape->setTooltip(M("TP_WAVELET_CURVEEDITOR_HH_TOOLTIP")); diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index 918e9fa7c..0cf63a225 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -253,6 +253,7 @@ private: Gtk::Frame* const chanMixerHLFrame; Gtk::Frame* const chanMixerMidFrame; Gtk::Frame* const chanMixerShadowsFrame; + Gtk::Frame* const chromaFrame; Gtk::Label* const wavLabels; Gtk::Label* const labmC; From 0cfe14f433b4763c7082d094339f21001510965c Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 29 Aug 2019 18:59:45 +0200 Subject: [PATCH 027/154] Move gamut in GUI after contrast and chroma --- rtgui/wavelet.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 775205bdb..dde60b93e 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -918,6 +918,10 @@ Wavelet::Wavelet() : expchroma->setLevel(2); pack_start(*expchroma); + expgamut->add(*conBox, false); + expgamut->setLevel(2); + pack_start(*expgamut); + exptoning->add(*tonBox, false); exptoning->setLevel(2); pack_start(*exptoning); @@ -934,9 +938,6 @@ Wavelet::Wavelet() : expclari->setLevel(2); pack_start(*expclari); - expgamut->add(*conBox, false); - expgamut->setLevel(2); - pack_start(*expgamut); expresid->add(*resBox, false); expresid->setLevel(2); From 1c6fa0d3d0bc4b3d9d0051d6ea1194e2cc646be0 Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 30 Aug 2019 07:06:36 +0200 Subject: [PATCH 028/154] Clean code and adjustements to guidefilter --- rtengine/improccoordinator.cc | 21 ++++++++++++++++++--- rtengine/ipwavelet.cc | 23 +++++++++++++++++++---- rtgui/wavelet.cc | 5 +---- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 6a93d1d82..b3f5b186e 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -928,6 +928,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if (WaveParams.softrad > 0.f) { array2D ble(pW, pH); array2D guid(pW, pH); + Imagefloat *tmpImage = nullptr; + tmpImage = new Imagefloat(pW, pH); #ifdef _OPENMP #pragma omp parallel for #endif @@ -941,8 +943,14 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) Color::Lab2XYZ(L, a, b, X, Y, Z); guid[ir][jr] = Y / 32768.f; - - ble[ir][jr] = (nprevl->L[ir][jr]) / 32768.f; + float La = nprevl->L[ir][jr]; + float aa = nprevl->a[ir][jr]; + float ba = nprevl->b[ir][jr]; + Color::Lab2XYZ(La, aa, ba, X, Y, Z); + tmpImage->r(ir, jr) = X; + tmpImage->g(ir, jr) = Y; + tmpImage->b(ir, jr) = Z; + ble[ir][jr] = Y / 32768.f; } double epsilmax = 0.0001; double epsilmin = 0.00001; @@ -962,8 +970,15 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) for (int ir = 0; ir < pH; ir++) for (int jr = 0; jr < pW; jr++) { - nprevl->L[ir][jr] = 32768.f * ble[ir][jr]; + float X = tmpImage->r(ir, jr); + float Y = 32768.f * ble[ir][jr]; + float Z = tmpImage->b(ir, jr); + float L, a, b; + Color::XYZ2Lab(X, Y, Z, L, a, b); + nprevl->L[ir][jr] = L; } + delete tmpImage; + } } diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 8a2e3eeda..7db25dbd1 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -17,7 +17,7 @@ // // You should have received a copy of the GNU General Public License // along with this program. If not, see . -// * 2014 Jacques Desmis +// * 2014 - 2019 Jacques Desmis // * 2014 Ingo Weyrich // @@ -1269,6 +1269,8 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (waparams.softradend > 0.f && cp.finena) { array2D ble(lab->W, lab->H); array2D guid(lab->W, lab->H); + Imagefloat *tmpImage = nullptr; + tmpImage = new Imagefloat(lab->W, lab->H); bool multiTh = false; @@ -1284,7 +1286,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const for (int ir = 0; ir < lab->H; ir++) for (int jr = 0; jr < lab->W; jr++) { - ble[ir][jr] = dst->L[ir][jr] / 32768.f; float X, Y, Z; float L = provradius->L[ir][jr]; float a = provradius->a[ir][jr]; @@ -1292,8 +1293,15 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const Color::Lab2XYZ(L, a, b, X, Y, Z); guid[ir][jr] = Y / 32768.f; + float La = dst->L[ir][jr]; + float aa = dst->a[ir][jr]; + float ba = dst->b[ir][jr]; + Color::Lab2XYZ(La, aa, ba, X, Y, Z); + tmpImage->r(ir, jr) = X; + tmpImage->g(ir, jr) = Y; + tmpImage->b(ir, jr) = Z; + ble[ir][jr] = Y / 32768.f; -// guid[ir][jr] = provradius->L[ir][jr] / 32768.f; } double epsilmax = 0.001; @@ -1314,8 +1322,15 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const for (int ir = 0; ir < lab->H; ir++) for (int jr = 0; jr < lab->W; jr++) { - dst->L[ir][jr] = 32768.f * ble[ir][jr]; + float X = tmpImage->r(ir, jr); + float Y = 32768.f * ble[ir][jr]; + float Z = tmpImage->b(ir, jr); + float L, a, b; + Color::XYZ2Lab(X, Y, Z, L, a, b); + + dst->L[ir][jr] = L; } + delete tmpImage; } if (waparams.softradend > 0.f && cp.finena) { diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index dde60b93e..e3460e685 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . * - * 2014 Jacques Desmis + * 2014 - 2019Jacques Desmis */ #include "wavelet.h" @@ -688,7 +688,6 @@ Wavelet::Wavelet() : resBox->pack_start(*contrast); //keep the possibility to reinstall reschro->setAdjusterListener(this); -// resBox->pack_start(*reschro); chromaFrame->set_label_align(0.025, 0.5); ToolParamBlock* const chromaBox = Gtk::manage(new ToolParamBlock()); @@ -734,13 +733,11 @@ Wavelet::Wavelet() : hueskin2->set_tooltip_markup(M("TP_WAVELET_HUESKY_TOOLTIP")); hueskin2->setBgGradient(milestones); -// resBox->pack_start(*hueskin2); hueskin2->setAdjusterListener(this); sky->set_tooltip_text(M("TP_WAVELET_SKY_TOOLTIP")); sky->setAdjusterListener(this); -// resBox->pack_start(*sky); // whole hue range const std::vector milestones3 = makeWholeHueRange(); From 6a0e1cf1b6658e6ca992bc65f80dce94f0b20f3b Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 30 Aug 2019 07:42:47 +0200 Subject: [PATCH 029/154] change guidedfilter wavalet in simpleprocess --- rtengine/simpleprocess.cc | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 8270ec45b..1348879c3 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1187,25 +1187,29 @@ private: if (WaveParams.softrad > 0.f) { array2D ble(fw, fh); array2D guid(fw, fh); - /* - #ifdef _OPENMP - const int numThreads = omp_get_max_threads(); - #endif - - bool multiTh = false; - - if (numThreads > 1) { - multiTh = true; - } - */ + Imagefloat *tmpImage = nullptr; + tmpImage = new Imagefloat(fw, fh); #ifdef _OPENMP #pragma omp parallel for #endif for (int ir = 0; ir < fh; ir++) for (int jr = 0; jr < fw; jr++) { - ble[ir][jr] = (labView->L[ir][jr]) / 32768.f; - guid[ir][jr] = provradius->L[ir][jr] / 32768.f; + float X, Y, Z; + float L = provradius->L[ir][jr]; + float a = provradius->a[ir][jr]; + float b = provradius->b[ir][jr]; + Color::Lab2XYZ(L, a, b, X, Y, Z); + + guid[ir][jr] = Y / 32768.f; + float La = labView->L[ir][jr]; + float aa = labView->a[ir][jr]; + float ba = labView->b[ir][jr]; + Color::Lab2XYZ(La, aa, ba, X, Y, Z); + tmpImage->r(ir, jr) = X; + tmpImage->g(ir, jr) = Y; + tmpImage->b(ir, jr) = Z; + ble[ir][jr] = Y / 32768.f; } double epsilmax = 0.0001; double epsilmin = 0.00001; @@ -1225,8 +1229,14 @@ private: for (int ir = 0; ir < fh; ir++) for (int jr = 0; jr < fw; jr++) { - labView->L[ir][jr] = 32768.f * ble[ir][jr]; + float X = tmpImage->r(ir, jr); + float Y = 32768.f * ble[ir][jr]; + float Z = tmpImage->b(ir, jr); + float L, a, b; + Color::XYZ2Lab(X, Y, Z, L, a, b); + labView->L[ir][jr] = L; } + delete tmpImage; } } From 2068871b6ed2e700d7900c4fd2210f6f639bca11 Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 30 Aug 2019 08:04:32 +0200 Subject: [PATCH 030/154] Format ipwavelet.cc and wavelet.cc --- rtengine/ipwavelet.cc | 74 ++++++++++++++++-------------- rtgui/wavelet.cc | 102 ++++++++++++++++++++++-------------------- 2 files changed, 95 insertions(+), 81 deletions(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 7db25dbd1..784d3d405 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -3,7 +3,7 @@ // // // -// code dated: December , 2014 +// code dated: 9 , 2019 // // Ipwaveletcc is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -1275,9 +1275,11 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const bool multiTh = false; #ifdef _OPENMP + if (numthreads > 1) { multiTh = true; } + #endif #ifdef _OPENMP @@ -1301,7 +1303,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const tmpImage->g(ir, jr) = Y; tmpImage->b(ir, jr) = Z; ble[ir][jr] = Y / 32768.f; - + } double epsilmax = 0.001; @@ -1327,9 +1329,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const float Z = tmpImage->b(ir, jr); float L, a, b; Color::XYZ2Lab(X, Y, Z, L, a, b); - + dst->L[ir][jr] = L; } + delete tmpImage; } @@ -1781,11 +1784,11 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * double contreal = 0.6 * contrast; DiagonalCurve resid_contrast({ DCT_NURBS, - 0, 0, - avg - avg * (0.6 - contreal / 250.0), avg - avg * (0.6 + contreal / 250.0), - avg + (1. - avg) * (0.6 - contreal / 250.0), avg + (1. - avg) * (0.6 + contreal / 250.0), - 1, 1 - }); + 0, 0, + avg - avg * (0.6 - contreal / 250.0), avg - avg * (0.6 + contreal / 250.0), + avg + (1. - avg) * (0.6 - contreal / 250.0), avg + (1. - avg) * (0.6 + contreal / 250.0), + 1, 1 + }); #ifdef _OPENMP @@ -1796,17 +1799,18 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * { #ifdef _OPENMP - #pragma omp for + #pragma omp for #endif + for (int i = 0; i < W_L * H_L; i++) { - float buf = LIM01( WavCoeffs_L0[i] / 32768.f); + float buf = LIM01(WavCoeffs_L0[i] / 32768.f); buf = resid_contrast.getVal(buf); buf *= 32768.f; WavCoeffs_L0[i] = buf; } } } - + if (cp.tonemap && cp.contmet == 1 && cp.resena) { float maxp = max0 * 256.f; @@ -1818,33 +1822,37 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } } - if ((cp.conres != 0.f || cp.conresH != 0.f) && cp.resena) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step - LabImage *temp = nullptr; - temp = new LabImage(W_L, H_L); + if ((cp.conres != 0.f || cp.conresH != 0.f) && cp.resena) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step + LabImage *temp = nullptr; + temp = new LabImage(W_L, H_L); #ifdef _OPENMP - #pragma omp for + #pragma omp for #endif - for (int i = 0; i < H_L; i++) { - for (int j = 0; j < W_L; j++) { - temp->L[i][j] = WavCoeffs_L0[i * W_L + j]; - } - } - { - ImProcFunctions::shadowsHighlights(temp, true, 1, cp.conresH, cp.conres, cp.radius, skip, cp.thH, cp.th); - } -#ifdef _OPENMP - #pragma omp for -#endif - for (int i = 0; i < H_L; i++) { - for (int j = 0; j < W_L; j++) { - WavCoeffs_L0[i * W_L + j] = temp->L[i][j]; - } - } - - delete temp; + for (int i = 0; i < H_L; i++) { + for (int j = 0; j < W_L; j++) { + temp->L[i][j] = WavCoeffs_L0[i * W_L + j]; + } } + { + ImProcFunctions::shadowsHighlights(temp, true, 1, cp.conresH, cp.conres, cp.radius, skip, cp.thH, cp.th); + } + +#ifdef _OPENMP + #pragma omp for +#endif + + for (int i = 0; i < H_L; i++) { + for (int j = 0; j < W_L; j++) { + WavCoeffs_L0[i * W_L + j] = temp->L[i][j]; + } + } + + delete temp; + + } + #ifdef _OPENMP #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index e3460e685..11126666d 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -489,7 +489,7 @@ Wavelet::Wavelet() : showmaskConn = showmask->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::showmaskToggled)); ToolParamBlock* const clariBox = Gtk::manage(new ToolParamBlock()); - // ushamethod->append(M("TP_WAVELET_USH")); + // ushamethod->append(M("TP_WAVELET_USH")); ushamethod->append(M("TP_WAVELET_SHA")); ushamethod->append(M("TP_WAVELET_CLA")); ushamethodconn = ushamethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::ushamethodChanged)); @@ -1064,7 +1064,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) //ushamethod // if (pp->wavelet.ushamethod == "none") { // ushamethod->set_active(0); - // } else +// } else if (pp->wavelet.ushamethod == "sharp") { ushamethod->set_active(0); } else if (pp->wavelet.ushamethod == "clari") { @@ -1758,9 +1758,9 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.Medgreinf = "less"; } - // if (ushamethod->get_active_row_number() == 0) { - // pp->wavelet.ushamethod = "none"; - // } else +// if (ushamethod->get_active_row_number() == 0) { +// pp->wavelet.ushamethod = "none"; +// } else if (ushamethod->get_active_row_number() == 0) { pp->wavelet.ushamethod = "sharp"; } else if (ushamethod->get_active_row_number() == 1) { @@ -2319,14 +2319,14 @@ void Wavelet::TMmethodUpdateUI() } } */ - if(TMmethod->get_active_row_number() == 1) { - edgs->show(); - scale->show(); - } else if (TMmethod->get_active_row_number() == 0) { - edgs->hide(); - scale->hide(); - } - + if (TMmethod->get_active_row_number() == 1) { + edgs->show(); + scale->show(); + } else if (TMmethod->get_active_row_number() == 0) { + edgs->hide(); + scale->hide(); + } + } void Wavelet::TMmethodChanged() @@ -2413,14 +2413,14 @@ void Wavelet::ushamethodChanged() Dirmethod->set_sensitive(true); CLmethod->set_sensitive(false); Backmethod->set_sensitive(false); - /* } else if (ushamethod->get_active_row_number() == 0 || expclari->getEnabled() == false) { - Backmethod->set_active(1); - CLmethod->set_active(3); - Lmethod->set_active(3); - Dirmethod->set_active(3); - Lmethod->set_sensitive(false); - Dirmethod->set_sensitive(false); - */ + /* } else if (ushamethod->get_active_row_number() == 0 || expclari->getEnabled() == false) { + Backmethod->set_active(1); + CLmethod->set_active(3); + Lmethod->set_active(3); + Dirmethod->set_active(3); + Lmethod->set_sensitive(false); + Dirmethod->set_sensitive(false); + */ } else if (expclari->getEnabled() == false) { Backmethod->set_active(1); CLmethod->set_active(3); @@ -2496,12 +2496,16 @@ void Wavelet::LmethodUpdateUI() { void Wavelet::LmethodChanged() { //LmethodUpdateUI(); - if(ushamethod->get_active_row_number() == 0 && expclari->getEnabled() == true) { - if(Lmethod->get_active_row_number() > 3) Lmethod->set_active(3); + if (ushamethod->get_active_row_number() == 0 && expclari->getEnabled() == true) { + if (Lmethod->get_active_row_number() > 3) { + Lmethod->set_active(3); + } } - if(ushamethod->get_active_row_number() == 1 && expclari->getEnabled() == true) { - if(Lmethod->get_active_row_number() < 4) Lmethod->set_active(4); + if (ushamethod->get_active_row_number() == 1 && expclari->getEnabled() == true) { + if (Lmethod->get_active_row_number() < 4) { + Lmethod->set_active(4); + } } if (listener && (multiImage || getEnabled())) { @@ -2588,23 +2592,23 @@ void Wavelet::setBatchMode(bool batchMode) void Wavelet::adjusterUpdateUI(Adjuster* a) { - /* - if (!batchMode) { - if (a == tmrs ) { - float tm; - tm=tmrs->getValue(); - if(tm==0.f) tmr->hide(); - else tmr->show(); - } - else if (a == gamma ) { - float tm; - tm=tmrs->getValue(); - if(tm==0.f) tmr->hide(); - else tmr->show(); - - } - } - */ + /* + if (!batchMode) { + if (a == tmrs ) { + float tm; + tm=tmrs->getValue(); + if(tm==0.f) tmr->hide(); + else tmr->show(); + } + else if (a == gamma ) { + float tm; + tm=tmrs->getValue(); + if(tm==0.f) tmr->hide(); + else tmr->show(); + + } + } + */ } void Wavelet::adjusterChanged(Adjuster* a, double newval) @@ -2618,15 +2622,16 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavresconH, resconH->getTextValue()); } else if (a == reschro) { listener->panelChanged(EvWavreschro, reschro->getTextValue()); - } else if (a == tmrs) { + } else if (a == tmrs) { adjusterUpdateUI(a); listener->panelChanged(EvWavtmrs, tmrs->getTextValue()); - if(tmrs->getValue() != 0 && TMmethod->get_active_row_number() == 1) { - edgs->show(); - scale->show(); + + if (tmrs->getValue() != 0 && TMmethod->get_active_row_number() == 1) { + edgs->show(); + scale->show(); } else if (TMmethod->get_active_row_number() == 0) { - edgs->hide(); - scale->hide(); + edgs->hide(); + scale->hide(); } } else if (a == gamma) { adjusterUpdateUI(a); @@ -3305,6 +3310,7 @@ void Wavelet::enableToggled(MyExpander *expander) Backmethod->set_sensitive(false); } } + event = EvWavenaclari; } else // unknown expander, returning ! From 0f8b9c4574517fcf856e929f99eea08fc0343136 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 31 Aug 2019 08:00:41 +0200 Subject: [PATCH 031/154] Improve showmask and Guidedfilter dcrop --- rtengine/dcrop.cc | 40 ++++++++++++++++++++++++++++++----- rtengine/improccoordinator.cc | 13 ++++++++++-- rtengine/simpleprocess.cc | 2 +- 3 files changed, 47 insertions(+), 8 deletions(-) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index fc6e838d4..2ab9caa59 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -1043,6 +1043,8 @@ void Crop::update(int todo) if (WaveParams.softrad > 0.f) { array2D ble(labnCrop->W, labnCrop->H); array2D guid(labnCrop->W, labnCrop->H); + Imagefloat *tmpImage = nullptr; + tmpImage = new Imagefloat(labnCrop->W, labnCrop->W); #ifdef _OPENMP #pragma omp parallel for @@ -1050,8 +1052,21 @@ void Crop::update(int todo) for (int ir = 0; ir < labnCrop->H ; ir++) for (int jr = 0; jr < labnCrop->W; jr++) { - ble[ir][jr] = (labnCrop->L[ir][jr]) / 32768.f; - guid[ir][jr] = provradius->L[ir][jr] / 32768.f; + float X, Y, Z; + float L = provradius->L[ir][jr]; + float a = provradius->a[ir][jr]; + float b = provradius->b[ir][jr]; + Color::Lab2XYZ(L, a, b, X, Y, Z); + + guid[ir][jr] = Y / 32768.f; + float La = labnCrop->L[ir][jr]; + float aa = labnCrop->a[ir][jr]; + float ba = labnCrop->b[ir][jr]; + Color::Lab2XYZ(La, aa, ba, X, Y, Z); + tmpImage->r(ir, jr) = X; + tmpImage->g(ir, jr) = Y; + tmpImage->b(ir, jr) = Z; + ble[ir][jr] = Y / 32768.f; } double epsilmax = 0.0001; double epsilmin = 0.00001; @@ -1070,8 +1085,14 @@ void Crop::update(int todo) for (int ir = 0; ir < labnCrop->H; ir++) for (int jr = 0; jr < labnCrop->W; jr++) { - labnCrop->L[ir][jr] = 32768.f * ble[ir][jr]; + float X = tmpImage->r(ir, jr); + float Y = 32768.f * ble[ir][jr]; + float Z = tmpImage->b(ir, jr); + float L, a, b; + Color::XYZ2Lab(X, Y, Z, L, a, b); + labnCrop->L[ir][jr] = L; } + delete tmpImage; } } @@ -1083,16 +1104,24 @@ void Crop::update(int todo) float mC = (float)(WaveParams.mergeC / 100.f); float mL0; float mC0; + float background = 0.f; + int show = 0; if ((WaveParams.CLmethod == "one" || WaveParams.CLmethod == "inf") && WaveParams.Backmethod == "black") { mL0 = mC0 = 0.f; - mL = -mL; + mL = -1.5f * mL; mC = -mC; + background = 12000.f; + show = 0; } else if (WaveParams.CLmethod == "sup" && WaveParams.Backmethod == "resid") { mL0 = mL; mC0 = mC; + background = 0.f; + show = 0; } else { mL0 = mL = mC0 = mC = 0.f; + background = 0.f; + show = 0; } float indic = 1.f; @@ -1101,6 +1130,7 @@ void Crop::update(int todo) indic = -1.f; mL = fabs(mL); mC = fabs(mC); + show = 1; } @@ -1110,7 +1140,7 @@ void Crop::update(int todo) for (int x = 0; x < labnCrop->H; x++) for (int y = 0; y < labnCrop->W; y++) { - labnCrop->L[x][y] = (1.f + mL0) * (unshar->L[x][y]) - mL * indic * labnCrop->L[x][y]; + labnCrop->L[x][y] = (1.f + mL0) * (unshar->L[x][y]) + show * background - mL * indic * labnCrop->L[x][y]; labnCrop->a[x][y] = (1.f + mC0) * (unshar->a[x][y]) - mC * indic * labnCrop->a[x][y]; labnCrop->b[x][y] = (1.f + mC0) * (unshar->b[x][y]) - mC * indic * labnCrop->b[x][y]; } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 812e6a23b..d04a29518 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -988,18 +988,26 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) float mC = (float)(WaveParams.mergeC / 100.f); float mL0; float mC0; + float background = 0.f; + int show = 0; if ((WaveParams.CLmethod == "one" || WaveParams.CLmethod == "inf") && WaveParams.Backmethod == "black") { mL0 = mC0 = 0.f; - mL = -mL; + mL = - 1.5f * mL; mC = -mC; + background = 12000.f; + show = 0; } else if (WaveParams.CLmethod == "sup" && WaveParams.Backmethod == "resid") { mL0 = mL; mC0 = mC; + background = 0.f; + show = 0; } else { mL0 = mL = mC0 = mC = 0.f; + background = 0.f; + show = 0; } float indic = 1.f; @@ -1008,6 +1016,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) indic = -1.f; mL = fabs(mL); mC = fabs(mC); + show = 1; } #ifdef _OPENMP #pragma omp parallel for @@ -1015,7 +1024,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) for (int x = 0; x < pH; x++) for (int y = 0; y < pW; y++) { - nprevl->L[x][y] = (1.f + mL0) * (unshar->L[x][y]) - mL * indic * nprevl->L[x][y]; + nprevl->L[x][y] = (1.f + mL0) * (unshar->L[x][y]) + show * background - mL * indic * nprevl->L[x][y]; nprevl->a[x][y] = (1.f + mC0) * (unshar->a[x][y]) - mC * indic * nprevl->a[x][y]; nprevl->b[x][y] = (1.f + mC0) * (unshar->b[x][y]) - mC * indic * nprevl->b[x][y]; } diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index eb51577a7..9311d2736 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1249,7 +1249,7 @@ private: if ((WaveParams.CLmethod == "one" || WaveParams.CLmethod == "inf") && WaveParams.Backmethod == "black") { mL0 = mC0 = 0.f; - mL = -mL; + mL = -1.5f * mL; mC = -mC; } else if (WaveParams.CLmethod == "sup" && WaveParams.Backmethod == "resid") { mL0 = mL; From 0b13aee4bc0bdafb7f7d3f2acf0658cfc98d4f6a Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 1 Sep 2019 08:51:34 +0200 Subject: [PATCH 032/154] Clip result clarity --- rtengine/dcrop.cc | 3 +-- rtengine/improccoordinator.cc | 2 +- rtengine/simpleprocess.cc | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 2ab9caa59..f7ce7bbb5 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -1133,14 +1133,13 @@ void Crop::update(int todo) show = 1; } - #ifdef _OPENMP #pragma omp parallel for #endif for (int x = 0; x < labnCrop->H; x++) for (int y = 0; y < labnCrop->W; y++) { - labnCrop->L[x][y] = (1.f + mL0) * (unshar->L[x][y]) + show * background - mL * indic * labnCrop->L[x][y]; + labnCrop->L[x][y] = LIM((1.f + mL0) * (unshar->L[x][y]) + show * background - mL * indic * labnCrop->L[x][y], 0.f, 32768.f); labnCrop->a[x][y] = (1.f + mC0) * (unshar->a[x][y]) - mC * indic * labnCrop->a[x][y]; labnCrop->b[x][y] = (1.f + mC0) * (unshar->b[x][y]) - mC * indic * labnCrop->b[x][y]; } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index d04a29518..d746ff9c6 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1024,7 +1024,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) for (int x = 0; x < pH; x++) for (int y = 0; y < pW; y++) { - nprevl->L[x][y] = (1.f + mL0) * (unshar->L[x][y]) + show * background - mL * indic * nprevl->L[x][y]; + nprevl->L[x][y] = LIM((1.f + mL0) * (unshar->L[x][y]) + show * background - mL * indic * nprevl->L[x][y], 0.f, 32768.f); nprevl->a[x][y] = (1.f + mC0) * (unshar->a[x][y]) - mC * indic * nprevl->a[x][y]; nprevl->b[x][y] = (1.f + mC0) * (unshar->b[x][y]) - mC * indic * nprevl->b[x][y]; } diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 9311d2736..b7d807808 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1265,7 +1265,7 @@ private: for (int x = 0; x < fh; x++) for (int y = 0; y < fw; y++) { - labView->L[x][y] = (1.f + mL0) * (unshar->L[x][y]) - mL * labView->L[x][y]; + labView->L[x][y] = LIM((1.f + mL0) * (unshar->L[x][y]) - mL * labView->L[x][y], 0.f, 32768.f); labView->a[x][y] = (1.f + mC0) * (unshar->a[x][y]) - mC * labView->a[x][y]; labView->b[x][y] = (1.f + mC0) * (unshar->b[x][y]) - mC * labView->b[x][y]; } From 025f444d7eef0de4d2d8a7884ff3ac7ed04c9f0b Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 15 Dec 2019 08:21:41 +0100 Subject: [PATCH 033/154] Improve contrast levels with sigma --- rtdata/languages/default | 2 ++ rtengine/ipwavelet.cc | 32 ++++++++++++++++++++++++-------- rtengine/procparams.cc | 4 ++++ rtengine/procparams.h | 1 + rtgui/paramsedited.cc | 6 ++++++ rtgui/paramsedited.h | 1 + rtgui/wavelet.cc | 15 +++++++++++++++ rtgui/wavelet.h | 2 ++ 8 files changed, 55 insertions(+), 8 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 9cc354323..5fa474dd6 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -790,6 +790,7 @@ HISTORY_MSG_WAVCLARI;Clarity HISTORY_MSG_WAVUSHAMET;Clarity method HISTORY_MSG_WAVMERGEL;Merge L HISTORY_MSG_WAVMERGEC;Merge C +HISTORY_MSG_WAVSIGMA;Sigma HISTORY_MSG_WAVSOFTRAD;Soft radius clarity HISTORY_MSG_WAVSOFTRADEND;Soft radius final HISTORY_MSG_WAVSHOWMASK;Show wavelet mask @@ -2236,6 +2237,7 @@ TP_WAVELET_RESCONH;Highlights TP_WAVELET_RESID;Residual Image TP_WAVELET_SAT;Saturated chroma TP_WAVELET_SETTINGS;Wavelet Settings +TP_WAVELET_SIGMA;Sigma TP_WAVELET_SKIN;Skin targetting/protection TP_WAVELET_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected. TP_WAVELET_SKY;Sky targetting/protection diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index f45b21f28..f2c8c8182 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -63,6 +63,7 @@ namespace rtengine struct cont_params { float mul[10]; + float sigm; int chrom; int chro; int contrast; @@ -224,6 +225,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (params->wavelet.BAmethod == "cur") { cp.BAmet = 2; } + cp.sigm = params->wavelet.sigma; cp.tmstrength = params->wavelet.tmrs; //cp.tonemap = params->wavelet.tmr; @@ -2997,15 +2999,29 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz //for each pixel and each level float beta; float mea[9]; - mea[0] = mean[level] / 6.f; - mea[1] = mean[level] / 2.f; + float rap = mean[level] - 2.f * cp.sigm * sigma[level]; + + if (rap > 0.f) { + mea[0] = rap; + } else { + mea[0] = mean[level] / 6.f; + } + + rap = mean[level] - cp.sigm * sigma[level]; + + if (rap > 0.f) { + mea[1] = rap; + } else { + mea[1] = mean[level] / 2.f; + } + mea[2] = mean[level]; // 50% data - mea[3] = mean[level] + sigma[level] / 2.f; - mea[4] = mean[level] + sigma[level]; //66% - mea[5] = mean[level] + 1.2f * sigma[level]; - mea[6] = mean[level] + 1.5f * sigma[level]; // - mea[7] = mean[level] + 2.f * sigma[level]; //95% - mea[8] = mean[level] + 2.5f * sigma[level]; //99% + mea[3] = mean[level] + cp.sigm * sigma[level] / 2.f; + mea[4] = mean[level] + cp.sigm * sigma[level]; //66% + mea[5] = mean[level] + cp.sigm * 1.2f * sigma[level]; + mea[6] = mean[level] + cp.sigm * 1.5f * sigma[level]; // + mea[7] = mean[level] + cp.sigm * 2.f * sigma[level]; //95% + mea[8] = mean[level] + cp.sigm * 2.5f * sigma[level]; //99% bool useChromAndHue = (skinprot != 0.f || cp.HSmet); float modchro; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index f92b40191..1822a81c7 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2263,6 +2263,7 @@ WaveletParams::WaveletParams() : TMmethod("cont"), Dirmethod("all"), HSmethod("with"), + sigma(1.0), rescon(0), resconH(0), reschro(0), @@ -2369,6 +2370,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && TMmethod == other.TMmethod && Dirmethod == other.Dirmethod && HSmethod == other.HSmethod + && sigma == other.sigma && rescon == other.rescon && resconH == other.resconH && reschro == other.reschro @@ -3548,6 +3550,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.avoid, "Wavelet", "AvoidColorShift", wavelet.avoid, keyFile); saveToKeyfile(!pedited || pedited->wavelet.showmask, "Wavelet", "Showmask", wavelet.showmask, keyFile); saveToKeyfile(!pedited || pedited->wavelet.tmr, "Wavelet", "TMr", wavelet.tmr, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.sigma, "Wavelet", "Sigma", wavelet.sigma, keyFile); saveToKeyfile(!pedited || pedited->wavelet.rescon, "Wavelet", "ResidualcontShadow", wavelet.rescon, keyFile); saveToKeyfile(!pedited || pedited->wavelet.resconH, "Wavelet", "ResidualcontHighlight", wavelet.resconH, keyFile); saveToKeyfile(!pedited || pedited->wavelet.thr, "Wavelet", "ThresholdResidShadow", wavelet.thr, keyFile); @@ -4655,6 +4658,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "TMMethod", pedited, wavelet.TMmethod, pedited->wavelet.TMmethod); assignFromKeyfile(keyFile, "Wavelet", "HSMethod", pedited, wavelet.HSmethod, pedited->wavelet.HSmethod); assignFromKeyfile(keyFile, "Wavelet", "DirMethod", pedited, wavelet.Dirmethod, pedited->wavelet.Dirmethod); + assignFromKeyfile(keyFile, "Wavelet", "Sigma", pedited, wavelet.sigma, pedited->wavelet.sigma); assignFromKeyfile(keyFile, "Wavelet", "ResidualcontShadow", pedited, wavelet.rescon, pedited->wavelet.rescon); assignFromKeyfile(keyFile, "Wavelet", "ResidualcontHighlight", pedited, wavelet.resconH, pedited->wavelet.resconH); assignFromKeyfile(keyFile, "Wavelet", "Residualchroma", pedited, wavelet.reschro, pedited->wavelet.reschro); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 839872e77..7ad99b594 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1237,6 +1237,7 @@ struct WaveletParams { Glib::ustring TMmethod; Glib::ustring Dirmethod; Glib::ustring HSmethod; + double sigma; int rescon; int resconH; int reschro; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index d4e2bd759..c915685bc 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -504,6 +504,7 @@ void ParamsEdited::set(bool v) wavelet.TMmethod = v; wavelet.HSmethod = v; wavelet.Dirmethod = v; + wavelet.sigma = v; wavelet.rescon = v; wavelet.resconH = v; wavelet.reschro = v; @@ -1095,6 +1096,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.TMmethod = wavelet.TMmethod && p.wavelet.TMmethod == other.wavelet.TMmethod; wavelet.HSmethod = wavelet.HSmethod && p.wavelet.HSmethod == other.wavelet.HSmethod; wavelet.Dirmethod = wavelet.Dirmethod && p.wavelet.Dirmethod == other.wavelet.Dirmethod; + wavelet.sigma = wavelet.sigma && p.wavelet.sigma == other.wavelet.sigma; wavelet.rescon = wavelet.rescon && p.wavelet.rescon == other.wavelet.rescon; wavelet.resconH = wavelet.resconH && p.wavelet.resconH == other.wavelet.resconH; wavelet.reschro = wavelet.reschro && p.wavelet.reschro == other.wavelet.reschro; @@ -3132,6 +3134,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.edgeampli = mods.wavelet.edgeampli; } + if (wavelet.sigma) { + toEdit.wavelet.sigma = mods.wavelet.sigma; + } + if (wavelet.resconH) { toEdit.wavelet.resconH = dontforceSet && options.baBehav[ADDSET_WA_RESCONH] ? toEdit.wavelet.resconH + mods.wavelet.resconH : mods.wavelet.resconH; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index d166e7ccc..4f7fabd1a 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -520,6 +520,7 @@ struct WaveletParamsEdited { bool Tilesmethod; bool daubcoeffmethod; bool Dirmethod; + bool sigma; bool rescon; bool resconH; bool reschro; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index c95736a80..252ed0abe 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -80,6 +80,7 @@ Wavelet::Wavelet() : tmr(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_BALCHRO")))), showmask(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_SHOWMASK")))), neutralchButton(Gtk::manage(new Gtk::Button(M("TP_WAVELET_NEUTRAL")))), + sigma(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMA"), 0.2, 2.5, 0.01, 1.))), rescon(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCON"), 0, 100, 1, 0))), resconH(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCONH"), 0, 100, 1, 0))), reschro(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCHRO"), -100, 100, 1, 0))), @@ -173,6 +174,7 @@ Wavelet::Wavelet() : EvWavedgs = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVEDGS"); EvWavscale = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSCALE"); EvWavradius = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVRADIUS"); + EvWavsigma = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSIGMA"); expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings)); @@ -325,6 +327,9 @@ Wavelet::Wavelet() : levBox->pack_start(*correction[i]); } + sigma->setAdjusterListener(this); + levBox->pack_start(*sigma, Gtk::PACK_SHRINK); + levBox->pack_start(*sup); sup->setAdjusterListener(this); wavLabels->show(); @@ -1226,6 +1231,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) lastavoid = pp->wavelet.avoid; lastshowmask = pp->wavelet.showmask; lasttmr = pp->wavelet.tmr; + sigma->setValue(pp->wavelet.sigma); rescon->setValue(pp->wavelet.rescon); resconH->setValue(pp->wavelet.resconH); reschro->setValue(pp->wavelet.reschro); @@ -1377,6 +1383,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) tmr->set_inconsistent(!pedited->wavelet.tmr); edgthresh->setEditedState(pedited->wavelet.edgthresh ? Edited : UnEdited); rescon->setEditedState(pedited->wavelet.rescon ? Edited : UnEdited); + sigma->setEditedState(pedited->wavelet.sigma ? Edited : UnEdited); resconH->setEditedState(pedited->wavelet.resconH ? Edited : UnEdited); reschro->setEditedState(pedited->wavelet.reschro ? Edited : UnEdited); tmrs->setEditedState(pedited->wavelet.tmrs ? Edited : UnEdited); @@ -1558,6 +1565,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.avoid = avoid->get_active(); pp->wavelet.showmask = showmask->get_active(); pp->wavelet.tmr = tmr->get_active(); + pp->wavelet.sigma = sigma->getValue(); pp->wavelet.rescon = rescon->getValue(); pp->wavelet.resconH = resconH->getValue(); pp->wavelet.reschro = reschro->getValue(); @@ -1668,6 +1676,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.HSmethod = HSmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.Dirmethod = Dirmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.edgthresh = edgthresh->getEditedState(); + pedited->wavelet.sigma = sigma->getEditedState(); pedited->wavelet.rescon = rescon->getEditedState(); pedited->wavelet.resconH = resconH->getEditedState(); pedited->wavelet.reschro = reschro->getEditedState(); @@ -1902,6 +1911,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit strength->setDefault(defParams->wavelet.strength); balance->setDefault(defParams->wavelet.balance); iter->setDefault(defParams->wavelet.iter); + sigma->setDefault(defParams->wavelet.sigma); rescon->setDefault(defParams->wavelet.rescon); resconH->setDefault(defParams->wavelet.resconH); reschro->setDefault(defParams->wavelet.reschro); @@ -1963,6 +1973,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit softrad->setDefaultEditedState(pedited->wavelet.softrad ? Edited : UnEdited); softradend->setDefaultEditedState(pedited->wavelet.softradend ? Edited : UnEdited); + sigma->setDefault(defParams->wavelet.sigma); rescon->setDefault(defParams->wavelet.rescon); resconH->setDefault(defParams->wavelet.resconH); reschro->setDefault(defParams->wavelet.reschro); @@ -2013,6 +2024,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit correctionch[i]->setDefaultEditedState(pedited->wavelet.ch[i] ? Edited : UnEdited); } } else { + sigma->setDefaultEditedState(Irrelevant); rescon->setDefaultEditedState(Irrelevant); resconH->setDefaultEditedState(Irrelevant); reschro->setDefaultEditedState(Irrelevant); @@ -2540,6 +2552,7 @@ void Wavelet::setBatchMode(bool batchMode) opacityCurveEditorWL->setBatchMode(batchMode); curveEditorRES->setBatchMode(batchMode); curveEditorGAM->setBatchMode(batchMode); + sigma->showEditedCB(); rescon->showEditedCB(); resconH->showEditedCB(); reschro->showEditedCB(); @@ -2621,6 +2634,8 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavtiles, edgthresh->getTextValue()); } else if (a == rescon) { listener->panelChanged(EvWavrescon, rescon->getTextValue()); + } else if (a == sigma) { + listener->panelChanged(EvWavsigma, sigma->getTextValue()); } else if (a == resconH) { listener->panelChanged(EvWavresconH, resconH->getTextValue()); } else if (a == reschro) { diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index b18ac668b..9d9502670 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -76,6 +76,7 @@ private: rtengine::ProcEvent EvWavedgs; rtengine::ProcEvent EvWavscale; rtengine::ProcEvent EvWavradius; + rtengine::ProcEvent EvWavsigma; void foldAllButMe (GdkEventButton* event, MyExpander *expander); @@ -167,6 +168,7 @@ private: Gtk::Button* const neutralchButton; Adjuster* correction[9]; Adjuster* correctionch[9]; + Adjuster* const sigma; Adjuster* const rescon; Adjuster* const resconH; Adjuster* const reschro; From fefb9c43b9a6b86bf07ff609fcf213eb5c509930 Mon Sep 17 00:00:00 2001 From: Benitoite Date: Fri, 7 Feb 2020 12:45:24 -0800 Subject: [PATCH 034/154] macos_bundle.sh: fix libpixbuf and immodules Fixes building libpixbuf and immodules database by modifying install names later on. --- tools/osx/macosx_bundle.sh | 41 +++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 08740f696..eae8a2021 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -124,6 +124,19 @@ ditto ${LOCAL_PREFIX}/local/lib/liblensfun.2.dylib "${CONTENTS}/Frameworks/lible # Copy libomp to Frameworks ditto ${LOCAL_PREFIX}/local/lib/libomp.dylib "${CONTENTS}/Frameworks" +# dylib install names +find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib))' | while read -r x; do + msg "Modifying dylib install names: ${x}" + { + # id + case ${x} in *.dylib) echo " install_name_tool -id '@rpath/$(basename "${x}")' '${x}'";; esac + # names + GetDependencies "${x}" | while read -r y; do + echo " install_name_tool -change '${y}' '@rpath/$(basename "${y}")' '${x}'" + done + } | bash -v +done + msg "Copying dependencies from ${GTK_PREFIX}:" CheckLink "${EXECUTABLE}" @@ -189,6 +202,13 @@ ditto {"${LOCAL_PREFIX}/local","${RESOURCES}"}/share/icons/Adwaita/index.theme "${LOCAL_PREFIX}/local/bin/gtk-update-icon-cache" "${RESOURCES}/share/icons/Adwaita" ditto "${LOCAL_PREFIX}/local/share/icons/hicolor" "${RESOURCES}/share/icons/hicolor" +# pixbuf loaders & immodules +msg "Build GTK3 databases:" +"${LOCAL_PREFIX}"/local/bin/gdk-pixbuf-query-loaders "${LIB}"/libpix*.so > "${ETC}"/gtk-3.0/gdk-pixbuf.loaders +"${LOCAL_PREFIX}"/local/bin/gtk-query-immodules-3.0 "${LIB}"/im-* > "${ETC}"/gtk-3.0/gtk.immodules +sed -i "" -e "s|${PWD}/RawTherapee.app/Contents/|/Applications/RawTherapee.app/Contents/|" "${ETC}/gtk-3.0/gdk-pixbuf.loaders" "${ETC}/gtk-3.0/gtk.immodules" +sed -i "" -e "s|/opt/local/|/usr/|" "${ETC}/gtk-3.0/gtk.immodules" + # Install names find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib|so))' | while read -r x; do msg "Modifying install names: ${x}" @@ -209,13 +229,6 @@ for frameworklibs in ${CONTENTS}/Frameworks/* ; do echo " install_name_tool -add_rpath /Applications/RawTherapee.app/Contents/Frameworks '${frameworklibs}'" | bash -v done -# pixbuf loaders & immodules -msg "Build GTK3 databases:" -"${LOCAL_PREFIX}"/local/bin/gdk-pixbuf-query-loaders "${LIB}"/libpix*.so > "${ETC}"/gtk-3.0/gdk-pixbuf.loaders -"${LOCAL_PREFIX}"/local/bin/gtk-query-immodules-3.0 "${LIB}"/im-* > "${ETC}"/gtk-3.0/gtk.immodules -sed -i "" -e "s|${PWD}/RawTherapee.app/Contents/|/Applications/RawTherapee.app/Contents/|" "${ETC}/gtk-3.0/gdk-pixbuf.loaders" "${ETC}/gtk-3.0/gtk.immodules" -sed -i "" -e "s|/opt/local/|/usr/|" "${ETC}/gtk-3.0/gtk.immodules" - # Mime directory msg "Copying shared files from ${GTK_PREFIX}:" ditto {"${LOCAL_PREFIX}/local","${RESOURCES}"}/share/mime @@ -247,6 +260,20 @@ msg "Registering @rpath into the executable:" echo " install_name_tool -add_rpath /Applications/RawTherapee.app/Contents/Frameworks '${MACOS}/bin/rawtherapee-bin'" | bash -v echo " install_name_tool -add_rpath /Applications/RawTherapee.app/Contents/Frameworks '${EXECUTABLE}-cli'" | bash -v +# Install names +find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib|so))' | while read -r x; do + msg "Modifying install names: ${x}" + { + # id + case ${x} in *.dylib) echo " install_name_tool -id '@rpath/$(basename "${x}")' '${x}'";; esac + # names + GetDependencies "${x}" | while read -r y; do + echo " install_name_tool -change '${y}' '@rpath/$(basename "${y}")' '${x}'" + done + } | bash -v +done + + # Sign the app msg "Codesigning:" CODESIGNID="$(cmake .. -LA -N | grep "CODESIGNID" | cut -d "=" -f2)" From 5dc1c1dce2c1b12a572d7b3be0652eda9aa4a7bf Mon Sep 17 00:00:00 2001 From: Benitoite Date: Fri, 7 Feb 2020 13:10:32 -0800 Subject: [PATCH 035/154] Mac: install_name change after CheckLink --- tools/osx/macosx_bundle.sh | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index eae8a2021..b8554a6e3 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -124,6 +124,9 @@ ditto ${LOCAL_PREFIX}/local/lib/liblensfun.2.dylib "${CONTENTS}/Frameworks/lible # Copy libomp to Frameworks ditto ${LOCAL_PREFIX}/local/lib/libomp.dylib "${CONTENTS}/Frameworks" +msg "Copying dependencies from ${GTK_PREFIX}:" +CheckLink "${EXECUTABLE}" + # dylib install names find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib))' | while read -r x; do msg "Modifying dylib install names: ${x}" @@ -137,9 +140,6 @@ find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib } | bash -v done -msg "Copying dependencies from ${GTK_PREFIX}:" -CheckLink "${EXECUTABLE}" - # Copy libjpeg-turbo ("62") into the app bundle ditto ${LOCAL_PREFIX}/local/lib/libjpeg.62.dylib "${CONTENTS}/Frameworks/libjpeg.62.dylib" @@ -273,6 +273,12 @@ find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib } | bash -v done +# fix @rpath in Frameworks +msg "Registering @rpath in Frameworks folder:" +for frameworklibs in ${CONTENTS}/Frameworks/* ; do + echo " install_name_tool -delete_rpath /opt/local/lib '${frameworklibs}'" | bash -v + echo " install_name_tool -add_rpath /Applications/RawTherapee.app/Contents/Frameworks '${frameworklibs}'" | bash -v +done # Sign the app msg "Codesigning:" From d796f70caf12ea2825610d20962b646bbd56fc39 Mon Sep 17 00:00:00 2001 From: Benitoite Date: Sat, 8 Feb 2020 02:52:31 -0800 Subject: [PATCH 036/154] Mac: fix os deployment target compilation flags Uses `${CMAKE_OSX_DEPLOYMENT_TARGET}` instead of `10.9` --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 13c648de0..259a0d7a2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -118,8 +118,8 @@ if(APPLE) endif() # Set minimum system version - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.9") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mmacosx-version-min=10.9") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -headerpad_max_install_names") endif() From 344e9862ef971344e89eaef8f2a899d48d5e3c3b Mon Sep 17 00:00:00 2001 From: Benitoite Date: Sat, 8 Feb 2020 13:14:37 -0800 Subject: [PATCH 037/154] mac: append bundle-time to AboutThisBuild.txt Appends a section of information to uniquely identify a particular bundle. --- tools/osx/macosx_bundle.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index b8554a6e3..779b31a1e 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -68,7 +68,6 @@ if [[ -x "$(which git)" && -d "${PROJECT_SOURCE_DIR}/.git" ]]; then PROJECT_FULL_VERSION="$gitDescribe" PROJECT_VERSION="$gitVersionNumericBS" - fi MINIMUM_SYSTEM_VERSION="$(otool -l "${CMAKE_BUILD_TYPE}"/MacOS/rawtherapee | grep -A2 'LC_VERSION_MIN_MACOSX' | awk '$1 ~ /version/ { printf $2 }')" @@ -110,6 +109,13 @@ install -d "${RESOURCES}" \ "${LIB}" \ "${ETC}" +echo "\n--------\n" >> Resources/AboutThisBuild.txt +echo "Bundle system: $(sysctl -n machdep.cpu.brand_string)" >> Resources/AboutThisBuild.txt +echo "Bundle OS: $(sw_vers -productName) $(sw_vers -productVersion) $(sw_vers -buildVersion) $(uname -mrs)" >> Resources/AboutThisBuild.txt +echo "Bundle date: $(date -Ru) ZULU" >> Resources/AboutThisBuild.txt +echo "Bundle epoch: $(date +%s)" >> Resources/AboutThisBuild.txt +echo "Bundle UUID: $(uuidgen)" >> Resources/AboutThisBuild.txt + msg "Copying release files:" ditto "${CMAKE_BUILD_TYPE}/MacOS" "${MACOS}" ditto "Resources" "${RESOURCES}" From 8170b6ed759cdd6a365ec74c7a6a76bfb73b6e9e Mon Sep 17 00:00:00 2001 From: Benitoite Date: Sun, 9 Feb 2020 05:02:50 -0800 Subject: [PATCH 038/154] cmake: gather and display build information Displays unique info: the build OS, the build zulu datetime, the build epoch, and a uuid during cmake configuration. --- UpdateInfo.cmake | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/UpdateInfo.cmake b/UpdateInfo.cmake index d1f532506..9aa211d96 100644 --- a/UpdateInfo.cmake +++ b/UpdateInfo.cmake @@ -63,6 +63,11 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) string(REGEX REPLACE "-.*" "" GIT_NUMERIC_VERSION_BS ${GIT_DESCRIBE}) set(GIT_NUMERIC_VERSION_BS "${GIT_NUMERIC_VERSION_BS}.${GIT_COMMITS_SINCE_TAG}") endif() + + execute_process(COMMAND uname -mrs COMMAND_ECHO STDOUT OUTPUT_VARIABLE BUILDINFO_OS OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND date -Ru COMMAND_ECHO STDOUT OUTPUT_VARIABLE BUILDINFO_DATE OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND date +%s COMMAND_ECHO STDOUT OUTPUT_VARIABLE BUILDINFO_EPOCH OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND uuidgen COMMAND tr "A-Z" "a-z" COMMAND_ECHO STDOUT OUTPUT_VARIABLE BUILDINFO_UUID OUTPUT_STRIP_TRAILING_WHITESPACE) message(STATUS "Git checkout information:") message(STATUS " Commit description: ${GIT_DESCRIBE}") @@ -72,6 +77,11 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) message(STATUS " Commits since tag: ${GIT_COMMITS_SINCE_TAG}") message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}") message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}") + message(STATUS "Build information:") + message(STATUS " Build OS: ${BUILDINFO_OS}") + message(STATUS " Build date: ${BUILDINFO_DATE}") + message(STATUS " Epoch: ${BUILDINFO_EPOCH}") + message(STATUS " UUID: ${BUILDINFO_UUID}") if(NOT DEFINED CACHE_NAME_SUFFIX) set(CACHE_NAME_SUFFIX "${GIT_DESCRIBE}") From 80eb85215ad9c133affcd9996fb5e4dde7e3391e Mon Sep 17 00:00:00 2001 From: Benitoite Date: Sun, 9 Feb 2020 05:05:30 -0800 Subject: [PATCH 039/154] Appends build-unique info to AboutThisBuild.txt --- AboutThisBuild.txt.in | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/AboutThisBuild.txt.in b/AboutThisBuild.txt.in index f48d39b50..d6454d8a0 100644 --- a/AboutThisBuild.txt.in +++ b/AboutThisBuild.txt.in @@ -13,3 +13,7 @@ Build flags: ${CXX_FLAGS} Link flags: ${LFLAGS} OpenMP support: ${OPTION_OMP} MMAP support: ${WITH_MYFILE_MMAP} +Build OS: ${BUILDINFO_OS} +Build date: ${BUILDINFO_DATE} ZULU +Build Epoch: ${BUILDINFO_EPOCH} +Build UUID: ${BUILDINFO_UUID} From 9115addbc2299e1b527d2906b8c0127c17eec16c Mon Sep 17 00:00:00 2001 From: Benitoite Date: Sun, 9 Feb 2020 11:25:21 -0800 Subject: [PATCH 040/154] mac: copy correct AboutThisBuild.txt into bundle --- tools/osx/macosx_bundle.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 779b31a1e..19b78fae4 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -335,7 +335,7 @@ function CreateDmg { msg "Preparing disk image sources at ${srcDir}:" cp -R "${APP}" "${srcDir}" - ditto AboutThisBuild.txt "${srcDir}" + ditto Resources/AboutThisBuild.txt "${srcDir}" ln -s /Applications "${srcDir}" # Web bookmarks @@ -392,7 +392,7 @@ function CreateDmg { # Zip disk image for redistribution msg "Zipping disk image for redistribution:" - zip "${dmg_name}.zip" "${dmg_name}.dmg" AboutThisBuild.txt + zip "${dmg_name}.zip" "${dmg_name}.dmg" Resources/AboutThisBuild.txt rm "${dmg_name}.dmg" msg "Removing disk image caches:" From cb09e78e81bb8129656eaf51437f54436eb372d0 Mon Sep 17 00:00:00 2001 From: Benitoite Date: Sun, 9 Feb 2020 12:21:47 -0800 Subject: [PATCH 041/154] mac: convert case statement to if --- tools/osx/macosx_bundle.sh | 53 ++++++++++++++------------------------ 1 file changed, 19 insertions(+), 34 deletions(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 19b78fae4..83bc4f630 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -34,6 +34,22 @@ function CheckLink { done } +function ModifyInstallNames { + find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib))' | while read -r x; do + msg "Modifying install names: ${x}" + { + # id + if [ ${x:(-6)} == ".dylib" ]; then + echo " install_name_tool -id '@rpath/$(basename "${x}")' '${x}'" + fi + GetDependencies "${x}" | while read -r y + do + echo " install_name_tool -change '${y}' '@rpath/$(basename "${y}")' '${x}'" + done + } | bash -v + done +} + # Source check if [[ ! -d "${CMAKE_BUILD_TYPE}" ]]; then msgError "${PWD}/${CMAKE_BUILD_TYPE} folder does not exist. Please execute 'make install' first." @@ -134,17 +150,7 @@ msg "Copying dependencies from ${GTK_PREFIX}:" CheckLink "${EXECUTABLE}" # dylib install names -find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib))' | while read -r x; do - msg "Modifying dylib install names: ${x}" - { - # id - case ${x} in *.dylib) echo " install_name_tool -id '@rpath/$(basename "${x}")' '${x}'";; esac - # names - GetDependencies "${x}" | while read -r y; do - echo " install_name_tool -change '${y}' '@rpath/$(basename "${y}")' '${x}'" - done - } | bash -v -done +ModifyInstallNames # Copy libjpeg-turbo ("62") into the app bundle ditto ${LOCAL_PREFIX}/local/lib/libjpeg.62.dylib "${CONTENTS}/Frameworks/libjpeg.62.dylib" @@ -216,17 +222,7 @@ sed -i "" -e "s|${PWD}/RawTherapee.app/Contents/|/Applications/RawTherapee.app/C sed -i "" -e "s|/opt/local/|/usr/|" "${ETC}/gtk-3.0/gtk.immodules" # Install names -find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib|so))' | while read -r x; do - msg "Modifying install names: ${x}" - { - # id - case ${x} in *.dylib) echo " install_name_tool -id '@rpath/$(basename "${x}")' '${x}'";; esac - # names - GetDependencies "${x}" | while read -r y; do - echo " install_name_tool -change '${y}' '@rpath/$(basename "${y}")' '${x}'" - done - } | bash -v -done +ModifyInstallNames # fix @rpath in Frameworks msg "Registering @rpath in Frameworks folder:" @@ -266,18 +262,7 @@ msg "Registering @rpath into the executable:" echo " install_name_tool -add_rpath /Applications/RawTherapee.app/Contents/Frameworks '${MACOS}/bin/rawtherapee-bin'" | bash -v echo " install_name_tool -add_rpath /Applications/RawTherapee.app/Contents/Frameworks '${EXECUTABLE}-cli'" | bash -v -# Install names -find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib|so))' | while read -r x; do - msg "Modifying install names: ${x}" - { - # id - case ${x} in *.dylib) echo " install_name_tool -id '@rpath/$(basename "${x}")' '${x}'";; esac - # names - GetDependencies "${x}" | while read -r y; do - echo " install_name_tool -change '${y}' '@rpath/$(basename "${y}")' '${x}'" - done - } | bash -v -done +ModifyInstallNames # fix @rpath in Frameworks msg "Registering @rpath in Frameworks folder:" From 3349aa041a9546ea7afd5b59a29bcab679577e38 Mon Sep 17 00:00:00 2001 From: Benitoite Date: Sun, 9 Feb 2020 13:25:45 -0800 Subject: [PATCH 042/154] mac: include .so objects in routine --- tools/osx/macosx_bundle.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 83bc4f630..7a6bfe765 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -35,7 +35,7 @@ function CheckLink { } function ModifyInstallNames { - find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib))' | while read -r x; do + find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib|so))' | while read -r x; do msg "Modifying install names: ${x}" { # id From 4790eb08b3f6440a7a487375aec2ba2735365157 Mon Sep 17 00:00:00 2001 From: Benitoite Date: Mon, 10 Feb 2020 09:45:39 -0800 Subject: [PATCH 043/154] Epoch -> epoch --- AboutThisBuild.txt.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AboutThisBuild.txt.in b/AboutThisBuild.txt.in index d6454d8a0..06f628187 100644 --- a/AboutThisBuild.txt.in +++ b/AboutThisBuild.txt.in @@ -15,5 +15,5 @@ OpenMP support: ${OPTION_OMP} MMAP support: ${WITH_MYFILE_MMAP} Build OS: ${BUILDINFO_OS} Build date: ${BUILDINFO_DATE} ZULU -Build Epoch: ${BUILDINFO_EPOCH} +Build epoch: ${BUILDINFO_EPOCH} Build UUID: ${BUILDINFO_UUID} From a65b6e6edb3e69d3c23d03810aa61907c4746dba Mon Sep 17 00:00:00 2001 From: Benitoite Date: Tue, 11 Feb 2020 06:52:27 -0800 Subject: [PATCH 044/154] Remove COMMAND_ECHO STDOUTs --- UpdateInfo.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/UpdateInfo.cmake b/UpdateInfo.cmake index 9aa211d96..1c31cf44f 100644 --- a/UpdateInfo.cmake +++ b/UpdateInfo.cmake @@ -64,10 +64,10 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) set(GIT_NUMERIC_VERSION_BS "${GIT_NUMERIC_VERSION_BS}.${GIT_COMMITS_SINCE_TAG}") endif() - execute_process(COMMAND uname -mrs COMMAND_ECHO STDOUT OUTPUT_VARIABLE BUILDINFO_OS OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND date -Ru COMMAND_ECHO STDOUT OUTPUT_VARIABLE BUILDINFO_DATE OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND date +%s COMMAND_ECHO STDOUT OUTPUT_VARIABLE BUILDINFO_EPOCH OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND uuidgen COMMAND tr "A-Z" "a-z" COMMAND_ECHO STDOUT OUTPUT_VARIABLE BUILDINFO_UUID OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND uname -mrs OUTPUT_VARIABLE BUILDINFO_OS OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND date -Ru OUTPUT_VARIABLE BUILDINFO_DATE OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND date +%s OUTPUT_VARIABLE BUILDINFO_EPOCH OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND uuidgen COMMAND tr "A-Z" "a-z" OUTPUT_VARIABLE BUILDINFO_UUID OUTPUT_STRIP_TRAILING_WHITESPACE) message(STATUS "Git checkout information:") message(STATUS " Commit description: ${GIT_DESCRIBE}") From 2acf13a62a55d4b9c7fae29c9061ab8b242c6229 Mon Sep 17 00:00:00 2001 From: Benitoite Date: Sat, 15 Feb 2020 15:37:42 -0800 Subject: [PATCH 045/154] Update main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bab7397a6..d1f1578f8 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -30,7 +30,7 @@ jobs: CMAKE_CXX_STANDARD: 11 PKG_CONFIG_PATH: /usr/local/opt/libffi/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig RAW_THERAPEE_MAJOR: '5' - RAW_THERAPEE_MINOR: '7' + RAW_THERAPEE_MINOR: '8' C_FLAGS: -Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/gdk-pixbuf/include -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/llvm/include run: | # GITHUB_REF is the ref that triggered the build, like refs/heads/new-feature - the next line parses that to REF: the branch name only (new-feature) From 9d24423c770ed582f05557772d8a89011ffe24d6 Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Sat, 15 Feb 2020 15:56:20 -0800 Subject: [PATCH 046/154] mac: simplify bundle structure --- AboutThisBuild.txt.in | 4 ++++ UpdateInfo.cmake | 10 ++++++++++ tools/osx/Info.plist-bin.in | 10 ---------- tools/osx/Info.plist.in | 31 ++++++++++++++++++++++++++++++- tools/osx/executable_loader.in | 33 --------------------------------- tools/osx/macosx_bundle.sh | 33 +++++++++++++++++++++++++++------ tools/osx/rt-bin.entitlements | 8 -------- tools/osx/rt.entitlements | 34 +++++++++++++++++----------------- 8 files changed, 88 insertions(+), 75 deletions(-) delete mode 100644 tools/osx/Info.plist-bin.in delete mode 100644 tools/osx/executable_loader.in delete mode 100644 tools/osx/rt-bin.entitlements diff --git a/AboutThisBuild.txt.in b/AboutThisBuild.txt.in index f48d39b50..06f628187 100644 --- a/AboutThisBuild.txt.in +++ b/AboutThisBuild.txt.in @@ -13,3 +13,7 @@ Build flags: ${CXX_FLAGS} Link flags: ${LFLAGS} OpenMP support: ${OPTION_OMP} MMAP support: ${WITH_MYFILE_MMAP} +Build OS: ${BUILDINFO_OS} +Build date: ${BUILDINFO_DATE} ZULU +Build epoch: ${BUILDINFO_EPOCH} +Build UUID: ${BUILDINFO_UUID} diff --git a/UpdateInfo.cmake b/UpdateInfo.cmake index d1f532506..a4de8fe1a 100644 --- a/UpdateInfo.cmake +++ b/UpdateInfo.cmake @@ -64,6 +64,11 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) set(GIT_NUMERIC_VERSION_BS "${GIT_NUMERIC_VERSION_BS}.${GIT_COMMITS_SINCE_TAG}") endif() + execute_process(COMMAND uname -mrs OUTPUT_VARIABLE BUILDINFO_OS OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND date -Ru OUTPUT_VARIABLE BUILDINFO_DATE OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND date +%s OUTPUT_VARIABLE BUILDINFO_EPOCH OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND uuidgen COMMAND tr "A-Z" "a-z" OUTPUT_VARIABLE BUILDINFO_UUID OUTPUT_STRIP_TRAILING_WHITESPACE) + message(STATUS "Git checkout information:") message(STATUS " Commit description: ${GIT_DESCRIBE}") message(STATUS " Branch: ${GIT_BRANCH}") @@ -72,6 +77,11 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) message(STATUS " Commits since tag: ${GIT_COMMITS_SINCE_TAG}") message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}") message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}") + message(STATUS "Build information:") + message(STATUS " Build OS: ${BUILDINFO_OS}") + message(STATUS " Build date: ${BUILDINFO_DATE}") + message(STATUS " Epoch: ${BUILDINFO_EPOCH}") + message(STATUS " UUID: ${BUILDINFO_UUID}") if(NOT DEFINED CACHE_NAME_SUFFIX) set(CACHE_NAME_SUFFIX "${GIT_DESCRIBE}") diff --git a/tools/osx/Info.plist-bin.in b/tools/osx/Info.plist-bin.in deleted file mode 100644 index 33abd4f7a..000000000 --- a/tools/osx/Info.plist-bin.in +++ /dev/null @@ -1,10 +0,0 @@ - - - - - CFBundleName - RawTherapee-bin - CFBundleIdentifier - com.rawtherapee.rawtherapee - - diff --git a/tools/osx/Info.plist.in b/tools/osx/Info.plist.in index eec1ab490..7e4918cc0 100644 --- a/tools/osx/Info.plist.in +++ b/tools/osx/Info.plist.in @@ -2,6 +2,35 @@ + LSEnvironment + + XDG_DATA_DIRS + /Applications/RawTherapee.app/Contents/Resources/share + DYLD_FALLBACK_LIBRARY_PATH + /Applications/RawTherapee.app/Contents/Frameworks + GTK_PATH + /Applications/RawTherapee.app/Contents/Frameworks + GTK_IM_MODULE_FILE + /Applications/RawTherapee.app/Contents/Resources/etc/gtk-3.0/gtk.immodules + XDG_DATA_HOME + /Applications/RawTherapee.app/Contents/Resources/share + GSETTINGS_SCHEMA_DIR + /Applications/RawTherapee.app/Contents/Resources/share/glib-2.0/schemas + GDK_PIXBUF_MODULE_FILE + /Applications/RawTherapee.app/Contents/Resources/etc/gtk-3.0/gdk-pixbuf.loaders + GDK_PIXBUF_MODULEDIR + /Applications/RawTherapee.app/Contents/Frameworks + FONTCONFIG_PATH + /Applications/RawTherapee.app/Contents/Resources/etc/fonts + LIBDIR + /Applications/RawTherapee.app/Contents/Frameworks + DATADIR + /Applications/RawTherapee.app/Contents/Resources + GDK_RENDERING + similar + GTK_OVERLAY_SCROLLING + 0 + CFBundleDevelopmentRegion English CFBundleDisplayName @@ -115,7 +144,7 @@ CFBundleIconFile rawtherapee.icns CFBundleIdentifier - com.rawtherapee.rawtherapee + com.rawtherapee.RawTherapee CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/tools/osx/executable_loader.in b/tools/osx/executable_loader.in deleted file mode 100644 index 5ee609043..000000000 --- a/tools/osx/executable_loader.in +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh - -# GIMP has this next line regarding raising the number-of-open-files limit: -ulimit -n 7000 - -cd "$(dirname "$0")" || exit 1 - -cwd="$(pwd)" -app="/Applications/RawTherapee.app" -lib="${app}/Contents/Frameworks" -resources="${app}/Contents/Resources" -etc="${resources}/etc" -export XDG_DATA_DIRS="${resources}/share" -export DYLD_FALLBACK_LIBRARY_PATH="${lib}" -export GTK_PATH="${lib}/gtk-3.0/3.0.0" -export XDG_DATA_HOME="${resources}/share" -export GSETTINGS_SCHEMA_DIR="${resources}/share/glib-2.0/schemas" -export GDK_PIXBUF_MODULE_FILE="${etc}/gtk-3.0/gdk-pixbuf.loaders" -export GDK_PIXBUF_MODULEDIR="${lib}" - -export RT_SETTINGS="${HOME}/Library/Application Support/RawTherapee/config" -export RT_CACHE="${HOME}/Library/Application Support/RawTherapee/cache" - -# Strip out system argument -case "$1" in - -psn_*) shift ;; -esac - -# Prevent crash when directory name contains special characters -AppleLocale=`defaults read -g AppleLocale` -export LANG=${AppleLocale%@*}.UTF-8 - -exec "${app}/Contents/MacOS/bin/rawtherapee-bin" "$@" diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 7a6bfe765..cb5338121 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -50,6 +50,22 @@ function ModifyInstallNames { done } +function ModifyInstallNames { + find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib|so))' | while read -r x; do + msg "Modifying install names: ${x}" + { + # id + if [ ${x:(-6)} == ".dylib" ] || [ f${x:(-3)} == ".so" ]; then + echo " install_name_tool -id '@rpath/$(basename "${x}")' '${x}'" + fi + GetDependencies "${x}" | while read -r y + do + echo " install_name_tool -change '${y}' '@rpath/$(basename "${y}")' '${x}'" + done + } | bash -v + done +} + # Source check if [[ ! -d "${CMAKE_BUILD_TYPE}" ]]; then msgError "${PWD}/${CMAKE_BUILD_TYPE} folder does not exist. Please execute 'make install' first." @@ -132,9 +148,16 @@ echo "Bundle date: $(date -Ru) ZULU" >> Resources/AboutThisBuild.txt echo "Bundle epoch: $(date +%s)" >> Resources/AboutThisBuild.txt echo "Bundle UUID: $(uuidgen)" >> Resources/AboutThisBuild.txt +echo "\n--------\n" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt +echo "Bundle system: $(sysctl -n machdep.cpu.brand_string)" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt +echo "Bundle OS: $(sw_vers -productName) $(sw_vers -productVersion) $(sw_vers -buildVersion) $(uname -mrs)" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt +echo "Bundle date: $(date -Ru) ZULU" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt +echo "Bundle epoch: $(date +%s)" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt +echo "Bundle UUID: $(uuidgen)" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt + msg "Copying release files:" ditto "${CMAKE_BUILD_TYPE}/MacOS" "${MACOS}" -ditto "Resources" "${RESOURCES}" +ditto "${CMAKE_BUILD_TYPE}/Resources" "${RESOURCES}" # Copy the Lensfun database into the app bundle mkdir -p "${RESOURCES}/share/lensfun" @@ -152,6 +175,9 @@ CheckLink "${EXECUTABLE}" # dylib install names ModifyInstallNames +# dylib install names +ModifyInstallNames + # Copy libjpeg-turbo ("62") into the app bundle ditto ${LOCAL_PREFIX}/local/lib/libjpeg.62.dylib "${CONTENTS}/Frameworks/libjpeg.62.dylib" @@ -193,11 +219,6 @@ ditto "${LIB}"/gtk-3.0/3*/immodules/*.{dylib,so} "${LIB}" rm -r "${LIB}"/gtk-3.0 rm -r "${LIB}"/gdk-pixbuf-2.0 -msg "Build glib database:" -mkdir -p ${RESOURCES}/share/glib-2.0 -ditto {"${LOCAL_PREFIX}/local","${RESOURCES}"}/share/glib-2.0/schemas -"${LOCAL_PREFIX}/local/bin/glib-compile-schemas" "${RESOURCES}/share/glib-2.0/schemas" - # GTK+3 themes msg "Copy GTK+3 theme and icon resources:" ditto {"${LOCAL_PREFIX}/local","${RESOURCES}"}/share/themes/Mac/gtk-3.0/gtk-keys.css diff --git a/tools/osx/rt-bin.entitlements b/tools/osx/rt-bin.entitlements deleted file mode 100644 index 9e5e269cb..000000000 --- a/tools/osx/rt-bin.entitlements +++ /dev/null @@ -1,8 +0,0 @@ - - - - -com.apple.security.inherit - - - \ No newline at end of file diff --git a/tools/osx/rt.entitlements b/tools/osx/rt.entitlements index 082661401..61422fae7 100644 --- a/tools/osx/rt.entitlements +++ b/tools/osx/rt.entitlements @@ -1,20 +1,20 @@ - - application-identifier - com.rawtherapee.rawtherapee - com.apple.security.temporary-exception.files.absolute-path.read-write - - "/" - - com.apple.security.cs.allow-dyld-environment-variables - - com.apple.security.files.user-selected.read-write - - com.apple.security.app-sandbox - - com.apple.security.files.downloads.read-write - - - + + application-identifier + com.rawtherapee.RawTherapee + com.apple.security.temporary-exception.files.absolute-path.read-write + + / + + com.apple.security.cs.allow-dyld-environment-variables + + com.apple.security.files.user-selected.read-write + + com.apple.security.app-sandbox + + com.apple.security.files.downloads.read-write + + + \ No newline at end of file From debf97126b4243ac209eab2ec8c0725e8a08011d Mon Sep 17 00:00:00 2001 From: Benitoite Date: Sat, 15 Feb 2020 18:02:14 -0800 Subject: [PATCH 047/154] revert AboutThisBuild.txt --- AboutThisBuild.txt.in | 4 ---- 1 file changed, 4 deletions(-) diff --git a/AboutThisBuild.txt.in b/AboutThisBuild.txt.in index 06f628187..f48d39b50 100644 --- a/AboutThisBuild.txt.in +++ b/AboutThisBuild.txt.in @@ -13,7 +13,3 @@ Build flags: ${CXX_FLAGS} Link flags: ${LFLAGS} OpenMP support: ${OPTION_OMP} MMAP support: ${WITH_MYFILE_MMAP} -Build OS: ${BUILDINFO_OS} -Build date: ${BUILDINFO_DATE} ZULU -Build epoch: ${BUILDINFO_EPOCH} -Build UUID: ${BUILDINFO_UUID} From ba388cc196c55cec5037c68eaa91aad68ea8ab90 Mon Sep 17 00:00:00 2001 From: Benitoite Date: Sat, 15 Feb 2020 18:04:24 -0800 Subject: [PATCH 048/154] revert UpdateInfo.cmake --- UpdateInfo.cmake | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/UpdateInfo.cmake b/UpdateInfo.cmake index a4de8fe1a..d1f532506 100644 --- a/UpdateInfo.cmake +++ b/UpdateInfo.cmake @@ -64,11 +64,6 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) set(GIT_NUMERIC_VERSION_BS "${GIT_NUMERIC_VERSION_BS}.${GIT_COMMITS_SINCE_TAG}") endif() - execute_process(COMMAND uname -mrs OUTPUT_VARIABLE BUILDINFO_OS OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND date -Ru OUTPUT_VARIABLE BUILDINFO_DATE OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND date +%s OUTPUT_VARIABLE BUILDINFO_EPOCH OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND uuidgen COMMAND tr "A-Z" "a-z" OUTPUT_VARIABLE BUILDINFO_UUID OUTPUT_STRIP_TRAILING_WHITESPACE) - message(STATUS "Git checkout information:") message(STATUS " Commit description: ${GIT_DESCRIBE}") message(STATUS " Branch: ${GIT_BRANCH}") @@ -77,11 +72,6 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) message(STATUS " Commits since tag: ${GIT_COMMITS_SINCE_TAG}") message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}") message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}") - message(STATUS "Build information:") - message(STATUS " Build OS: ${BUILDINFO_OS}") - message(STATUS " Build date: ${BUILDINFO_DATE}") - message(STATUS " Epoch: ${BUILDINFO_EPOCH}") - message(STATUS " UUID: ${BUILDINFO_UUID}") if(NOT DEFINED CACHE_NAME_SUFFIX) set(CACHE_NAME_SUFFIX "${GIT_DESCRIBE}") From 7b215e83a3c29eb002a0d06dcbc76afbe86e55fd Mon Sep 17 00:00:00 2001 From: Benitoite Date: Sat, 15 Feb 2020 18:07:30 -0800 Subject: [PATCH 049/154] mac: bundle simplification --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 259a0d7a2..8503fe573 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -168,7 +168,7 @@ endif() if(NOT DEFINED DATADIR) if(BUILD_BUNDLE) if(APPLE) - set(DATADIR "../../Resources") + set(DATADIR "../Resources") else() set(DATADIR .) endif() @@ -180,7 +180,7 @@ endif() if(NOT DEFINED LIBDIR) if(BUILD_BUNDLE) if(APPLE) - set(LIBDIR "../../Frameworks") + set(LIBDIR "../Frameworks") else() set(LIBDIR .) endif() From 338c2aaccee9cbb099c778c83f2dc7c93b55fea2 Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Sun, 16 Feb 2020 06:08:12 -0800 Subject: [PATCH 050/154] mac:bundle simplification cont'd --- rtdata/options/options.osx | 5 +- tools/osx/macosx_bundle.sh | 343 +++++++++++++++++-------------------- 2 files changed, 156 insertions(+), 192 deletions(-) diff --git a/rtdata/options/options.osx b/rtdata/options/options.osx index 58e0a5604..bffd48495 100644 --- a/rtdata/options/options.osx +++ b/rtdata/options/options.osx @@ -9,6 +9,7 @@ # which can be useful if you want to keep the application and all the cache data in a single place, # an external HD for example MultiUser=true +UseSystemTheme=false [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) @@ -38,5 +39,5 @@ CustomProfileBuilder= #ImgDefault=Neutral [GUI] -FontFamily=Helvetica Regular -CPFontFamily=Helvetica Regular +FontFamily=DroidSansMonoSlashed Regular +CPFontFamily=DroidSansMonoSlashed Regular diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index cb5338121..35b80a44c 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -16,95 +16,79 @@ fMagenta="$(tput setaf 5)" fRed="$(tput setaf 1)" function msg { - printf "\\n${fBold}-- %s${fNormal}\\n" "${@}" +printf "\\n${fBold}-- %s${fNormal}\\n" "${@}" } function msgError { - printf "\\n${fBold}Error:${fNormal}\\n%s\\n" "${@}" +printf "\\n${fBold}Error:${fNormal}\\n%s\\n" "${@}" } function GetDependencies { - otool -L "$1" | awk 'NR >= 2 && $1 !~ /^(\/usr\/lib|\/System|@executable_path|@rpath)\// { print $1 }' +otool -L "$1" | awk 'NR >= 2 && $1 !~ /^(\/usr\/lib|\/System|@executable_path|@rpath)\// { print $1 }' } function CheckLink { - GetDependencies "$1" | while read -r; do - local dest="${LIB}/$(basename "${REPLY}")" - test -f "${dest}" || { ditto --arch "${arch}" "${REPLY}" "${dest}"; CheckLink "${dest}"; } - done +GetDependencies "$1" | while read -r; do +local dest="${LIB}/$(basename "${REPLY}")" +test -f "${dest}" || { ditto --arch "${arch}" "${REPLY}" "${dest}"; CheckLink "${dest}"; } +done } function ModifyInstallNames { - find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib|so))' | while read -r x; do - msg "Modifying install names: ${x}" - { - # id - if [ ${x:(-6)} == ".dylib" ]; then - echo " install_name_tool -id '@rpath/$(basename "${x}")' '${x}'" - fi - GetDependencies "${x}" | while read -r y - do - echo " install_name_tool -change '${y}' '@rpath/$(basename "${y}")' '${x}'" - done - } | bash -v - done -} - -function ModifyInstallNames { - find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib|so))' | while read -r x; do - msg "Modifying install names: ${x}" - { - # id - if [ ${x:(-6)} == ".dylib" ] || [ f${x:(-3)} == ".so" ]; then - echo " install_name_tool -id '@rpath/$(basename "${x}")' '${x}'" - fi - GetDependencies "${x}" | while read -r y - do - echo " install_name_tool -change '${y}' '@rpath/$(basename "${y}")' '${x}'" - done - } | bash -v - done +find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib|so))' | while read -r x; do +msg "Modifying install names: ${x}" +{ +# id +if [ ${x:(-6)} == ".dylib" ] || [ f${x:(-3)} == ".so" ]; then +echo " install_name_tool -id '@rpath/$(basename "${x}")' '${x}'" +fi +GetDependencies "${x}" | while read -r y +do +echo " install_name_tool -change '${y}' '@rpath/$(basename "${y}")' '${x}'" +done +} | bash -v +done } # Source check if [[ ! -d "${CMAKE_BUILD_TYPE}" ]]; then - msgError "${PWD}/${CMAKE_BUILD_TYPE} folder does not exist. Please execute 'make install' first." - exit 1 +msgError "${PWD}/${CMAKE_BUILD_TYPE} folder does not exist. Please execute 'make install' first." +exit 1 fi # Update project version if [[ -x "$(which git)" && -d "${PROJECT_SOURCE_DIR}/.git" ]]; then - ### This section is copied from tools/generateReleaseInfo - # Get version description. - # Depending on whether you checked out a branch (dev) or a tag (release), - # "git describe" will return "5.0-gtk2-2-g12345678" or "5.0-gtk2", respectively. - gitDescribe="$(git describe --tags --always)" +### This section is copied from tools/generateReleaseInfo +# Get version description. +# Depending on whether you checked out a branch (dev) or a tag (release), +# "git describe" will return "5.0-gtk2-2-g12345678" or "5.0-gtk2", respectively. +gitDescribe="$(git describe --tags --always)" - # Apple requires a numeric version of the form n.n.n - # https://goo.gl/eWDQv6 +# Apple requires a numeric version of the form n.n.n +# https://goo.gl/eWDQv6 - # Get number of commits since tagging. This is what gitDescribe uses. - # Works when checking out branch, tag or commit. - gitCommitsSinceTag="$(git rev-list --count HEAD --not $(git tag --merged HEAD))" +# Get number of commits since tagging. This is what gitDescribe uses. +# Works when checking out branch, tag or commit. +gitCommitsSinceTag="$(git rev-list --count HEAD --not $(git tag --merged HEAD))" - # Create numeric version. - # This version is nonsense, either don't use it at all or use it only where you have no other choice, e.g. Inno Setup's VersionInfoVersion. - # Strip everything after hyphen, e.g. "5.0-gtk2" -> "5.0", "5.1-rc1" -> "5.1" (ergo BS). - if [[ -z $gitCommitsSinceTag ]]; then - gitVersionNumericBS="0.0.0" - else - gitVersionNumericBS="${gitDescribe%%-*}" # Remove everything after first hyphen. - gitVersionNumericBS="${gitVersionNumericBS}.${gitCommitsSinceTag}" # Remove everything until after first hyphen: 5.0 - fi - ### Copy end. +# Create numeric version. +# This version is nonsense, either don't use it at all or use it only where you have no other choice, e.g. Inno Setup's VersionInfoVersion. +# Strip everything after hyphen, e.g. "5.0-gtk2" -> "5.0", "5.1-rc1" -> "5.1" (ergo BS). +if [[ -z $gitCommitsSinceTag ]]; then +gitVersionNumericBS="0.0.0" +else +gitVersionNumericBS="${gitDescribe%%-*}" # Remove everything after first hyphen. +gitVersionNumericBS="${gitVersionNumericBS}.${gitCommitsSinceTag}" # Remove everything until after first hyphen: 5.0 +fi +### Copy end. - PROJECT_FULL_VERSION="$gitDescribe" - PROJECT_VERSION="$gitVersionNumericBS" +PROJECT_FULL_VERSION="$gitDescribe" +PROJECT_VERSION="$gitVersionNumericBS" fi MINIMUM_SYSTEM_VERSION="$(otool -l "${CMAKE_BUILD_TYPE}"/MacOS/rawtherapee | grep -A2 'LC_VERSION_MIN_MACOSX' | awk '$1 ~ /version/ { printf $2 }')" if [[ -z "${MINIMUM_SYSTEM_VERSION}" ]]; then - MINIMUM_SYSTEM_VERSION="$(sw_vers -productVersion | cut -d. -f-2)" +MINIMUM_SYSTEM_VERSION="$(sw_vers -productVersion | cut -d. -f-2)" fi arch=x86_64 @@ -122,7 +106,7 @@ __EOS__ LOCAL_PREFIX="$(cmake .. -LA -N | grep "LOCAL_PREFIX" | cut -d "=" -f2)" EXPATLIB="$(cmake .. -LA -N | grep "pkgcfg_lib_EXPAT_expat" | cut -d "=" -f2)" - + APP="${PROJECT_NAME}.app" CONTENTS="${APP}/Contents" RESOURCES="${CONTENTS}/Resources" @@ -137,16 +121,9 @@ rm -rf "${APP}" "${PROJECT_NAME}_*.dmg" "*zip" msg "Creating bundle container:" install -d "${RESOURCES}" \ - "${MACOS}" \ - "${LIB}" \ - "${ETC}" - -echo "\n--------\n" >> Resources/AboutThisBuild.txt -echo "Bundle system: $(sysctl -n machdep.cpu.brand_string)" >> Resources/AboutThisBuild.txt -echo "Bundle OS: $(sw_vers -productName) $(sw_vers -productVersion) $(sw_vers -buildVersion) $(uname -mrs)" >> Resources/AboutThisBuild.txt -echo "Bundle date: $(date -Ru) ZULU" >> Resources/AboutThisBuild.txt -echo "Bundle epoch: $(date +%s)" >> Resources/AboutThisBuild.txt -echo "Bundle UUID: $(uuidgen)" >> Resources/AboutThisBuild.txt +"${MACOS}" \ +"${LIB}" \ +"${ETC}" echo "\n--------\n" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt echo "Bundle system: $(sysctl -n machdep.cpu.brand_string)" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt @@ -175,9 +152,6 @@ CheckLink "${EXECUTABLE}" # dylib install names ModifyInstallNames -# dylib install names -ModifyInstallNames - # Copy libjpeg-turbo ("62") into the app bundle ditto ${LOCAL_PREFIX}/local/lib/libjpeg.62.dylib "${CONTENTS}/Frameworks/libjpeg.62.dylib" @@ -228,8 +202,8 @@ ditto {"${LOCAL_PREFIX}/local","${RESOURCES}"}/share/themes/Default/gtk-3.0/gtk- msg "Copy Adwaita icons" iconfolders=("16x16/actions" "16x16/devices" "16x16/mimetypes" "16x16/places" "16x16/status" "48x48/devices") for f in "${iconfolders[@]}"; do - mkdir -p ${RESOURCES}/share/icons/Adwaita/${f} - ditto ${LOCAL_PREFIX}/local/share/icons/Adwaita/${f}/* "${RESOURCES}"/share/icons/Adwaita/${f} +mkdir -p ${RESOURCES}/share/icons/Adwaita/${f} +ditto ${LOCAL_PREFIX}/local/share/icons/Adwaita/${f}/* "${RESOURCES}"/share/icons/Adwaita/${f} done ditto {"${LOCAL_PREFIX}/local","${RESOURCES}"}/share/icons/Adwaita/index.theme "${LOCAL_PREFIX}/local/bin/gtk-update-icon-cache" "${RESOURCES}/share/icons/Adwaita" @@ -240,47 +214,39 @@ msg "Build GTK3 databases:" "${LOCAL_PREFIX}"/local/bin/gdk-pixbuf-query-loaders "${LIB}"/libpix*.so > "${ETC}"/gtk-3.0/gdk-pixbuf.loaders "${LOCAL_PREFIX}"/local/bin/gtk-query-immodules-3.0 "${LIB}"/im-* > "${ETC}"/gtk-3.0/gtk.immodules sed -i "" -e "s|${PWD}/RawTherapee.app/Contents/|/Applications/RawTherapee.app/Contents/|" "${ETC}/gtk-3.0/gdk-pixbuf.loaders" "${ETC}/gtk-3.0/gtk.immodules" -sed -i "" -e "s|/opt/local/|/usr/|" "${ETC}/gtk-3.0/gtk.immodules" - -# Install names -ModifyInstallNames - -# fix @rpath in Frameworks -msg "Registering @rpath in Frameworks folder:" -for frameworklibs in ${CONTENTS}/Frameworks/* ; do - echo " install_name_tool -delete_rpath /opt/local/lib '${frameworklibs}'" | bash -v - echo " install_name_tool -add_rpath /Applications/RawTherapee.app/Contents/Frameworks '${frameworklibs}'" | bash -v -done +sed -i "" -e "s|/opt/local/|/Applications/RawTherapee.app/Contents/Frameworks/|" "${ETC}/gtk-3.0/gtk.immodules" # Mime directory msg "Copying shared files from ${GTK_PREFIX}:" ditto {"${LOCAL_PREFIX}/local","${RESOURCES}"}/share/mime +# Install names +ModifyInstallNames + msg "Installing required application bundle files:" PROJECT_SOURCE_DATA_DIR="${PROJECT_SOURCE_DIR}/tools/osx" ditto "${PROJECT_SOURCE_DIR}/build/Resources" "${RESOURCES}" -# Executable loader -# Note: executable is renamed to 'rawtherapee-bin'. -mkdir "${MACOS}/bin" -ditto "${MACOS}/rawtherapee" "${MACOS}/bin/rawtherapee-bin" -rm "${MACOS}/rawtherapee" -install -m 0755 "${PROJECT_SOURCE_DATA_DIR}/executable_loader.in" "${MACOS}/rawtherapee" +ditto "${PROJECT_SOURCE_DIR}/rtdata/fonts" "${ETC}/fonts" + # App bundle resources ditto "${PROJECT_SOURCE_DATA_DIR}/"{rawtherapee,profile}.icns "${RESOURCES}" ditto "${PROJECT_SOURCE_DATA_DIR}/PkgInfo" "${CONTENTS}" install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/Info.plist.in" "${CONTENTS}/Info.plist" -install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/Info.plist-bin.in" "${CONTENTS}/MacOS/bin/Info.plist" sed -i "" -e "s|@version@|${PROJECT_FULL_VERSION}| s|@shortVersion@|${PROJECT_VERSION}| s|@arch@|${arch}|" \ - "${CONTENTS}/Info.plist" -plutil -convert xml1 "${CONTENTS}/Info.plist" -plutil -convert xml1 "${CONTENTS}/MacOS/bin/Info.plist" +"${CONTENTS}/Info.plist" +plutil -convert binary1 "${CONTENTS}/Info.plist" update-mime-database -V "${CONTENTS}/Resources/share/mime" +msg "Build glib database:" +mkdir -p ${RESOURCES}/share/glib-2.0 +ditto {"${LOCAL_PREFIX}/local","${RESOURCES}"}/share/glib-2.0/schemas +"${LOCAL_PREFIX}/local/bin/glib-compile-schemas" "${RESOURCES}/share/glib-2.0/schemas" + # Append an LC_RPATH msg "Registering @rpath into the executable:" -echo " install_name_tool -add_rpath /Applications/RawTherapee.app/Contents/Frameworks '${MACOS}/bin/rawtherapee-bin'" | bash -v +echo " install_name_tool -add_rpath /Applications/RawTherapee.app/Contents/Frameworks '${EXECUTABLE}'" | bash -v echo " install_name_tool -add_rpath /Applications/RawTherapee.app/Contents/Frameworks '${EXECUTABLE}-cli'" | bash -v ModifyInstallNames @@ -288,121 +254,118 @@ ModifyInstallNames # fix @rpath in Frameworks msg "Registering @rpath in Frameworks folder:" for frameworklibs in ${CONTENTS}/Frameworks/* ; do - echo " install_name_tool -delete_rpath /opt/local/lib '${frameworklibs}'" | bash -v - echo " install_name_tool -add_rpath /Applications/RawTherapee.app/Contents/Frameworks '${frameworklibs}'" | bash -v +echo " install_name_tool -delete_rpath ${LOCAL_PREFIX}/local/lib '${frameworklibs}'" | bash -v +echo " install_name_tool -add_rpath /Applications/RawTherapee.app/Contents/Frameworks '${frameworklibs}'" | bash -v done # Sign the app msg "Codesigning:" CODESIGNID="$(cmake .. -LA -N | grep "CODESIGNID" | cut -d "=" -f2)" if ! test -z "$CODESIGNID" ; then -install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/rt.entitlements" "${CONTENTS}/Entitlements.plist" -plutil -convert xml1 "${CONTENTS}/Entitlements.plist" -install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/rt-bin.entitlements" "${CONTENTS}/MacOS/bin/Entitlements.plist" -plutil -convert xml1 "${CONTENTS}/MacOS/bin/Entitlements.plist" -codesign -v -s "${CODESIGNID}" -i "com.rawtherapee.rawtherapee-bin" -o runtime --timestamp --entitlements "${APP}/Contents/MacOS/bin/Entitlements.plist" "${APP}/Contents/MacOS/bin/rawtherapee-bin" +install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/rt.entitlements" "${CONTENTS}/rt.entitlements" +plutil -convert binary1 "${CONTENTS}/rt.entitlements" +codesign -v -s "${CODESIGNID}" -i "com.rawtherapee.RawTherapee" -o runtime --timestamp --entitlements "${CONTENTS}/rt.entitlements" "${CONTENTS}/rt.entitlements" +codesign -v -s "${CODESIGNID}" -i "com.rawtherapee.RawTherapee" -o runtime --timestamp --entitlements "${CONTENTS}/rt.entitlements" "${EXECUTABLE}" +codesign -v -s "${CODESIGNID}" -i "com.rawtherapee.RawTherapee" -o runtime --timestamp --entitlements "${CONTENTS}/rt.entitlements" "${EXECUTABLE}-cli" for frameworklibs in ${CONTENTS}/Frameworks/* ; do - codesign -v -s "${CODESIGNID}" -i "com.rawtherapee.rawtherapee-bin" -o runtime --timestamp "${frameworklibs}" +codesign -v -s "${CODESIGNID}" -i "com.rawtherapee.RawTherapee" -o runtime --timestamp "${frameworklibs}" done -codesign --deep --preserve-metadata=identifier,entitlements,runtime --timestamp --strict -v -s "${CODESIGNID}" -i "com.rawtherapee.RawTherapee" -o runtime --entitlements "${CONTENTS}/Entitlements.plist" "${APP}" +codesign --deep --preserve-metadata=identifier,entitlements,runtime --timestamp --strict -v -s "${CODESIGNID}" -i "com.rawtherapee.RawTherapee" -o runtime --entitlements "${CONTENTS}/rt.entitlements" "${APP}" spctl -a -vvvv "${APP}" fi # Notarize the app NOTARY="$(cmake .. -LA -N | grep "NOTARY" | cut -d "=" -f2)" if ! test -z "$NOTARY" ; then - msg "Notarizing the application:" - ditto -c -k --sequesterRsrc --keepParent "${APP}" "${APP}.zip" - uuid=`xcrun altool --notarize-app --primary-bundle-id "com.rawtherapee.RawTherapee" ${NOTARY} --file "${APP}.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` - echo "Result= $uuid" # Display identifier string - sleep 15 - while : - do - fullstatus=`xcrun altool --notarization-info "$uuid" ${NOTARY} 2>&1` # get the status - status1=`echo "$fullstatus" | grep 'Status\:' | awk '{ print $2 }'` - if [ "$status1" = "success" ]; then - xcrun stapler staple *app # staple the ticket - xcrun stapler validate -v *app - echo "Notarization success" - break - elif [ "$status1" = "in" ]; then - echo "Notarization still in progress, sleeping for 15 seconds and trying again" - sleep 15 - else - echo "Notarization failed fullstatus below" - echo "$fullstatus" - exit 1 - fi - done +msg "Notarizing the application:" +ditto -c -k --sequesterRsrc --keepParent "${APP}" "${APP}.zip" +uuid=`xcrun altool --notarize-app --primary-bundle-id "com.rawtherapee.RawTherapee" ${NOTARY} --file "${APP}.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` +echo "Result= $uuid" # Display identifier string +sleep 15 +while : +do +fullstatus=`xcrun altool --notarization-info "$uuid" ${NOTARY} 2>&1` # get the status +status1=`echo "$fullstatus" | grep 'Status\:' | awk '{ print $2 }'` +if [ "$status1" = "success" ]; then +xcrun stapler staple *app # staple the ticket +xcrun stapler validate -v *app +echo "Notarization success" +break +elif [ "$status1" = "in" ]; then +echo "Notarization still in progress, sleeping for 15 seconds and trying again" +sleep 15 +else +echo "Notarization failed fullstatus below" +echo "$fullstatus" +exit 1 +fi +done fi function CreateDmg { - local srcDir="$(mktemp -dt $$)" +local srcDir="$(mktemp -dt $$)" - msg "Preparing disk image sources at ${srcDir}:" - cp -R "${APP}" "${srcDir}" - ditto Resources/AboutThisBuild.txt "${srcDir}" - ln -s /Applications "${srcDir}" +msg "Preparing disk image sources at ${srcDir}:" +cp -R "${APP}" "${srcDir}" +ditto "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt "${srcDir}" +ln -s /Applications "${srcDir}" - # Web bookmarks - function CreateWebloc { - defaults write "${srcDir}/$1" URL "$2" - mv "${srcDir}/$1".{plist,webloc} - } - CreateWebloc 'Website' 'http://www.rawtherapee.com/' - CreateWebloc 'Manual' 'http://rawpedia.rawtherapee.com/' +# Web bookmarks +function CreateWebloc { +defaults write "${srcDir}/$1" URL "$2" +mv "${srcDir}/$1".{plist,webloc} +} +CreateWebloc 'Website' 'http://www.rawtherapee.com/' +CreateWebloc 'Manual' 'http://rawpedia.rawtherapee.com/' - # Disk image name - dmg_name="${PROJECT_NAME// /_}_OSX_${MINIMUM_SYSTEM_VERSION}_${PROC_BIT_DEPTH}_${PROJECT_FULL_VERSION}" - lower_build_type="$(tr '[:upper:]' '[:lower:]' <<< "$CMAKE_BUILD_TYPE")" - if [[ ${lower_build_type} != release ]]; then - dmg_name="${dmg_name}_${lower_build_type}" - fi +# Disk image name +dmg_name="${PROJECT_NAME// /_}_OSX_${MINIMUM_SYSTEM_VERSION}_${PROC_BIT_DEPTH}_${PROJECT_FULL_VERSION}" +lower_build_type="$(tr '[:upper:]' '[:lower:]' <<< "$CMAKE_BUILD_TYPE")" +if [[ ${lower_build_type} != release ]]; then +dmg_name="${dmg_name}_${lower_build_type}" +fi - msg "Creating disk image:" - hdiutil create -format UDBZ -fs HFS+ -srcdir "${srcDir}" -volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" "${dmg_name}.dmg" +msg "Creating disk image:" +hdiutil create -format UDBZ -fs HFS+ -srcdir "${srcDir}" -volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" "${dmg_name}.dmg" - # Sign disk image - if ! test -z "$CODESIGNID" ; then - codesign --deep --force -v -s "${CODESIGNID}" --timestamp "${dmg_name}.dmg" - fi +# Sign disk image +if ! test -z "$CODESIGNID" ; then +codesign --deep --force -v -s "${CODESIGNID}" --timestamp "${dmg_name}.dmg" +fi + +# Notarize the dmg +if ! test -z "$NOTARY" ; then +msg "Notarizing the dmg:" +zip "${dmg_name}.dmg.zip" "${dmg_name}.dmg" +uuid=`xcrun altool --notarize-app --primary-bundle-id "com.rawtherapee" ${NOTARY} --file "${dmg_name}.dmg.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` +echo "dmg Result= $uuid" # Display identifier string +sleep 15 +while : +do +fullstatus=`xcrun altool --notarization-info "$uuid" ${NOTARY} 2>&1` # get the status +status1=`echo "$fullstatus" | grep 'Status\:' | awk '{ print $2 }'` +if [ "$status1" = "success" ]; then +xcrun stapler staple "${dmg_name}.dmg" # staple the ticket +xcrun stapler validate -v "${dmg_name}.dmg" +echo "dmg Notarization success" +break +elif [ "$status1" = "in" ]; then +echo "dmg Notarization still in progress, sleeping for 15 seconds and trying again" +sleep 15 +else +echo "dmg Notarization failed fullstatus below" +echo "$fullstatus" +exit 1 +fi +done +fi - # Notarize the dmg - - if ! test -z "$NOTARY" ; then - msg "Notarizing the dmg:" - zip "${dmg_name}.dmg.zip" "${dmg_name}.dmg" - uuid=`xcrun altool --notarize-app --primary-bundle-id "com.rawtherapee" ${NOTARY} --file "${dmg_name}.dmg.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` - echo "dmg Result= $uuid" # Display identifier string - sleep 15 - while : - do - fullstatus=`xcrun altool --notarization-info "$uuid" ${NOTARY} 2>&1` # get the status - status1=`echo "$fullstatus" | grep 'Status\:' | awk '{ print $2 }'` - if [ "$status1" = "success" ]; then - xcrun stapler staple "${dmg_name}.dmg" # staple the ticket - xcrun stapler validate -v "${dmg_name}.dmg" - echo "dmg Notarization success" - break - elif [ "$status1" = "in" ]; then - echo "dmg Notarization still in progress, sleeping for 15 seconds and trying again" - sleep 15 - else - echo "dmg Notarization failed fullstatus below" - echo "$fullstatus" - exit 1 - fi - done - fi - # Zip disk image for redistribution - msg "Zipping disk image for redistribution:" - - zip "${dmg_name}.zip" "${dmg_name}.dmg" Resources/AboutThisBuild.txt - rm "${dmg_name}.dmg" - - msg "Removing disk image caches:" - rm -rf "${srcDir}" +msg "Zipping disk image for redistribution:" +zip "${dmg_name}.zip" "${dmg_name}.dmg" "${CMAKE_BUILD_TYPE}/Resources/AboutThisBuild.txt" +rm "${dmg_name}.dmg" +msg "Removing disk image caches:" +rm -rf "${srcDir}" } CreateDmg msg "Finishing build:" From 209f8a5921de4ee46470321654bcbb0442599fda Mon Sep 17 00:00:00 2001 From: Benitoite Date: Sun, 16 Feb 2020 11:33:16 -0800 Subject: [PATCH 051/154] mac: sets the Resources font folder Sets a directory of fonts to use by the app @ Contents/Resources/etc/fonts (https://developer.apple.com/documentation/bundleresources/information_property_list/atsapplicationfontspath?language=objc) --- tools/osx/Info.plist.in | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/osx/Info.plist.in b/tools/osx/Info.plist.in index 7e4918cc0..4874567e7 100644 --- a/tools/osx/Info.plist.in +++ b/tools/osx/Info.plist.in @@ -31,6 +31,8 @@ GTK_OVERLAY_SCROLLING 0 + ATSApplicationFontsPath + etc/fonts CFBundleDevelopmentRegion English CFBundleDisplayName From 8b1438f23d6c8e172e35cb764172dfa1149440ff Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Sun, 16 Feb 2020 14:53:36 -0800 Subject: [PATCH 052/154] mac: also set RT_SETTINGS and RT_CACHE --- tools/osx/Info.plist.in | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/osx/Info.plist.in b/tools/osx/Info.plist.in index 4874567e7..8e68a165f 100644 --- a/tools/osx/Info.plist.in +++ b/tools/osx/Info.plist.in @@ -30,6 +30,10 @@ similar GTK_OVERLAY_SCROLLING 0 + RT_SETTINGS + ~/Library/Application Support/RawTherapee/config + RT_CACHE + ~/Library/Application Support/RawTherapee/cache ATSApplicationFontsPath etc/fonts From d8d96784a492d446ff714d06c1049aea80361ab9 Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Sun, 16 Feb 2020 20:21:07 -0800 Subject: [PATCH 053/154] mac: set config path in options.cc --- rtgui/options.cc | 6 +++++- tools/osx/Info.plist.in | 8 ++++---- tools/osx/macosx_bundle.sh | 1 + 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index dcb16e1ea..fe19bf42e 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2270,8 +2270,12 @@ void Options::load(bool lightweight) const gchar* path; Glib::ustring dPath; +#ifdef __APPLE__ + path = g_getenv("HOME") + "Library/Application Support/RawTherapee/config"; +#else path = g_getenv("RT_SETTINGS"); - +#endif + if (path != nullptr) { rtdir = Glib::ustring(path); diff --git a/tools/osx/Info.plist.in b/tools/osx/Info.plist.in index 8e68a165f..cc445c1b0 100644 --- a/tools/osx/Info.plist.in +++ b/tools/osx/Info.plist.in @@ -30,13 +30,13 @@ similar GTK_OVERLAY_SCROLLING 0 - RT_SETTINGS - ~/Library/Application Support/RawTherapee/config - RT_CACHE - ~/Library/Application Support/RawTherapee/cache ATSApplicationFontsPath etc/fonts + LSMultipleInstancesProhibited + + LSMinimumSystemVersion + @minimum_macos_version@ CFBundleDevelopmentRegion English CFBundleDisplayName diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 35b80a44c..81746ba4b 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -104,6 +104,7 @@ GTK_PREFIX: ${GTK_PREFIX} PWD: ${PWD} __EOS__ +minimum_macos_version=${MINIMUM_SYSTEM_VERSION} LOCAL_PREFIX="$(cmake .. -LA -N | grep "LOCAL_PREFIX" | cut -d "=" -f2)" EXPATLIB="$(cmake .. -LA -N | grep "pkgcfg_lib_EXPAT_expat" | cut -d "=" -f2)" From 12ea3db9cb05ec27ad96fd57ec02f56c8c2e97d3 Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Sun, 16 Feb 2020 22:36:17 -0800 Subject: [PATCH 054/154] mac:build pathname in options.cc --- rtgui/options.cc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index fe19bf42e..7bcf0b466 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2271,7 +2271,16 @@ void Options::load(bool lightweight) Glib::ustring dPath; #ifdef __APPLE__ - path = g_getenv("HOME") + "Library/Application Support/RawTherapee/config"; + const gchar* homedir; + const gchar* configdir; + homedir = g_getenv("HOME"); + configdir = "Library/Application Support/RawTherapee/config"; + int bufferSize = strlen(homedir) + strlen(configdir) + 1; + gchar* concatString = new gchar[ bufferSize ]; + strcpy( concatString, homedir ); + strcat( concatString, configdir ); + path = concatString; + delete[] concatString; #else path = g_getenv("RT_SETTINGS"); #endif From 0770363c6fa1ef79364c33907f7687d4610cc78e Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Sun, 16 Feb 2020 22:53:56 -0800 Subject: [PATCH 055/154] mac:also build cache dir in options.cc --- rtgui/options.cc | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index 7bcf0b466..6a2522de0 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2274,12 +2274,14 @@ void Options::load(bool lightweight) const gchar* homedir; const gchar* configdir; homedir = g_getenv("HOME"); - configdir = "Library/Application Support/RawTherapee/config"; + std::cout << "homedir=" << homedir << "\n"; + configdir = "/../../../Application Support/RawTherapee/config"; int bufferSize = strlen(homedir) + strlen(configdir) + 1; gchar* concatString = new gchar[ bufferSize ]; strcpy( concatString, homedir ); strcat( concatString, configdir ); path = concatString; + std::cout << concatString << "\n"; delete[] concatString; #else path = g_getenv("RT_SETTINGS"); @@ -2326,8 +2328,23 @@ void Options::load(bool lightweight) } // Modify the path of the cache folder to the one provided in RT_CACHE environment variable +#ifdef __APPLE__ + const gchar* homedir; + const gchar* cachedir; + homedir = g_getenv("HOME"); // This returns the current container + std::cout << "homedir=" << homedir << "\n"; + configdir = "/../../../Application Support/RawTherapee/cache"; + int bufferSize = strlen(homedir) + strlen(cachedir) + 1; + gchar* concatString = new gchar[ bufferSize ]; + strcpy( concatString, homedir ); + strcat( concatString, cachedir ); + std::cout << path << "\n"; + path = concatString; + delete[] concatString; +#else path = g_getenv("RT_CACHE"); - +#endif + if (path != nullptr) { cacheBaseDir = Glib::ustring(path); From af624df79883d3d06290a3c659038b04f0e9afdd Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Sun, 16 Feb 2020 23:03:48 -0800 Subject: [PATCH 056/154] mac:use another variable name for cache folder --- rtgui/options.cc | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index 6a2522de0..efc718c20 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2271,9 +2271,10 @@ void Options::load(bool lightweight) Glib::ustring dPath; #ifdef __APPLE__ + // Build Application Support directory path for macOS. const gchar* homedir; const gchar* configdir; - homedir = g_getenv("HOME"); + homedir = g_getenv("HOME"); // This returns the current container std::cout << "homedir=" << homedir << "\n"; configdir = "/../../../Application Support/RawTherapee/config"; int bufferSize = strlen(homedir) + strlen(configdir) + 1; @@ -2327,20 +2328,17 @@ void Options::load(bool lightweight) rtdir = Glib::build_filename(argv0, "mysettings"); } - // Modify the path of the cache folder to the one provided in RT_CACHE environment variable + // Modify the path of the cache folder to the one provided in RT_CACHE environment variable. Build the cache folder name in macOS. #ifdef __APPLE__ - const gchar* homedir; const gchar* cachedir; - homedir = g_getenv("HOME"); // This returns the current container - std::cout << "homedir=" << homedir << "\n"; - configdir = "/../../../Application Support/RawTherapee/cache"; - int bufferSize = strlen(homedir) + strlen(cachedir) + 1; - gchar* concatString = new gchar[ bufferSize ]; - strcpy( concatString, homedir ); - strcat( concatString, cachedir ); + cachedir = "/../../../Application Support/RawTherapee/cache"; + int bufferSize2 = strlen(homedir) + strlen(cachedir) + 1; //reuse homedir from above. + gchar* concatString2 = new gchar[ bufferSize2 ]; + strcpy( concatString2, homedir ); + strcat( concatString2, cachedir ); std::cout << path << "\n"; - path = concatString; - delete[] concatString; + path = concatString2; + delete[] concatString2; #else path = g_getenv("RT_CACHE"); #endif From 910ce572b08ecc0cbfd6853ee694db7978ccd080 Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Sun, 16 Feb 2020 23:13:46 -0800 Subject: [PATCH 057/154] mac:reorder a cout --- rtgui/options.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index efc718c20..9bf1302ed 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2282,7 +2282,7 @@ void Options::load(bool lightweight) strcpy( concatString, homedir ); strcat( concatString, configdir ); path = concatString; - std::cout << concatString << "\n"; + std::cout << "config=" << path << "\n"; delete[] concatString; #else path = g_getenv("RT_SETTINGS"); @@ -2336,8 +2336,8 @@ void Options::load(bool lightweight) gchar* concatString2 = new gchar[ bufferSize2 ]; strcpy( concatString2, homedir ); strcat( concatString2, cachedir ); - std::cout << path << "\n"; path = concatString2; + std::cout << "cache=" << path << "\n"; delete[] concatString2; #else path = g_getenv("RT_CACHE"); From 4905b03372306dd19d16cfa5f9d126f982823ea2 Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Sun, 16 Feb 2020 23:47:44 -0800 Subject: [PATCH 058/154] mac: add some comments --- rtdata/options/options.osx | 1 + rtgui/options.cc | 6 +++--- tools/osx/Info.plist.in | 4 ++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/rtdata/options/options.osx b/rtdata/options/options.osx index bffd48495..9c1cb4c92 100644 --- a/rtdata/options/options.osx +++ b/rtdata/options/options.osx @@ -39,5 +39,6 @@ CustomProfileBuilder= #ImgDefault=Neutral [GUI] +# Set the included font as default FontFamily=DroidSansMonoSlashed Regular CPFontFamily=DroidSansMonoSlashed Regular diff --git a/rtgui/options.cc b/rtgui/options.cc index 9bf1302ed..7625e6620 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2274,9 +2274,9 @@ void Options::load(bool lightweight) // Build Application Support directory path for macOS. const gchar* homedir; const gchar* configdir; - homedir = g_getenv("HOME"); // This returns the current container + homedir = g_getenv("HOME"); // This returns the current container data dir in ~/Library std::cout << "homedir=" << homedir << "\n"; - configdir = "/../../../Application Support/RawTherapee/config"; + configdir = "/../../../Application Support/RawTherapee/config"; // Back out of containers and into App. Support int bufferSize = strlen(homedir) + strlen(configdir) + 1; gchar* concatString = new gchar[ bufferSize ]; strcpy( concatString, homedir ); @@ -2331,7 +2331,7 @@ void Options::load(bool lightweight) // Modify the path of the cache folder to the one provided in RT_CACHE environment variable. Build the cache folder name in macOS. #ifdef __APPLE__ const gchar* cachedir; - cachedir = "/../../../Application Support/RawTherapee/cache"; + cachedir = "/../../../Application Support/RawTherapee/cache"; // Back out of containers and into App. Support int bufferSize2 = strlen(homedir) + strlen(cachedir) + 1; //reuse homedir from above. gchar* concatString2 = new gchar[ bufferSize2 ]; strcpy( concatString2, homedir ); diff --git a/tools/osx/Info.plist.in b/tools/osx/Info.plist.in index cc445c1b0..ee11ba6d7 100644 --- a/tools/osx/Info.plist.in +++ b/tools/osx/Info.plist.in @@ -12,6 +12,8 @@ /Applications/RawTherapee.app/Contents/Frameworks GTK_IM_MODULE_FILE /Applications/RawTherapee.app/Contents/Resources/etc/gtk-3.0/gtk.immodules + GTK_MODULES + /Applications/RawTherapee.app/Contents/Frameworks/im-quartz.so XDG_DATA_HOME /Applications/RawTherapee.app/Contents/Resources/share GSETTINGS_SCHEMA_DIR @@ -30,6 +32,8 @@ similar GTK_OVERLAY_SCROLLING 0 + GDK_NATIVE_WINDOWS + 1 ATSApplicationFontsPath etc/fonts From 7a258d1a25a1af37637a63fbc67d06a221001ce7 Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Sun, 16 Feb 2020 23:56:24 -0800 Subject: [PATCH 059/154] mac: remove cout outputs --- rtgui/options.cc | 3 --- 1 file changed, 3 deletions(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index 7625e6620..d447bc980 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2275,14 +2275,12 @@ void Options::load(bool lightweight) const gchar* homedir; const gchar* configdir; homedir = g_getenv("HOME"); // This returns the current container data dir in ~/Library - std::cout << "homedir=" << homedir << "\n"; configdir = "/../../../Application Support/RawTherapee/config"; // Back out of containers and into App. Support int bufferSize = strlen(homedir) + strlen(configdir) + 1; gchar* concatString = new gchar[ bufferSize ]; strcpy( concatString, homedir ); strcat( concatString, configdir ); path = concatString; - std::cout << "config=" << path << "\n"; delete[] concatString; #else path = g_getenv("RT_SETTINGS"); @@ -2337,7 +2335,6 @@ void Options::load(bool lightweight) strcpy( concatString2, homedir ); strcat( concatString2, cachedir ); path = concatString2; - std::cout << "cache=" << path << "\n"; delete[] concatString2; #else path = g_getenv("RT_CACHE"); From c9f887281e952e9b4eae964f62ef42e2e72abc80 Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Mon, 17 Feb 2020 06:55:18 -0800 Subject: [PATCH 060/154] mac: truncate homedir --- rtgui/options.cc | 37 +++++++++++++++++-------------------- tools/osx/macosx_bundle.sh | 26 +++++++++++++------------- 2 files changed, 30 insertions(+), 33 deletions(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index d447bc980..31b816a19 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2272,20 +2272,18 @@ void Options::load(bool lightweight) #ifdef __APPLE__ // Build Application Support directory path for macOS. - const gchar* homedir; - const gchar* configdir; - homedir = g_getenv("HOME"); // This returns the current container data dir in ~/Library - configdir = "/../../../Application Support/RawTherapee/config"; // Back out of containers and into App. Support - int bufferSize = strlen(homedir) + strlen(configdir) + 1; - gchar* concatString = new gchar[ bufferSize ]; - strcpy( concatString, homedir ); - strcat( concatString, configdir ); - path = concatString; - delete[] concatString; + const gchar* homedir = g_getenv("HOME"); // This returns the current container data dir in ~/Library + const gchar* configdir = "/Application Support/RawTherapee/config"; + gchar* homebuf = g_strnfill(789, 'a'); + gsize homelength = strlen(homedir); + g_stpcpy(homebuf, homedir); + homebuf[homelength-45] = '\0'; + configdir = "/Application Support/RawTherapee/config"; // Back out of containers and into App. Support + const gchar* pathconcat = g_strconcat(homebuf, configdir); + path = pathconcat; #else path = g_getenv("RT_SETTINGS"); #endif - if (path != nullptr) { rtdir = Glib::ustring(path); @@ -2294,6 +2292,8 @@ void Options::load(bool lightweight) throw Error(msg); } } else { + + #ifdef WIN32 WCHAR pathW[MAX_PATH] = {0}; @@ -2329,25 +2329,22 @@ void Options::load(bool lightweight) // Modify the path of the cache folder to the one provided in RT_CACHE environment variable. Build the cache folder name in macOS. #ifdef __APPLE__ const gchar* cachedir; - cachedir = "/../../../Application Support/RawTherapee/cache"; // Back out of containers and into App. Support - int bufferSize2 = strlen(homedir) + strlen(cachedir) + 1; //reuse homedir from above. - gchar* concatString2 = new gchar[ bufferSize2 ]; - strcpy( concatString2, homedir ); - strcat( concatString2, cachedir ); - path = concatString2; - delete[] concatString2; + cachedir = "/Application Support/RawTherapee/cache"; // Back out of containers and into App. Support + const gchar* pathconcat2 = g_strconcat(homebuf, cachedir); + path = pathconcat2; #else path = g_getenv("RT_CACHE"); #endif - if (path != nullptr) { cacheBaseDir = Glib::ustring(path); - + if (!Glib::path_is_absolute(cacheBaseDir)) { Glib::ustring msg = Glib::ustring::compose("Cache base dir %1 is not absolute", cacheBaseDir); throw Error(msg); } } + + // No environment variable provided, so falling back to the multi user mode, if enabled else if (options.multiUser) { #ifdef WIN32 diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 81746ba4b..4a9d8d41c 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -217,16 +217,16 @@ msg "Build GTK3 databases:" sed -i "" -e "s|${PWD}/RawTherapee.app/Contents/|/Applications/RawTherapee.app/Contents/|" "${ETC}/gtk-3.0/gdk-pixbuf.loaders" "${ETC}/gtk-3.0/gtk.immodules" sed -i "" -e "s|/opt/local/|/Applications/RawTherapee.app/Contents/Frameworks/|" "${ETC}/gtk-3.0/gtk.immodules" +# Install names +ModifyInstallNames + # Mime directory msg "Copying shared files from ${GTK_PREFIX}:" ditto {"${LOCAL_PREFIX}/local","${RESOURCES}"}/share/mime -# Install names -ModifyInstallNames - msg "Installing required application bundle files:" PROJECT_SOURCE_DATA_DIR="${PROJECT_SOURCE_DIR}/tools/osx" -ditto "${PROJECT_SOURCE_DIR}/build/Resources" "${RESOURCES}" +ditto "${CMAKE_BUILD_TYPE}/Resources" "${RESOURCES}" ditto "${PROJECT_SOURCE_DIR}/rtdata/fonts" "${ETC}/fonts" # App bundle resources @@ -260,19 +260,19 @@ echo " install_name_tool -add_rpath /Applications/RawTherapee.app/Contents/Fra done # Sign the app -msg "Codesigning:" CODESIGNID="$(cmake .. -LA -N | grep "CODESIGNID" | cut -d "=" -f2)" -if ! test -z "$CODESIGNID" ; then +if ! test -z "${CODESIGNID}" ; then +msg "Codesigning:" install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/rt.entitlements" "${CONTENTS}/rt.entitlements" plutil -convert binary1 "${CONTENTS}/rt.entitlements" -codesign -v -s "${CODESIGNID}" -i "com.rawtherapee.RawTherapee" -o runtime --timestamp --entitlements "${CONTENTS}/rt.entitlements" "${CONTENTS}/rt.entitlements" -codesign -v -s "${CODESIGNID}" -i "com.rawtherapee.RawTherapee" -o runtime --timestamp --entitlements "${CONTENTS}/rt.entitlements" "${EXECUTABLE}" -codesign -v -s "${CODESIGNID}" -i "com.rawtherapee.RawTherapee" -o runtime --timestamp --entitlements "${CONTENTS}/rt.entitlements" "${EXECUTABLE}-cli" +codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --timestamp --entitlements '${CONTENTS}/rt.entitlements' '${CONTENTS}/rt.entitlements' +codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --timestamp --entitlements '${CONTENTS}/rt.entitlements' '${EXECUTABLE}' +codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --timestamp --entitlements '${CONTENTS}/rt.entitlements' '${EXECUTABLE}-cli' for frameworklibs in ${CONTENTS}/Frameworks/* ; do -codesign -v -s "${CODESIGNID}" -i "com.rawtherapee.RawTherapee" -o runtime --timestamp "${frameworklibs}" +codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --timestamp '${frameworklibs}' done -codesign --deep --preserve-metadata=identifier,entitlements,runtime --timestamp --strict -v -s "${CODESIGNID}" -i "com.rawtherapee.RawTherapee" -o runtime --entitlements "${CONTENTS}/rt.entitlements" "${APP}" -spctl -a -vvvv "${APP}" +codesign --deep --preserve-metadata=identifier,entitlements,runtime --timestamp --strict -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements '${CONTENTS}/rt.entitlements' '${APP}' +spctl -a -vvvv ${APP} fi # Notarize the app @@ -331,7 +331,7 @@ hdiutil create -format UDBZ -fs HFS+ -srcdir "${srcDir}" -volname "${PROJECT_NAM # Sign disk image if ! test -z "$CODESIGNID" ; then -codesign --deep --force -v -s "${CODESIGNID}" --timestamp "${dmg_name}.dmg" +codesign --deep --force -v -s ""${CODESIGNID}"" --timestamp "${dmg_name}.dmg" fi # Notarize the dmg From c6579a4efc285818db69fe053c0525f0a757d64a Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Mon, 17 Feb 2020 07:32:19 -0800 Subject: [PATCH 061/154] mac:fix a codesign stmnt --- tools/osx/macosx_bundle.sh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 4a9d8d41c..bdfbf2aee 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -254,7 +254,7 @@ ModifyInstallNames # fix @rpath in Frameworks msg "Registering @rpath in Frameworks folder:" -for frameworklibs in ${CONTENTS}/Frameworks/* ; do +for frameworklibs in "${CONTENTS}"/Frameworks/* ; do echo " install_name_tool -delete_rpath ${LOCAL_PREFIX}/local/lib '${frameworklibs}'" | bash -v echo " install_name_tool -add_rpath /Applications/RawTherapee.app/Contents/Frameworks '${frameworklibs}'" | bash -v done @@ -263,15 +263,15 @@ done CODESIGNID="$(cmake .. -LA -N | grep "CODESIGNID" | cut -d "=" -f2)" if ! test -z "${CODESIGNID}" ; then msg "Codesigning:" -install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/rt.entitlements" "${CONTENTS}/rt.entitlements" -plutil -convert binary1 "${CONTENTS}/rt.entitlements" -codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --timestamp --entitlements '${CONTENTS}/rt.entitlements' '${CONTENTS}/rt.entitlements' -codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --timestamp --entitlements '${CONTENTS}/rt.entitlements' '${EXECUTABLE}' -codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --timestamp --entitlements '${CONTENTS}/rt.entitlements' '${EXECUTABLE}-cli' -for frameworklibs in ${CONTENTS}/Frameworks/* ; do -codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --timestamp '${frameworklibs}' +install -m 0644 "${PROJECT_SOURCE_DATA_DIR}"/rt.entitlements "${CONTENTS}"/rt.entitlements +plutil -convert binary1 "${CONTENTS}"/rt.entitlements +codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --timestamp --entitlements "${CONTENTS}"/rt.entitlements "${CONTENTS}"/rt.entitlements +codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --timestamp --entitlements "${CONTENTS}"/rt.entitlements "${EXECUTABLE}" +codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --timestamp --entitlements "${CONTENTS}"/rt.entitlements "${EXECUTABLE}"-cli +for frameworklibs in "${LIB}" ; do +codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --timestamp "${frameworklibs}" done -codesign --deep --preserve-metadata=identifier,entitlements,runtime --timestamp --strict -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements '${CONTENTS}/rt.entitlements' '${APP}' +codesign --deep --preserve-metadata=identifier,entitlements,runtime --timestamp --strict -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements "${CONTENTS}/rt.entitlements" "${APP}" spctl -a -vvvv ${APP} fi From 18c360ed4d7ffec28ce342fc719c55eed4169fbe Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Mon, 17 Feb 2020 07:34:07 -0800 Subject: [PATCH 062/154] mac:fix a glob for frameworks codesign --- tools/osx/macosx_bundle.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index bdfbf2aee..f08e45c48 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -268,7 +268,7 @@ plutil -convert binary1 "${CONTENTS}"/rt.entitlements codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --timestamp --entitlements "${CONTENTS}"/rt.entitlements "${CONTENTS}"/rt.entitlements codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --timestamp --entitlements "${CONTENTS}"/rt.entitlements "${EXECUTABLE}" codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --timestamp --entitlements "${CONTENTS}"/rt.entitlements "${EXECUTABLE}"-cli -for frameworklibs in "${LIB}" ; do +for frameworklibs in "${LIB}"/* ; do codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --timestamp "${frameworklibs}" done codesign --deep --preserve-metadata=identifier,entitlements,runtime --timestamp --strict -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements "${CONTENTS}/rt.entitlements" "${APP}" From 38037aee8c2658f928daefb566c55184a4506e0f Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Mon, 17 Feb 2020 11:24:05 -0800 Subject: [PATCH 063/154] mac:use a std::string --- rtgui/options.cc | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index 31b816a19..5b908d499 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2272,15 +2272,15 @@ void Options::load(bool lightweight) #ifdef __APPLE__ // Build Application Support directory path for macOS. - const gchar* homedir = g_getenv("HOME"); // This returns the current container data dir in ~/Library - const gchar* configdir = "/Application Support/RawTherapee/config"; - gchar* homebuf = g_strnfill(789, 'a'); - gsize homelength = strlen(homedir); - g_stpcpy(homebuf, homedir); + const char* homedir = g_getenv("HOME"); // This returns the current container data dir in ~/Library + std::string configdir = "/Application Support/RawTherapee/config"; + std::string homebuf{homedir}; + int homelength = strlen(homebuf.c_str()); homebuf[homelength-45] = '\0'; - configdir = "/Application Support/RawTherapee/config"; // Back out of containers and into App. Support - const gchar* pathconcat = g_strconcat(homebuf, configdir); - path = pathconcat; + configdir = "/Application Support/RawTherapee/config"; + std::string configpath = homebuf + configdir; + path = configpath.c_str(); + std::cout< Date: Mon, 17 Feb 2020 11:31:39 -0800 Subject: [PATCH 064/154] mac: use fewer variables --- rtgui/options.cc | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index 5b908d499..3cd3adb8a 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2273,12 +2273,10 @@ void Options::load(bool lightweight) #ifdef __APPLE__ // Build Application Support directory path for macOS. const char* homedir = g_getenv("HOME"); // This returns the current container data dir in ~/Library - std::string configdir = "/Application Support/RawTherapee/config"; std::string homebuf{homedir}; int homelength = strlen(homebuf.c_str()); - homebuf[homelength-45] = '\0'; - configdir = "/Application Support/RawTherapee/config"; - std::string configpath = homebuf + configdir; + homebuf[homelength-44] = '\0'; + std::string configpath = homebuf + "/Application Support/RawTherapee/config"; path = configpath.c_str(); std::cout< Date: Mon, 17 Feb 2020 11:44:01 -0800 Subject: [PATCH 065/154] mac:use strcat() --- rtgui/options.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index 3cd3adb8a..84cd4d857 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2276,8 +2276,9 @@ void Options::load(bool lightweight) std::string homebuf{homedir}; int homelength = strlen(homebuf.c_str()); homebuf[homelength-44] = '\0'; - std::string configpath = homebuf + "/Application Support/RawTherapee/config"; - path = configpath.c_str(); + std::string homeconfig{homebuf}; + std::strcat(homeconfig, "/Application Support/RawTherapee/config"); + path = homebuf.c_str(); std::cout< Date: Mon, 17 Feb 2020 11:47:09 -0800 Subject: [PATCH 066/154] mac:change a variable name --- rtgui/options.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index 84cd4d857..93a898987 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2275,7 +2275,7 @@ void Options::load(bool lightweight) const char* homedir = g_getenv("HOME"); // This returns the current container data dir in ~/Library std::string homebuf{homedir}; int homelength = strlen(homebuf.c_str()); - homebuf[homelength-44] = '\0'; + homebuf[homelength-44] = '\0'; // Truncate path to just ${HOME}/Library std::string homeconfig{homebuf}; std::strcat(homeconfig, "/Application Support/RawTherapee/config"); path = homebuf.c_str(); @@ -2328,8 +2328,8 @@ void Options::load(bool lightweight) // Modify the path of the cache folder to the one provided in RT_CACHE environment variable. Build the cache folder name in macOS. #ifdef __APPLE__ std::string homecache{homebuf}; - std::strcat(homecache + "/Application Support/RawTherapee/cache"); - path = cachepath.c_str(); + std::strcat(homecache, "/Application Support/RawTherapee/cache"); + path = homecache.c_str(); std::cout< Date: Mon, 17 Feb 2020 11:55:56 -0800 Subject: [PATCH 067/154] mac:try a string pointer --- rtgui/options.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index 93a898987..b09a16ae8 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2277,9 +2277,9 @@ void Options::load(bool lightweight) int homelength = strlen(homebuf.c_str()); homebuf[homelength-44] = '\0'; // Truncate path to just ${HOME}/Library std::string homeconfig{homebuf}; - std::strcat(homeconfig, "/Application Support/RawTherapee/config"); + std::strcat(&homeconfig[0], "/Application Support/RawTherapee/config"); path = homebuf.c_str(); - std::cout< Date: Mon, 17 Feb 2020 12:21:45 -0800 Subject: [PATCH 068/154] mac: spell font name correctly --- rtdata/options/options.osx | 4 ++-- rtgui/options.cc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rtdata/options/options.osx b/rtdata/options/options.osx index 9c1cb4c92..f5477d11d 100644 --- a/rtdata/options/options.osx +++ b/rtdata/options/options.osx @@ -40,5 +40,5 @@ CustomProfileBuilder= [GUI] # Set the included font as default -FontFamily=DroidSansMonoSlashed Regular -CPFontFamily=DroidSansMonoSlashed Regular +FontFamily=Droid Sans Mono Slashed Regular +CPFontFamily=Droid Sans Mono Slashed Regular diff --git a/rtgui/options.cc b/rtgui/options.cc index b09a16ae8..615485c42 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2278,7 +2278,7 @@ void Options::load(bool lightweight) homebuf[homelength-44] = '\0'; // Truncate path to just ${HOME}/Library std::string homeconfig{homebuf}; std::strcat(&homeconfig[0], "/Application Support/RawTherapee/config"); - path = homebuf.c_str(); + path = homeconfig.c_str(); std::cout<<"config="< Date: Mon, 17 Feb 2020 13:18:40 -0800 Subject: [PATCH 069/154] mac:options font name adjust. --- rtdata/options/options.osx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtdata/options/options.osx b/rtdata/options/options.osx index f5477d11d..c83aea179 100644 --- a/rtdata/options/options.osx +++ b/rtdata/options/options.osx @@ -40,5 +40,5 @@ CustomProfileBuilder= [GUI] # Set the included font as default -FontFamily=Droid Sans Mono Slashed Regular -CPFontFamily=Droid Sans Mono Slashed Regular +FontFamily=Droid Sans Mono Slashed +CPFontFamily=Droid Sans Mono Slashed From b8fce85a2d8c4afce9e8b8ecafdf80a696f09a69 Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Mon, 17 Feb 2020 13:40:39 -0800 Subject: [PATCH 070/154] mac:remove debug outputs --- rtgui/options.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index 615485c42..414eec521 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2275,11 +2275,11 @@ void Options::load(bool lightweight) const char* homedir = g_getenv("HOME"); // This returns the current container data dir in ~/Library std::string homebuf{homedir}; int homelength = strlen(homebuf.c_str()); - homebuf[homelength-44] = '\0'; // Truncate path to just ${HOME}/Library + homebuf[homelength-44] = '\0'; // Terminate string after ${HOME}/Library std::string homeconfig{homebuf}; std::strcat(&homeconfig[0], "/Application Support/RawTherapee/config"); path = homeconfig.c_str(); - std::cout<<"config="< Date: Mon, 17 Feb 2020 14:14:57 -0800 Subject: [PATCH 071/154] mac:lowercase bundle UUID --- rtgui/options.cc | 1 - tools/osx/macosx_bundle.sh | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index 414eec521..d85317c9d 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2279,7 +2279,6 @@ void Options::load(bool lightweight) std::string homeconfig{homebuf}; std::strcat(&homeconfig[0], "/Application Support/RawTherapee/config"); path = homeconfig.c_str(); - delete(homedir); #else path = g_getenv("RT_SETTINGS"); #endif diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index f08e45c48..be76face3 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -131,7 +131,7 @@ echo "Bundle system: $(sysctl -n machdep.cpu.brand_string)" >> "${CMAKE_BUILD_TY echo "Bundle OS: $(sw_vers -productName) $(sw_vers -productVersion) $(sw_vers -buildVersion) $(uname -mrs)" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt echo "Bundle date: $(date -Ru) ZULU" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt echo "Bundle epoch: $(date +%s)" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt -echo "Bundle UUID: $(uuidgen)" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt +echo "Bundle UUID: $(uuidgen|tr 'A-Z' 'a-z')" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt msg "Copying release files:" ditto "${CMAKE_BUILD_TYPE}/MacOS" "${MACOS}" From b27c78916e5a432b7485537bf300cbce1d9849fb Mon Sep 17 00:00:00 2001 From: Benitoite Date: Mon, 17 Feb 2020 14:30:46 -0800 Subject: [PATCH 072/154] mac:travis adjustment --- .github/workflows/main.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bab7397a6..45c877559 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -30,7 +30,7 @@ jobs: CMAKE_CXX_STANDARD: 11 PKG_CONFIG_PATH: /usr/local/opt/libffi/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig RAW_THERAPEE_MAJOR: '5' - RAW_THERAPEE_MINOR: '7' + RAW_THERAPEE_MINOR: '8' C_FLAGS: -Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/gdk-pixbuf/include -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/llvm/include run: | # GITHUB_REF is the ref that triggered the build, like refs/heads/new-feature - the next line parses that to REF: the branch name only (new-feature) @@ -54,6 +54,7 @@ jobs: -DOpenMP_CXX_FLAGS="${C_FLAGS}" \ -DCMAKE_AR="/usr/local/opt/llvm/bin/llvm-ar" \ -DCMAKE_RANLIB="/usr/local/opt/llvm/bin/llvm-ranlib" \ + -DCMAKE_OSX_DEPLOYMENT_TARGET="10.11" .. make --jobs make install From 3041169499dc293e39dff4a5015d698640f7cc2c Mon Sep 17 00:00:00 2001 From: Benitoite Date: Mon, 17 Feb 2020 14:49:17 -0800 Subject: [PATCH 073/154] UpdateInfo.cmake: remove an errant whitespace --- UpdateInfo.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UpdateInfo.cmake b/UpdateInfo.cmake index 1c31cf44f..a4de8fe1a 100644 --- a/UpdateInfo.cmake +++ b/UpdateInfo.cmake @@ -63,7 +63,7 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) string(REGEX REPLACE "-.*" "" GIT_NUMERIC_VERSION_BS ${GIT_DESCRIBE}) set(GIT_NUMERIC_VERSION_BS "${GIT_NUMERIC_VERSION_BS}.${GIT_COMMITS_SINCE_TAG}") endif() - + execute_process(COMMAND uname -mrs OUTPUT_VARIABLE BUILDINFO_OS OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND date -Ru OUTPUT_VARIABLE BUILDINFO_DATE OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND date +%s OUTPUT_VARIABLE BUILDINFO_EPOCH OUTPUT_STRIP_TRAILING_WHITESPACE) From 2029bfdf14b0e25e4c202cba5e7f8b52e4cb9de5 Mon Sep 17 00:00:00 2001 From: Benitoite Date: Mon, 17 Feb 2020 14:50:24 -0800 Subject: [PATCH 074/154] mac: revert the travis yml for this PR --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d1f1578f8..bab7397a6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -30,7 +30,7 @@ jobs: CMAKE_CXX_STANDARD: 11 PKG_CONFIG_PATH: /usr/local/opt/libffi/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig RAW_THERAPEE_MAJOR: '5' - RAW_THERAPEE_MINOR: '8' + RAW_THERAPEE_MINOR: '7' C_FLAGS: -Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/gdk-pixbuf/include -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/llvm/include run: | # GITHUB_REF is the ref that triggered the build, like refs/heads/new-feature - the next line parses that to REF: the branch name only (new-feature) From 9047e89bd3b461d4c4f3593dbba382ed7523ce2d Mon Sep 17 00:00:00 2001 From: Benitoite Date: Mon, 17 Feb 2020 14:55:01 -0800 Subject: [PATCH 075/154] options.cc: remove a whitespace --- rtgui/options.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index d85317c9d..71e77fa70 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2334,7 +2334,7 @@ void Options::load(bool lightweight) #endif if (path != nullptr) { cacheBaseDir = Glib::ustring(path); - + if (!Glib::path_is_absolute(cacheBaseDir)) { Glib::ustring msg = Glib::ustring::compose("Cache base dir %1 is not absolute", cacheBaseDir); throw Error(msg); From 6bc7e16d9b473302ba6236d1149f0072a52f1496 Mon Sep 17 00:00:00 2001 From: Benitoite Date: Mon, 17 Feb 2020 15:26:41 -0800 Subject: [PATCH 076/154] remove another whitespace --- rtgui/options.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index 71e77fa70..b0f8d714e 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2291,7 +2291,6 @@ void Options::load(bool lightweight) } } else { - #ifdef WIN32 WCHAR pathW[MAX_PATH] = {0}; From 007fe17e48d2dab6849968e012b04c8f20ef408c Mon Sep 17 00:00:00 2001 From: Benitoite Date: Mon, 17 Feb 2020 15:27:59 -0800 Subject: [PATCH 077/154] another whitespace removed --- rtgui/options.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index b0f8d714e..5e9d48cc5 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2340,7 +2340,6 @@ void Options::load(bool lightweight) } } - // No environment variable provided, so falling back to the multi user mode, if enabled else if (options.multiUser) { #ifdef WIN32 From 85bffa10381450bee541283616e3572665f12314 Mon Sep 17 00:00:00 2001 From: Benitoite Date: Mon, 17 Feb 2020 15:35:31 -0800 Subject: [PATCH 078/154] mac: use the LIB var to refer to frameworks dir. --- tools/osx/macosx_bundle.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index be76face3..aa6228500 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -254,7 +254,7 @@ ModifyInstallNames # fix @rpath in Frameworks msg "Registering @rpath in Frameworks folder:" -for frameworklibs in "${CONTENTS}"/Frameworks/* ; do +for frameworklibs in "${LIB}"/* ; do echo " install_name_tool -delete_rpath ${LOCAL_PREFIX}/local/lib '${frameworklibs}'" | bash -v echo " install_name_tool -add_rpath /Applications/RawTherapee.app/Contents/Frameworks '${frameworklibs}'" | bash -v done From 533db7aa17d50c331b1c00b533bf83ac41a64dff Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Wed, 19 Feb 2020 12:03:11 -0800 Subject: [PATCH 079/154] mac bundle: fix -cli codesigning --- tools/osx/macosx_bundle.sh | 53 +++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index be76face3..23c5df2b9 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -40,11 +40,11 @@ msg "Modifying install names: ${x}" { # id if [ ${x:(-6)} == ".dylib" ] || [ f${x:(-3)} == ".so" ]; then -echo " install_name_tool -id '@rpath/$(basename "${x}")' '${x}'" +install_name_tool -id @rpath/$(basename ${x}) ${x} fi GetDependencies "${x}" | while read -r y do -echo " install_name_tool -change '${y}' '@rpath/$(basename "${y}")' '${x}'" +install_name_tool -change ${y} @rpath/$(basename ${y}) ${x} done } | bash -v done @@ -107,6 +107,8 @@ __EOS__ minimum_macos_version=${MINIMUM_SYSTEM_VERSION} LOCAL_PREFIX="$(cmake .. -LA -N | grep "LOCAL_PREFIX" | cut -d "=" -f2)" EXPATLIB="$(cmake .. -LA -N | grep "pkgcfg_lib_EXPAT_expat" | cut -d "=" -f2)" +CODESIGNID="$(cmake .. -LA -N | grep "CODESIGNID" | cut -d "=" -f2)" +NOTARY="$(cmake .. -LA -N | grep "NOTARY" | cut -d "=" -f2)" APP="${PROJECT_NAME}.app" CONTENTS="${APP}/Contents" @@ -118,7 +120,7 @@ EXECUTABLE="${MACOS}/rawtherapee" GDK_PREFIX="${LOCAL_PREFIX}/local/" msg "Removing old files:" -rm -rf "${APP}" "${PROJECT_NAME}_*.dmg" "*zip" +rm -rf "${APP}" *.dmg *.zip msg "Creating bundle container:" install -d "${RESOURCES}" \ @@ -133,8 +135,10 @@ echo "Bundle date: $(date -Ru) ZULU" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutT echo "Bundle epoch: $(date +%s)" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt echo "Bundle UUID: $(uuidgen|tr 'A-Z' 'a-z')" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt -msg "Copying release files:" +msg "Copying binary executable files." ditto "${CMAKE_BUILD_TYPE}/MacOS" "${MACOS}" + +msg "Copying Resources directory." ditto "${CMAKE_BUILD_TYPE}/Resources" "${RESOURCES}" # Copy the Lensfun database into the app bundle @@ -147,7 +151,7 @@ ditto ${LOCAL_PREFIX}/local/lib/liblensfun.2.dylib "${CONTENTS}/Frameworks/lible # Copy libomp to Frameworks ditto ${LOCAL_PREFIX}/local/lib/libomp.dylib "${CONTENTS}/Frameworks" -msg "Copying dependencies from ${GTK_PREFIX}:" +msg "Copying dependencies from ${GTK_PREFIX}." CheckLink "${EXECUTABLE}" # dylib install names @@ -238,7 +242,7 @@ s|@shortVersion@|${PROJECT_VERSION}| s|@arch@|${arch}|" \ "${CONTENTS}/Info.plist" plutil -convert binary1 "${CONTENTS}/Info.plist" -update-mime-database -V "${CONTENTS}/Resources/share/mime" +update-mime-database -V "${RESOURCES}/share/mime" msg "Build glib database:" mkdir -p ${RESOURCES}/share/glib-2.0 @@ -246,37 +250,34 @@ ditto {"${LOCAL_PREFIX}/local","${RESOURCES}"}/share/glib-2.0/schemas "${LOCAL_PREFIX}/local/bin/glib-compile-schemas" "${RESOURCES}/share/glib-2.0/schemas" # Append an LC_RPATH -msg "Registering @rpath into the executable:" -echo " install_name_tool -add_rpath /Applications/RawTherapee.app/Contents/Frameworks '${EXECUTABLE}'" | bash -v -echo " install_name_tool -add_rpath /Applications/RawTherapee.app/Contents/Frameworks '${EXECUTABLE}-cli'" | bash -v +msg "Registering @rpath into the main executable." +install_name_tool -add_rpath ${LIB} ${EXECUTABLE} ModifyInstallNames # fix @rpath in Frameworks -msg "Registering @rpath in Frameworks folder:" -for frameworklibs in "${CONTENTS}"/Frameworks/* ; do -echo " install_name_tool -delete_rpath ${LOCAL_PREFIX}/local/lib '${frameworklibs}'" | bash -v -echo " install_name_tool -add_rpath /Applications/RawTherapee.app/Contents/Frameworks '${frameworklibs}'" | bash -v +msg "Registering @rpath in Frameworks folder." +for frameworklibs in "${LIB}"/*{dylib,so} ; do +install_name_tool -delete_rpath ${LOCAL_PREFIX}/local/lib ${frameworklibs} +install_name_tool -add_rpath "${LIB}" ${frameworklibs} done +install_name_tool -delete_rpath RawTherapee.app/Contents/Frameworks "${EXECUTABLE}"-cli +install_name_tool -add_rpath @executable_path "${EXECUTABLE}"-cli -# Sign the app -CODESIGNID="$(cmake .. -LA -N | grep "CODESIGNID" | cut -d "=" -f2)" +# Codesign the app if ! test -z "${CODESIGNID}" ; then -msg "Codesigning:" -install -m 0644 "${PROJECT_SOURCE_DATA_DIR}"/rt.entitlements "${CONTENTS}"/rt.entitlements -plutil -convert binary1 "${CONTENTS}"/rt.entitlements -codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --timestamp --entitlements "${CONTENTS}"/rt.entitlements "${CONTENTS}"/rt.entitlements -codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --timestamp --entitlements "${CONTENTS}"/rt.entitlements "${EXECUTABLE}" -codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --timestamp --entitlements "${CONTENTS}"/rt.entitlements "${EXECUTABLE}"-cli +msg "Codesigning Application." +install -m 0644 "${PROJECT_SOURCE_DATA_DIR}"/rt.entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements +plutil -convert binary1 "${CMAKE_BUILD_TYPE}"/rt.entitlements +mv "${EXECUTABLE}"-cli "${LIB}" for frameworklibs in "${LIB}"/* ; do -codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --timestamp "${frameworklibs}" +codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee --force --verbose -o runtime --timestamp "${frameworklibs}" done -codesign --deep --preserve-metadata=identifier,entitlements,runtime --timestamp --strict -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements "${CONTENTS}/rt.entitlements" "${APP}" +codesign --timestamp --strict -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements "${APP}" spctl -a -vvvv ${APP} fi # Notarize the app -NOTARY="$(cmake .. -LA -N | grep "NOTARY" | cut -d "=" -f2)" if ! test -z "$NOTARY" ; then msg "Notarizing the application:" ditto -c -k --sequesterRsrc --keepParent "${APP}" "${APP}.zip" @@ -308,7 +309,6 @@ local srcDir="$(mktemp -dt $$)" msg "Preparing disk image sources at ${srcDir}:" cp -R "${APP}" "${srcDir}" -ditto "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt "${srcDir}" ln -s /Applications "${srcDir}" # Web bookmarks @@ -331,7 +331,7 @@ hdiutil create -format UDBZ -fs HFS+ -srcdir "${srcDir}" -volname "${PROJECT_NAM # Sign disk image if ! test -z "$CODESIGNID" ; then -codesign --deep --force -v -s ""${CODESIGNID}"" --timestamp "${dmg_name}.dmg" +codesign --deep --force -v -s "${CODESIGNID}" --timestamp "${dmg_name}.dmg" fi # Notarize the dmg @@ -363,7 +363,6 @@ fi # Zip disk image for redistribution msg "Zipping disk image for redistribution:" -zip "${dmg_name}.zip" "${dmg_name}.dmg" "${CMAKE_BUILD_TYPE}/Resources/AboutThisBuild.txt" rm "${dmg_name}.dmg" msg "Removing disk image caches:" rm -rf "${srcDir}" From 3bbdd89c8f6edb32b06f330ad7fb8c1f15abab55 Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Wed, 19 Feb 2020 14:40:42 -0800 Subject: [PATCH 080/154] mac: fix -cli and add a linker flag --- CMakeLists.txt | 7 +++++-- cmake/modules/FindMacIntegration.cmake | 2 +- tools/osx/macosx_bundle.sh | 12 ++++++++---- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8503fe573..05efc3a3b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -113,14 +113,14 @@ endif() if(APPLE) if(CMAKE_CXX_COMPILER MATCHES "g\\+\\+-mp-4.[5-8]" OR CMAKE_CXX_COMPILER_ARG1 MATCHES "g\\+\\+-mp-4.[5-8]") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /usr/lib/libstdc++.6.dylib") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /usr/lib/libstdc++.6.dylib -Wl,-headerpad_max_install_names -mtune=generic") message(STATUS "CMAKE_CXX_COMPILER is MacPorts GCC.\n CMAKE_EXE_LINKER_FLAGS: ${CMAKE_EXE_LINKER_FLAGS}") endif() # Set minimum system version set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -headerpad_max_install_names") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-headerpad_max_install_names -mtune=generic") endif() option(USE_EXPERIMENTAL_LANG_VERSIONS "Build with -std=c++0x" OFF) @@ -270,6 +270,9 @@ if(APPLE) elseif(NOT DEFINED LOCAL_PREFIX) set(LOCAL_PREFIX "/usr") endif() + if("${FANCY_DMG}") + set(FANCY_DMG ON CACHE BOOL "Use the andreyvit/create-dmg script to make a fancy .dmg") + endif() endif() # Enforce absolute paths for non-bundle builds: diff --git a/cmake/modules/FindMacIntegration.cmake b/cmake/modules/FindMacIntegration.cmake index a67c31baa..a6729ad7f 100644 --- a/cmake/modules/FindMacIntegration.cmake +++ b/cmake/modules/FindMacIntegration.cmake @@ -24,7 +24,7 @@ mark_as_advanced(MACINTEGRATION_LIBRARY) # handle the QUIETLY and REQUIRED arguments and set MACINTEGRATION_FOUND to TRUE if # all listed variables are TRUE include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(MACINTEGRATION DEFAULT_MSG MACINTEGRATION_LIBRARY MACINTEGRATION_INCLUDE_DIR) +find_package_handle_standard_args(MacIntegration DEFAULT_MSG MACINTEGRATION_LIBRARY MACINTEGRATION_INCLUDE_DIR) if(MACINTEGRATION_FOUND) set(MacIntegration_LIBRARIES ${MACINTEGRATION_LIBRARY}) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 23c5df2b9..6beefd83f 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -40,11 +40,11 @@ msg "Modifying install names: ${x}" { # id if [ ${x:(-6)} == ".dylib" ] || [ f${x:(-3)} == ".so" ]; then -install_name_tool -id @rpath/$(basename ${x}) ${x} +install_name_tool -id /Applications/"${LIB}"/$(basename ${x}) ${x} fi GetDependencies "${x}" | while read -r y do -install_name_tool -change ${y} @rpath/$(basename ${y}) ${x} +install_name_tool -change ${y} /Applications/"${LIB}"/$(basename ${y}) ${x} done } | bash -v done @@ -109,6 +109,8 @@ LOCAL_PREFIX="$(cmake .. -LA -N | grep "LOCAL_PREFIX" | cut -d "=" -f2)" EXPATLIB="$(cmake .. -LA -N | grep "pkgcfg_lib_EXPAT_expat" | cut -d "=" -f2)" CODESIGNID="$(cmake .. -LA -N | grep "CODESIGNID" | cut -d "=" -f2)" NOTARY="$(cmake .. -LA -N | grep "NOTARY" | cut -d "=" -f2)" +FANCY_DMG="$(cmake .. -LA -N | grep "FANCY_DMG" | cut -d "=" -f2)" +echo ${FANCY_DMG} || echo "Building plain .dmg" APP="${PROJECT_NAME}.app" CONTENTS="${APP}/Contents" @@ -251,7 +253,7 @@ ditto {"${LOCAL_PREFIX}/local","${RESOURCES}"}/share/glib-2.0/schemas # Append an LC_RPATH msg "Registering @rpath into the main executable." -install_name_tool -add_rpath ${LIB} ${EXECUTABLE} +install_name_tool -add_rpath /Applications/"${LIB}" ${EXECUTABLE} ModifyInstallNames @@ -259,7 +261,7 @@ ModifyInstallNames msg "Registering @rpath in Frameworks folder." for frameworklibs in "${LIB}"/*{dylib,so} ; do install_name_tool -delete_rpath ${LOCAL_PREFIX}/local/lib ${frameworklibs} -install_name_tool -add_rpath "${LIB}" ${frameworklibs} +install_name_tool -add_rpath /Applications/"${LIB}" ${frameworklibs} done install_name_tool -delete_rpath RawTherapee.app/Contents/Frameworks "${EXECUTABLE}"-cli install_name_tool -add_rpath @executable_path "${EXECUTABLE}"-cli @@ -370,3 +372,5 @@ rm -rf "${srcDir}" CreateDmg msg "Finishing build:" echo "Script complete." +# +# TODO filter out the benign errors From a78c4b99df54ff9a12b31e9b3f6796ebee665806 Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Wed, 19 Feb 2020 15:51:50 -0800 Subject: [PATCH 081/154] mac:send an absolute path to config.h.in via CMakeLists.txt --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 05efc3a3b..1947d2c1b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -168,7 +168,7 @@ endif() if(NOT DEFINED DATADIR) if(BUILD_BUNDLE) if(APPLE) - set(DATADIR "../Resources") + set(DATADIR "/Applications/RawTherapee.app/Contents/Resources") else() set(DATADIR .) endif() @@ -180,7 +180,7 @@ endif() if(NOT DEFINED LIBDIR) if(BUILD_BUNDLE) if(APPLE) - set(LIBDIR "../Frameworks") + set(LIBDIR "/Applications/RawTherapee.app/Contents/Frameworks") else() set(LIBDIR .) endif() From 9bc078c5bb88addb87ee40bb93478ac0bd29c582 Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Thu, 20 Feb 2020 01:17:49 -0800 Subject: [PATCH 082/154] mac:export non-relative paths to config.h --- CMakeLists.txt | 4 ++-- rtengine/CMakeLists.txt | 4 ++++ rtgui/config.h.in | 9 +++++++++ tools/osx/macosx_bundle.sh | 24 +++++++++++------------- 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1947d2c1b..5cef1fc97 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -168,7 +168,7 @@ endif() if(NOT DEFINED DATADIR) if(BUILD_BUNDLE) if(APPLE) - set(DATADIR "/Applications/RawTherapee.app/Contents/Resources") + set(DATADIR "../Resources/share") else() set(DATADIR .) endif() @@ -180,7 +180,7 @@ endif() if(NOT DEFINED LIBDIR) if(BUILD_BUNDLE) if(APPLE) - set(LIBDIR "/Applications/RawTherapee.app/Contents/Frameworks") + set(LIBDIR "../Frameworks") else() set(LIBDIR .) endif() diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index 5f59da371..3ac8a8071 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -195,4 +195,8 @@ target_link_libraries(rtengine rtexif ${KLT_LIBRARIES} ) +if(APPLE) +install(FILES ${CAMCONSTSFILE} DESTINATION "${CMAKE_INSTALL_PREFIX}/RawTherapee.app/Contents/Resources" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ) +else() install(FILES ${CAMCONSTSFILE} DESTINATION "${DATADIR}" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ) +endif() diff --git a/rtgui/config.h.in b/rtgui/config.h.in index 95217b689..570f263b8 100644 --- a/rtgui/config.h.in +++ b/rtgui/config.h.in @@ -22,10 +22,19 @@ #cmakedefine BUILD_BUNDLE #cmakedefine HAVE_UNALIGNED_MALLOC + +#ifdef __APPLE__ +#define DATA_SEARCH_PATH "/Applications/RawTherapee.com/Contents/Resources/share" +#define DOC_SEARCH_PATH "/Applications/RawTherapee.com/Contents/Resources" +#define CREDITS_SEARCH_PATH "/Applications/RawTherapee.com/Contents/Resources" +#define LICENCE_SEARCH_PATH "/Applications/RawTherapee.com/Contents/Resources" +#define LENSFUN_DB_PATH "${LENSFUNDBDIR}" +#else #define DATA_SEARCH_PATH "${DATADIR}" #define DOC_SEARCH_PATH "${DOCDIR}" #define CREDITS_SEARCH_PATH "${CREDITSDIR}" #define LICENCE_SEARCH_PATH "${LICENCEDIR}" #define LENSFUN_DB_PATH "${LENSFUNDBDIR}" +#endif #endif diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 6beefd83f..44908cb4d 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -110,7 +110,7 @@ EXPATLIB="$(cmake .. -LA -N | grep "pkgcfg_lib_EXPAT_expat" | cut -d "=" -f2)" CODESIGNID="$(cmake .. -LA -N | grep "CODESIGNID" | cut -d "=" -f2)" NOTARY="$(cmake .. -LA -N | grep "NOTARY" | cut -d "=" -f2)" FANCY_DMG="$(cmake .. -LA -N | grep "FANCY_DMG" | cut -d "=" -f2)" -echo ${FANCY_DMG} || echo "Building plain .dmg" +echo ${FANCY_DMG} APP="${PROJECT_NAME}.app" CONTENTS="${APP}/Contents" @@ -125,17 +125,14 @@ msg "Removing old files:" rm -rf "${APP}" *.dmg *.zip msg "Creating bundle container:" -install -d "${RESOURCES}" \ -"${MACOS}" \ -"${LIB}" \ -"${ETC}" +install -d "${APP}" "${RESOURCES}" "${MACOS}" "${LIB}" "${ETC}" -echo "\n--------\n" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt -echo "Bundle system: $(sysctl -n machdep.cpu.brand_string)" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt -echo "Bundle OS: $(sw_vers -productName) $(sw_vers -productVersion) $(sw_vers -buildVersion) $(uname -mrs)" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt -echo "Bundle date: $(date -Ru) ZULU" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt -echo "Bundle epoch: $(date +%s)" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt -echo "Bundle UUID: $(uuidgen|tr 'A-Z' 'a-z')" >> "${CMAKE_BUILD_TYPE}"/Resources/AboutThisBuild.txt +echo "\n--------\n" >> "${CMAKE_BUILD_TYPE}/Resources/AboutThisBuild.txt" +echo "Bundle system: $(sysctl -n machdep.cpu.brand_string)" >> "${CMAKE_BUILD_TYPE}/Resources/AboutThisBuild.txt" +echo "Bundle OS: $(sw_vers -productName) $(sw_vers -productVersion) $(sw_vers -buildVersion) $(uname -mrs)" >> "${CMAKE_BUILD_TYPE}/${RESOURCES}/AboutThisBuild.txt" +echo "Bundle date: $(date -Ru) ZULU" >> "${CMAKE_BUILD_TYPE}/Resources/AboutThisBuild.txt" +echo "Bundle epoch: $(date +%s)" >> "${CMAKE_BUILD_TYPE}/Resources/AboutThisBuild.txt" +echo "Bundle UUID: $(uuidgen|tr 'A-Z' 'a-z')" >> "${CMAKE_BUILD_TYPE}/Resources/AboutThisBuild.txt" msg "Copying binary executable files." ditto "${CMAKE_BUILD_TYPE}/MacOS" "${MACOS}" @@ -318,8 +315,8 @@ function CreateWebloc { defaults write "${srcDir}/$1" URL "$2" mv "${srcDir}/$1".{plist,webloc} } -CreateWebloc 'Website' 'http://www.rawtherapee.com/' -CreateWebloc 'Manual' 'http://rawpedia.rawtherapee.com/' +CreateWebloc 'Website' 'https://www.rawtherapee.com/' +CreateWebloc 'Manual' 'https://rawpedia.rawtherapee.com/' # Disk image name dmg_name="${PROJECT_NAME// /_}_OSX_${MINIMUM_SYSTEM_VERSION}_${PROC_BIT_DEPTH}_${PROJECT_FULL_VERSION}" @@ -374,3 +371,4 @@ msg "Finishing build:" echo "Script complete." # # TODO filter out the benign errors +# Build a fancy dmg From d21f051f437e6437bd784a3eb0e4f4b9edcc9e08 Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Thu, 20 Feb 2020 01:56:00 -0800 Subject: [PATCH 083/154] mac:sync build directories locations --- CMakeLists.txt | 36 ++++++++++++++++++++++++++++++------ tools/osx/macosx_bundle.sh | 20 ++++++++++++-------- 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5cef1fc97..a9f96a4d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -200,7 +200,11 @@ endif() if(NOT DEFINED DOCDIR) if(BUILD_BUNDLE) - set(DOCDIR "${DATADIR}/share/doc") + if(APPLE) + set(DOCDIR "${DATADIR}/doc") + else() + set(DOCDIR "${DATADIR}/share/doc") + endif() else() set(DOCDIR "${CMAKE_INSTALL_PREFIX}/share/doc/rawtherapee") endif() @@ -208,7 +212,11 @@ endif() if(NOT DEFINED CREDITSDIR) if(BUILD_BUNDLE) - set(CREDITSDIR "${DATADIR}") + if(APPLE) + set(CREDITSDIR "${DATADIR}") + else() + set(CREDITSDIR "${DATADIR}") + endif() else() set(CREDITSDIR "${CMAKE_INSTALL_PREFIX}/share/doc/rawtherapee") endif() @@ -216,7 +224,11 @@ endif() if(NOT DEFINED LICENCEDIR) if(BUILD_BUNDLE) - set(LICENCEDIR "${DATADIR}") + if(APPLE) + set(LICENCEDIR "${CREDITSDIR}") + else() + set(LICENCEDIR "${DATADIR}") + endif() else() set(LICENCEDIR "${CMAKE_INSTALL_PREFIX}/share/doc/rawtherapee") endif() @@ -225,7 +237,11 @@ endif() if(NOT DEFINED DESKTOPDIR) if(UNIX) if(BUILD_BUNDLE) - set(DESKTOPDIR "${DATADIR}/share/applications") + if(APPLE) + set(DESKTOPDIR "${DATADIR}/applications") + else() + set(DESKTOPDIR "${DATADIR}/share/applications") + endif() else() set(DESKTOPDIR "${CMAKE_INSTALL_PREFIX}/share/applications") endif() @@ -235,7 +251,11 @@ endif() if(NOT DEFINED ICONSDIR) if(UNIX) if(BUILD_BUNDLE) - set(ICONSDIR "${DATADIR}/share/icons") + if(APPLE) + set(ICONSDIR "${DATADIR}/icons") + else() + set(ICONSDIR "${DATADIR}/share/icons") + endif() else() set(ICONSDIR "${CMAKE_INSTALL_PREFIX}/share/icons") endif() @@ -245,7 +265,11 @@ endif() if(NOT DEFINED APPDATADIR) if(UNIX) if(BUILD_BUNDLE) - set(APPDATADIR "${DATADIR}/share/metainfo") + if(APPLE) + set(APPDATADIR "${DATADIR}/share/metainfo") + else() + set(APPDATADIR "${DATADIR}/share/metainfo") + endif() else() set(APPDATADIR "${CMAKE_INSTALL_PREFIX}/share/metainfo") endif() diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 44908cb4d..1d184899f 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -12,7 +12,7 @@ fNormal="$(tput sgr0)" fBold="$(tput bold)" # Colors depend upon the user's terminal emulator color scheme - what is readable for you may be not readable for someone else. -fMagenta="$(tput setaf 5)" +fMagenta="$(tput setaf 3)" fRed="$(tput setaf 1)" function msg { @@ -125,11 +125,16 @@ msg "Removing old files:" rm -rf "${APP}" *.dmg *.zip msg "Creating bundle container:" -install -d "${APP}" "${RESOURCES}" "${MACOS}" "${LIB}" "${ETC}" +cd "${CMAKE_INSTALL_PREEFIX}" +install -d "${APP}" +install -d "${RESOURCES}" +install -d "${MACOS}" +install -d "${LIB}" +install -d "${ETC}" echo "\n--------\n" >> "${CMAKE_BUILD_TYPE}/Resources/AboutThisBuild.txt" echo "Bundle system: $(sysctl -n machdep.cpu.brand_string)" >> "${CMAKE_BUILD_TYPE}/Resources/AboutThisBuild.txt" -echo "Bundle OS: $(sw_vers -productName) $(sw_vers -productVersion) $(sw_vers -buildVersion) $(uname -mrs)" >> "${CMAKE_BUILD_TYPE}/${RESOURCES}/AboutThisBuild.txt" +echo "Bundle OS: $(sw_vers -productName) $(sw_vers -productVersion) $(sw_vers -buildVersion) $(uname -mrs)" >> "${CMAKE_BUILD_TYPE}/Resources/AboutThisBuild.txt" echo "Bundle date: $(date -Ru) ZULU" >> "${CMAKE_BUILD_TYPE}/Resources/AboutThisBuild.txt" echo "Bundle epoch: $(date +%s)" >> "${CMAKE_BUILD_TYPE}/Resources/AboutThisBuild.txt" echo "Bundle UUID: $(uuidgen|tr 'A-Z' 'a-z')" >> "${CMAKE_BUILD_TYPE}/Resources/AboutThisBuild.txt" @@ -250,15 +255,15 @@ ditto {"${LOCAL_PREFIX}/local","${RESOURCES}"}/share/glib-2.0/schemas # Append an LC_RPATH msg "Registering @rpath into the main executable." -install_name_tool -add_rpath /Applications/"${LIB}" ${EXECUTABLE} +install_name_tool -add_rpath /Applications/"${LIB}" "${EXECUTABLE}" ModifyInstallNames # fix @rpath in Frameworks msg "Registering @rpath in Frameworks folder." for frameworklibs in "${LIB}"/*{dylib,so} ; do -install_name_tool -delete_rpath ${LOCAL_PREFIX}/local/lib ${frameworklibs} -install_name_tool -add_rpath /Applications/"${LIB}" ${frameworklibs} +install_name_tool -delete_rpath ${LOCAL_PREFIX}/local/lib "${frameworklibs}" +install_name_tool -add_rpath /Applications/"${LIB}" "${frameworklibs}" done install_name_tool -delete_rpath RawTherapee.app/Contents/Frameworks "${EXECUTABLE}"-cli install_name_tool -add_rpath @executable_path "${EXECUTABLE}"-cli @@ -370,5 +375,4 @@ CreateDmg msg "Finishing build:" echo "Script complete." # -# TODO filter out the benign errors -# Build a fancy dmg +# TODO filter out the benign errors; Build a fancy dmg From 4e4faafb08cea176173e86f1403d16968e36c9af Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Thu, 20 Feb 2020 03:14:46 -0800 Subject: [PATCH 084/154] mac:fix destination of comconst.json --- CMakeLists.txt | 10 +++++++--- rtengine/CMakeLists.txt | 4 ++-- tools/osx/macosx_bundle.sh | 6 ++---- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a9f96a4d6..403314b07 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -150,7 +150,7 @@ endif() if(NOT DEFINED BUNDLE_BASE_INSTALL_DIR) if(APPLE) - set(BUNDLE_BASE_INSTALL_DIR "${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/MacOS") + set(BUNDLE_BASE_INSTALL_DIR "${CMAKE_BUILD_TYPE}") else() set(BUNDLE_BASE_INSTALL_DIR "${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}") endif() @@ -266,7 +266,7 @@ if(NOT DEFINED APPDATADIR) if(UNIX) if(BUILD_BUNDLE) if(APPLE) - set(APPDATADIR "${DATADIR}/share/metainfo") + set(APPDATADIR "${DATADIR}/metainfo") else() set(APPDATADIR "${DATADIR}/share/metainfo") endif() @@ -561,7 +561,11 @@ install(FILES RELEASE_NOTES.txt DESTINATION "${CREDITSDIR}" OPTIONAL) # The standard location for man pages in Linux is /usr/share/man # Use "manpath" to see the search paths for man pages on your system. if(BUILD_BUNDLE) - install(FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1" DESTINATION "${DATADIR}/share/man/man1") + if(APPLE) + install(FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1" DESTINATION "${DATADIR}/man/man1") + else() + install(FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1" DESTINATION "${DATADIR}/share/man/man1") + endif() else() install(FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1" DESTINATION "${CMAKE_INSTALL_PREFIX}/share/man/man1") endif() diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index 3ac8a8071..8d13f0d6e 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -196,7 +196,7 @@ target_link_libraries(rtengine rtexif ) if(APPLE) -install(FILES ${CAMCONSTSFILE} DESTINATION "${CMAKE_INSTALL_PREFIX}/RawTherapee.app/Contents/Resources" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ) + install(FILES ${CAMCONSTSFILE} DESTINATION "${DATADIR}" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ) else() -install(FILES ${CAMCONSTSFILE} DESTINATION "${DATADIR}" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ) + install(FILES ${CAMCONSTSFILE} DESTINATION "${DATADIR}" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ) endif() diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 1d184899f..884979aba 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -12,7 +12,7 @@ fNormal="$(tput sgr0)" fBold="$(tput bold)" # Colors depend upon the user's terminal emulator color scheme - what is readable for you may be not readable for someone else. -fMagenta="$(tput setaf 3)" +fMagenta="$(tput setaf 5)" fRed="$(tput setaf 1)" function msg { @@ -125,8 +125,6 @@ msg "Removing old files:" rm -rf "${APP}" *.dmg *.zip msg "Creating bundle container:" -cd "${CMAKE_INSTALL_PREEFIX}" -install -d "${APP}" install -d "${RESOURCES}" install -d "${MACOS}" install -d "${LIB}" @@ -278,7 +276,7 @@ for frameworklibs in "${LIB}"/* ; do codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee --force --verbose -o runtime --timestamp "${frameworklibs}" done codesign --timestamp --strict -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements "${APP}" -spctl -a -vvvv ${APP} +spctl -a -vvvv "${APP}" fi # Notarize the app From 4dbbc405391770d43c8fa7caf9ce25b7d1bbede0 Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Thu, 20 Feb 2020 11:43:11 -0800 Subject: [PATCH 085/154] mac:config.h.in use macos extention --- CMakeLists.txt | 15 ++++++++++----- UpdateInfo.cmake | 6 +++++- rtgui/config.h.in | 8 ++++---- tools/osx/macosx_bundle.sh | 15 ++++++++------- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 403314b07..00604052e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -150,15 +150,20 @@ endif() if(NOT DEFINED BUNDLE_BASE_INSTALL_DIR) if(APPLE) - set(BUNDLE_BASE_INSTALL_DIR "${CMAKE_BUILD_TYPE}") + set(BUNDLE_BASE_INSTALL_DIR "${CMAKE_BUILD_TYPE}/MacOS") else() set(BUNDLE_BASE_INSTALL_DIR "${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}") endif() endif() if(BUILD_BUNDLE) - set(BINDIR .) - set(CMAKE_INSTALL_PREFIX "${BUNDLE_BASE_INSTALL_DIR}") + if(APPLE) + set(BINDIR "${BUNDLE_BASE_INSTALL_DIR}") + set(CMAKE_INSTALL_PREFIX ".") + else() + set(BINDIR .) + set(CMAKE_INSTALL_PREFIX "${BUNDLE_BASE_INSTALL_DIR}") + endif() endif() if(NOT DEFINED BINDIR) @@ -168,7 +173,7 @@ endif() if(NOT DEFINED DATADIR) if(BUILD_BUNDLE) if(APPLE) - set(DATADIR "../Resources/share") + set(DATADIR "${CMAKE_BUILD_TYPE}/Resources/share") else() set(DATADIR .) endif() @@ -180,7 +185,7 @@ endif() if(NOT DEFINED LIBDIR) if(BUILD_BUNDLE) if(APPLE) - set(LIBDIR "../Frameworks") + set(LIBDIR "${CMAKE_BUILD_TYPE}/Frameworks") else() set(LIBDIR .) endif() diff --git a/UpdateInfo.cmake b/UpdateInfo.cmake index d1f532506..ce194bfe9 100644 --- a/UpdateInfo.cmake +++ b/UpdateInfo.cmake @@ -107,4 +107,8 @@ endif(WIN32) # build version.h from template configure_file("${PROJECT_SOURCE_DIR}/rtgui/version.h.in" "${CMAKE_BINARY_DIR}/rtgui/version.h") # build AboutThisBuild.txt from template -configure_file("${PROJECT_SOURCE_DIR}/AboutThisBuild.txt.in" "${CMAKE_BINARY_DIR}/AboutThisBuild.txt") +if(APPLE) + configure_file("${PROJECT_SOURCE_DIR}/AboutThisBuild.txt.in" "${CMAKE_BINARY_DIR}/AboutThisBuild.txt") +else() + configure_file("${PROJECT_SOURCE_DIR}/AboutThisBuild.txt.in" "${CMAKE_BINARY_DIR}/AboutThisBuild.txt") +endif() diff --git a/rtgui/config.h.in b/rtgui/config.h.in index 570f263b8..558c25f76 100644 --- a/rtgui/config.h.in +++ b/rtgui/config.h.in @@ -24,10 +24,10 @@ #cmakedefine HAVE_UNALIGNED_MALLOC #ifdef __APPLE__ -#define DATA_SEARCH_PATH "/Applications/RawTherapee.com/Contents/Resources/share" -#define DOC_SEARCH_PATH "/Applications/RawTherapee.com/Contents/Resources" -#define CREDITS_SEARCH_PATH "/Applications/RawTherapee.com/Contents/Resources" -#define LICENCE_SEARCH_PATH "/Applications/RawTherapee.com/Contents/Resources" +#define DATA_SEARCH_PATH "/Applications/RawTherapee.app/Contents/Resources/share" +#define DOC_SEARCH_PATH "/Applications/RawTherapee.app/Contents/Resources" +#define CREDITS_SEARCH_PATH "/Applications/RawTherapee.app/Contents/Resources" +#define LICENCE_SEARCH_PATH "/Applications/RawTherapee.app/Contents/Resources" #define LENSFUN_DB_PATH "${LENSFUNDBDIR}" #else #define DATA_SEARCH_PATH "${DATADIR}" diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 884979aba..da44ed51e 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -130,19 +130,20 @@ install -d "${MACOS}" install -d "${LIB}" install -d "${ETC}" -echo "\n--------\n" >> "${CMAKE_BUILD_TYPE}/Resources/AboutThisBuild.txt" -echo "Bundle system: $(sysctl -n machdep.cpu.brand_string)" >> "${CMAKE_BUILD_TYPE}/Resources/AboutThisBuild.txt" -echo "Bundle OS: $(sw_vers -productName) $(sw_vers -productVersion) $(sw_vers -buildVersion) $(uname -mrs)" >> "${CMAKE_BUILD_TYPE}/Resources/AboutThisBuild.txt" -echo "Bundle date: $(date -Ru) ZULU" >> "${CMAKE_BUILD_TYPE}/Resources/AboutThisBuild.txt" -echo "Bundle epoch: $(date +%s)" >> "${CMAKE_BUILD_TYPE}/Resources/AboutThisBuild.txt" -echo "Bundle UUID: $(uuidgen|tr 'A-Z' 'a-z')" >> "${CMAKE_BUILD_TYPE}/Resources/AboutThisBuild.txt" - msg "Copying binary executable files." ditto "${CMAKE_BUILD_TYPE}/MacOS" "${MACOS}" msg "Copying Resources directory." +mv "${CMAKE_BUILD_TYPE}/Resources/share/AboutThisBuild.txt" ditto "${CMAKE_BUILD_TYPE}/Resources" "${RESOURCES}" +echo "\n--------\n" >> "${RESOURCES}/AboutThisBuild.txt" +echo "Bundle system: $(sysctl -n machdep.cpu.brand_string)" >> "${RESOURCES}/AboutThisBuild.txt" +echo "Bundle OS: $(sw_vers -productName) $(sw_vers -productVersion) $(sw_vers -buildVersion) $(uname -mrs)" >> "${RESOURCES}/AboutThisBuild.txt" +echo "Bundle date: $(date -Ru) ZULU" >> "${RESOURCES}/AboutThisBuild.txt" +echo "Bundle epoch: $(date +%s)" >> "${RESOURCES}/AboutThisBuild.txt" +echo "Bundle UUID: $(uuidgen|tr 'A-Z' 'a-z')" >> "${RESOURCES}/AboutThisBuild.txt" + # Copy the Lensfun database into the app bundle mkdir -p "${RESOURCES}/share/lensfun" ditto ${LOCAL_PREFIX}/local/share/lensfun/version_2/* "${RESOURCES}/share/lensfun" From e53113ca6d28f77a498cf68d9bb6451f2f44343e Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Thu, 20 Feb 2020 12:01:11 -0800 Subject: [PATCH 086/154] mac:add a destination --- tools/osx/macosx_bundle.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index da44ed51e..6ceff6592 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -134,7 +134,7 @@ msg "Copying binary executable files." ditto "${CMAKE_BUILD_TYPE}/MacOS" "${MACOS}" msg "Copying Resources directory." -mv "${CMAKE_BUILD_TYPE}/Resources/share/AboutThisBuild.txt" +mv "${CMAKE_BUILD_TYPE}/Resources/share/AboutThisBuild.txt" "${RESOURCES}" ditto "${CMAKE_BUILD_TYPE}/Resources" "${RESOURCES}" echo "\n--------\n" >> "${RESOURCES}/AboutThisBuild.txt" From e81d09aa567ddc065805e737141de9a576ecb461 Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Sat, 22 Feb 2020 15:37:25 -0800 Subject: [PATCH 087/154] mac:build a fancy .dmg --- tools/osx/macosx_bundle.sh | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 6ceff6592..e68d2659c 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -110,7 +110,9 @@ EXPATLIB="$(cmake .. -LA -N | grep "pkgcfg_lib_EXPAT_expat" | cut -d "=" -f2)" CODESIGNID="$(cmake .. -LA -N | grep "CODESIGNID" | cut -d "=" -f2)" NOTARY="$(cmake .. -LA -N | grep "NOTARY" | cut -d "=" -f2)" FANCY_DMG="$(cmake .. -LA -N | grep "FANCY_DMG" | cut -d "=" -f2)" -echo ${FANCY_DMG} +if [[ -n ${FANCY_DMG} ]] ; then +echo "Fancy .dmg build is ON." +fi APP="${PROJECT_NAME}.app" CONTENTS="${APP}/Contents" @@ -134,13 +136,13 @@ msg "Copying binary executable files." ditto "${CMAKE_BUILD_TYPE}/MacOS" "${MACOS}" msg "Copying Resources directory." -mv "${CMAKE_BUILD_TYPE}/Resources/share/AboutThisBuild.txt" "${RESOURCES}" +mv AboutThisBuild.txt "${RESOURCES}" ditto "${CMAKE_BUILD_TYPE}/Resources" "${RESOURCES}" echo "\n--------\n" >> "${RESOURCES}/AboutThisBuild.txt" echo "Bundle system: $(sysctl -n machdep.cpu.brand_string)" >> "${RESOURCES}/AboutThisBuild.txt" echo "Bundle OS: $(sw_vers -productName) $(sw_vers -productVersion) $(sw_vers -buildVersion) $(uname -mrs)" >> "${RESOURCES}/AboutThisBuild.txt" -echo "Bundle date: $(date -Ru) ZULU" >> "${RESOURCES}/AboutThisBuild.txt" +echo "Bundle date: $(date -Ru) UTC" >> "${RESOURCES}/AboutThisBuild.txt" echo "Bundle epoch: $(date +%s)" >> "${RESOURCES}/AboutThisBuild.txt" echo "Bundle UUID: $(uuidgen|tr 'A-Z' 'a-z')" >> "${RESOURCES}/AboutThisBuild.txt" @@ -268,7 +270,7 @@ install_name_tool -delete_rpath RawTherapee.app/Contents/Frameworks "${EXECUTABL install_name_tool -add_rpath @executable_path "${EXECUTABLE}"-cli # Codesign the app -if ! test -z "${CODESIGNID}" ; then +if [ -n "${CODESIGNID}" ] ; then msg "Codesigning Application." install -m 0644 "${PROJECT_SOURCE_DATA_DIR}"/rt.entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements plutil -convert binary1 "${CMAKE_BUILD_TYPE}"/rt.entitlements @@ -281,7 +283,7 @@ spctl -a -vvvv "${APP}" fi # Notarize the app -if ! test -z "$NOTARY" ; then +if [ -n "$NOTARY" ] ; then msg "Notarizing the application:" ditto -c -k --sequesterRsrc --keepParent "${APP}" "${APP}.zip" uuid=`xcrun altool --notarize-app --primary-bundle-id "com.rawtherapee.RawTherapee" ${NOTARY} --file "${APP}.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` @@ -312,6 +314,7 @@ local srcDir="$(mktemp -dt $$)" msg "Preparing disk image sources at ${srcDir}:" cp -R "${APP}" "${srcDir}" +cp "${RESOURCES}"/share/LICENSE.txt "${srcDir}" ln -s /Applications "${srcDir}" # Web bookmarks @@ -319,8 +322,10 @@ function CreateWebloc { defaults write "${srcDir}/$1" URL "$2" mv "${srcDir}/$1".{plist,webloc} } -CreateWebloc 'Website' 'https://www.rawtherapee.com/' -CreateWebloc 'Manual' 'https://rawpedia.rawtherapee.com/' +CreateWebloc 'Website' 'https://www.rawtherapee.com/' +CreateWebloc 'Documentation' 'https://rawpedia.rawtherapee.com/' +CreateWebloc 'Forum' 'https://discuss.pixls.us/c/software/rawtherapee' +CreateWebloc 'Report Bug' 'https://github.com/Beep6581/RawTherapee/issues/new' # Disk image name dmg_name="${PROJECT_NAME// /_}_OSX_${MINIMUM_SYSTEM_VERSION}_${PROC_BIT_DEPTH}_${PROJECT_FULL_VERSION}" @@ -330,10 +335,25 @@ dmg_name="${dmg_name}_${lower_build_type}" fi msg "Creating disk image:" +if [ ! -z ${FANCY_DMG} ] ; then +echo "Building Fancy .dmg" +cp -R "${PROJECT_SOURCE_DATA_DIR}/rtdmg.icns" "${srcDir}/.VolumeIcon.icns" +cp -R "${PROJECT_SOURCE_DATA_DIR}/rtdmg-bkgd.png" "${srcDir}/.background/background.png" +SetFile -c incC "${srcDir}/.VolumeIcon.icns" +create-dmg ${dmg_name}.dmg "${srcDir}" \ +--volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" \ +--volicon "${srcDir}/.VolumeIcon.icns" \ +--sandbox-safe \ +--no-internet-enable \ +--eula LICENSE.txt \ +--hdiutil-verbose \ +--rez /Library/Developer/CommandLineTools/usr/bin/Rez +else hdiutil create -format UDBZ -fs HFS+ -srcdir "${srcDir}" -volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" "${dmg_name}.dmg" +fi # Sign disk image -if ! test -z "$CODESIGNID" ; then +if [ -n "$CODESIGNID" ] ; then codesign --deep --force -v -s "${CODESIGNID}" --timestamp "${dmg_name}.dmg" fi @@ -374,4 +394,4 @@ CreateDmg msg "Finishing build:" echo "Script complete." # -# TODO filter out the benign errors; Build a fancy dmg +# TODO filter out the benign errors From fc4db9a5021f586b0b48f634995091bb9b5e1454 Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Sat, 22 Feb 2020 15:38:51 -0800 Subject: [PATCH 088/154] mac:images for fancy .dmg --- tools/osx/rtdmg-bkgd.png | Bin 0 -> 375796 bytes tools/osx/rtdmg.icns | Bin 0 -> 1323996 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tools/osx/rtdmg-bkgd.png create mode 100644 tools/osx/rtdmg.icns diff --git a/tools/osx/rtdmg-bkgd.png b/tools/osx/rtdmg-bkgd.png new file mode 100644 index 0000000000000000000000000000000000000000..ecd9b9d422d2ed51bbba349527d9b79e8f6e2199 GIT binary patch literal 375796 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∨XGdTttfN2ffjl^@q8a~ujS&Z8SW+jvH>e3G?&3jc>c{2>h$1(Z!mgC9QS z3Vf&DrA2QP7ej!dA!6WvbtF zziDmCpNy>uzfqr>Zy7M?BOYX(nQ zRKXP{VC~DY;7>hFT5J83fBR(diPHww3?Q1NogX?F)1@6?a86x!!)kB|?qDMAaZbb} zsBqH5H8MxI_alzr=H|UG>(9u?7mdh;8U1syt)JdW{;#I3TMEDkVb{Z#z40*OR~l|A z1FrEm;{4BP4vgYC9eVyY9GHfs!D@UOlc#r1{F6*W=bNpsT)mMssWkQ{&Z=gk+VPxG z8t;QN*xAkMysM*vZx_SDIruc#Q=Q`2d32_9u5r`(#Orit-4X&JFhXQpJNzbmq+3EO z9W-Ht7-0b36D&Ug6i+*G(*zkMav?X@8NE0Egmn}g97c}92#s;YF)tz2O?OtzIZFYi zp-tucsE(b=Z)5~XX~S>iPiRs~r7M1M3;_a?Vy6hN1s1#!F=N0*K#vorTqBf}$CUOM z5%O0~v{L%nQQZ8Bp8=5zh{O?mcto*Md>69W??Ujz;tGcFF)&8l&oZy9tTyFwYkhWA zXGMPalF%(~DObu@^*wu>weyVZU&$p$W<4lo0{xRuKRNu}-~HX;R<1c7ez>DR8PJ7p z#(<5HHmaf1jK`|KAP#bMV`gIN0e>u;Ske&hbc2}<%81DCiGjdR`;hJ@xishME4~Sl zQvk{1ohX02{ij1@OrGE#ftj< zIrDl9|9|T_g>QS=httB{FSE`_nd! zz&jIGXn$6^Pt#u!FD9Go;pdY@5lq2-eq~il^;5c}|TU=?r4!Uu@KZPMmh8eR6yF4dN)6 zQkGXjYfn=J&H%`5fFFZP|GS$0z1HN)`0fEXB_o05x2zjj6HKMNy9L*GN&~-@urUGxUMJlc11p3y zItqaF*1YSu?Yw~)e>?k1QGwqM7g#h=VwB|GO~0S?HvO1VcMOhjA=sp;)xXP=@+bHS zo0tKs^XJ`EHN}op>2>@OQfMJq&_Om*GV9->t?|jr2>yc)KIpotqkcx@=#!hZeIsOo z2p%+ajX!zG+lDODr6X`CMEM)}QkCat4*@ka@iw&Z0>AI=A%ks(BK z*`@!@-OGnhb6xLmfBoyjN4a(wJcUfCjsmwlG4)4@Tb{WZ8sz4F03LLM@uEKAz=vE_ z8Dr^THagxt{NU}kdm3S_Eo)nNl_QYZ=`W48^-4Cv-HhR*GU&zGeZ35T3x^-ZyuEp2 z9g%x{Ez`vg30~g}q2!(lYdwZt>lr-CiZV_egK6gTE-X$NxK)mN7mnrK0#4EjSSj*^ zGfvuLn1H@)3M=@1P4HQcHC*l5w>aAS&m4q3wz92 zeZQL}ox$Ciu^}u;-6+}1i@pPmesg5n4hB93i+_&QS~gH-`)2yB2;~ni7?<2K;w{gq zg%el0LeHi2iE-LX4V^q+6WrbQ3jlKKY~LC7C%2<>dWEW3O)jXCLmCZe!Bb+*>Wi(N%&^>fAfMf zLZT8P@&T>A?>+%WK;lgKo9@1q{QyS7cHqDJ7k|;6_XG@OU)uPU9}YO9@Gf3lecy*) zo;3e#%!=|Jw>OT25okuq3;+g>C&e$H3!Uy??;QbRwX%AOk7BH_%R6CB8M?mLDFF1~ z%Z1RfZiicS)qM~6*tGdbN;eNK17YD#-37h1eMb&&CjefJp8;gFiIxiUz^Ef- zk>9j4JZQ7Z6Fc|=cKGP?Cx`#}{p9)d2Zv{Ozc^g@^0UL;Oq1Wu{Qw+T4qe>5ueX!G zaQ*vm-$J_u?89pcAmGBHxpeH{UVk;SQLO?hRy$95)oJSdVtVZLY%E-&LF^uLF|}>? zTMiqKh2pC^TL03v?4M8%aq0)2-X3T=Vsni2;z`=+TN5|$?XL-3iZ^Yym6m{zR%PBg zUCJM&PT7=>&{m}#cmsmVX&anAu3fdV8?ydr8}jn3laDgxshzcdCZhb>+V289{Woy? z%YYpH`*4G>3DESvV}Tq-Jj(u@PX9;7KFCzo)l46bvM&&r{K!$yrpfc%y?_HJE$ao5 z=RxIwM#N1IKdqo62TcFp%bftOr39FUY5HF}MuCfc=2O7l84E`KFXFv)#gS*7(O##Z z)2RrIc_$!*@16MR{K9oaifv%Ub2>St2zI9L+F9Xe1SH%CbSi`rMrd&NLraxu!Uzo0 z?3AI=6Q;nil&yb#l6TBViMj^hP(W%|)M)t~rw&tq{%>+}+8M@9oU+u$(MahaST}IHsXQUQ{YmGI^ox?xhp||pGGPLmW zbd_)NZ(a~$bB4P3VZ>`>87pb!70n@CzXgzxf+j4RM2i2LZ?cae%9_x%_u!ovL0{!e zy)OfDZUuZZdj$S6Cj`(>A>6s0GkDVD0h;4S3#D$B0=^Jb-ne(*evB)d9Pw28D*u(T zG{R$dd&`?Vrk*yIFPa0-C95d6=ZA07+AloLvQR|xrA+wj^0^TEeOC9S%&610{J zHax?qU4{&5jzMO^i1BD<$~*qH>^m}qsTb|=(WCn@s24KrUEONi)Bl$doi?el1&97- zHp`_{t9&c1Vy!kBpwK?`s_pV?uiAt1U&f<5sB@^=wXGu$o#Vhrp@`7?-u4_xu)dG21o zffp&E7l54yg#)!Z^Q2AqM^Qg<8(`j#hCv$Usm}qY5&IPIJAvWs0r1tUpRCtYe@%BC z>x2>{%4?RN34Nc$|H!PU>@abch6sc zt?_V!Gt#L5h*C0bO~&;|T;eHhBmRr|!kuYu;crH9%cHL8mk1c4F;mn_2rW9%Wo>)b z^8b*J?)WUPFZ#Xn&O4nAFzr2p3vO7I6JAQ4LBpZjMLvuMVSeB!)?QbGZE7|x*;BloIN`gAH%`vRV`p7gDZJ}_pu^*vI0EkX23A21X?2C zp63=oO8^1ti3qv6{`F$k`rmlVhQNgjtaAL#zxr1(jNZ!Tzx$>0SHJwFsP2<+{{hD+ zS`MYEH8U;oI-OvtrTYf7uaxk33#MFW)eIpA#hymO?xMO!+og3SHgy5~Vbp3;CqI`W*vd(hPigr~f4Vgn=2k zpzQiXXX4ax+FGam(=PW89?K0iV8spXTjh97Hmh&tw5Nky@Y_2h z|G~YX?rgyHu|4eg)7E?xNQZMBu=W2Bwzw4Y@|%$hpKkBhBL|Nk1IkjX835M+WBBT@ zOD>NQFfw~fe*QSifupiH8*%=A|yp!mnCZcI8P<?PDg9!EQFVnPAG_C9fN^?Ix!(X%9KCI`oGwU zV&%)|(9t`hw$ne56bxbJ7#-mw{#mZC^-&yQFJ%TmIy=^nE(wq2YF10A$=me*j5Nl` zQC6GbzR3nbm)6+)<{tijqBql%9mP`0TmGZ`MsdwDg#6KqMj!4$FT=;w_foRCM&4~5;?w)@zn>X`FKTp& zX9Q6~_&i3NCns$4R;e?p?sT>#EA~&e{RGO27r}#Hc*RjzZ)LOJ*N;MT{AMD4b0^c{ zLH#$^zdHPPzsR={e)v)8dUWqchljbWDPT+ZQ}1ZX4~>+8BbVY6)b=}Z@)ExO@GLJ{ znif3f3E%t^w?cPGiwN8TJb|CE?O6&=r`wV)niHSm?($9jr+%)c4L->7i-;R9G4gzx zI{PJFzI^y9qxZe`@%2jk3n>3ZyBV8RPuiC@?5T{LWgZH9mIPY%FlF`jMYsCwzLVs& z>UPZ}%*2B%Qc*4e-hP@_mrNA7v>kr>V2_y)7sQbGt4!mH|4yVS&tf6 zp$USYzxUIu*T0hc64IoC58v-+6W=fY>7VL%Bcif4|CC|fp16(@DpSiFO!&=!VkA}J zB#kdDqF+6$Zw7;-*6LvIZe?Vv#oWqW`Z(~D+?W4RW&*~o))D@uPF$({;LhE{lNd2q zW3=>6082&zx{=w7`?qe@C~&&NtkJRksu%4HGJMN>@osG|i4wLc6}(OCKJEC?^rEy? zE1ggnK~AxEWE%{^MriE) zV8D*6Fg?DkH-f?M*mDz4A&@GA%V@*O|pf^jnR*d%BA8oi%q!yu)FH$VIN&kygu`|g@4kwF|B6?}QOCK`#D zT3fv6EqUI_p~x@mr57mv%wm|5f0Cb(>M{_F>em|XgN)=D0wWle$wsZt2n3OGT#Hh8 zm`~@L>hB27+HAs~GiDGLe{~QqD^4ZpQ&th`RM892bM+Uiz4>QeQ-}fF3*!9mDGr<)0H@gTM_;C~d1|nu z!1>(;a6LV+NYbeB7M$P3G~}`i;N15;wwVo)m0Q)g^j${-m=T-@=1<0P?A@2n_|7C}B30p~)HkZpKTR zOBuNuSuz4X$TT&@WRzdQ3txPWoyiZ4BkaL&oefBN2^eKo2F|-_`Ic=n3><;`hkyHT z3-?~~t000Hd|-@*;JBD6T6pHGd`6xIB1_Swd`WXDXXBq3jl}?PUb~7h#qLJFpfq(o zim@BGk_KP!mhhF=g%}GLpV_pyjITA-8eYZzL)8-YWds#R zw?B*8(=Yq5`nNx)!nc(e|z}VuYTD&g@^Hup4B|otem?c(5Koce~#kkCa=A})M{(uMZ|fo_P68M z*>bJ<5pwfR@^cD+vJP3#odT#o?|aw#RVE+4CY4*L?IdPlX($PA_OoD|sT!B_KvAsg&WuDq0c2JYO=S^J;{zqAN8Wi}{= z!o!D*hUbUZlEzJZT=8W8EgOje!APJOOJefv8oH&HgkQO8p9z99%8ma)?l|a##g_Jo zxVrV6Hwl8NG5(gb$%7xASFWWkUSTNbyAke5kimDjg=zIoJVh5g`V)Ul;r7=_4rb~^ zTUy3*X3)}}W~Qe`HF|UbYO7U)tzBO9kyA8G(Kg zq5hM+*QKG~O9$BIP8-y;@x402TIdJ?9j?mj%=6g60B@bDLQsdyZ#t@{-{5OHQX{_= ze$wX%rLJ-2ZhCP#@)!dZ4g^OWdYrc>jJj@}k)&yB>61}$P-Oq&U;fL(-)DsG{`rp1 zo19V(I|B!v5ab+b;)oMFny*Iq^P3T%qAPHcW`xa@sfqIEH^2E!%k;03C#BdCe8LI4 zu8ZfXJV8|BrT7xR%C!_)i>$-uxo+X6WUw0|ZI$2;Q#%T!7700G&ZH6>m&*)H| zwvCicU5vB*;IqHwgYeLV-)3eQ5$eJcK#iot<3X1;z{SnML;*n1RZ%s>bWLrX@|QTA6{ z!y6b%KRJc;7!udB1QF$bEzbwpY&ZTVfzeLPDs(0xN#JLMN$m@N*Ye#0vq0Jb1K?ru zyc#?!ZQv;5HbII>+09H@`U&1_e7w4)x$csq(5LHAw6`1obdQ<`hYz%Z{)bBPi;F5 z^I2|^{47fW`k+2zU?5l6Jv*b2=i|)W9VG#}f){!th%B zqHFo5{9sPX+!W*}?x%YCIp7)rfu9=y0X>TG()WZT5q#5#jHCSFS=OPDRDFK?_XeK- zIpM&$0dT^LKgBnFL!;98JcozVAdh&mbN^YaR*klXKpO6yH1M9S$#ZW!NCQv58356^ z=~UBsJarx&Y)%FgHeurYbWTp%D!V)>V&R_Bk1O7Jm!Q2l>2m+LsrBZUba%5Gf4&*N zfmCP^sPHim?nPml*4OF5D3B5M+i$&9Bj7i`{&f`3z0y#;&3Dm_9?IoX1V1{Xb|MWn zgC!-Ik&ZY*a|uv_XqBbPI5;S~-~INt8R=X<{P@Q|>4$ubmI*L)%429;yxsCoct?c6 zQ8;|UMl|HXb*3VT;3NF4%RkL#Fh&Ayqk;1G;g(cG6w;DC@RdGw7r4?sf;ISUKulp< z-evry!CcHKiWmZJH?)J?x^de@(wSlDa!~mcdRnezm?uGQ2BOax79)t0Y4TX@V%BsW z-?ZPrs8Bs=E5|mH5_z96bX^KPaMV~!J{NKizR&+&yBFi+)qDrw;WvlN->fNp{BjwR z9Isz9Tg31RC-a|jXGP;Hf5?bJ!oM{-PbTGGic_eIQNkA~;}{1fqp#%2T2_Azi!wKZ z@+gWLD>)ZZ_tvwh|m^Kc~~CEUC8?kp?PZH6%j3Jq}OOFuZf}bKfB& z;(j(jz8n+&X^xIQ3_q@1&azQ!c)>Oki4upu@>eg6K5e2iNqJxG5^MD(Z5u5ywu&wE z1g5y+wE@)z%Q5^`T772qLl;7Qk&C4K%-(4y_Ip_FVMv-86DA#6N*)sPyOAmXFF()j zjP`PeBiC61e1k8~_~ONh)B{|A;)K1(rOkblKGDt+7`I?) zHtDik2Rf4|FsmV-HUL1uF>z;7oxi?_1EaiN6n7r>-5k)!G`77G_l}=w%NHYqpP91C z>nZ0B0Ji|z1K?|bjth?amI2X-Go6M&ra+QDoqj3EcEr4k6E0o{&&%L0>{;bMkrn92 zm*tW4PIhs3A3#Qm6f4};`DX)JArn?*6e(`{uzMArL|H`0SYyn=-j2K-IU}^3?f*JE zrqRAc$;yvV6oz)LWr$FlV@`x2rwlD`ibvFJGALi7O}rv+{Q32-eia;-4)4A9v*I%1 zLBFyRmIQt=CQb7-{Mh4HeKdecjgw5~a>;*OkDKSw7IFmcMp z_;6ky9nw<<%0|AbOT6|;VUC}n)4Iz$m?{hW;}5R7;JRq`CkDWm`KIob+xPOx;*SqE z9^_C=M&ggRQ9e2?6ZweHm29Ll`hT1)Uti_PF<$E5P7_>ytoJneLClk%+qwV*CcCvmI&oxSs2k4);ULr5Fk2 zxrB()0%XXoEH=LvZ8HKSvn*?LAK0YXTIquG7oLEtlj6$zpi*~!oa?0hR=y4DW*(#%wE_vAl&~E_@ z8o}wa_D%`XSlE1fC!&$NKz8NmG|#i~JJ5444h*x-x$&oQVBetj%70RqpAoP*6?el@ zz=J5|>thI{F+WSA{$8FR1;$_`v38whg6F9dQT#gOK5hMp8{q)Hoq7a#-uH3ECt!MS z{8_^2$ez-t-0x+yXxjN%!U=`RLy>&W*R=BG#8H4Rg&reOv~i~2f4JT6|5bK{JKyg} z-=ioHZj6`NAwB1xhepbr5|n2J2f>ne&ij$A2{%nj0srCs_gkEw{`99Ud(%;rfxlow z9$XN>wYipwpH|6qsB%g-&ov_uzNUQTuCy^07M*4bjA)xnDVAPvy`yU7mCXnK~exSyKyn^Uxc3fx9%P8=i2t`xf}n%MKd7VP<&;Z ztYg4D!OOIXP;)QS@?7-w(cgglVW9cu&IKcV1x;1Z{n4+Rdw$5L5>7ispD=}t|E{NO z;`i0O`@tvZo-G|AuiuwosBLLudldYkG@O}=&{6{+ulm@u=iYJ*E_BVuyRT;FKTdyr zAzum1X1W@2;U}m1!v4C}S@T!{(=HfZ++^REGk>b!1E4+W6JTqcZ%@lc>R*Plc@GNr zLzpp?*Gjwc5(kHqBxZvicE3vkLYmVYS8}|RYadXEGfoL6bYQ;gxldXioCK%=zr8a9 z;0krl+SETw{F^9kSM$QrO+WC-k1*QuF}koHvIBrT){a{X_b`%;5TEzb$UBb zqd=QH^O?2q=<(r|O)*gVW);+DXASb)JACeO!{phrCeoCAGC$nQ&i`k*2lzn@E1yu7 ze|aamAZxZl9WnW?CZ01xbR*?&p7AR?h1R+XjD6_RUk+{3$d^I=a>~%Ql{B5HNqEaD zUuodt4=#Sj5R2V=kA%iwJ}0j6!CyQ{lU=%r4Q!swn2U)+4?ebiCQWJF_$s~M)ol&w zvONLd^TRXP7&Q!2ZrVwFN#`$m_3_5GZowRlGQr#;Yx(oiba|6c>5AX;TT6opH@&Z& zt&=1hd@>zgFbF^T;Qhm+>=C#a-agI#AJ+j-mgwQitEAH&r)Pp~k4!i=Tu~cOr=h2;grt0YkcW^R zXT(#N%&f^*`GtmY(xZhjP}-hnBOcoDH2G!5IBw%c`4a`-pryb|N0uUO9#dCFZ_c_SBx(3zq#Q9D(9pMye9>Gb z-TW3E>Q$*-c0@VLV@CbTg}0R6)1bO8V&D$y2)di7V|18=k30ZjAN6fg@{huu1DtSR8W`U3pXH%O_$UqeavF3S zW;&jpG>vrDvV0V1zXza3MZzxIoJDAJI`0xB)7F=eG8L~A>CEHy{>lZNE-(a_j_Jou zy1j4{wtDlzCcQ3uJC}#txqIjE`fIPZ!&(Nok?(|`tmCH_RuC=0K=D&(pM3mrmHR76 zcOhTvQ=VBnALTro*PI*}+MT_p?B(vBexEjd9D(MzVCK$4e9DWsjXxc=fj%Q(jzVsW zs}hQToEeI`C|cJSn`#dd>`IEmsL&^@xWQf$}Tk zD1YxGay`BGlArk1wfz|7UHrqlwv*5^GX`5WCy&6konR7|XN?Me`MV@3JK?1-TtNam z>A>-OZf=w+MKx~fYT|@XeYPB-eH6{4k>9i-VKo|dVbW3Xdne6Y<1DO&ogXjwA2Ril!$ zjp98XBM>Hi1M}z2AO7%gBUAnDwMDo(_45ez`}ydM&TZ=T z%Pa|);^(Sx5-v~p{W`jgLUX?Svs^giUVA452#hgm>W8M_@?>M z?|TZaCeBNZ5A-mI9)MU3{KC|E-wDTqdnAM0~{w0 z>7hiUbnA%BnvW4U1rvMTt{$*rY>wDtT`-@(+ru;SJXV2wTj@TXk%ZFU zit_hfu>4u&Uk1TvAANYZol^t$Eja4QJ&Vy@hw!**2g)#R{GLMF?~?yk*p{2WDR${5 z{R^Hl9l7}}1sI6$B=k?tEF%AsF{utbO{I@xvA!>Mf)i%s4 z(9s}p5r9VPmsx;l*EZ0|;-}6^Ne_0M2454Lm9B$wg!Q=DOz3@t3BN8no$n~%wvI>O zfE_$Kqp-ar$bOPF^1t~{{`KLd+}3t<1wI@;`rYq(uGsXx5vy5%`9$vsYQhH|?~H&~ zGPNvEH`aZTOG#YeOMs2gBN;k^_QiT0Man5_OKYT$r^(OMJA;OkuROW|4t%cUm0x+(o%vxx;=36yxUBD2 zAt#+_e^dN*41~so-h@kU`2%dv%Ofr@@+%MG4`2)=P|0n`G^(p)ZG2GPIIHPs%_-mGlpQ12goHA1uXrxFwlHU^VTa0?L zkx=t!+B~(fr&&L)i=Ue|+&Vz__7kUVXy;Yvd7t*Y__k&cCOve*xxsNXJQ6u+wY|dR z&-91l+xil}{Km~OJPH@~D)B9HUtT=t%tmpgC1Gv*4OxGRBQ)UMq&M1^ex4v1xm@vt ze$O!=v<>YXZp&Z{puz=SIsKL)(103zHTvL_FI;(c2`)G+vuWF-{KZXvKCbmmmg{b1 zwoZGo?thUH0GdE$zrc{rK8~|a-j3J4zHJN~x;*{VDVVyvZ@#|r%VU-!7SN0Tru}`q z#XQTv>9`kQTmL5~Pa5@-!8(Z_nQ9>AdG7uM4xAeRe*%+U0HTp`8k)v9Phrb_^Ub|n z4SYEry1hM0(RZ!EMXp}52jHxOv)Xq$7J&WK=-JIZgP@&@;K+}Yo}eRC_D<(?wm-eJ zFq03V;9mW=fAGV@dw=~evi5g!qe4Kj*2#lfGtUv`uaNLhVqU_)~ z^-Elc>1dp=qnJCo&IsFHf!^gGdOghmnA&d{;mNyEyqN>D0ava@&_ys-h$p`An{aHN z3<2R$#!WjolMar$u(#)>Bkm_n^UDa{QpOXbsI3Yp1IyY%ocBEbpW6_ijGv%4nQcz)-@s8cfNX5@iUC!;7|$ z1o-a2qs(eB8VK&A3ytm(n6_xwIj7u5rJ-D#D?jFC!t&IvXZ8Wiv{im>Vhkll);>;~ znf41E`2BCo;uzNV4QAj6#^@Z+DBL8d!87%O7kl1LT6xulvK*o~_8PNCiCpOPQhyMc7@MUNSTd46l=U;xjb-{!zFMZX<>9`gMh zm_{}YPs7vz$7!TX8*d@$81o)^`t;*8@^`nW2{-zO?^UC!QH(kiA+>kHjMO#>(GI6W z2_HAsxbP9S1jY#NffG;I+63gHo?ra+U$?XV?w|fKqtaz)>%brU`d7tc7ypB-72du5 zO)uGzPiYJuZiEinD1V#%#9I=$b?dXk=U;r@Gv~q|L_w|*>ROXFg0)<56b`{*Cx6Qu z1&@AwaXR3vqpaq#AaTf<(dobvwnkLeV&N)W@a^3kZ&QxCAUez2@+|49AQF#mqcFUn zI9}u^8R-VsC^h*B8zmvF^1=h3JUY!UJU`*H1aqZJ8R2=9u=L}k@uPHX1XJ$P9DE#O z3$DHLZ}=8p9@hY|nx%N#6Lx!L@nT z)8C}+Oj6>ycO#TC?xwszD0}o%{@SRgnFOPF^q`d+{P5MkW#>rgxS^#pI9s|JFAGJ% z7&Ws=a11PbHv=HQ*I$1vr+QvH{5t*nllMPp0WaOiO^)00!jax%sT<-O!#jz zQvaKLNQA=v@VCF|r)niK3Us?zuZ~UHdocoDdiloTW{wY;4xSO)p1ZY7Lbz`eomS)aKqEU{3+H6+h7O&6pk%U7@YGQR?nmBYvbb|2AWZmE-MInqr*i7saHII~aIDWgKO1i|;F;C5 zHtGn%Tj}&aO-JYy*B-r&M2NK$#jn#4sC%KOV}kLkfJ-ME0kagtb`i+dLB&m{^8_=U z*!!gYGD`keA?9!Y_HPUS;jez#Cn5HAM)0>H2;R&c-28cmY=VuLVw;DxcuN3wVvpO^3TIXZXB{yq23^+3;=3*g6W`aFxE48_kq; z?@d5g=;TbTk1&+~@LyhNpE{{R4(#43k8rR7+(#9^yy3)eWo+GpjROsLc_OZ%x&1En z2fib;gu}rx9{kK$P$Kn*zG;tyIs?#Nh-aC-arus~6TXqp(BApxPV2aIZuxlNEgs9G zG$w3cUhrr}8)YeO?}k_NEDr))u>2{{LbG%;(=zENjrPL$8-9ydZ)<5O^|d9Kr&mh* z{(VR6RvR0d2j`ZgkIn=fv81i*ccWw*>c+3I}9D2%)q-%i{di;sQ zPkRS&4*`%Uhpuk3ip(=eTL>^S(=~q3xCSH1=mR`VZ{H?+t__+%EkX1C!19^N(;~ zudx0I=y~)DIG|x_l=$f9T|XXoHM0OuF1-Bm@kn4g;+-hAQTk>8oDMJpFb#UrR|o=cfn>1WIr6o-ftOuQVqk!f)~~eDFRaG=_*g2_5+v zg`0Iy2C#5QI|4{K2}I$0g-H3MN4Y)4qpLWQ{yD{-wCEHz^mjTxVK=w@;U0wqPTrh! z!YK{m#RYc53Fb)W7A{N~!3RO>=yY}|s z&3prbVKMDOdOTAuiWdFC#^FnOlK@ZC8b@(6TF{H9m$mJbSwE21+6So$m5yuxeXoXi(*&K!14u_c@XCdCvB)k-NPwoKG(w zkEu3f{lS|WXvtrH`0Jm&SAN;c!|9h`xc-eFohMvq)TuuMKY_~3g$KR^a4cB(c4~uk z(&ggOe)(@NS0(j6vUlPPy3XA{g99hM@1K$A9P|_iG(J6f_2%{5H%LeOB1_ku08#!Y z^U^11Xy#)lI0~*OMTfG8AWUOFsf~^7Sk)f|mdW%e8cYS03rWdEyBtKR)b|xx1w+; zBWbFXHh#%sU3e6l&NRDS)<+tQfUh_nxzQ2=k8wOH$=ZLBrIwa+hh%wA!|xL-U#HwB zFrW)MeI#L)Zm#5`1ka-=;ey{+AJ01cTyF6kuz!wqUQItiB?C;mn-d$?;-_4>WAgRZ zcgtdf*G$=W<=rG35>(i?M30)9B=ersh zn;+!*?l<3h`|yvMJrGwIaNwofh@TlQL3M$xF`aU^9N&@GfS-M4^l#I&Jac_$z8`(( z&RO|5@>VC}XC^B3^W?y#NGdB8tqrnuxS4vwKqzVP~uQkG{D zE}HX{hO$!zaNLx=uz459P5jVb+=)Y1kO+2RCR8tCu zk8NM*jzTTG5qhT7-OAT*GK7Ac)0$86(iRs@sk111IPxdI73}Zu>?Gt*^i9IS<$d!{ z`}j^w-;?%8P;l*wA{I=-UlY?c0Ss)qQ!TF2VzK>z2;yiBjOE7Dr&rsc*Li6f$D1UiO=NE2NF(qr>i67+{B3lII976?;QPgk| zNaNre+@6C6{Lnw~^4gc1fT!dLyxv5(@n_P3<(EI>W!~WtUfPpCf8&zg6YWDUp7X;o z<)A#1sOhF0(tw?OlnbsZp`@K95Mf;N-UO<2Xqdb_L7lXYCOPJ}$3fA~8u%C#aO3fm z1#Zg;XoavDNc-=M?`g&X5${>Xfzs-20Jj=+5 zA*UFj_y1|{+_vm2t}LCTQnDl@&M+_yZj6V^)#d8LWj{h+_pA0h^iB7u3l}za*+31< z$-n?1gb=AzX3uX%%zv-_YiFh;B-&M8F>+^|)+uI0tcd^2n-)X1Xe-8$WJ8qKPqWGL z`}{e>F55ZsXI{|f^b=S!=9mwZd3=F^@@(ecdh0En$@yaMTiqP2LeqNOp?qTD{!ktD zOPQ<3Sa*L`deZj?7Jf|`fBXlq$*;r4(Ty7NIF6hFSkrg@0TAd7zypBv03-}X2I3me z>`ITdLh`*$i_)p(+d3j18SPx*Pd?Em;I+NK|Mfra{qEjx_P*Amd^p_izPY*gg%-N+b)EMa-Sov| z=g6N^=QtR6IXb1B;3Ets)hOwn1T zoGJQw>HuC&$>L3Mt{eq>BOqBmqNQFsI9;7Qx}d`@%4D<_Gd2+8#X;~7MKnqFsot9k zw5Se#aCMs$$5;Dne#%e>76jUg4sT2p+djpvrJd60$M-}Jjn-K45Bu(_-8>RV+hPy0 z!HKpa`{Lx`-Spm!Nj9hN!I8e;d46LAz4$n@!N-|cygAcD@J35=XzNx`o=w297AXv7 z1K@TbOW1q-f`{}V$(tjM5ub&i-J;vSpl8r$d$Geoa!EU{en{IiC_FBX&<8Db3E@rN zwhEijDZV$4f(4-4dLn*wxDO)>K9zBaXaDk8kQb3j%y?S6RXX}@;)E=88DsS^H}&b# zz`n+kF~v69DG{X6DNOv1iMwOW`h65C-yI}Bs7-6zeBC z{r}o)Ki&J~Km4b?KfL|+-Zx*}@G0Hz^fkXjEfnADn&bD+jl1UA1mH}#CQZyDY}+hr z=tnMgV2}P3hNB;g+i#B&Fk(mSjjgUSk3mzZ{eJ9Ip@c|jYT^*a*6FO6d3zr5x=vgh6m`pAx3 z`e>s!OOnSW8*t@}3^+QBj&fV|Zz*#dl%ua*sta6v+3=o@p1~8$GWK91O*t_-J@#Z< z#wu9WK>4n~s*nH%1dpc_u4BnXGX0t(-i!mvqc=9uMlKDwt!f)M`KC?UGi7*Oul20* zpg!KMPlXm-Ez*8>|HVz)Ge*6s6jkmm$sP6B$E$j=G5u(}5IOsmq=T@9CcKPG0{z2} z_EAroHi3m@NH!Zn7JvHZ!w>)LdT66Ju?6ZMc8yUr##imD;7RN=U}1vq1uyKdUk zgHz+K{~5E$XR(h2Iy=6WvfTqD)E%FSKyLs}h326v>L4V|Mj(Mfd|A8M+d9I`k-s+# znt*qhY%^3DDcg$UG&8xFz&Lb*zn;e;rqh5-ZWdmj>ScjZ$mE1Kj*H11$D4@^ZEUiG zkbT_E&6$8#Uww7&mwHdY@8ACI-fi6wC{cbr@J+oP@Q#icI1+tYmjw9aul36gWZ`sh z7U*&tq?d&Q#}KE7&DeuZY~)OWzat?2*oiFcv@G#bp0xQTlT+6?YOe3I5W|CBWEu~p z3FIk91~PN>f_+}}#mC}}v!|Ze?NAIa>0E2~BB*i#r@v_f^@-6TCbxO9U-Yy;ju>8e z_@RqBrxhbJcG_mq&@SKguR4NlRylaa{^+6}dD(D)8S?ac)y)DxThZzGXl}lSecWYF zn`wg>&5KOZZkJ;0ao)wF9R~+!;*m*S=rr!<5QEEfOgiFZXX(y}hLkW~JKgu~H6I~gD zm=t+C%-bsRc-9zUTp$sXAM=&Ino5?YyKXX91QqY2N+MKCf;R5XwXwlkE%zU3ESJ3)ttA zHpLkTWH2%~>i}J5fNlc3q!(x~$ob?Y^xhPlA#3j8`PHv~z4y*P z|7Pzy9xYPfo%dV{;K!Q+zm{Y8$+ht+V4MTL1RS>QfN$!i?nu{panYQn9(mq}z#@nP zn>K3^vGY^jN7kZ87HN)t5yw$94r{{;w<~nLg`;)g$3YH*Q+-RQ-%f(pUuWHBrFpi7RMon4L~-7qrGfR;Nz6MHzLwAY#IHRG=1g% zlQp9~oBqXC0y?nMm}4hADudpejhXim;b0N2!(MpAx`Z4xQsl)=a=g&6@zKT;dd3Yl z6VQQ;<7~?qZ?2gCY*Q^bFD>~0AoHspDgb)03Y-cVj6P!8Lfhb>4Bzph9^2%{&A(cFC)bF;`8$>IWlo=oz*ne> z(V^$`jL{`+*c0$g;Fe8O$`eZ`k47I$zfVJ|Z7lK(mT@!#;qJTtq36fi1$`!%k{uov zf!+W-EMjNVGZ-^C6WfDo@xQG{<*w<8fLl5Va7|AG==(VScuLL)SaNkxI0|;$b@7A< z8YUw*7G2ccy_v*zP^!nVA8K-Qr17Ob^zoct;mMKT;#M@-Ni(UD6(Bp)&Hm3|e z#s;FnE*L@wKY=vzc7^D$TC90rq@|Nm&rHgK7cVeUArv! z0MLv7z~l%0?+w5Yf^UntV#(lSkXCPbq_zLH&IDXzQfXrHr7OM?h>+WwC?Bi*d6h4R z>`W9UPz_8hCJ{UK1Kk0Qb68JjJ61Vb9Q!@hf1^|LFV463MHV*1k&sRxjZPd6Y4jyc zIWl<_=x3jOw)cuI2jJ}g_|7|H6MztmL7aYE^X8^Ghv;}pX9?z6gHdtDf7+-kCP$N= zN4K~W{8$d@DLEq70*dP5Ldd^7LnWI-WdCU}9h%~Lr(7#SNLw#Wyx^gaC}TtQl+t;lBuC%`Y;q_% zM#1bGWjK;fUxF`v7o1tZ6RWuGB+Ctu!){v6&r}DgP;Be_C5K_YOy!S13k{PG2QAv%^n*dX zhy@;w+?nXO13LlHWm4L~PX*Lbp1=a+iLRJ{E!5*EaJbwsME<>h`NQ(vfbd$;@INrx zL3m>@kEm=+h||P{epKAmO@`>)XJOY{3HL9_`N;9e31`G*6c&-h)RX20In%;~{RDW4^z-#s;X=$Ak2qQCv-m@w{)2}flITC% zCfHl8Gqba z4h~?II>wX(wkqMa!ZXupJ4@)`GWE`X3)ZT|76J<#_<)z5q4g%|nl^1N95oMYk{es2=^_&#?-wY@(SDoIPMe%y>f=bA|E}1gpQ@&3jR{ zd?;s43mshrkaP?%ZP6;<;SmtXczXoaW;q3cV9G#ckdn7I(SYV2fOXLQG)KowAa=x> zSlI!Om%)rP1Pc$7kcq_N7+(!&$oAFJv>UzF47lD&)in9W_q zd}j7Y^2ei1f|CsdvIOf1&v@&`LpBARDd3C&JeRol!89l%8H3a&(V`wKXdeq2PAf6a z3w+`5UEl~vkeu09mWgvCaOCMYdM3tnrY%iBDIXl!Kyj8Qi+45+c9uifreCHUig$&y zZi!=uh_RP)j?%md&_Nc}wnH_EdHWn;EZ;1Q;|5B~aNHR$#&XK9xIzaF?Z^U-Y|1!$ z;EmG6+;|H+#un`*?;~k&)31)l;Dh{ZI5PfuvCTTruh@m|*Z~a~@cYT^tH`QtFt6-k zjGK41)9splxO@WHLJj0bkNDuN;S%pEC?WcoJ6v7>XP%fKWZ@6_cy(}cvR!As;Nw07 zY{JIKqitt}UG;n*h_`rttWR~%vytP-f3_P8@gL?@8FMH4(B<@OFMZ;BlBN;VF+Y$2 zuGF(puKclAeQ`tW*;>@ORH_4)_)MG?oej;{QH8nVM@Arv)gudN#`_ScgP7G}tg@3# zgZeoJHD>`d;19Lf+|YIYJO;QWj7f)M%)&q=lm3dF9*Y!?fO-c_vSng1AvO7!aM0mo zncN)tAQMN6gJn`8Z!1h*%5c2!#!)hnac#MVNS^0}k@XM%^}p?1d;SHVX}~E_XFl0M zx;h^(NGedVbZkzqZrQObGySSh>53m`nbWWwRovH>T{6xo!`1}wL@tlC@d;k)ShS6! z>PU0M#G;x_61-mA#J64uXz)h*Sb(9gI>|qBkWDyfPRn8&`e_6G;e}s<={s=Zlt0*K z%p{KPb)MJa-uD_@$%2l4t_yhL7TS9D_!V}O`E<#myNU_8`5pMqvAN0!Q% z9|U7PF(B_VJhGKO1E*!~P)QK2H_@`0fK3_8F3>->h0LT$dEz?GT_!rP@#Y3Lev_BJ zSk5%eI^@%D!}dYHHF+#__dm`|FgH9dl?GRy>E}tBUE$@IulS3R%wb)gG>O|MyU>rV z)z{FDCCEl&Fk`U7*IdwjP3T>MWcjQl^Ha7JU$*6Vgvr9B>;HZYa9RARtBuIIRekNE zvJ(%EK!AL3j;4H21X%ntaF>n19OzqvKLX_pw^lrPoRoR8X;Hd$>s#L_ zxaE+TbUHN-4Uf{{WN|umK|(f@90x}oavf%xavV7U+9k{hpFF(T1pM+>zuJ4{rI*GL zw&*xAzc@dhf&@-8!;Wn@sYo3+ON}E%^m;*+?z$*M-)S*+EY7RidkRAwb!=GkQeW}H z@L=Y&>diChNK+mjUsJYjmFq@D^iYS~)GhK^@@Qa_@RP#MMNwHY3M zI#WGlRvAf8$vA1tgom5|hJp>%t}=|CVI(C(&fo1+LA@a_bmzs!QA8XWg9BstNa+i@ zmd*{Ij1|INZOV9$e}XNsPU*+^*%yp!FSM#-vq-pm#EX_BXBa(crIWcJeFUm_l4D%Y zANOFyHe@qSIiq1({~!FLr^m*KP19Hm=bIvR)Xp5B-^{nfqklL<13fkqqc5~mh0FMs zLinM>7Q)G~%9SUu$)TKXB#;KP1p4VnmnQzAn}omC&3l9`ebUW>jsL)A1ko3M3{Z77 z(3;_EIMV?(!}gs1-=!oLmIBjh+bDo=t?!{dWXqSVrm<53m|WIf8`U~$MCu_dtJBZD975vQU@{VA>^jEd0@6Q}QwgaN!9q1$7rip7Wx zhskWsaK3CVqI1oQOdla~#G`a>nqonU-SFbS+2Eje*dcP2$7*y^4sNvB7^bbXU;OSf z)nN~E(81=2#bCinbiCw;fc4ZN7an91Ggc_e;%&Xs6}@AFH=MKEuEh|VA#+?lVxdJp z_Rn*ls5M-enh7inouDO!>l<0)9rEo9Rlj7b9NMc>rrifKpMYC2Vf51OoU9N9Wtv8O7krMo(Qn7(Pkbxd=37G@!|Gpj9u3yyJz)9 zP;Q9ySl77u`sYc~acrha#}GIQ>vz z&A%WpR^jb|yIicy%`IHxV$h50rs7XEzF$!KjYWzQISTh_L`}-4uRX0rpVQqJ{E5~J zy4KCjP@KYp21l<)41HZMM-(^$p6~r?ZU7=5C*nmt1&VP3{0Qjw!Zc$h@u(Tj1)9iU zl7FSg19K{VaVjPn3!E1~Ee_O0$L4wYu~2i@Gz<8+G{E98Xz__G0CZKcl0e!gPfj9aSXTbzl`WKptb@U+@p6EcZ zX;CoiB7e*NViWxWHS!6JMf#618$HOUPyGIY8PmV?6*RdI0Q`|f8GQy1G_)O)D6cXZ zTWsPZgBuEiL1>q@Np9+}6I8j^;kshZ1aO2;U*TKizkF5_8#qJ2_dlSaKiO2g_~J{t zdGH(A#@riU@+_zR5l_(KzyGE1|5P+zNY;@S{X6ny95mGcaCPy=w+=8XRi_^bf!+W- z5^U!(w7iU((jvJ6R2UV(xZ*;lhQdZfj!JYh9keStM{Ghk85L&)Q>}3V&tHY1p-?5 z2(*KI7E>H2WzY}1#tnh!BjB)tJ8wjbUg${^0}=8`$4+=dLz;T%`9&XT*WDYk(pHYF zpf_%!Nt(?GA?>Qr@rH3NjlLGg>P=|Vl!CSK5U%w z(0%XT=x=npe8t#?G>7r$WwnAa@iDIl*@n4ttP6Ut|%ty^@0t0(o?EM2vLw zP{$8jf@`I}cW>YjejcIq^YSVXB31QuV_VTAVM=TS9GHc#&E8^Kl>S$1(e~s^p-@ zu2|*Ki45e$F7%PNo|z_!UTi@Zd}&|owJgzc%^Tg&W?=}uF_pdO5Ye!SG&-(*7l@2}FONczuxg8Y#z1h4tc zHU2GSv0F6Zfr9$lPoc+7LTs}wqUCh|%X*0zj~#Q=PXIG8u(jBX%!v_LJ*Uk3I*T7h65r<=Ro3AV5y%*RMD}Jo0|Btjpe3#Y*L6B=@1uR~sx?=R zxDA*5Z9VSB7Xp>s4oobL5Fm~`qA!)GZ| zmIx4NTZ7q<4&l(Z#8dB*Pd!2vypU3+AG#xty6BIMsdIVcDz@&(RZM-b3J%C4AS3c< z!xpdVIb94ttuPiaDNqKjb&rCPSK2Za!$ZBt0CvoL#)GmWh=%dBw1-mU>sNzyQa#x7=`vEe?tcQ7tt{GFtS;$v^ z`qRCS^hjZBLLTXwR}p7Dx31-Xcj3aJHW^2{mRXM9bnJGxr`Ei1C3&mt#{ zae}wdrQY(U+--!+V6x?(_|qqmNnK5cwwB$eH$)|d2A+(IEn8N0-zP8iiouN^G>idc z^2?cxsH{H3Wswnr#3@%CtlrZGfQ9{ypZ!Psnp?N@S##+~pP`rg0-n}8JFd&;yeHrE zmEI2$Ot7umLtcH)4bNKhFL1!a{ZHeROzhaiIr5M1T>I1wWv3nqf!+W-5^N8|ltB%~ z3}6PY7yZJ0taJKDx<%hNz8oApbzAHEoh!Po&!pkb+AqHN!cLn>jML-{z)iiE`!~P& z&E7x$=l`%q36qCB`Waj6)8nC~-ff#aKJBhFatYXou3dpT_nqhyuws)NrO>d+B_^cZ#Dvh- zwxiSS77cN1h|biTU-i*TdE_p7&@pW!Mql#qhhBwbmteY?3w`tun-BXYR%su2f*$>Tf zvk=U0+R0737cc20QHtMx|GmB6>$TwA?*lJ-6Bu&@%4eJJ+`IP_k0sqyKE4u?y2#@< z<2#dvro&@Gpf>=I3CJ_VWZcT?|9lwnw(`iDe5Zx?t_w=j0smFOlmL1yU3onid zX9GmAH_r2bgB!6Qij&801dRUm$qA8p<3)?9PpcRVrQgQom)JTWm;s4*LGrWu_uec zAQ}A}+bDA=yo~*{FLDw?yG}=cY=)+$kwrdjA2-qsOl`AtSNg~&<_CZ5LAHpOcDheg z1RXL6mA~dmS3SG((McU4vTE8gRIru>EqzRRoeS`WM*_)ig(?R={K?yI|MT8gH@@;F z;Ca39>zW=v=3NbZ`SY{SK9@iGSpMcCKaG^PW7dAA54l%_vf<12?FV&b9*Ndn z2ITOIgj^!PZ`KWhEBoK$L14WoJsznor6Q04%pe|zQQKz%I18|M=lb>ATB$EhkyRF9uK_k$)yW?-hp$|4nHPy z4dj`COvK2l&dd&53~@Bo(XX9I)lTo;sxo##eos^qQXXlo783x>HVU*(xJob8Mx~ZICS+N4~)s94asT z=AH5xcgTP)Schk=xAHPR)7O;O0AK8)oU~*8OS`Zst&SYZxctC|QB1bSHq3Tse57Bo z0b7v+-LlbCp8j&5DVes}W@ue)RFv8T>rxhbViUEoIatMx4d>8riQ>)Njh?hW^tM^{ zviL@3c-OjPQ?Nn?`~)5|e)ms*@{5Cb5`d$Bo^s%2LcISYz9uh6f`>B!zMQEv`r%XA zZTT$@bhd)8|8Ew3>X>w0}h8TyC zu<)te9FrGEj}GeNOpqDJ5Pmxkm0ORT15TBYg(CHFq|~jQ6*{m9nk8mYkzC{riQ9aU z8|Q{xf@$HEEck5~a%QkhrI&>knrU-*X{XB+!W*X7kDpbj4=m z*mmrj!Mw9Q+&D+bJRn|pX}9XaZ=1;L$M|C*WC6r}WM-VZKP8_y{h{hDtgvyZ4_4@l zU5e3XjAmK-5n0IfxFVwvo71*MHg)=8Gj=A>-x<%y`AQ!FiwyJ-Y>Rl(F6>FUDwld5 zS=QqJrF_|+cm&Wyn}5R(Zs+lnITNs{>C|IGpsW^;O=b()Mu0iRKqh9!;7RfWf69sX zkFH#~cYNoL(kIX8TK`2&wAbahuKZMY*7Eot!OlgKEt9M|h)hT(D3h2=1g00C%VwMj zOq_BiaenaDa`f7f%n6T7@?O+%5a?5|JQ6BHh9|$Xo5h=I__H7;kM1~s(geSKPU(@8 zND9eM*;Oz0*nX2tj@b_M;lM3-@=`X$%>_$xanfECs1O}#FpX@=SoqOf?N2)g3WFCB zEIR0f-ffn=#b(t&jpeO${8#?(=k z*jOnOIZ7ZecFA@?CTYdUppL~A z9{R|#p;3swEbkDmhauoIg(GqCWwR@ltGT*}dp9q`VvWSfdEFhYLHi7E3u zoqDmGGGb&Kt6`9Nu?{`-4RyrEm2zw-`eK`D#N(DtJ#O2SHN?;UC^9^zmG?IVWY4;f z(3|;SJEsn8Kqni7^aH%mrft`Clc4S=xvi%PetYN6;s4Rgi+(TqPjpt`w)jt!W}zRu zEDRhAKTQ}NU^R z5yyW}{Hi9&1+Mio!MO>Ln90V(V-$bXnstY=Jskc1U$AKaz!E$D1t=GlK zQLwxcyKLrdldwn`dX4Mc*!cRlYd1F9*3v%nPQKWi*Ed(JLZ?QJ_K64Vu>qa7R%vXY zj2F!;r;Nqpc1&ItkBkAz7hWmhXxB2P-R>jGRyJpjuxYD(wCEKN?TKFN5v^m@p~rR5 zO$@*eIYIz1Wv~31Sazc8DBh(6@|FbihB$iP^LhT&{WoHn`7ZgY6X$`7Fqk zMJKf6*CBI?a%ii(*gzc`lSkHqRjGr9I_T&lV)~2NysAq*<*(>n0=%tMF9-TuPYC>P zy}|HLs{dTPUuo0L{Z5<>7!6lKfwQFe$XZ5uhsTUSZvY-Mpr?q-jLc~+Vt$+v$YmI4 zj&v44v+nScCg{GL!I5qZd`6S#6)pVxJk!s!|5xaH>ppJH{#t8N~q&?NX;Q=DQ$40QGELdUJi5$IkOkMCogWdcr0~=;J^(>&2)85l~%_rKN%|aHm*vgSA?O5|7 zn?O6V31FE;78__bsK`4gvcQ7&z>^T&wr>^&1KUo!(q7u3ADf13YSuU+!j}RRyAQ?7 z_+uQnT}mT^pXrc21G3Pah1_Fj(k}Rhm{`2ApDeuCR{6shx{OC~MIYt0kEjPv+Q-69 z9(kq{7StgVJ=o7@hJXI^pQC>7!w*0F;?Ey^@V~_KPojBGv>)qW$Dbe+?M3DBhdBd~ zvjI6^vW))s_z_s<{^J+j63;+@?*cH$xirAQ&piQ3DqO#QRp6ye#dK@D$^N~p$ z=b&oyBbP}|-8$H*PKOXj3r%dHK78mObAD_-kXggVF8i{jigI}Q#VHbpp8*}G3T@hf z1LSC&MLr>IU3kST76;lL8$ypx0{T)%+rSf9^at&}eEBDq15N1Q!C$mvV6CnlkmlzUoCs`Zwdu3%_)Md-P>| zK<_akTM5+D=HN^|0ecDPryRZn^8C_%;_xP>ELdeez@PE4jWsnJ-H}Tv7{LQ>(Suz0 z!2&ziV-h|Byzs!AKwHxm_^>zgI5@zU{t2$|Q$`+{q~X<({juH)a7RxEysf&oCHoK3 z_fJZHDVAH=0Emu_0Dh3b(f_bddMeXM*8_^nNVcF)&z=j}_H zFt2Okys7#(G%5ebv(G>Ocl!9o0h5i1rirc>2TljAM``j}PSHF3 zqHhq)FA^eyg(at~N9Fvl$qYZ=AxN-8S2=c6-iv(fL}w;^W+23htK%xgJCh4-(VHVv zzw>^@Wv4Us=5wpx>(NI7e0(71t}r++;Pg0qLZH3K4PV+j7VY8GahBW(T?6$TA?Jfe z@P`+yYBkIW*?L&0nLq^64x9xbp$T{}Hv-Ub z#Q%!oEba?Ev;;N;ia3CHNe3jiG$C2!EngG(lD-Caw7-9HFyk$~Dm$bu^olz)0*yc; z00MGF_8s;wfkcZt&-GK5&B2k%SkMV~=E6_@E8&3 z4Zvdr^ASaDEx=QT7kZ_~y#m*-U%obu-o4nfA<)f%dN|bMxYV++e9EoZLgLZCMQKN8TVsL4XV z9`rc^&*osTb93M-urc85edSl2G5aPyxD*>)ixtR4?w8T0qm_ku3!C3 zvPPr1?o;V`4mubxWg}wv!+&Od6aO+2b=U1pq6N?0w+^hj^U+}`7JD~LG`SchnEHSg z1PKX~Ttz`vZ$lKtBB_i3_G+j8VSwuva8LN>!LK+Q^$gvtOj_$HGaH>$fu%hnLfr80 zpN>KDCpPa^9~`#_WHf#6VSE)dgf9)FR1Omb^&HNOpMDi>;Nyv1n<(yaGz{g{L*kaA5c&#~A zw+(_ic3CXZT zRqTbD#w=j((m-`(|I5FXI2%1Bet)1@Wi^~L;J4*IDuBkBhD^fpeR7L&C(MxXsfifq zjg`Zjjfmo0yVdXYLD2^#RkTmxv>)pUTS- z*5@xIUWZ@Ur0V@zN)nU0AFxT&5Q+mfPbU=~UUT z29!aGbOCZhCxR9$6l$y#46j-x?+a8s3rkAd%8 zPG0l?KLj1~gT?8UAy_Tjode|vOZUQz#L^O|DVdTk5+4~YanSx<-{R&AD~;%8olmi7 zM5@?pu8hF6lmKgLQS>0VuaKLwh^&s10g8X1Ey;!$pPd)E$w1RJUvqrEfjxVd_>{q+_ z1AD|@35#KpOMMkopUrTQILWEZJB!60dxux-E)^+tV?dP zRa|lOA04BKiJT*cH^y4)lgRW)@A+{Srlp$){M0(ET7Vn#g)nPeIcS_%o=$4KfR&K- z1mzLO{Cx0*B(wN$XW(wslVGm1sB^cIh$rSu^{vJL_FZMi`QN#;h94HT3ib|3xedj- z%Ko;I(e1_Znra0SoeS%g8f33ClBJ`Zi}VRj&3o#ZTe>`;HlKf4LC6JW&K{?e zzdGQ%iNSmYYwfO(x#OaDg?PM_VA&8se@FbD?D$mCvOb--v$?vxRkdAlJG+JE*-Br#&w&aOz|L} zqf1A@AD#0rI`Kc^3yHw|6}3I$5WHYGFCG1NarR~G|4#k4`L85i4nuE`0NN8B0}Z3* zrwnc|(#xl!sG(3R2M%|%;T1(f{k$EgrJ;<6O^N+7g{SgXK?ey5<)w>)go*LeT>AaG zLqbAMag>+WQjwRZ*Yb3G@A$zE35hK^C}~0!MVn+;dZZt7pdg%#3!`DhA=bsD6oU~M zOJV!NAxB$z#v_xWqQGvZG-~GCNa@ly^`n(`2P!m0B894_aEt7u12cQMH|M>(4>x~B z_w(+N*U}3rhoDGWI=EaEco!E3=<8Rw_^9w9phS3iRiOeS{^!#N0ja+*@a^#Q`^PRf zDoGs!a%6y}#Oul|*-kZyPU~`rNbJ3k$!EU|kM%8qVTyR?ge*ONxj@y)_y&5S9-?~% z<2T6E*{5mmULCA84Po1S^(ZY7+2}8^R&2VqmG-tzYcn>`w8zvQgA5E3mU>l5)IT&G7w1UuVzDYzWPCmG85JFD9;86N!E+$so5|y*3fBeUpvxZvXLm!NOe1cl!AK-OBm)K58yDZgIQy=tz;vn&H?tPlp z%*!r;?2J_2tE(e%y!0`VkYgN?UVx#HkY6h0OMThQ0+jz5K|v}&{eS)cOtSH2^!yKu zlppeOmvMF3nE$$=y>!|1+`W{*&SVmaiaOi7;__Y+hJZL11&>Iya3ZugZfmB{WRMIu z3UjDe+8X+30+07sG_r6cA~2gQ3L2(D3MRPsi^{uV(7i^m3Y5rK%Qn}tz*}a=OC%+`~-|}Ax{C}4~Z;upZ=G{^md)MobI7*{H z+!M((4?H%wo_>}Ik==SH5g}BeZ{-F@ROZe<_fJbmGEUv}ZcVc~g zknYrVyG~kEZF(}b!tvqmiC0KSf6rcj>GP)S@1V=_Ty>Y$~dt+-VBpS^t-G z_$^z~s$uD!@sAKB-K}Kw9DeHWq~z6BeC|&YId5WqdhDdWyJsMbw1Mse3!glG>QHxyuyxDvk5}_HC302S`Q7Mv7E4X zJl;c=;S#gRn=6ZB9#+9|JDLk@IygX(T2>1qN!af*)*Kd%~vBx8FmL9k6PC+ z^+z6l{}Wr}{7Jlwb??4e*1YJePrK-oVgus~uhMf8mlLpCG%eb1&=&h%cwlt3n$`35 z=lJ5xtFQz}jSl~P2x_hNNv;Y}F|Z@?U*^CMms%H>c<%lE_vV^>b^?u!cD@0nljAHO zKDcCvx41rw7`mF>=l{@cy#<6I0H&q0A;AoSyoXnonEo9}bG`q;E~3-++uRbEemJpV z)p#HPZFc?1ZJ=Uum{U;ZR3|{O-@hLYmA=;+oMi?Nj!M_7SAL3Q((T=(2b3lQ`S}`1`_pQ0 zLGsuup}yq_GBw@_IdQS-H-?lTt`<#bbd$OJ4%ui^>Q1%$$B);ztGvm7nH~+IYR+4) zkd&XY&?YjD*ojY+x9}wAX55VSP$8dxOLUoYw`iM!Z~bHK(Witv){9U4_uEBA&Y+ z_CubguDh?hx(R`AuG!V?2c=84eCqKXz;}khM=j96t0?lPqLi}f2dOEFq5`JdhLSW8 z>%}L2><>@us{?00%%KTr-zx{P5(oSUN6ph5sk@(kj%`lA>GHN!VMX$?vvRDToIrxX zMMOk?+--1}er_Sz9^{?zjb?-r;h6iSXiPGOg%?5u?KE*oJ*^AS-xA3xl>JDOA&3a8 z77{j^U#a-jei%#jE<%ghCSj7>t-i$Vz^P~!o8JH{bgzH;MZccTOuX4URF|@%$Xv=Pt%pq) z06wncY(Y$UL=TZUCi-A%APFjg`dDQ#DwyQUYtcJ~rJb;LCp>CG`3^|Eby=-PRtot} z=tebpG<)$7)|lbSi&ziATO;fsK!FF#gAg(3t;!8)ax z1ar>)vfb>@zgyW8o9C|4_U2ND`D}jSgx>luqq`82kyYP|rZw`ldR~o(JZ#fFzz9Na z2IyRY_0JMNC}AJUVk`;qa_%PWpWCfVug1e zMDqd>?gR12)Z~j!EAfOBH}64P%*zx%M?)J|m1@7fx7B(!Ds{515BLIo?zQ?&*@c~` z?ZiT2V)Cn(Rl<=xFt#rtg;h1y!adZQH+8|>OQ@D43+Ku=b%F5i-{IO>{11QA@%!)o7M({%M>q$gb*U7F?u_$|z5}k>pYv8v+hu zH2gA0;Q)$q9E-V~5l2+WxK4&2ilt^+Q~z4bvv#XibznJxnl-&c8@Y)KL?QoD+$LQ2 z&86`0SFKuh6LLHh5qPfCowhb&Q;2g*r|iZ9xqF6kDcaW>5$#>H?aw6Y+th325ppq% zHxH(*C$!$QX`}2UfA|&w;pE(I74;Vf!gl`&n@vYV$jp5C3!Lv=xpjW>Vtl*Yc|14_ zxjTId$|Z4%pcm(>YWK3AeoV==eA;#7LV6M@yh;fjfnPbYAL4|Tm9R<~Lk~9YhDDwR ze%OpW@pb&Y&+_hAUGaBD*@nAh3Z7woUDKE_D*oUu@w0U()6r?dZ=8P8X}>`1#J(#Y zY$z47_d(S2P(ifbw<*W+MHKl4NlWnmt50-o)Anlk)gEnmFEJ=kXqLd z314R>=;bWl2uJ;V75$c1SgF4cnW^kdt)w}op)VANW$#zV5<*99^?D~Z28oLT+z;*z zo3-n%q{DTK=qvX`?opP!EGWusfVb!@FsQysg!tlz(_L0I+37&EOQ&B&`^p=V3(gQd zA9~71)!=?D^T3@Sz->jHzrjRGL)p$W zk9#{4n?oFcsQrQj&^Vl{-62?v8ZjE?!yEVLg$*!yq7wuVXI7e?S15DLb=S-)NrPro z%BPoL$7K`u8PaSUkLw>NA^-$tCk)WPsS{k>9KcVhL?Aq7KUc5zxes9zg34hNSQK`G z%;!HH%BJ6k^OI3GX?NN2?kKowJkd(72;!C{6Z~NKx)kneXV;b^;d2*qo4awF+a-Nh zBz-5(aFv4O{P*Dg;AOk(G-+9r?;M}nimIxf{XXIBhtz#={qP(4`_>+2+O{4pIz|O$ z$$Pf4<%-eo4!cu>c3g=mnFbUoG)BH}ixm~f3Te-fd;HJ6jr|VZ>@o~%K=h$Vz%-Na2flF9 z?n*|&ZUQb88EJMIo0dLU|NFEN*-zxLVTz$IxHwkkKR{(@!jRq{y^Kiyo+x1u!NDd< zS1?zL->bLs8;;{M3FDVG6iyv{ll)E88yrZ`B3^<60_y%_+@{_X8%MZ6f8PyNUNDJ8 zn(B71kq=)KF3w5~7Z;atsSm|rwul>EBn+{l9-aPhQNp79)u?Z$w7Wz@d zKg$kZ^GnxC=hBIT`LcfYriQug$OV^BRe@lrPdj0W1^5D7n@}~-3knct5os2u&OT}(t z;!WQ5U(*F*XEt82Q%Ds=Dg`2b z9Mn7)tLj}c=8I_G2Ktq?q(8s?jG&x6&d1cxLAkFUD#)GkewiAe7`Od70=aEy%BUF-5}@ zBeIF`ZbSN<+Zb4Vj{{~#g zrJOece$q#k*-#hMES8hVk?1a=M1!uu?4G33;Xi9P3h-JA7Z_I<+8o5=k&k5f?yvwe zypg_h9ISQWSt4owQiOX=-7&3ED_h&&_h~B^Pk588hL(OPU?_4CtJErwZY?cz@n>5i zH9tOSmWqgW=c=1)!lJcc6THdcL>orT5I@k4G=?iH6jzVjx{aYU;wH6D_5CO|#?wQc>{2{E=M8ot2PGNfCeBAE z;vb89mL@VvLsXz1RSy%V&#K!J7i(VW*AWD@sXn4((_M%_|D!+G<5^@v@d4d?k|p-` z7MCcY!CjS#SRKbUCPv>IOM}){Qob#m`XGbt;4x7JBXlBuJ7aO1T zERo(~X_~@cuFo1}TAt~xxb2aUM8N4^2m8Lq=hvbke}^_Po4+DHf4wm~_T!`f1jIpi zCHie#o)dbpF>j5upNTbT`+n&!;8O3jC}6hT^SO|v2N&Y|MiCwe1P|r8RZ9F`<~ZHx zuoSMfV6VD9{VXzA)i>&bw8Q5DBu=HHQyiW_e9uj~_0Ym`n)J;m2%rm*uaoLOwl*_S zV`xgs#uFwG-?Ly39dJR8RKQ4+rAQ!LMdDBjKGIh4jz8vu{s=?*5z5(=q3Y=ENPW3_ z$7B~xMBPbEsnKBbwHjL=*Aux4Nqq(0dR9<}bv)`hZG@!$DGlSKFmIl*|KC4oP8==# z*A}0r)Ld<#B0feL7wO9F6qbFk)oi>vbjz6fJKXFSG*F&Z3nV*Culy4yz#tMG;|g<1 z;I)LzyN*pw%kNc6bdjWeirl`DY|*O#w*;mr{4`17ja`6w+$lmGqeIUrpTB5 zhj(LlVCAbWGdbX}2-;-6=}>nbYCl_Rh6axIcP7$J{&qgbEk9d@q;`d6j$(Hd_r_eJ z*pKd`HSm+>@0R4k{`JQ=Qv*NJ+VH-DP(YDQ#I~tL<=%kVBNmyi=mIH3q-3?IDnwjd zu;3$HyA+9{6x-f}=I+@jIlF0Tw>Be*&*rnwr`}hqNZOaWB!&~`Bv`)`Z(}iRTlTxp zPuxQ8J1%f=-cZ+Y)DEjCeTJ!&$Bm-xB1=NrN}ZNx|AzH)TL+?nilYV;{zc7dWe#Qj z9P=A8)On}Y;HH1+AMVMA<;Q^Tdh>@aq=B;sf| zh$a#lNcgf?U;!P>@u=hMUN4T@lbz6*=vt3^^U`)i-6S)>o20x&VuvcnLytU9hB1Cs zxf*BRc{$2$0MBiQ2+x%$SMpUJRw zC}?;>UNmr+xTB-U(;}-;uw~%VF@Ne}NPM-kC1mL&At)03`1cD}@ z1V!Q{Dxk7^58ajedYt!D0&VrkYr0cs(jTS%C-Co$=$3_=s2W?nPOe!Rz|2LTT%ZNh~3yUq`R_BZC zE~#77=)WFsrZ%rx58&s6%Tz4T8J8U9o@V)2Lw|hH`$O@@%^2o3v_K3b z7RAmAGdzMjr*kCt?{}%E?+fc$#6f60!)(sCP3RP%SU>9{+*kDgQH3tyWz>Esj`Qw% zjumse!^l$PyPIWaG-lRih5tz=XSDr}KU%(KQ*c%vh&S9+?snpRzo}BdRs0f-NP-8R zA0gGEr#ub*0}b{pp!xnDdHCj?=uRcH@JMeWaUS(gI;Ms-^A6dtC zJbui#=PQ_zFg6US%dIuZDN2Y>onVsc%Xv+1rW z6h~E+D!}3(^oINm5=0qz~97PrjNCf`USkZ%?!Pt@RM z<>1p?%twI_fK{vgFixYl=Tr=VL8$dWkcvm1Xc_Z z-UUZd7mgoCW_jdf+VnBRaMQWGqOwF&8YW(sr^kEl#Um98Ym{|`6MBIrUa^oku$~Cf z4Pg}z^IF5C3OUGI5fK>YV;Fq8aW;deM{5xjK1h{&cTibs0+ z!w*y@6juL&;l3 zDyD|6`r1$aS#@HshGDV}x9cZP3br4b(+wwvv!I&Nt@hcvcySOig6gwFEgYZ@t;A%P z{pS&-vUe2n(X-VWES~sufL9@O5T+IgK^a{lb4CJmLhW~?11mHzOFw*W6WOvBSUsAY z84Y|1^sqNpSlmF@nhYj0fr(?{E924z3?87$Q+SXeFHpp??A8Rm6Z?J3ST|lM4_k`o zv~}|-UA3K_n#M^$U>G<;?=I9rb4%b`2)1oWPw3CE3F{#Z{VUK%GN7X=H9fx~LAs_p z2y^G%>ez_r40I-%;8IO>w^Us+K>}FZ6IOOO=@og}EGXq_V{4$6Cmc?ETcff`Tn0H) zm&Te|OJ0`Pl+VsoE;bEPP*85l-5ktHF__JsK}{4JwuXm~#6&oWhcyYZC_8D!*E{Al zhUTA_mZH0*c{k7_S%qU|-?j624d57#kqo7K@RPgPJ?;$l$X7s}_|hXdV`%uOG||{@t6%7e-q; ztAq;T50+F{zD_-gDN?7qIzldWq&ai+6+uG=gPM?#(qRMyaouT15NE==epo##;fv8Mr~$>n4*75s;WQNnBty~A zB76$PjdLyKu~vNQ&_HVRKP$e1xPlBGCHj4i+nL=x!I(AU9@6+F@KW@NM6U&Edi8=u z_IWLn%jA0xForuK2z?O`~CXJ*>rwd4@-5a>HFkVRnRTCG>@CFA@s za_o)#0;r8wI;(i5LDq>_oH)lZPmB!t`1lt4H=*riX~X=+{C-S}2)gvwB|hd}rfHBb z3r6JvLk}H_o@!vzv~F-El?D=o`D^SgvL;50Sa`eE4Ap15<_4!3JWkP-H(i++cFAGI zwR{}@xa7l0o=b7|?tfS&v{bi1Cz*Xk8sr$sV&}6FqhBo?3g65tOD&X8gIZF6#!PkA zD<@AZ210?uI8=TNpWIR0MCq3tRwzDW@XNi>9>mdhssKh>==BmeS$h*@vJ>9?Mr(1* zDf>1HSxZ-!_!mWlze|z5r}#-pu)IhDAIFawMydOQQ;(xn)3hVB$i;C4xX;v}!hPd! zCHZCfPL`V?hJcC1laN4`w=+$C0|8N6cPPkv9YcS~G-cE9zf@vcewi3)-TWRf>!r&m(b=xBhU9$RR+vy5P+tB;of z2hZF|!Bo9j0b;>Q29F1X<*IxRp{Hkga|$N&3R!z`Fnj5XWlvc;sZB@Qys5ldqQ?<* z3-ZAkUZSJfLfoYD^{WYfzl=XDe__0W^|?}SjffxPWK$mZv1aI~YJtT-A_ps(S2lsS zm{^Koh3gq)v{GLk5I`R}ToYI$+ty|^Hg>nH-Eb;Bo_dkUNP)!r8nTi{yyi0%@zHY* zCfmacEVyA5iB_riih|XfTK?V^tQ1OGegVk%>`NYW=+2C=D9K!4P83tHDjSk;Nt(US z@8fo^_`4OH*RvM~pLwh04>yPVaUR)XY+}gkN(w_XbYh7z&jwrNS|mcTTx@rczjG8J zh%ivXV`?{aW4g;PkeQ%kxAC5%1V(u38g{VVp%_hfdi^kd;apNjeS$)vjss*1>^;k{ zYWbC!;m*V-m3T}jl`$p})l-vDNOo@|GM{KLT;whS-N-rS{IX}m*6~u}IncVl>jEOJ zP!)ttH2R(oeNs7s9!bX``OJB2JGkltT@A8nL%e-1l~8_g(b?>k*5VFoo@t`1C6n0? zaFmf7$;O=g=j*@gJce~<+-{vu?UwVYu1nrju=sX7L{Qk}Dw29g49yjKuhn&L%B|*6 z>+{Ah{16w7y1mEox~EFZ`S!a$z;0Up!(iRA?Ke3T8#!P`8?2W=SD)B}tp=lFU78j< z1d7H=h<0O5|6BitB8n){iTQ&sODg*5r^jQmNWkRfjYH#)5zJzAH~SL7slJnvv0r0I zHvD{BR|GA;Xz-xgY25o)Zv~JI9RC{k&*Lyrnc?PRlf?RsLZ?rx*F4ZbfDV$9#~Ne` zf8VL}s7zJAIW9P+1yt65rh z+JAUy2T>_Y=N*!U4`vJyYtb0?E2Cv%BsMfj1_jfb2luC=wJ)TrL)-Ic+emd)|1=l4 zE-~6DUEquaeK-n3GsU>eYKDCNi2~H34@rtPu}ve|MF~=CBH@};#mw`NqJ$?lz`6~^ z!!YVCR_gZP*lYE+k-EQL1FH;zsUG=kzT*1O+DT=*S&@_Cgs{TA6tW#0DL<`^_YC}p zRdBK#PFKgo34J9|1Vy9 zAVO(*?58bfGUzqa3@x6p>L9gm)2Ex!W#o@%t(*%sP(a7De*Dii8+VH>Pb1r`8i8j5 z`9a;CUI$!3g(ogOBanJZUs700AcQt0{b1UOMqaM>z=mFQZsO4&didc|$kFDw)rAoC z!{EOG#z9s9KL(Ig&ex{6P~P72HYwshR(PEw#{Q7kM5AgF zqvC|k(F(WJQAV{@xVmz{=$4jCLUF+7OYGeptA3SDfh1=v?}r&Q*Grmj*ma(WP(CTa z&DUo8$v-82pUl=8tlyv<6-c=IpAfWNqxb2HI$O5mOTpM>>>P^56S&s9N4PVAJ3;Pv zF=AA1eX;|x4>cEAR6CU}M3!lZtIo?*Qa&^F>jh;K-pTsjHL61(5pnYIFeX7ixQDhT zMG&&W3MSq#M!c%GT~HP7dT9lSKbhKHMI_7kINYWkK&ZsOPI`g6R zc?AgOEX{Xc8O`twO%{$$_ZZ4RBCw5}{AvT!l4|PM+-2YAe^v&mVW<4e{Sd6-059pxuQPg%hg!w zV0Y2dWntW*z-IKG&mbY{o69c&P39*U8a>Z{#qZvZw&%9emxiVCkiJt z_2V^gDK3xj&4)ER{8zw~4|;Xn`*S&XmxVy+ezG~Gb@Hv)D(a&VAj3=v3j@kEq z35kV5-$JyIT__;dm07OUA7{ft=17~j&?E-wPwuo8?`+s!)%5W-`D*VAe<63frs8LF zE1TP)80dRJ1#ymAeMMn5*e@H`t7EWhAErmnvQuO^u`-^(>UX&IOuDQ=Hxl=vB*kCt zc6I2lcPbDcxKGBtY4=Mm=s}-Arv*W5o)n@Z9cs5*1Y z2+~R?T}Y`NVTAy*ySRWBS&s#+UF3H86v>X;Np-lgrYk{jf`MNQAW%g&znf)B0(HHi zDo=)zn!7A5Xt1SAXt5@P$jr7jlgZ4Ta!vM*g#d^9rb!0dhXA#} z{e})5%xdCtISfY$Q($ESUn>VT%`!WBt|^Q^0A*zq*p{O>9IctR9vTeS$!Koh zKqm-72I7lSctM1`e;yD|Ga*rZRcqOlU6R!3;=V?fSTPEt^V=h^4o6_-RA)w?M?2q+ zie5&6-zd2xDqA0s!xb|2V$@DNSF@kW1wL%MP-82wo=}l-bNs9CK7_D zhLc=?*c zXq=Cp+x2$bZR_5tA(lc8GD2?YDzo;p1N^WBXULH>WmyCDB5wtbu21XM=IC7d4leY# z8K7x`(Y?9}W8(PZpOj00Me*`n4m9m|iJeA_ilW_BS{vJ&+3{p%N zpl9#z=HZCzFVfM+Hv)(n%p?D3j^6@0%&o^^(^9g$quh!N!@nsi2%t7{A4VMDY`xv= zc7?N}ia4@~;z|3pfOrSZ&|v*ccB!Tq2okvJii=SOT=_)@S#$R_Xdw*;roQj2-@drO z9W6`>C?n|YNMu7ToAsuYNV8L8m+wn;!}TilU=;F7 ze!fTrBVFl9Em?aoHCM;ce1=!eptU$Tyy|FAyI7KSd~TMISf8tV4C;#wWFvaLrpeWN@ zjnT4(8c2mX6djWZ&Rheg9an-pUqkRv{WWd-tc)^e(5S#eh3a4J=#gE_XON*tYruc> z1mFS)Q9W{*%*~Fj>$coi2hpYgsSsR9q6}%oK;kwFPt!1R#A-PZnAOzXF8n$AmyDYn zwxoOw|Jj?MZ*G5dtKVIUjXG+9k9M15fUpx3wRfJ8O{kJ3FZ6AJxXJk{uGPBl5|}7- zUEkW`xXpg8!F&gD&)oEpFS^&{TA@m`Rhsb~)2^=78x(rj02UQdILh&5>it8>l= zP1qRebG5o_3%VFWTj)XbX^#ZA-8IpAqTFb*P{%(46|yzDZ!+%vwHci72IzjB_9oG{ z+SK6?1;cMR<%|s_BQrl8pA(U4%vwy!?>1TWv(GU>dYT$cNwAGACC1wj+{^SUFMG$l zJfANxDyR2LK5Qw<7i_i^Tl~jXWj?WKAOt%TPbNaO>)DglQ`uJ^j5FtYX+^!T#HV)! zH_g=5we0je+iFo_{&Y?#^m4Dols~Z6@9{vE-Fb;j!2l`h?Uu0&F_yes3kY#Nq>?rN z&{`taOPrxKV&H9$}zyi zh(Lj^s;pij(RX?t!%c9LpcL1l4BbSbwUkf4mt_gsv3e0^R<>1TXf+0%n5F2F$f$IZ zZ3TVBb9)A%2;S-)eChI`WHw_>GY8Fx5=iLICXr+ZH8RO>4==$<=H~8H4B9`q8HZ}9 zT@}!Hbll5O20bSX?{)WDhli+?W}J#cOf&PD(&;{i6Ja(D8R3?XdcwbS7RO`w31{`G z0LAL$wC%$ug50~<>GDk|&W~R{)*PZMQ@x-ZH)zYP?B02p=2XR#Co1o5PEhgh$y&;C3RE)&m$17Zr_u!3Km3k+EBpk~885K6=ya{}L;-zJXeFH)m@f=l5zvg`H2+*0 z#ud~^gBlz5ha7+BD_j`Uv(?5ZJ4#sFMNk2))uVt~Sskcpa-M_1Y=l2f$+-(U1l?*S zaQ?CpWZ(aWu41FWhiw)aG^}_&H1^v;MGD3j{c2sXHN>)B0ripjdl4N~@8aU7MI$Vn z!kDAa#FZZw&w7PMTEbHqx7sK?+jT4Hh~aHFxKkE%~Y)1Tdx0U-#*=fw@s%P(ekM zKg!9NqwRP=pdaP$XNQ~3v02eX!QOfijHyBjd@43vXpCH&xLB=XdSPPL33k#Yt z#=y+@*oeZ;PxK6|^r6@UzoLZrz2G8}LRBm897~)-l;OL%jJ;6)Qt;MwDb9C}+p`O!{=j}#h!C!-{(kBDFyMqt5HUv zxX4f>MBu1n3`Gqt>dIdf!zqhLKn)rd-LmVSDT8_@j0Fm>`lo#bgoan)ytP@NbMH0$ z-b~r)p|4c+F9}N$;#c-#Mkzl!0^iVCeq7&$rvJ4cH>$w{Z0PLKJZSTD^G=NJiYTt4 zpT8Tb6ShxFFxl@}AKsS!8MPJvC1%jGOY{&JJm| z@2ZryLZ>Z{EygD%+qu<7F5|US4Jm4#1 zmAF|Tb8o#|oDGq3rTJ)lZz6R375s2gD{*Apl_#x>Ptadd98?msQZcU-aCyNeo~0#K zM-d9UwDOv@4ZVQ|?H*1r!1}Pc*t#L0lUtl`2tJC~vQn8*oyWUbEIfqSgJ5YaknLVY zk!bSCCI`qax?7UDw|SY=A0l%(+ZcSGZiR?_6l#-WkJ{$tIBkZTQO&Qrj-B&TmzpaQ zeU44ltoHg$K=&FtgpVEWm-lDHeu#@GDb*#1Y=EPAQ%EL3zmJya_D@TBy|9s}aZUkG z_-9(vbt`}X>aH(xIVgVoXH{GN8+wA?o@?L+;QHWrc!6PqqGqeE|PId+F zcib&v9cM=+7i$WC(_#F&Dj03VH4ALE8-t`d?xRTi+KDPums09J+}5hh>2ni}SzmF_ zWD&!S{&1-!Tu*)J-F5c(Z^gOyDA2%T62N|?7&Uia5ERmWc#uR^&6U`hPSL7F+}hOF z`s+Y$qw@O$ZQW%u$_c$&Tsc6aPa;PvVf;p3W-xgv=)+smcnl+i>UTV?;k&Ki_PIsl zd+gHH`NIf#Ts4jPQB&@5MXJM>{9RYaI)BE9l>w#gKOfi6f}x}Nvw@Fo?|7f(rXKAdomau3m+q~U!0DQSv|=wh!K66H?Im0WrHK0+ zwYRk2`fgW|aNZDSWhx>md*|S<{TdMobZb%%0NO5TtVFA&cz$pBIv_?IuwjD>;~D*1@jXA$yHAnD7~4^wzAyy$VXDnE?H|K=O3uT{sL zL1+Yc6Tri4=VdwT0lG?$OUOmsP$2^)P!LxHJ+bjHjv(syKHqzRI`QEV*VpqJ0^!SS zzv0kv*okk&WV_n~AhlOVgA(*(x?{jVIoQ-Nhqu)|0ku&ARx##V)XtY3-^WJP>axjd8pnBKwd%CO` zzxuFh%7kE+MvQmL62G7ngeZ{;ftKI=KG0-ibj_BpCOTVCf`XM)!P}&Z{5?!(WZ{NN zOPcnGi`c~FvR!aReFGUaqc>|kmIaY6XV>Sl0|;Ojp>Fanp<}1Aq_^!>|=m{f+dtaCKn5C@dHSad|mJk42oK5*^mxH`Kc} zJGC*giuXkYs7yYfNs56hL56%3paIqokxc4EE2CzDp6w^TJd(Aiaoy<%?BRbh3V#@7 z=1Tn3oMrlRx;p>Uv)gT&neIuBIt?hkrQHiA{2(!y2z&yfLX@EDKXtF}^fFi9(PUDS zQYm?$xWvzTQs@`$BN>6d(-+qGXV!<`EU^LYk5KX=2boip)6+F5^2tgq*YFJu+Ssz^ zEZ^IPG`2L_Wqy{ptx5Vm7l+!yVN&kWr|oo>ESE=Dz{B>Ax>q{Z)jO9f_Fhr!ip=qmbifXijz|?X^xfHXS`}*r{RJjHR)~KTy|jscuV{nty*h$_Lj_7D>(Spr$rJJ zk@9bT&nl2H!?qCr>tm-ZxRB|q+K9A%OJ009#f75sEO|k?s2xcYSgOg;CsLMW-`Nc;NSDF9?J6rzPrkCRf-&qSe6i&Rml*Z16Fzv;(05Ydpp?(hclcirh%o{C2GxKgIaU=Jk|>FPYkVp z##h4*K}Fo%D+9qCb$>?-?t_ohvuC13d)Kzrwqt5m0UN-seH3;KrJr2Yj6BMHJSAM8; z;YN#q3vLp#v$^5tx0bxP8|CeQ!t=+L51I13Q9wxwPQ->fEMeNVTG2kKd5JnjPZyg& zaKZotQ0UQ0;s(^vrzbbl9}$ic58I8)@x+@i9gUnQz1REWa%xJO z^|C&r&jL{q-wRi*S3Hv@rq%B4U%|#?_U?;?X=S`Zn)o4(xRvq0FvLGyF$pH;2itEd z_jvZ(FsWy^k?;;){%};mphZH*7u%+xjHZoopnON%nH1OOJGKLem6Ws$XS(>U3sLis z2^);#`6&6{*+UKz{P>rfi}# zcxXVQIW27a{s1m(hbWlbrgvOXp#(<3S6aC%P79TTcPMRjD1%c)1s`P-!DZD=nrWfQ zYj8ih?r}L{j&8Jph8aJWU+@$I;J$Ho z^q(FwYQnmaZYCBH)5<;n04aLJF)y~ZFW~K8ETs5r*A1&V)^o`_qlsecD7~X+mt51R zgyk_9N)z}BSId8RmG^lM+gs~!m3=?mBCu|N!YraGFBZ6%{!8dZ*gx4ABD3ytkun=k z6kZ^sgWa{Gm=i#7Gb*g)e*wxsHNVVhq8O4ETOTUNu*ONED`fEV1UOQ)C&9+A$!l7q zMJsg7E5PBUJb1&-CG{;1?tx;f&Ru0gP&>^-1@w82uyN|p021oJa1B9e+ICM*hf@j<>TzKF zx#>lX9pWPzhm4~IUC}QKjEo`LYP!%94P;=(L=;pf3OpN%2o$>zlD0_uCOo#Z)gW1=!G?ff+nm$;v=of(swMFM#YpJwM^B=+&9oU6@vq9eiw zkKB z#uY!;I9264$i!RrK#uafw z7HH^F$Sw{~GLe~GJM^=VqmC!V@9RO;DUDCxgO>1%i%UKs;8~MJ#ug4kvfI&#$8d51 zFVP(DgmGMh{Av#YiQ?#8(DKG>G&J~K#q9@Vr_M*%jXt^r#;r>%40sXHxqG_hqX#|$ zgpA}Zm*9v8$4@!9z!1obK8t`kc(!0Zs&g2XlaCCwvi_PTb!5$-1%VcWl!-oNaLhsy zzJv2u8hL`7#S%Ey12hTHZ2_k~KQ}*l=ucy0dV0h2oVLy|S7irg^k=&1S8#b70K6

TU$7`UPuDY`hB+j49e{@3=X>M`OyDL7- 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%0D;wW!&k_fB3W6 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 z

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

;-?pVneCe-pzOPOG07L-2(?@;gs`H%$Gt2nu!g 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 yfR27tNB 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%0DvJ>wA3L_4C=nhdx%@l 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

c@E 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 }(0BW}0r8nG1dv#JWTS3?K9HLuuw!oB(o2pn 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 literal 0 HcmV?d00001 From f719c2840e4bc67ca7b5da73410edc2c0924e26f Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Sat, 22 Feb 2020 19:16:09 -0800 Subject: [PATCH 089/154] mac:make a dir --- tools/osx/macosx_bundle.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index e68d2659c..ced5821b0 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -136,7 +136,7 @@ msg "Copying binary executable files." ditto "${CMAKE_BUILD_TYPE}/MacOS" "${MACOS}" msg "Copying Resources directory." -mv AboutThisBuild.txt "${RESOURCES}" +cp AboutThisBuild.txt "${RESOURCES}" ditto "${CMAKE_BUILD_TYPE}/Resources" "${RESOURCES}" echo "\n--------\n" >> "${RESOURCES}/AboutThisBuild.txt" @@ -337,10 +337,11 @@ fi msg "Creating disk image:" if [ ! -z ${FANCY_DMG} ] ; then echo "Building Fancy .dmg" +mkdir "${srcDir}/.background" cp -R "${PROJECT_SOURCE_DATA_DIR}/rtdmg.icns" "${srcDir}/.VolumeIcon.icns" cp -R "${PROJECT_SOURCE_DATA_DIR}/rtdmg-bkgd.png" "${srcDir}/.background/background.png" SetFile -c incC "${srcDir}/.VolumeIcon.icns" -create-dmg ${dmg_name}.dmg "${srcDir}" \ +create-dmg "${dmg_name}.dmg" "${srcDir}" \ --volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" \ --volicon "${srcDir}/.VolumeIcon.icns" \ --sandbox-safe \ From 8329e28bb09992acbd5c05b60dc405d036a1912d Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Sun, 23 Feb 2020 12:13:46 -0800 Subject: [PATCH 090/154] Complete reverting UpdateInfo.cmake --- UpdateInfo.cmake | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/UpdateInfo.cmake b/UpdateInfo.cmake index ce194bfe9..287acff01 100644 --- a/UpdateInfo.cmake +++ b/UpdateInfo.cmake @@ -65,13 +65,13 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) endif() message(STATUS "Git checkout information:") - message(STATUS " Commit description: ${GIT_DESCRIBE}") - message(STATUS " Branch: ${GIT_BRANCH}") - message(STATUS " Commit: ${GIT_COMMIT}") - message(STATUS " Commit date: ${GIT_COMMIT_DATE}") - message(STATUS " Commits since tag: ${GIT_COMMITS_SINCE_TAG}") - message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}") - message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}") + message(STATUS " Commit description: ${GIT_DESCRIBE}") + message(STATUS " Branch: ${GIT_BRANCH}") + message(STATUS " Commit: ${GIT_COMMIT}") + message(STATUS " Commit date: ${GIT_COMMIT_DATE}") + message(STATUS " Commits since tag: ${GIT_COMMITS_SINCE_TAG}") + message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}") + message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}") if(NOT DEFINED CACHE_NAME_SUFFIX) set(CACHE_NAME_SUFFIX "${GIT_DESCRIBE}") @@ -107,8 +107,4 @@ endif(WIN32) # build version.h from template configure_file("${PROJECT_SOURCE_DIR}/rtgui/version.h.in" "${CMAKE_BINARY_DIR}/rtgui/version.h") # build AboutThisBuild.txt from template -if(APPLE) - configure_file("${PROJECT_SOURCE_DIR}/AboutThisBuild.txt.in" "${CMAKE_BINARY_DIR}/AboutThisBuild.txt") -else() - configure_file("${PROJECT_SOURCE_DIR}/AboutThisBuild.txt.in" "${CMAKE_BINARY_DIR}/AboutThisBuild.txt") -endif() +configure_file("${PROJECT_SOURCE_DIR}/AboutThisBuild.txt.in" "${CMAKE_BINARY_DIR}/AboutThisBuild.txt") From f32602b550c806d306ea5a360eb13bc95f01706f Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Sun, 23 Feb 2020 12:15:49 -0800 Subject: [PATCH 091/154] mac:remove obsolete libiconv patches 1.14 and 1.15 keeping 1.16 --- tools/osx/libiconv_1.14_rt.patch | 30 ------------------------------ tools/osx/libiconv_1.15_rt.patch | 30 ------------------------------ 2 files changed, 60 deletions(-) delete mode 100644 tools/osx/libiconv_1.14_rt.patch delete mode 100644 tools/osx/libiconv_1.15_rt.patch diff --git a/tools/osx/libiconv_1.14_rt.patch b/tools/osx/libiconv_1.14_rt.patch deleted file mode 100644 index 7a01b1373..000000000 --- a/tools/osx/libiconv_1.14_rt.patch +++ /dev/null @@ -1,30 +0,0 @@ -diff --git a/lib/iconv.c b/lib/iconv.c -index 3785296..24a0f07 100644 ---- a/lib/iconv.c -+++ b/lib/iconv.c -@@ -607,4 +607,25 @@ strong_alias (libiconv, iconv) - strong_alias (libiconv_close, iconv_close) - #endif - -+#undef iconv_open -+#undef iconv -+#undef iconv_close -+ -+LIBICONV_DLL_EXPORTED iconv_t iconv_open (const char* tocode, const char* fromcode) -+{ -+ return libiconv_open(tocode, fromcode); -+} -+ -+LIBICONV_DLL_EXPORTED size_t iconv (iconv_t icd, -+ ICONV_CONST char * * inbuf, size_t *inbytesleft, -+ char * * outbuf, size_t *outbytesleft) -+{ -+ return libiconv(icd, inbuf, inbytesleft, outbuf, outbytesleft); -+} -+ -+LIBICONV_DLL_EXPORTED int iconv_close (iconv_t icd) -+{ -+ return libiconv_close(icd); -+} -+ - #endif diff --git a/tools/osx/libiconv_1.15_rt.patch b/tools/osx/libiconv_1.15_rt.patch deleted file mode 100644 index ca434154b..000000000 --- a/tools/osx/libiconv_1.15_rt.patch +++ /dev/null @@ -1,30 +0,0 @@ -diff --git a/lib/iconv.c b/lib/iconv.c -index 31853a7..630a498 100644 ---- a/lib/iconv.c -+++ b/lib/iconv.c -@@ -611,4 +611,25 @@ strong_alias (libiconv, iconv) - strong_alias (libiconv_close, iconv_close) - #endif - -+#undef iconv_open -+#undef iconv -+#undef iconv_close -+ -+LIBICONV_DLL_EXPORTED iconv_t iconv_open (const char* tocode, const char* fromcode) -+{ -+ return libiconv_open(tocode, fromcode); -+} -+ -+LIBICONV_DLL_EXPORTED size_t iconv (iconv_t icd, -+ ICONV_CONST char * * inbuf, size_t *inbytesleft, -+ char * * outbuf, size_t *outbytesleft) -+{ -+ return libiconv(icd, inbuf, inbytesleft, outbuf, outbytesleft); -+} -+ -+LIBICONV_DLL_EXPORTED int iconv_close (iconv_t icd) -+{ -+ return libiconv_close(icd); -+} -+ - #endif From 1066546483626dc1fbe44f724921941ee1962a74 Mon Sep 17 00:00:00 2001 From: Benitoite Date: Sun, 23 Feb 2020 12:30:01 -0800 Subject: [PATCH 092/154] revert a change. --- UpdateInfo.cmake | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/UpdateInfo.cmake b/UpdateInfo.cmake index 287acff01..d1f532506 100644 --- a/UpdateInfo.cmake +++ b/UpdateInfo.cmake @@ -65,13 +65,13 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) endif() message(STATUS "Git checkout information:") - message(STATUS " Commit description: ${GIT_DESCRIBE}") - message(STATUS " Branch: ${GIT_BRANCH}") - message(STATUS " Commit: ${GIT_COMMIT}") - message(STATUS " Commit date: ${GIT_COMMIT_DATE}") - message(STATUS " Commits since tag: ${GIT_COMMITS_SINCE_TAG}") - message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}") - message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}") + message(STATUS " Commit description: ${GIT_DESCRIBE}") + message(STATUS " Branch: ${GIT_BRANCH}") + message(STATUS " Commit: ${GIT_COMMIT}") + message(STATUS " Commit date: ${GIT_COMMIT_DATE}") + message(STATUS " Commits since tag: ${GIT_COMMITS_SINCE_TAG}") + message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}") + message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}") if(NOT DEFINED CACHE_NAME_SUFFIX) set(CACHE_NAME_SUFFIX "${GIT_DESCRIBE}") From 4bd6383c0776f28624ef2cd0b327b0b5fe1eca1d Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Sun, 23 Feb 2020 20:35:45 -0800 Subject: [PATCH 093/154] re-indent some scripts w/cmake_format and beautify_bash --- CMakeLists.txt | 345 +++++++++++++++++++++++++------------ UpdateInfo.cmake | 105 +++++++---- tools/osx/macosx_bundle.sh | 332 +++++++++++++++++------------------ 3 files changed, 476 insertions(+), 306 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 00604052e..5998ccb50 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,17 +7,22 @@ endif() # Must stay before the project() command: if(${CMAKE_EXTRA_GENERATOR} MATCHES "Eclipse CDT4") - set(CMAKE_CXX_COMPILER_ARG1 "-std=c++11" CACHE STRING "C++ version for eclipse" FORCE) + set(CMAKE_CXX_COMPILER_ARG1 + "-std=c++11" + CACHE STRING "C++ version for eclipse" FORCE) # Users building with Eclipse should set CMAKE_ECLIPSE_VERSION through the # command line to their current version of Eclipse: - #set(CMAKE_ECLIPSE_VERSION "4.6.0" CACHE STRING "Eclipse version" FORCE) + # set(CMAKE_ECLIPSE_VERSION "4.6.0" CACHE STRING "Eclipse version" FORCE) endif() project(RawTherapee) # The default target is Debug: if(CMAKE_BUILD_TYPE STREQUAL "") - set(CMAKE_BUILD_TYPE Debug CACHE STRING "One of: None Debug Release RelWithDebInfo MinSizeRel" FORCE) + set(CMAKE_BUILD_TYPE + Debug + CACHE STRING "One of: None Debug Release RelWithDebInfo MinSizeRel" + FORCE) endif() string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_CMAKE_BUILD_TYPE) @@ -26,11 +31,15 @@ string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_CMAKE_BUILD_TYPE) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") -if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.9") - message(FATAL_ERROR "Building RawTherapee requires using GCC version 4.9 or higher!") +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION + VERSION_LESS "4.9") + message( + FATAL_ERROR + "Building RawTherapee requires using GCC version 4.9 or higher!") endif() -# We might want to build using the old C++ ABI, even when using a new GCC version: +# We might want to build using the old C++ ABI, even when using a new GCC +# version: if(USE_OLD_CXX_ABI) add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) endif() @@ -46,30 +55,50 @@ message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/") -# Cache name suffix examples: "" = ~/.config/RawTherapee, "5" = ~/.config/RawTherapee-5, "_testing" = ~/.config/RawTherapee_testing -# Use "" for stable releases and "5-dev" for anything else. -set(CACHE_NAME_SUFFIX "" CACHE STRING "RawTherapee's cache folder suffix") +# Cache name suffix examples: "" = ~/.config/RawTherapee, "5" = +# ~/.config/RawTherapee-5, "_testing" = ~/.config/RawTherapee_testing Use "" for +# stable releases and "5-dev" for anything else. +set(CACHE_NAME_SUFFIX + "" + CACHE STRING "RawTherapee's cache folder suffix") -# By default we don't use a specific processor target, so PROC_TARGET_NUMBER is set to 0. -# Specify other values to optimize for specific processor architecture as listed in ProcessorTargets.cmake: -set(PROC_TARGET_NUMBER 0 CACHE STRING "Selected target processor from the list above (taken from ProcessorTargets.cmake)") +# By default we don't use a specific processor target, so PROC_TARGET_NUMBER is +# set to 0. Specify other values to optimize for specific processor architecture +# as listed in ProcessorTargets.cmake: +set(PROC_TARGET_NUMBER + 0 + CACHE + STRING + "Selected target processor from the list above (taken from ProcessorTargets.cmake)" +) # Set special compilation flags for rtengine which get added to CMAKE_CXX_FLAGS: -# Some Linux distros build with -O2 instead of -O3. We explicitly enable auto vectorization by using -ftree-vectorize -set(RTENGINE_CXX_FLAGS "-ftree-vectorize" CACHE STRING "Special compilation flags for RTEngine") +# Some Linux distros build with -O2 instead of -O3. We explicitly enable auto +# vectorization by using -ftree-vectorize +set(RTENGINE_CXX_FLAGS + "-ftree-vectorize" + CACHE STRING "Special compilation flags for RTEngine") # Loads the ProcessorTargets list: include(ProcessorTargets.cmake) -set(PROC_LABEL "undefined" CACHE STRING "Target processor label, unused if PROC_TARGET_NUMBER = 0 or 2") -set(PROC_FLAGS "" CACHE STRING "Target processor related build/link flags") +set(PROC_LABEL + "undefined" + CACHE STRING + "Target processor label, unused if PROC_TARGET_NUMBER = 0 or 2") +set(PROC_FLAGS + "" + CACHE STRING "Target processor related build/link flags") if((NOT (PROC_TARGET_NUMBER EQUAL 0)) AND (NOT (PROC_TARGET_NUMBER EQUAL 2))) set(PROC_LABEL ${PROC_TARGET_${PROC_TARGET_NUMBER}_LABEL}) endif() -if(NOT(PROC_TARGET_NUMBER EQUAL 0)) +if(NOT (PROC_TARGET_NUMBER EQUAL 0)) set(PROC_FLAGS ${PROC_TARGET_${PROC_TARGET_NUMBER}_FLAGS}) endif() if(UNIX AND PROC_LABEL STREQUAL "undefined") - execute_process(COMMAND uname -p OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE cpu) + execute_process( + COMMAND uname -p + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE cpu) if("${cpu}" STREQUAL "unknown") set(PROC_LABEL "${CMAKE_SYSTEM_PROCESSOR}") else() @@ -77,7 +106,8 @@ if(UNIX AND PROC_LABEL STREQUAL "undefined") endif() endif() -# If PROC_FORCED_LABEL exists, its value is loaded in PROC_LABEL to override the one from ProcessorTargets: +# If PROC_FORCED_LABEL exists, its value is loaded in PROC_LABEL to override the +# one from ProcessorTargets: if(DEFINED PROC_FORCED_LABEL) set(PROC_LABEL ${PROC_FORCED_LABEL}) endif() @@ -87,7 +117,8 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PROC_FLAGS}") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${PROC_FLAGS}") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${PROC_FLAGS}") -# Stop compilation on typos such as std:swap (missing colon will be detected as unused label): +# Stop compilation on typos such as std:swap (missing colon will be detected as +# unused label): set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=unused-label") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=delete-incomplete") @@ -106,21 +137,35 @@ endif() include(FindUnalignedMalloc) if(WIN32) - # Add additional paths. Look in the MinGW path first, then in the Gtkmm path. - # If you wish to build some dependent libraries, you have to install them in MinGW to use them: - set(CMAKE_PREFIX_PATH $ENV{MINGW_BASEPATH} $ENV{GTKMM_BASEPATH} CACHE STRING "Additional search paths") + # Add additional paths. Look in the MinGW path first, then in the Gtkmm + # path. If you wish to build some dependent libraries, you have to install + # them in MinGW to use them: + set(CMAKE_PREFIX_PATH + $ENV{MINGW_BASEPATH} $ENV{GTKMM_BASEPATH} + CACHE STRING "Additional search paths") endif() if(APPLE) - if(CMAKE_CXX_COMPILER MATCHES "g\\+\\+-mp-4.[5-8]" OR CMAKE_CXX_COMPILER_ARG1 MATCHES "g\\+\\+-mp-4.[5-8]") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /usr/lib/libstdc++.6.dylib -Wl,-headerpad_max_install_names -mtune=generic") - message(STATUS "CMAKE_CXX_COMPILER is MacPorts GCC.\n CMAKE_EXE_LINKER_FLAGS: ${CMAKE_EXE_LINKER_FLAGS}") + if(CMAKE_CXX_COMPILER MATCHES "g\\+\\+-mp-4.[5-8]" + OR CMAKE_CXX_COMPILER_ARG1 MATCHES "g\\+\\+-mp-4.[5-8]") + set(CMAKE_EXE_LINKER_FLAGS + "${CMAKE_EXE_LINKER_FLAGS} /usr/lib/libstdc++.6.dylib -Wl,-headerpad_max_install_names -mtune=generic" + ) + message( + STATUS + "CMAKE_CXX_COMPILER is MacPorts GCC.\n CMAKE_EXE_LINKER_FLAGS: ${CMAKE_EXE_LINKER_FLAGS}" + ) endif() # Set minimum system version - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-headerpad_max_install_names -mtune=generic") + set(CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}" + ) + set(CMAKE_C_FLAGS + "${CMAKE_C_FLAGS} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}") + set(CMAKE_EXE_LINKER_FLAGS + "${CMAKE_EXE_LINKER_FLAGS} -Wl,-headerpad_max_install_names -mtune=generic" + ) endif() option(USE_EXPERIMENTAL_LANG_VERSIONS "Build with -std=c++0x" OFF) @@ -132,18 +177,33 @@ option(WITH_SAN "Build with run-time sanitizer" OFF) option(WITH_PROF "Build with profiling instrumentation" OFF) option(WITH_SYSTEM_KLT "Build using system KLT library." OFF) option(OPTION_OMP "Build with OpenMP support" ON) -option(STRICT_MUTEX "True (recommended): MyMutex will behave like POSIX Mutex; False: MyMutex will behave like POSIX RecMutex; Note: forced to ON for Debug builds" ON) -option(TRACE_MYRWMUTEX "Trace custom R/W Mutex (Debug builds only); redirecting std::out to a file is strongly recommended!" OFF) -option(AUTO_GDK_FLUSH "Use gdk_flush on all gdk_thread_leave other than the GUI thread; set it ON if you experience X Server warning/errors" OFF) -#option(TARGET32BIT "Build for 32-bit architecture when ON, otherwise 64-bit. Default is OFF" OFF) +option( + STRICT_MUTEX + "True (recommended): MyMutex will behave like POSIX Mutex; False: MyMutex will behave like POSIX RecMutex; Note: forced to ON for Debug builds" + ON) +option( + TRACE_MYRWMUTEX + "Trace custom R/W Mutex (Debug builds only); redirecting std::out to a file is strongly recommended!" + OFF) +option( + AUTO_GDK_FLUSH + "Use gdk_flush on all gdk_thread_leave other than the GUI thread; set it ON if you experience X Server warning/errors" + OFF) +# option(TARGET32BIT "Build for 32-bit architecture when ON, otherwise 64-bit. +# Default is OFF" OFF) option(ENABLE_TCMALLOC "Use the tcmalloc library if available" OFF) -set(TCMALLOC_LIB_DIR "" CACHE PATH "Custom path for the tcmalloc library") +set(TCMALLOC_LIB_DIR + "" + CACHE PATH "Custom path for the tcmalloc library") # Set installation directories: if(WIN32 OR APPLE) if(BUILD_BUNDLE) - message(STATUS "You have set BUILD_BUNDLE=ON but this is not necessary - the option is forced to ON for Windows and macOS.") + message( + STATUS + "You have set BUILD_BUNDLE=ON but this is not necessary - the option is forced to ON for Windows and macOS." + ) endif() set(BUILD_BUNDLE ON FORCE) endif() @@ -281,26 +341,35 @@ if(NOT DEFINED APPDATADIR) endif() endif() -if (NOT APPLE) - if(DEFINED LENSFUNDBDIR AND NOT IS_ABSOLUTE "${LENSFUNDBDIR}") - set(LENSFUNDBDIR "${DATADIR}/${LENSFUNDBDIR}") +if(NOT APPLE) + if(DEFINED LENSFUNDBDIR AND NOT IS_ABSOLUTE "${LENSFUNDBDIR}") + set(LENSFUNDBDIR "${DATADIR}/${LENSFUNDBDIR}") endif() endif() if(APPLE) if("${CODESIGNID}") - set(CODESIGNID "${CODESIGNID}" CACHE STRING "Codesigning Identity") + set(CODESIGNID + "${CODESIGNID}" + CACHE STRING "Codesigning Identity") endif() if("${NOTARY}") - set(NOTARY "${NOTARY}" CACHE STRING "Notarization Identity") + set(NOTARY + "${NOTARY}" + CACHE STRING "Notarization Identity") endif() if("${LOCAL_PREFIX}") - set(LOCAL_PREFIX "${LOCAL_PREFIX}" CACHE STRING "macos/gtk parent directory ie /usr or /opt") + set(LOCAL_PREFIX + "${LOCAL_PREFIX}" + CACHE STRING "macos/gtk parent directory ie /usr or /opt") elseif(NOT DEFINED LOCAL_PREFIX) set(LOCAL_PREFIX "/usr") endif() if("${FANCY_DMG}") - set(FANCY_DMG ON CACHE BOOL "Use the andreyvit/create-dmg script to make a fancy .dmg") + set(FANCY_DMG + ON + CACHE BOOL + "Use the andreyvit/create-dmg script to make a fancy .dmg") endif() endif() @@ -308,7 +377,10 @@ endif() if(NOT BUILD_BUNDLE) foreach(path BINDIR DATADIR LIBDIR DOCDIR CREDITSDIR LICENCEDIR) if(NOT (IS_ABSOLUTE "${${path}}")) - message(FATAL_ERROR "The ${path} path has to be absolute when using -DBUILD_BUNDLE=OFF") + message( + FATAL_ERROR + "The ${path} path has to be absolute when using -DBUILD_BUNDLE=OFF" + ) endif() endforeach() endif() @@ -337,11 +409,11 @@ endif() find_package(PkgConfig) if(WIN32) - pkg_check_modules (GTK REQUIRED gtk+-3.0>=3.22.24) - pkg_check_modules (GTKMM REQUIRED gtkmm-3.0>=3.22) + pkg_check_modules(GTK REQUIRED gtk+-3.0>=3.22.24) + pkg_check_modules(GTKMM REQUIRED gtkmm-3.0>=3.22) else() - pkg_check_modules (GTK REQUIRED gtk+-3.0>=3.16) - pkg_check_modules (GTKMM REQUIRED gtkmm-3.0>=3.16) + pkg_check_modules(GTK REQUIRED gtk+-3.0>=3.16) + pkg_check_modules(GTKMM REQUIRED gtkmm-3.0>=3.16) endif() if(GTK_VERSION VERSION_GREATER "3.24.1" AND GTK_VERSION VERSION_LESS "3.24.7") @@ -350,19 +422,26 @@ if(GTK_VERSION VERSION_GREATER "3.24.1" AND GTK_VERSION VERSION_LESS "3.24.7") else() set(CERTAINTY "likely to") endif() - message(WARNING "\nWarning! You are using GTK+ version " ${GTK_VERSION} " which is " ${CERTAINTY} " have an issue where combobox menu scroll-arrows are missing when a Gtk::ComboBox list does not fit vertically on the screen. As a result, users of your build will not be able to select items in the following comboboxes: Processing Profiles, Film Simulation, and the camera and lens profiles in Profiled Lens Correction.\nIt is recommended that you either downgrade GTK+ to <= 3.24.1 or upgrade to >= 3.24.7.") + message( + WARNING + "\nWarning! You are using GTK+ version " + ${GTK_VERSION} + " which is " + ${CERTAINTY} + " have an issue where combobox menu scroll-arrows are missing when a Gtk::ComboBox list does not fit vertically on the screen. As a result, users of your build will not be able to select items in the following comboboxes: Processing Profiles, Film Simulation, and the camera and lens profiles in Profiled Lens Correction.\nIt is recommended that you either downgrade GTK+ to <= 3.24.1 or upgrade to >= 3.24.7." + ) endif() -pkg_check_modules (GLIB2 REQUIRED glib-2.0>=2.44) -pkg_check_modules (GLIBMM REQUIRED glibmm-2.4>=2.44) -pkg_check_modules (CAIROMM REQUIRED cairomm-1.0) -pkg_check_modules (GIO REQUIRED gio-2.0>=2.44) -pkg_check_modules (GIOMM REQUIRED giomm-2.4>=2.44) -pkg_check_modules (GTHREAD REQUIRED gthread-2.0>=2.44) -pkg_check_modules (GOBJECT REQUIRED gobject-2.0>=2.44) -pkg_check_modules (SIGC REQUIRED sigc++-2.0>=2.3.1) -pkg_check_modules (LENSFUN REQUIRED lensfun>=0.2) -pkg_check_modules (RSVG REQUIRED librsvg-2.0>=2.40) +pkg_check_modules(GLIB2 REQUIRED glib-2.0>=2.44) +pkg_check_modules(GLIBMM REQUIRED glibmm-2.4>=2.44) +pkg_check_modules(CAIROMM REQUIRED cairomm-1.0) +pkg_check_modules(GIO REQUIRED gio-2.0>=2.44) +pkg_check_modules(GIOMM REQUIRED giomm-2.4>=2.44) +pkg_check_modules(GTHREAD REQUIRED gthread-2.0>=2.44) +pkg_check_modules(GOBJECT REQUIRED gobject-2.0>=2.44) +pkg_check_modules(SIGC REQUIRED sigc++-2.0>=2.3.1) +pkg_check_modules(LENSFUN REQUIRED lensfun>=0.2) +pkg_check_modules(RSVG REQUIRED librsvg-2.0>=2.40) if(WIN32) add_definitions(-DWIN32) @@ -389,7 +468,7 @@ if(WITH_SYSTEM_KLT) endif() # Check for libcanberra-gtk3 (sound events on Linux): -if(UNIX AND(NOT APPLE)) +if(UNIX AND (NOT APPLE)) pkg_check_modules(CANBERRA-GTK REQUIRED libcanberra-gtk3) endif() @@ -400,9 +479,12 @@ endif() if(WITH_LTO) # Using LTO with older versions of binutils requires setting extra flags set(BINUTILS_VERSION_MININUM "2.29") - execute_process(COMMAND ar --version OUTPUT_VARIABLE BINUTILS_VERSION_DETECTED) - string(REGEX REPLACE ".* ([0-9.]+)\n.*" "\\1" BINUTILS_VERSION_DETECTED "${BINUTILS_VERSION_DETECTED}") - if("${BINUTILS_VERSION_DETECTED}" VERSION_LESS "${BINUTILS_VERSION_MININUM}") + execute_process(COMMAND ar --version + OUTPUT_VARIABLE BINUTILS_VERSION_DETECTED) + string(REGEX REPLACE ".* ([0-9.]+)\n.*" "\\1" BINUTILS_VERSION_DETECTED + "${BINUTILS_VERSION_DETECTED}") + if("${BINUTILS_VERSION_DETECTED}" VERSION_LESS + "${BINUTILS_VERSION_MININUM}") if(APPLE) if(!CMAKE_AR) set(CMAKE_AR "/opt/local/bin/ar") @@ -414,7 +496,15 @@ if(WITH_LTO) set(CMAKE_AR "/usr/bin/gcc-ar") set(CMAKE_RANLIB "/usr/bin/gcc-ranlib") endif() - message(STATUS "Binutils version detected as less than " ${BINUTILS_VERSION_MININUM} " - setting CMake parameters to enable LTO linking:\n CMAKE_AR=\"" ${CMAKE_AR} "\"\n CMAKE_RANLIB=\"" ${CMAKE_RANLIB} "\"") + message( + STATUS + "Binutils version detected as less than " + ${BINUTILS_VERSION_MININUM} + " - setting CMake parameters to enable LTO linking:\n CMAKE_AR=\"" + ${CMAKE_AR} + "\"\n CMAKE_RANLIB=\"" + ${CMAKE_RANLIB} + "\"") endif() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -flto") @@ -425,7 +515,8 @@ endif() if(WITH_SAN) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=${WITH_SAN}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=${WITH_SAN}") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=${WITH_SAN}") + set(CMAKE_EXE_LINKER_FLAGS + "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=${WITH_SAN}") endif() if(WITH_PROF) @@ -434,11 +525,14 @@ if(WITH_PROF) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") endif() -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wuninitialized -Wcast-qual -Wno-deprecated-declarations -Wno-unused-result -Wunused-macros") +set(CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} -Wall -Wuninitialized -Wcast-qual -Wno-deprecated-declarations -Wno-unused-result -Wunused-macros" +) if(OPTION_OMP) find_package(OpenMP) if(OPENMP_FOUND) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} -Werror=unknown-pragmas") + set(CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} -Werror=unknown-pragmas") endif() endif() @@ -452,13 +546,14 @@ if(OPENMP_FOUND) set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${_f}) endforeach() check_c_source_compiles( -"#include + "#include int main() { fftwf_init_threads(); fftwf_plan_with_nthreads(1); return 0; -}" _fftw3f_multithread) +}" + _fftw3f_multithread) if(_fftw3f_multithread) add_definitions(-DRT_FFTW3F_OMP) else() @@ -476,63 +571,83 @@ get_filename_component(ABS_BINARY_DIR "${CMAKE_BINARY_DIR}" ABSOLUTE) set(OUT_OF_SOURCE_BUILD TRUE) if(ABS_SOURCE_DIR STREQUAL ABS_BINARY_DIR) set(OUT_OF_SOURCE_BUILD FALSE) - message(WARNING "You are performing an in-source build. This is discouraged. For an explanation and the advantages of out-of-source builds, please refer to http://www.cmake.org/Wiki/CMake_FAQ#What_is_an_.22out-of-source.22_build.3F") + message( + WARNING + "You are performing an in-source build. This is discouraged. For an explanation and the advantages of out-of-source builds, please refer to http://www.cmake.org/Wiki/CMake_FAQ#What_is_an_.22out-of-source.22_build.3F" + ) endif() -# Remove files which could require manual work. -# We will remove this after some time to have a clean build system without file modifications in the source tree again. (?) -set(OOSB_FILES "${PROJECT_SOURCE_DIR}/rtdata/rawtherapee.desktop" "${PROJECT_SOURCE_DIR}/rtgui/version.h" "${PROJECT_SOURCE_DIR}/rtgui/config.h" "${PROJECT_SOURCE_DIR}/AboutThisBuild.txt") +# Remove files which could require manual work. We will remove this after some +# time to have a clean build system without file modifications in the source +# tree again. (?) +set(OOSB_FILES + "${PROJECT_SOURCE_DIR}/rtdata/rawtherapee.desktop" + "${PROJECT_SOURCE_DIR}/rtgui/version.h" + "${PROJECT_SOURCE_DIR}/rtgui/config.h" + "${PROJECT_SOURCE_DIR}/AboutThisBuild.txt") if(OUT_OF_SOURCE_BUILD) foreach(f ${OOSB_FILES}) file(REMOVE "${f}") endforeach() endif() -# Check for generated files in the source tree which should not be there when doing an out-of-source build. -# Without checking for this it might happen that old versions are used for the compilation: +# Check for generated files in the source tree which should not be there when +# doing an out-of-source build. Without checking for this it might happen that +# old versions are used for the compilation: if(OUT_OF_SOURCE_BUILD) foreach(f ${OOSB_FILES}) if(EXISTS "${f}") - message(SEND_ERROR "Generated \"${f}\" found inside the source tree. Please remove it as it is a relic of the old build system and prevents valid compilation now.") + message( + SEND_ERROR + "Generated \"${f}\" found inside the source tree. Please remove it as it is a relic of the old build system and prevents valid compilation now." + ) endif() endforeach() endif() -### Start generating AboutThisBuild.txt -# Set the platform bit-depth: +# Start generating AboutThisBuild.txt Set the platform bit-depth: if(CMAKE_SIZEOF_VOID_P EQUAL 4) set(PROC_BIT_DEPTH 32 bits) else() set(PROC_BIT_DEPTH 64 bits) endif() -# Get compiler name and version. -# Only CMake > 2.8.7 knows CMAKE_*_COMPILER_VERSION +# Get compiler name and version. Only CMake > 2.8.7 knows +# CMAKE_*_COMPILER_VERSION if(CMAKE_VERSION VERSION_GREATER 2.8.7) get_filename_component(COMPILER_INFO ${CMAKE_C_COMPILER} NAME_WE) set(COMPILER_INFO "${COMPILER_INFO} ${CMAKE_C_COMPILER_VERSION}") else() - execute_process(COMMAND gcc -dumpversion OUTPUT_VARIABLE GCC_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process( + COMMAND gcc -dumpversion + OUTPUT_VARIABLE GCC_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) set(COMPILER_INFO "gcc ${GCC_VERSION}") endif() -# Get C++ and linker flags for rtengine (the GUI's C++ flags may have fewer flags): -set(CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${UPPER_CMAKE_BUILD_TYPE}} ${RTENGINE_CXX_FLAGS}") -set(LFLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${UPPER_CMAKE_BUILD_TYPE}}") +# Get C++ and linker flags for rtengine (the GUI's C++ flags may have fewer +# flags): +set(CXX_FLAGS + "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${UPPER_CMAKE_BUILD_TYPE}} ${RTENGINE_CXX_FLAGS}" +) +set(LFLAGS + "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${UPPER_CMAKE_BUILD_TYPE}}" +) -set(ABOUT_COMMAND_WITH_ARGS ${CMAKE_COMMAND} - -DPROJECT_SOURCE_DIR:STRING=${PROJECT_SOURCE_DIR} +set(ABOUT_COMMAND_WITH_ARGS + ${CMAKE_COMMAND} -DPROJECT_SOURCE_DIR:STRING=${PROJECT_SOURCE_DIR} -DCACHE_NAME_SUFFIX:STRING=${CACHE_NAME_SUFFIX} -DPROC_LABEL:STRING="${PROC_LABEL}" -DPROC_BIT_DEPTH:STRING="${PROC_BIT_DEPTH}" -DBUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} - -DGTKMM_VERSION:STRING=${GTKMM_VERSION} - -DOPTION_OMP:STRING=${OPTION_OMP} + -DGTKMM_VERSION:STRING=${GTKMM_VERSION} -DOPTION_OMP:STRING=${OPTION_OMP} -DWITH_MYFILE_MMAP:STRING=${WITH_MYFILE_MMAP} -DLENSFUN_VERSION:STRING=${LENSFUN_VERSION}) if(WIN32) - list(APPEND ABOUT_COMMAND_WITH_ARGS -DSYSTEM:STRING=Windows + list( + APPEND + ABOUT_COMMAND_WITH_ARGS + -DSYSTEM:STRING=Windows -DCXX_FLAGS:STRING="${CXX_FLAGS}" -DLFLAGS:STRING="${LFLAGS}" -DCOMPILER_INFO:STRING="${COMPILER_INFO}" @@ -540,39 +655,45 @@ if(WIN32) -DBIT_DEPTH:STRING="${CMAKE_SIZEOF_VOID_P}") elseif(APPLE) list(APPEND ABOUT_COMMAND_WITH_ARGS -DSYSTEM:STRING=Apple - -DCXX_FLAGS:STRING=${CXX_FLAGS} - -DLFLAGS:STRING=${LFLAGS} - -DCOMPILER_INFO:STRING=${COMPILER_INFO}) + -DCXX_FLAGS:STRING=${CXX_FLAGS} -DLFLAGS:STRING=${LFLAGS} + -DCOMPILER_INFO:STRING=${COMPILER_INFO}) else() list(APPEND ABOUT_COMMAND_WITH_ARGS -DSYSTEM:STRING=Linux - -DCXX_FLAGS:STRING=${CXX_FLAGS} - -DLFLAGS:STRING=${LFLAGS} - -DCOMPILER_INFO:STRING=${COMPILER_INFO}) + -DCXX_FLAGS:STRING=${CXX_FLAGS} -DLFLAGS:STRING=${LFLAGS} + -DCOMPILER_INFO:STRING=${COMPILER_INFO}) endif() list(APPEND ABOUT_COMMAND_WITH_ARGS -P "${PROJECT_SOURCE_DIR}/UpdateInfo.cmake") -add_custom_target(UpdateInfo ALL +add_custom_target( + UpdateInfo ALL COMMAND ${ABOUT_COMMAND_WITH_ARGS} COMMENT "Creating AboutThisBuild.txt and other version-dependent files") -### End generating AboutThisBuild.txt +# End generating AboutThisBuild.txt install(FILES AUTHORS.txt DESTINATION "${CREDITSDIR}") install(FILES LICENSE.txt DESTINATION "${LICENCEDIR}") -install(FILES "${CMAKE_BINARY_DIR}/AboutThisBuild.txt" DESTINATION "${CREDITSDIR}") -install(FILES RELEASE_NOTES.txt DESTINATION "${CREDITSDIR}" OPTIONAL) +install(FILES "${CMAKE_BINARY_DIR}/AboutThisBuild.txt" + DESTINATION "${CREDITSDIR}") +install( + FILES RELEASE_NOTES.txt + DESTINATION "${CREDITSDIR}" + OPTIONAL) -# The standard location for man pages in Linux is /usr/share/man -# Use "manpath" to see the search paths for man pages on your system. +# The standard location for man pages in Linux is /usr/share/man Use "manpath" +# to see the search paths for man pages on your system. if(BUILD_BUNDLE) if(APPLE) - install(FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1" DESTINATION "${DATADIR}/man/man1") + install(FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1" + DESTINATION "${DATADIR}/man/man1") else() - install(FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1" DESTINATION "${DATADIR}/share/man/man1") + install(FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1" + DESTINATION "${DATADIR}/share/man/man1") endif() else() - install(FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1" DESTINATION "${CMAKE_INSTALL_PREFIX}/share/man/man1") + install(FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1" + DESTINATION "${CMAKE_INSTALL_PREFIX}/share/man/man1") endif() if(WIN32) @@ -580,7 +701,8 @@ if(WIN32) endif() if(UNIX) - install(FILES com.rawtherapee.RawTherapee.appdata.xml DESTINATION "${APPDATADIR}") + install(FILES com.rawtherapee.RawTherapee.appdata.xml + DESTINATION "${APPDATADIR}") endif() # check whether the used version of lensfun has lfDatabase::LoadDirectory @@ -608,26 +730,31 @@ int main() lfDatabase *db = 0; bool b = db->LoadDirectory(0); return 0; -}" LENSFUN_HAS_LOAD_DIRECTORY) +}" + LENSFUN_HAS_LOAD_DIRECTORY) set(TCMALLOC_LIB_DIR) if(ENABLE_TCMALLOC) if(TCMALLOC_LIB_DIR) - find_library(TCMALLOC_LIBRARIES tcmalloc PATHS ${TCMALLOC_LIB_DIR} NO_DEFAULT_PATH) + find_library(TCMALLOC_LIBRARIES tcmalloc PATHS ${TCMALLOC_LIB_DIR} + NO_DEFAULT_PATH) else() find_library(TCMALLOC_LIBRARIES tcmalloc) endif() if(TCMALLOC_LIBRARIES) message(STATUS "using tcmalloc library in ${TCMALLOC_LIBRARIES}") else() - set(TCMALLOC_LIBRARIES "" CACHE INTERNAL "" FORCE) + set(TCMALLOC_LIBRARIES + "" + CACHE INTERNAL "" FORCE) message(STATUS "tcmalloc not found") endif() else() - set(TCMALLOC_LIBRARIES "" CACHE INTERNAL "" FORCE) + set(TCMALLOC_LIBRARIES + "" + CACHE INTERNAL "" FORCE) endif() - add_subdirectory(rtexif) add_subdirectory(rtengine) add_subdirectory(rtgui) diff --git a/UpdateInfo.cmake b/UpdateInfo.cmake index 287acff01..b809fb2e5 100644 --- a/UpdateInfo.cmake +++ b/UpdateInfo.cmake @@ -1,13 +1,21 @@ # cmakefile executed within a makefile target -# If we find ReleaseInfo.cmake we use the info from there and don't need Git to be installed -find_file(REL_INFO_FILE ReleaseInfo.cmake PATHS "${PROJECT_SOURCE_DIR}" NO_DEFAULT_PATH) +# If we find ReleaseInfo.cmake we use the info from there and don't need Git to +# be installed +find_file( + REL_INFO_FILE ReleaseInfo.cmake + PATHS "${PROJECT_SOURCE_DIR}" + NO_DEFAULT_PATH) if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) # we look for the git command in this paths by order of preference if(WIN32) - find_program(GIT_CMD git.exe HINTS ENV Path PATH_SUFFIXES ../) + find_program( + GIT_CMD git.exe + HINTS ENV Path + PATH_SUFFIXES ../) elseif(APPLE) - find_program(GIT_CMD git PATHS "/opt/local/bin" "/usr/local/bin" "/usr/bin") + find_program(GIT_CMD git PATHS "/opt/local/bin" "/usr/local/bin" + "/usr/bin") find_program(GIT_CMD git) set(SHELL "/bin/bash") else(WIN32) # Linux @@ -22,46 +30,72 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) message(STATUS "git command found: ${GIT_CMD}") endif() - # Get version description. - # Depending on whether you checked out a branch (dev) or a tag (release), - # "git describe" will return "5.0-gtk2-2-g12345678" or "5.0-gtk2", respectively. - execute_process(COMMAND ${GIT_CMD} describe --tags --always OUTPUT_VARIABLE GIT_DESCRIBE OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") + # Get version description. Depending on whether you checked out a branch + # (dev) or a tag (release), "git describe" will return + # "5.0-gtk2-2-g12345678" or "5.0-gtk2", respectively. + execute_process( + COMMAND ${GIT_CMD} describe --tags --always + OUTPUT_VARIABLE GIT_DESCRIBE + OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") - # Get branch name. - # Will return empty if you checked out a commit or tag. Empty string handled later. - execute_process(COMMAND ${GIT_CMD} symbolic-ref --short -q HEAD OUTPUT_VARIABLE GIT_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") + # Get branch name. Will return empty if you checked out a commit or tag. + # Empty string handled later. + execute_process( + COMMAND ${GIT_CMD} symbolic-ref --short -q HEAD + OUTPUT_VARIABLE GIT_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") # Get commit hash. - execute_process(COMMAND ${GIT_CMD} rev-parse --short --verify HEAD OUTPUT_VARIABLE GIT_COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") + execute_process( + COMMAND ${GIT_CMD} rev-parse --short --verify HEAD + OUTPUT_VARIABLE GIT_COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") # Get commit date, YYYY-MM-DD. - execute_process(COMMAND ${GIT_CMD} show -s --format=%cd --date=format:%Y-%m-%d OUTPUT_VARIABLE GIT_COMMIT_DATE OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") + execute_process( + COMMAND ${GIT_CMD} show -s --format=%cd --date=format:%Y-%m-%d + OUTPUT_VARIABLE GIT_COMMIT_DATE OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") # Get number of commits since tagging. This is what "GIT_DESCRIBE" uses. - # Works when checking out branch, tag or commit. - # Get a list of all tags in repo: - execute_process(COMMAND ${GIT_CMD} tag --merged HEAD OUTPUT_VARIABLE GIT_TAG WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") + # Works when checking out branch, tag or commit. Get a list of all tags in + # repo: + execute_process( + COMMAND ${GIT_CMD} tag --merged HEAD + OUTPUT_VARIABLE GIT_TAG + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") # Replace newlines with semicolons so that it can be split: string(REPLACE "\n" ";" GIT_TAG_LIST "${GIT_TAG}") - execute_process(COMMAND ${GIT_CMD} rev-list --count HEAD --not ${GIT_TAG_LIST} OUTPUT_VARIABLE GIT_COMMITS_SINCE_TAG OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") + execute_process( + COMMAND ${GIT_CMD} rev-list --count HEAD --not ${GIT_TAG_LIST} + OUTPUT_VARIABLE GIT_COMMITS_SINCE_TAG OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") - # Get number of commits since branching. - # Works when checking out branch, tag or commit. - execute_process(COMMAND ${GIT_CMD} rev-list --count HEAD --not --tags OUTPUT_VARIABLE GIT_COMMITS_SINCE_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") + # Get number of commits since branching. Works when checking out branch, tag + # or commit. + execute_process( + COMMAND ${GIT_CMD} rev-list --count HEAD --not --tags + OUTPUT_VARIABLE GIT_COMMITS_SINCE_BRANCH + OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") - # If user checked-out something which is not a branch, use the description as branch name. + # If user checked-out something which is not a branch, use the description + # as branch name. if(GIT_BRANCH STREQUAL "") set(GIT_BRANCH "${GIT_DESCRIBE}") endif() - # Create numeric version. - # This version is nonsense, either don't use it at all or use it only where you have no other choice, e.g. Inno Setup's VersionInfoVersion. - # Strip everything after hyphen, e.g. "5.0-gtk2" -> "5.0", "5.1-rc1" -> "5.1" (ergo BS). + # Create numeric version. This version is nonsense, either don't use it at + # all or use it only where you have no other choice, e.g. Inno Setup's + # VersionInfoVersion. Strip everything after hyphen, e.g. "5.0-gtk2" -> + # "5.0", "5.1-rc1" -> "5.1" (ergo BS). if(GIT_COMMITS_SINCE_TAG STREQUAL "") set(GIT_NUMERIC_VERSION_BS "0.0.0") else() string(REGEX REPLACE "-.*" "" GIT_NUMERIC_VERSION_BS ${GIT_DESCRIBE}) - set(GIT_NUMERIC_VERSION_BS "${GIT_NUMERIC_VERSION_BS}.${GIT_COMMITS_SINCE_TAG}") + set(GIT_NUMERIC_VERSION_BS + "${GIT_NUMERIC_VERSION_BS}.${GIT_COMMITS_SINCE_TAG}") endif() message(STATUS "Git checkout information:") @@ -75,7 +109,10 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) if(NOT DEFINED CACHE_NAME_SUFFIX) set(CACHE_NAME_SUFFIX "${GIT_DESCRIBE}") - message(STATUS "CACHE_NAME_SUFFIX was not defined, it is now \"${CACHE_NAME_SUFFIX}\"") + message( + STATUS + "CACHE_NAME_SUFFIX was not defined, it is now \"${CACHE_NAME_SUFFIX}\"" + ) else() message(STATUS "CACHE_NAME_SUFFIX is \"${CACHE_NAME_SUFFIX}\"") endif() @@ -87,7 +124,8 @@ endif(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) if(WIN32) if(BIT_DEPTH EQUAL 4) set(BUILD_BIT_DEPTH 32) - # 32 bits builds has to be installable on 64 bits system, to support WinXP/64. + # 32 bits builds has to be installable on 64 bits system, to support + # WinXP/64. set(ARCHITECTURE_ALLOWED "x86 x64 ia64") # installing in 32 bits mode even on 64 bits OS and architecture set(INSTALL_MODE "") @@ -95,16 +133,21 @@ if(WIN32) set(BUILD_BIT_DEPTH 64) # Restricting the 64 bits builds to 64 bits systems only set(ARCHITECTURE_ALLOWED "x64 ia64") - # installing in 64 bits mode for all 64 bits processors, even for itanium architecture + # installing in 64 bits mode for all 64 bits processors, even for + # itanium architecture set(INSTALL_MODE "x64 ia64") endif(BIT_DEPTH EQUAL 4) # set part of the output archive name set(SYSTEM_NAME "WinVista") - configure_file("${PROJECT_SOURCE_DIR}/tools/win/InnoSetup/WindowsInnoSetup.iss.in" "${CMAKE_BINARY_DIR}/rtdata/WindowsInnoSetup.iss") + configure_file( + "${PROJECT_SOURCE_DIR}/tools/win/InnoSetup/WindowsInnoSetup.iss.in" + "${CMAKE_BINARY_DIR}/rtdata/WindowsInnoSetup.iss") endif(WIN32) # build version.h from template -configure_file("${PROJECT_SOURCE_DIR}/rtgui/version.h.in" "${CMAKE_BINARY_DIR}/rtgui/version.h") +configure_file("${PROJECT_SOURCE_DIR}/rtgui/version.h.in" + "${CMAKE_BINARY_DIR}/rtgui/version.h") # build AboutThisBuild.txt from template -configure_file("${PROJECT_SOURCE_DIR}/AboutThisBuild.txt.in" "${CMAKE_BINARY_DIR}/AboutThisBuild.txt") +configure_file("${PROJECT_SOURCE_DIR}/AboutThisBuild.txt.in" + "${CMAKE_BINARY_DIR}/AboutThisBuild.txt") diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index ced5821b0..64738d283 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -16,79 +16,79 @@ fMagenta="$(tput setaf 5)" fRed="$(tput setaf 1)" function msg { -printf "\\n${fBold}-- %s${fNormal}\\n" "${@}" + printf "\\n${fBold}-- %s${fNormal}\\n" "${@}" } function msgError { -printf "\\n${fBold}Error:${fNormal}\\n%s\\n" "${@}" + printf "\\n${fBold}Error:${fNormal}\\n%s\\n" "${@}" } function GetDependencies { -otool -L "$1" | awk 'NR >= 2 && $1 !~ /^(\/usr\/lib|\/System|@executable_path|@rpath)\// { print $1 }' + otool -L "$1" | awk 'NR >= 2 && $1 !~ /^(\/usr\/lib|\/System|@executable_path|@rpath)\// { print $1 }' } function CheckLink { -GetDependencies "$1" | while read -r; do -local dest="${LIB}/$(basename "${REPLY}")" -test -f "${dest}" || { ditto --arch "${arch}" "${REPLY}" "${dest}"; CheckLink "${dest}"; } -done + GetDependencies "$1" | while read -r; do + local dest="${LIB}/$(basename "${REPLY}")" + test -f "${dest}" || { ditto --arch "${arch}" "${REPLY}" "${dest}"; CheckLink "${dest}"; } + done } function ModifyInstallNames { -find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib|so))' | while read -r x; do -msg "Modifying install names: ${x}" -{ -# id -if [ ${x:(-6)} == ".dylib" ] || [ f${x:(-3)} == ".so" ]; then -install_name_tool -id /Applications/"${LIB}"/$(basename ${x}) ${x} -fi -GetDependencies "${x}" | while read -r y -do -install_name_tool -change ${y} /Applications/"${LIB}"/$(basename ${y}) ${x} -done -} | bash -v -done + find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib|so))' | while read -r x; do + msg "Modifying install names: ${x}" + { + # id + if [ ${x:(-6)} == ".dylib" ] || [ f${x:(-3)} == ".so" ]; then + install_name_tool -id /Applications/"${LIB}"/$(basename ${x}) ${x} + fi + GetDependencies "${x}" | while read -r y + do + install_name_tool -change ${y} /Applications/"${LIB}"/$(basename ${y}) ${x} + done + } | bash -v + done } # Source check if [[ ! -d "${CMAKE_BUILD_TYPE}" ]]; then -msgError "${PWD}/${CMAKE_BUILD_TYPE} folder does not exist. Please execute 'make install' first." -exit 1 + msgError "${PWD}/${CMAKE_BUILD_TYPE} folder does not exist. Please execute 'make install' first." + exit 1 fi # Update project version if [[ -x "$(which git)" && -d "${PROJECT_SOURCE_DIR}/.git" ]]; then -### This section is copied from tools/generateReleaseInfo -# Get version description. -# Depending on whether you checked out a branch (dev) or a tag (release), -# "git describe" will return "5.0-gtk2-2-g12345678" or "5.0-gtk2", respectively. -gitDescribe="$(git describe --tags --always)" - -# Apple requires a numeric version of the form n.n.n -# https://goo.gl/eWDQv6 - -# Get number of commits since tagging. This is what gitDescribe uses. -# Works when checking out branch, tag or commit. -gitCommitsSinceTag="$(git rev-list --count HEAD --not $(git tag --merged HEAD))" - -# Create numeric version. -# This version is nonsense, either don't use it at all or use it only where you have no other choice, e.g. Inno Setup's VersionInfoVersion. -# Strip everything after hyphen, e.g. "5.0-gtk2" -> "5.0", "5.1-rc1" -> "5.1" (ergo BS). -if [[ -z $gitCommitsSinceTag ]]; then -gitVersionNumericBS="0.0.0" -else -gitVersionNumericBS="${gitDescribe%%-*}" # Remove everything after first hyphen. -gitVersionNumericBS="${gitVersionNumericBS}.${gitCommitsSinceTag}" # Remove everything until after first hyphen: 5.0 -fi -### Copy end. - -PROJECT_FULL_VERSION="$gitDescribe" -PROJECT_VERSION="$gitVersionNumericBS" + ### This section is copied from tools/generateReleaseInfo + # Get version description. + # Depending on whether you checked out a branch (dev) or a tag (release), + # "git describe" will return "5.0-gtk2-2-g12345678" or "5.0-gtk2", respectively. + gitDescribe="$(git describe --tags --always)" + + # Apple requires a numeric version of the form n.n.n + # https://goo.gl/eWDQv6 + + # Get number of commits since tagging. This is what gitDescribe uses. + # Works when checking out branch, tag or commit. + gitCommitsSinceTag="$(git rev-list --count HEAD --not $(git tag --merged HEAD))" + + # Create numeric version. + # This version is nonsense, either don't use it at all or use it only where you have no other choice, e.g. Inno Setup's VersionInfoVersion. + # Strip everything after hyphen, e.g. "5.0-gtk2" -> "5.0", "5.1-rc1" -> "5.1" (ergo BS). + if [[ -z $gitCommitsSinceTag ]]; then + gitVersionNumericBS="0.0.0" + else + gitVersionNumericBS="${gitDescribe%%-*}" # Remove everything after first hyphen. + gitVersionNumericBS="${gitVersionNumericBS}.${gitCommitsSinceTag}" # Remove everything until after first hyphen: 5.0 + fi + ### Copy end. + + PROJECT_FULL_VERSION="$gitDescribe" + PROJECT_VERSION="$gitVersionNumericBS" fi MINIMUM_SYSTEM_VERSION="$(otool -l "${CMAKE_BUILD_TYPE}"/MacOS/rawtherapee | grep -A2 'LC_VERSION_MIN_MACOSX' | awk '$1 ~ /version/ { printf $2 }')" if [[ -z "${MINIMUM_SYSTEM_VERSION}" ]]; then -MINIMUM_SYSTEM_VERSION="$(sw_vers -productVersion | cut -d. -f-2)" + MINIMUM_SYSTEM_VERSION="$(sw_vers -productVersion | cut -d. -f-2)" fi arch=x86_64 @@ -111,7 +111,7 @@ CODESIGNID="$(cmake .. -LA -N | grep "CODESIGNID" | cut -d "=" -f2)" NOTARY="$(cmake .. -LA -N | grep "NOTARY" | cut -d "=" -f2)" FANCY_DMG="$(cmake .. -LA -N | grep "FANCY_DMG" | cut -d "=" -f2)" if [[ -n ${FANCY_DMG} ]] ; then -echo "Fancy .dmg build is ON." + echo "Fancy .dmg build is ON." fi APP="${PROJECT_NAME}.app" @@ -212,8 +212,8 @@ ditto {"${LOCAL_PREFIX}/local","${RESOURCES}"}/share/themes/Default/gtk-3.0/gtk- msg "Copy Adwaita icons" iconfolders=("16x16/actions" "16x16/devices" "16x16/mimetypes" "16x16/places" "16x16/status" "48x48/devices") for f in "${iconfolders[@]}"; do -mkdir -p ${RESOURCES}/share/icons/Adwaita/${f} -ditto ${LOCAL_PREFIX}/local/share/icons/Adwaita/${f}/* "${RESOURCES}"/share/icons/Adwaita/${f} + mkdir -p ${RESOURCES}/share/icons/Adwaita/${f} + ditto ${LOCAL_PREFIX}/local/share/icons/Adwaita/${f}/* "${RESOURCES}"/share/icons/Adwaita/${f} done ditto {"${LOCAL_PREFIX}/local","${RESOURCES}"}/share/icons/Adwaita/index.theme "${LOCAL_PREFIX}/local/bin/gtk-update-icon-cache" "${RESOURCES}/share/icons/Adwaita" @@ -263,133 +263,133 @@ ModifyInstallNames # fix @rpath in Frameworks msg "Registering @rpath in Frameworks folder." for frameworklibs in "${LIB}"/*{dylib,so} ; do -install_name_tool -delete_rpath ${LOCAL_PREFIX}/local/lib "${frameworklibs}" -install_name_tool -add_rpath /Applications/"${LIB}" "${frameworklibs}" + install_name_tool -delete_rpath ${LOCAL_PREFIX}/local/lib "${frameworklibs}" + install_name_tool -add_rpath /Applications/"${LIB}" "${frameworklibs}" done install_name_tool -delete_rpath RawTherapee.app/Contents/Frameworks "${EXECUTABLE}"-cli install_name_tool -add_rpath @executable_path "${EXECUTABLE}"-cli # Codesign the app if [ -n "${CODESIGNID}" ] ; then -msg "Codesigning Application." -install -m 0644 "${PROJECT_SOURCE_DATA_DIR}"/rt.entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements -plutil -convert binary1 "${CMAKE_BUILD_TYPE}"/rt.entitlements -mv "${EXECUTABLE}"-cli "${LIB}" -for frameworklibs in "${LIB}"/* ; do -codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee --force --verbose -o runtime --timestamp "${frameworklibs}" -done -codesign --timestamp --strict -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements "${APP}" -spctl -a -vvvv "${APP}" + msg "Codesigning Application." + install -m 0644 "${PROJECT_SOURCE_DATA_DIR}"/rt.entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements + plutil -convert binary1 "${CMAKE_BUILD_TYPE}"/rt.entitlements + mv "${EXECUTABLE}"-cli "${LIB}" + for frameworklibs in "${LIB}"/* ; do + codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee --force --verbose -o runtime --timestamp "${frameworklibs}" + done + codesign --timestamp --strict -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements "${APP}" + spctl -a -vvvv "${APP}" fi # Notarize the app if [ -n "$NOTARY" ] ; then -msg "Notarizing the application:" -ditto -c -k --sequesterRsrc --keepParent "${APP}" "${APP}.zip" -uuid=`xcrun altool --notarize-app --primary-bundle-id "com.rawtherapee.RawTherapee" ${NOTARY} --file "${APP}.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` -echo "Result= $uuid" # Display identifier string -sleep 15 -while : -do -fullstatus=`xcrun altool --notarization-info "$uuid" ${NOTARY} 2>&1` # get the status -status1=`echo "$fullstatus" | grep 'Status\:' | awk '{ print $2 }'` -if [ "$status1" = "success" ]; then -xcrun stapler staple *app # staple the ticket -xcrun stapler validate -v *app -echo "Notarization success" -break -elif [ "$status1" = "in" ]; then -echo "Notarization still in progress, sleeping for 15 seconds and trying again" -sleep 15 -else -echo "Notarization failed fullstatus below" -echo "$fullstatus" -exit 1 -fi -done + msg "Notarizing the application:" + ditto -c -k --sequesterRsrc --keepParent "${APP}" "${APP}.zip" + uuid=`xcrun altool --notarize-app --primary-bundle-id "com.rawtherapee.RawTherapee" ${NOTARY} --file "${APP}.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` + echo "Result= $uuid" # Display identifier string + sleep 15 + while : + do + fullstatus=`xcrun altool --notarization-info "$uuid" ${NOTARY} 2>&1` # get the status + status1=`echo "$fullstatus" | grep 'Status\:' | awk '{ print $2 }'` + if [ "$status1" = "success" ]; then + xcrun stapler staple *app # staple the ticket + xcrun stapler validate -v *app + echo "Notarization success" + break + elif [ "$status1" = "in" ]; then + echo "Notarization still in progress, sleeping for 15 seconds and trying again" + sleep 15 + else + echo "Notarization failed fullstatus below" + echo "$fullstatus" + exit 1 + fi + done fi function CreateDmg { -local srcDir="$(mktemp -dt $$)" - -msg "Preparing disk image sources at ${srcDir}:" -cp -R "${APP}" "${srcDir}" -cp "${RESOURCES}"/share/LICENSE.txt "${srcDir}" -ln -s /Applications "${srcDir}" - -# Web bookmarks -function CreateWebloc { -defaults write "${srcDir}/$1" URL "$2" -mv "${srcDir}/$1".{plist,webloc} -} -CreateWebloc 'Website' 'https://www.rawtherapee.com/' -CreateWebloc 'Documentation' 'https://rawpedia.rawtherapee.com/' -CreateWebloc 'Forum' 'https://discuss.pixls.us/c/software/rawtherapee' -CreateWebloc 'Report Bug' 'https://github.com/Beep6581/RawTherapee/issues/new' - -# Disk image name -dmg_name="${PROJECT_NAME// /_}_OSX_${MINIMUM_SYSTEM_VERSION}_${PROC_BIT_DEPTH}_${PROJECT_FULL_VERSION}" -lower_build_type="$(tr '[:upper:]' '[:lower:]' <<< "$CMAKE_BUILD_TYPE")" -if [[ ${lower_build_type} != release ]]; then -dmg_name="${dmg_name}_${lower_build_type}" -fi - -msg "Creating disk image:" -if [ ! -z ${FANCY_DMG} ] ; then -echo "Building Fancy .dmg" -mkdir "${srcDir}/.background" -cp -R "${PROJECT_SOURCE_DATA_DIR}/rtdmg.icns" "${srcDir}/.VolumeIcon.icns" -cp -R "${PROJECT_SOURCE_DATA_DIR}/rtdmg-bkgd.png" "${srcDir}/.background/background.png" -SetFile -c incC "${srcDir}/.VolumeIcon.icns" -create-dmg "${dmg_name}.dmg" "${srcDir}" \ ---volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" \ ---volicon "${srcDir}/.VolumeIcon.icns" \ ---sandbox-safe \ ---no-internet-enable \ ---eula LICENSE.txt \ ---hdiutil-verbose \ ---rez /Library/Developer/CommandLineTools/usr/bin/Rez -else -hdiutil create -format UDBZ -fs HFS+ -srcdir "${srcDir}" -volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" "${dmg_name}.dmg" -fi - -# Sign disk image -if [ -n "$CODESIGNID" ] ; then -codesign --deep --force -v -s "${CODESIGNID}" --timestamp "${dmg_name}.dmg" -fi - -# Notarize the dmg -if ! test -z "$NOTARY" ; then -msg "Notarizing the dmg:" -zip "${dmg_name}.dmg.zip" "${dmg_name}.dmg" -uuid=`xcrun altool --notarize-app --primary-bundle-id "com.rawtherapee" ${NOTARY} --file "${dmg_name}.dmg.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` -echo "dmg Result= $uuid" # Display identifier string -sleep 15 -while : -do -fullstatus=`xcrun altool --notarization-info "$uuid" ${NOTARY} 2>&1` # get the status -status1=`echo "$fullstatus" | grep 'Status\:' | awk '{ print $2 }'` -if [ "$status1" = "success" ]; then -xcrun stapler staple "${dmg_name}.dmg" # staple the ticket -xcrun stapler validate -v "${dmg_name}.dmg" -echo "dmg Notarization success" -break -elif [ "$status1" = "in" ]; then -echo "dmg Notarization still in progress, sleeping for 15 seconds and trying again" -sleep 15 -else -echo "dmg Notarization failed fullstatus below" -echo "$fullstatus" -exit 1 -fi -done -fi - -# Zip disk image for redistribution -msg "Zipping disk image for redistribution:" -rm "${dmg_name}.dmg" -msg "Removing disk image caches:" -rm -rf "${srcDir}" + local srcDir="$(mktemp -dt $$)" + + msg "Preparing disk image sources at ${srcDir}:" + cp -R "${APP}" "${srcDir}" + cp "${RESOURCES}"/share/LICENSE.txt "${srcDir}" + ln -s /Applications "${srcDir}" + + # Web bookmarks + function CreateWebloc { + defaults write "${srcDir}/$1" URL "$2" + mv "${srcDir}/$1".{plist,webloc} + } + CreateWebloc 'Website' 'https://www.rawtherapee.com/' + CreateWebloc 'Documentation' 'https://rawpedia.rawtherapee.com/' + CreateWebloc 'Forum' 'https://discuss.pixls.us/c/software/rawtherapee' + CreateWebloc 'Report Bug' 'https://github.com/Beep6581/RawTherapee/issues/new' + + # Disk image name + dmg_name="${PROJECT_NAME// /_}_OSX_${MINIMUM_SYSTEM_VERSION}_${PROC_BIT_DEPTH}_${PROJECT_FULL_VERSION}" + lower_build_type="$(tr '[:upper:]' '[:lower:]' <<< "$CMAKE_BUILD_TYPE")" + if [[ ${lower_build_type} != release ]]; then + dmg_name="${dmg_name}_${lower_build_type}" + fi + + msg "Creating disk image:" + if [ ! -z ${FANCY_DMG} ] ; then + echo "Building Fancy .dmg" + mkdir "${srcDir}/.background" + cp -R "${PROJECT_SOURCE_DATA_DIR}/rtdmg.icns" "${srcDir}/.VolumeIcon.icns" + cp -R "${PROJECT_SOURCE_DATA_DIR}/rtdmg-bkgd.png" "${srcDir}/.background/background.png" + SetFile -c incC "${srcDir}/.VolumeIcon.icns" + create-dmg "${dmg_name}.dmg" "${srcDir}" \ + --volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" \ + --volicon "${srcDir}/.VolumeIcon.icns" \ + --sandbox-safe \ + --no-internet-enable \ + --eula LICENSE.txt \ + --hdiutil-verbose \ + --rez /Library/Developer/CommandLineTools/usr/bin/Rez + else + hdiutil create -format UDBZ -fs HFS+ -srcdir "${srcDir}" -volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" "${dmg_name}.dmg" + fi + + # Sign disk image + if [ -n "$CODESIGNID" ] ; then + codesign --deep --force -v -s "${CODESIGNID}" --timestamp "${dmg_name}.dmg" + fi + + # Notarize the dmg + if ! test -z "$NOTARY" ; then + msg "Notarizing the dmg:" + zip "${dmg_name}.dmg.zip" "${dmg_name}.dmg" + uuid=`xcrun altool --notarize-app --primary-bundle-id "com.rawtherapee" ${NOTARY} --file "${dmg_name}.dmg.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` + echo "dmg Result= $uuid" # Display identifier string + sleep 15 + while : + do + fullstatus=`xcrun altool --notarization-info "$uuid" ${NOTARY} 2>&1` # get the status + status1=`echo "$fullstatus" | grep 'Status\:' | awk '{ print $2 }'` + if [ "$status1" = "success" ]; then + xcrun stapler staple "${dmg_name}.dmg" # staple the ticket + xcrun stapler validate -v "${dmg_name}.dmg" + echo "dmg Notarization success" + break + elif [ "$status1" = "in" ]; then + echo "dmg Notarization still in progress, sleeping for 15 seconds and trying again" + sleep 15 + else + echo "dmg Notarization failed fullstatus below" + echo "$fullstatus" + exit 1 + fi + done + fi + + # Zip disk image for redistribution + msg "Zipping disk image for redistribution:" + rm "${dmg_name}.dmg" + msg "Removing disk image caches:" + rm -rf "${srcDir}" } CreateDmg msg "Finishing build:" From 7ddf243693d7a8789c01e3a7a31fd195330d3690 Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Sun, 23 Feb 2020 20:40:15 -0800 Subject: [PATCH 094/154] don't reformat UpdateInfo.cmake --- UpdateInfo.cmake | 119 +++++++++++++++-------------------------------- 1 file changed, 38 insertions(+), 81 deletions(-) diff --git a/UpdateInfo.cmake b/UpdateInfo.cmake index 99235c736..287acff01 100644 --- a/UpdateInfo.cmake +++ b/UpdateInfo.cmake @@ -1,21 +1,13 @@ # cmakefile executed within a makefile target -# If we find ReleaseInfo.cmake we use the info from there and don't need Git to -# be installed -find_file( - REL_INFO_FILE ReleaseInfo.cmake - PATHS "${PROJECT_SOURCE_DIR}" - NO_DEFAULT_PATH) +# If we find ReleaseInfo.cmake we use the info from there and don't need Git to be installed +find_file(REL_INFO_FILE ReleaseInfo.cmake PATHS "${PROJECT_SOURCE_DIR}" NO_DEFAULT_PATH) if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) # we look for the git command in this paths by order of preference if(WIN32) - find_program( - GIT_CMD git.exe - HINTS ENV Path - PATH_SUFFIXES ../) + find_program(GIT_CMD git.exe HINTS ENV Path PATH_SUFFIXES ../) elseif(APPLE) - find_program(GIT_CMD git PATHS "/opt/local/bin" "/usr/local/bin" - "/usr/bin") + find_program(GIT_CMD git PATHS "/opt/local/bin" "/usr/local/bin" "/usr/bin") find_program(GIT_CMD git) set(SHELL "/bin/bash") else(WIN32) # Linux @@ -30,89 +22,60 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) message(STATUS "git command found: ${GIT_CMD}") endif() - # Get version description. Depending on whether you checked out a branch - # (dev) or a tag (release), "git describe" will return - # "5.0-gtk2-2-g12345678" or "5.0-gtk2", respectively. - execute_process( - COMMAND ${GIT_CMD} describe --tags --always - OUTPUT_VARIABLE GIT_DESCRIBE - OUTPUT_STRIP_TRAILING_WHITESPACE - WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") + # Get version description. + # Depending on whether you checked out a branch (dev) or a tag (release), + # "git describe" will return "5.0-gtk2-2-g12345678" or "5.0-gtk2", respectively. + execute_process(COMMAND ${GIT_CMD} describe --tags --always OUTPUT_VARIABLE GIT_DESCRIBE OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") - # Get branch name. Will return empty if you checked out a commit or tag. - # Empty string handled later. - execute_process( - COMMAND ${GIT_CMD} symbolic-ref --short -q HEAD - OUTPUT_VARIABLE GIT_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE - WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") + # Get branch name. + # Will return empty if you checked out a commit or tag. Empty string handled later. + execute_process(COMMAND ${GIT_CMD} symbolic-ref --short -q HEAD OUTPUT_VARIABLE GIT_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") # Get commit hash. - execute_process( - COMMAND ${GIT_CMD} rev-parse --short --verify HEAD - OUTPUT_VARIABLE GIT_COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE - WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") + execute_process(COMMAND ${GIT_CMD} rev-parse --short --verify HEAD OUTPUT_VARIABLE GIT_COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") # Get commit date, YYYY-MM-DD. - execute_process( - COMMAND ${GIT_CMD} show -s --format=%cd --date=format:%Y-%m-%d - OUTPUT_VARIABLE GIT_COMMIT_DATE OUTPUT_STRIP_TRAILING_WHITESPACE - WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") + execute_process(COMMAND ${GIT_CMD} show -s --format=%cd --date=format:%Y-%m-%d OUTPUT_VARIABLE GIT_COMMIT_DATE OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") # Get number of commits since tagging. This is what "GIT_DESCRIBE" uses. - # Works when checking out branch, tag or commit. Get a list of all tags in - # repo: - execute_process( - COMMAND ${GIT_CMD} tag --merged HEAD - OUTPUT_VARIABLE GIT_TAG - WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") + # Works when checking out branch, tag or commit. + # Get a list of all tags in repo: + execute_process(COMMAND ${GIT_CMD} tag --merged HEAD OUTPUT_VARIABLE GIT_TAG WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") # Replace newlines with semicolons so that it can be split: string(REPLACE "\n" ";" GIT_TAG_LIST "${GIT_TAG}") - execute_process( - COMMAND ${GIT_CMD} rev-list --count HEAD --not ${GIT_TAG_LIST} - OUTPUT_VARIABLE GIT_COMMITS_SINCE_TAG OUTPUT_STRIP_TRAILING_WHITESPACE - WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") + execute_process(COMMAND ${GIT_CMD} rev-list --count HEAD --not ${GIT_TAG_LIST} OUTPUT_VARIABLE GIT_COMMITS_SINCE_TAG OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") - # Get number of commits since branching. Works when checking out branch, tag - # or commit. - execute_process( - COMMAND ${GIT_CMD} rev-list --count HEAD --not --tags - OUTPUT_VARIABLE GIT_COMMITS_SINCE_BRANCH - OUTPUT_STRIP_TRAILING_WHITESPACE - WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") + # Get number of commits since branching. + # Works when checking out branch, tag or commit. + execute_process(COMMAND ${GIT_CMD} rev-list --count HEAD --not --tags OUTPUT_VARIABLE GIT_COMMITS_SINCE_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") - # If user checked-out something which is not a branch, use the description - # as branch name. + # If user checked-out something which is not a branch, use the description as branch name. if(GIT_BRANCH STREQUAL "") set(GIT_BRANCH "${GIT_DESCRIBE}") endif() - # Create numeric version. This version is nonsense, either don't use it at - # all or use it only where you have no other choice, e.g. Inno Setup's - # VersionInfoVersion. Strip everything after hyphen, e.g. "5.0-gtk2" -> - # "5.0", "5.1-rc1" -> "5.1" (ergo BS). + # Create numeric version. + # This version is nonsense, either don't use it at all or use it only where you have no other choice, e.g. Inno Setup's VersionInfoVersion. + # Strip everything after hyphen, e.g. "5.0-gtk2" -> "5.0", "5.1-rc1" -> "5.1" (ergo BS). if(GIT_COMMITS_SINCE_TAG STREQUAL "") set(GIT_NUMERIC_VERSION_BS "0.0.0") else() string(REGEX REPLACE "-.*" "" GIT_NUMERIC_VERSION_BS ${GIT_DESCRIBE}) - set(GIT_NUMERIC_VERSION_BS - "${GIT_NUMERIC_VERSION_BS}.${GIT_COMMITS_SINCE_TAG}") + set(GIT_NUMERIC_VERSION_BS "${GIT_NUMERIC_VERSION_BS}.${GIT_COMMITS_SINCE_TAG}") endif() message(STATUS "Git checkout information:") - message(STATUS " Commit description: ${GIT_DESCRIBE}") - message(STATUS " Branch: ${GIT_BRANCH}") - message(STATUS " Commit: ${GIT_COMMIT}") - message(STATUS " Commit date: ${GIT_COMMIT_DATE}") - message(STATUS " Commits since tag: ${GIT_COMMITS_SINCE_TAG}") - message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}") - message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}") + message(STATUS " Commit description: ${GIT_DESCRIBE}") + message(STATUS " Branch: ${GIT_BRANCH}") + message(STATUS " Commit: ${GIT_COMMIT}") + message(STATUS " Commit date: ${GIT_COMMIT_DATE}") + message(STATUS " Commits since tag: ${GIT_COMMITS_SINCE_TAG}") + message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}") + message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}") if(NOT DEFINED CACHE_NAME_SUFFIX) set(CACHE_NAME_SUFFIX "${GIT_DESCRIBE}") - message( - STATUS - "CACHE_NAME_SUFFIX was not defined, it is now \"${CACHE_NAME_SUFFIX}\"" - ) + message(STATUS "CACHE_NAME_SUFFIX was not defined, it is now \"${CACHE_NAME_SUFFIX}\"") else() message(STATUS "CACHE_NAME_SUFFIX is \"${CACHE_NAME_SUFFIX}\"") endif() @@ -124,8 +87,7 @@ endif(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) if(WIN32) if(BIT_DEPTH EQUAL 4) set(BUILD_BIT_DEPTH 32) - # 32 bits builds has to be installable on 64 bits system, to support - # WinXP/64. + # 32 bits builds has to be installable on 64 bits system, to support WinXP/64. set(ARCHITECTURE_ALLOWED "x86 x64 ia64") # installing in 32 bits mode even on 64 bits OS and architecture set(INSTALL_MODE "") @@ -133,21 +95,16 @@ if(WIN32) set(BUILD_BIT_DEPTH 64) # Restricting the 64 bits builds to 64 bits systems only set(ARCHITECTURE_ALLOWED "x64 ia64") - # installing in 64 bits mode for all 64 bits processors, even for - # itanium architecture + # installing in 64 bits mode for all 64 bits processors, even for itanium architecture set(INSTALL_MODE "x64 ia64") endif(BIT_DEPTH EQUAL 4) # set part of the output archive name set(SYSTEM_NAME "WinVista") - configure_file( - "${PROJECT_SOURCE_DIR}/tools/win/InnoSetup/WindowsInnoSetup.iss.in" - "${CMAKE_BINARY_DIR}/rtdata/WindowsInnoSetup.iss") + configure_file("${PROJECT_SOURCE_DIR}/tools/win/InnoSetup/WindowsInnoSetup.iss.in" "${CMAKE_BINARY_DIR}/rtdata/WindowsInnoSetup.iss") endif(WIN32) # build version.h from template -configure_file("${PROJECT_SOURCE_DIR}/rtgui/version.h.in" - "${CMAKE_BINARY_DIR}/rtgui/version.h") +configure_file("${PROJECT_SOURCE_DIR}/rtgui/version.h.in" "${CMAKE_BINARY_DIR}/rtgui/version.h") # build AboutThisBuild.txt from template -configure_file("${PROJECT_SOURCE_DIR}/AboutThisBuild.txt.in" - "${CMAKE_BINARY_DIR}/AboutThisBuild.txt") +configure_file("${PROJECT_SOURCE_DIR}/AboutThisBuild.txt.in" "${CMAKE_BINARY_DIR}/AboutThisBuild.txt") From a0b5cffff55629f4b6a369ea44aee8fa44122d7d Mon Sep 17 00:00:00 2001 From: Benitoite Date: Sun, 23 Feb 2020 20:42:11 -0800 Subject: [PATCH 095/154] re-re-reverting UpdateInfo.cmake --- UpdateInfo.cmake | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/UpdateInfo.cmake b/UpdateInfo.cmake index 287acff01..d1f532506 100644 --- a/UpdateInfo.cmake +++ b/UpdateInfo.cmake @@ -65,13 +65,13 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) endif() message(STATUS "Git checkout information:") - message(STATUS " Commit description: ${GIT_DESCRIBE}") - message(STATUS " Branch: ${GIT_BRANCH}") - message(STATUS " Commit: ${GIT_COMMIT}") - message(STATUS " Commit date: ${GIT_COMMIT_DATE}") - message(STATUS " Commits since tag: ${GIT_COMMITS_SINCE_TAG}") - message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}") - message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}") + message(STATUS " Commit description: ${GIT_DESCRIBE}") + message(STATUS " Branch: ${GIT_BRANCH}") + message(STATUS " Commit: ${GIT_COMMIT}") + message(STATUS " Commit date: ${GIT_COMMIT_DATE}") + message(STATUS " Commits since tag: ${GIT_COMMITS_SINCE_TAG}") + message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}") + message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}") if(NOT DEFINED CACHE_NAME_SUFFIX) set(CACHE_NAME_SUFFIX "${GIT_DESCRIBE}") From 6ccaf4aa5b299d4328364bf7d38bd212e0ae7dbf Mon Sep 17 00:00:00 2001 From: Benitoite Date: Sun, 23 Feb 2020 21:29:00 -0800 Subject: [PATCH 096/154] Tabs to spaces. --- UpdateInfo.cmake | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/UpdateInfo.cmake b/UpdateInfo.cmake index d1f532506..c6f9d6ee3 100644 --- a/UpdateInfo.cmake +++ b/UpdateInfo.cmake @@ -65,13 +65,13 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) endif() message(STATUS "Git checkout information:") - message(STATUS " Commit description: ${GIT_DESCRIBE}") - message(STATUS " Branch: ${GIT_BRANCH}") - message(STATUS " Commit: ${GIT_COMMIT}") - message(STATUS " Commit date: ${GIT_COMMIT_DATE}") - message(STATUS " Commits since tag: ${GIT_COMMITS_SINCE_TAG}") - message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}") - message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}") + message(STATUS " Commit description: ${GIT_DESCRIBE}") + message(STATUS " Branch: ${GIT_BRANCH}") + message(STATUS " Commit: ${GIT_COMMIT}") + message(STATUS " Commit date: ${GIT_COMMIT_DATE}") + message(STATUS " Commits since tag: ${GIT_COMMITS_SINCE_TAG}") + message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}") + message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}") if(NOT DEFINED CACHE_NAME_SUFFIX) set(CACHE_NAME_SUFFIX "${GIT_DESCRIBE}") From e5ad02dd7b8eb864572316d12467e998d6852f91 Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Mon, 24 Feb 2020 06:17:43 -0800 Subject: [PATCH 097/154] mac:xml-beautify plists --- tools/osx/Info.plist.in | 9 ++++----- tools/osx/rt.entitlements | 33 ++++++++++++++++----------------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/tools/osx/Info.plist.in b/tools/osx/Info.plist.in index ee11ba6d7..6970ed4da 100644 --- a/tools/osx/Info.plist.in +++ b/tools/osx/Info.plist.in @@ -1,5 +1,4 @@ - LSEnvironment @@ -38,7 +37,7 @@ ATSApplicationFontsPath etc/fonts LSMultipleInstancesProhibited - + LSMinimumSystemVersion @minimum_macos_version@ CFBundleDevelopmentRegion @@ -60,7 +59,7 @@ CFBundleTypeRole Editor LSIsAppleDefaultForType - + LSItemContentTypes com.rawtherapee.pp3 @@ -172,7 +171,7 @@ @arch@ NSHighResolutionCapable - + NSHumanReadableCopyright Copyright © 2004-2010 Gábor Horváth, 2010-2017 RawTherapee Development Team UTExportedTypeDeclarations @@ -203,4 +202,4 @@ - + \ No newline at end of file diff --git a/tools/osx/rt.entitlements b/tools/osx/rt.entitlements index 61422fae7..c571f1f41 100644 --- a/tools/osx/rt.entitlements +++ b/tools/osx/rt.entitlements @@ -1,20 +1,19 @@ - - - application-identifier - com.rawtherapee.RawTherapee - com.apple.security.temporary-exception.files.absolute-path.read-write - - / - - com.apple.security.cs.allow-dyld-environment-variables - - com.apple.security.files.user-selected.read-write - - com.apple.security.app-sandbox - - com.apple.security.files.downloads.read-write - - + + application-identifier + com.rawtherapee.RawTherapee + com.apple.security.temporary-exception.files.absolute-path.read-write + + / + + com.apple.security.cs.allow-dyld-environment-variables + + com.apple.security.files.user-selected.read-write + + com.apple.security.app-sandbox + + com.apple.security.files.downloads.read-write + + \ No newline at end of file From c7b4f6fc679c17c9ed897ccae9ff6c1c7c8d13ad Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Mon, 24 Feb 2020 10:31:47 -0800 Subject: [PATCH 098/154] mac:use of bash [[ instead of bsd [ --- tools/osx/macosx_bundle.sh | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 64738d283..063dde984 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -39,7 +39,7 @@ function ModifyInstallNames { msg "Modifying install names: ${x}" { # id - if [ ${x:(-6)} == ".dylib" ] || [ f${x:(-3)} == ".so" ]; then + if [[ ${x:(-6)} == ".dylib" ]] || [[ f${x:(-3)} == ".so" ]]; then install_name_tool -id /Applications/"${LIB}"/$(basename ${x}) ${x} fi GetDependencies "${x}" | while read -r y @@ -51,13 +51,13 @@ function ModifyInstallNames { } # Source check -if [[ ! -d "${CMAKE_BUILD_TYPE}" ]]; then +if [[ ! -d ${CMAKE_BUILD_TYPE} ]]; then msgError "${PWD}/${CMAKE_BUILD_TYPE} folder does not exist. Please execute 'make install' first." exit 1 fi # Update project version -if [[ -x "$(which git)" && -d "${PROJECT_SOURCE_DIR}/.git" ]]; then +if [[ -x $(which git) && -d ${PROJECT_SOURCE_DIR}/.git ]]; then ### This section is copied from tools/generateReleaseInfo # Get version description. # Depending on whether you checked out a branch (dev) or a tag (release), @@ -87,7 +87,7 @@ if [[ -x "$(which git)" && -d "${PROJECT_SOURCE_DIR}/.git" ]]; then fi MINIMUM_SYSTEM_VERSION="$(otool -l "${CMAKE_BUILD_TYPE}"/MacOS/rawtherapee | grep -A2 'LC_VERSION_MIN_MACOSX' | awk '$1 ~ /version/ { printf $2 }')" -if [[ -z "${MINIMUM_SYSTEM_VERSION}" ]]; then +if [[ -z ${MINIMUM_SYSTEM_VERSION} ]]; then MINIMUM_SYSTEM_VERSION="$(sw_vers -productVersion | cut -d. -f-2)" fi @@ -110,7 +110,7 @@ EXPATLIB="$(cmake .. -LA -N | grep "pkgcfg_lib_EXPAT_expat" | cut -d "=" -f2)" CODESIGNID="$(cmake .. -LA -N | grep "CODESIGNID" | cut -d "=" -f2)" NOTARY="$(cmake .. -LA -N | grep "NOTARY" | cut -d "=" -f2)" FANCY_DMG="$(cmake .. -LA -N | grep "FANCY_DMG" | cut -d "=" -f2)" -if [[ -n ${FANCY_DMG} ]] ; then +if [[ -n ${FANCY_DMG} ]]; then echo "Fancy .dmg build is ON." fi @@ -262,7 +262,7 @@ ModifyInstallNames # fix @rpath in Frameworks msg "Registering @rpath in Frameworks folder." -for frameworklibs in "${LIB}"/*{dylib,so} ; do +for frameworklibs in "${LIB}"/*{dylib,so}; do install_name_tool -delete_rpath ${LOCAL_PREFIX}/local/lib "${frameworklibs}" install_name_tool -add_rpath /Applications/"${LIB}" "${frameworklibs}" done @@ -270,12 +270,12 @@ install_name_tool -delete_rpath RawTherapee.app/Contents/Frameworks "${EXECUTABL install_name_tool -add_rpath @executable_path "${EXECUTABLE}"-cli # Codesign the app -if [ -n "${CODESIGNID}" ] ; then +if [[ -n ${CODESIGNID} ]]; then msg "Codesigning Application." install -m 0644 "${PROJECT_SOURCE_DATA_DIR}"/rt.entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements plutil -convert binary1 "${CMAKE_BUILD_TYPE}"/rt.entitlements mv "${EXECUTABLE}"-cli "${LIB}" - for frameworklibs in "${LIB}"/* ; do + for frameworklibs in "${LIB}"/*; do codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee --force --verbose -o runtime --timestamp "${frameworklibs}" done codesign --timestamp --strict -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements "${APP}" @@ -283,7 +283,7 @@ if [ -n "${CODESIGNID}" ] ; then fi # Notarize the app -if [ -n "$NOTARY" ] ; then +if [[ -n $NOTARY ]]; then msg "Notarizing the application:" ditto -c -k --sequesterRsrc --keepParent "${APP}" "${APP}.zip" uuid=`xcrun altool --notarize-app --primary-bundle-id "com.rawtherapee.RawTherapee" ${NOTARY} --file "${APP}.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` @@ -293,12 +293,12 @@ if [ -n "$NOTARY" ] ; then do fullstatus=`xcrun altool --notarization-info "$uuid" ${NOTARY} 2>&1` # get the status status1=`echo "$fullstatus" | grep 'Status\:' | awk '{ print $2 }'` - if [ "$status1" = "success" ]; then + if [[ $status1 = "success" ]]; then xcrun stapler staple *app # staple the ticket xcrun stapler validate -v *app echo "Notarization success" break - elif [ "$status1" = "in" ]; then + elif [[ $status1 = "in" ]]; then echo "Notarization still in progress, sleeping for 15 seconds and trying again" sleep 15 else @@ -335,7 +335,7 @@ function CreateDmg { fi msg "Creating disk image:" - if [ ! -z ${FANCY_DMG} ] ; then + if [[ ! -z ${FANCY_DMG} ]]; then echo "Building Fancy .dmg" mkdir "${srcDir}/.background" cp -R "${PROJECT_SOURCE_DATA_DIR}/rtdmg.icns" "${srcDir}/.VolumeIcon.icns" @@ -354,12 +354,12 @@ function CreateDmg { fi # Sign disk image - if [ -n "$CODESIGNID" ] ; then + if [[ -n $CODESIGNID ]]; then codesign --deep --force -v -s "${CODESIGNID}" --timestamp "${dmg_name}.dmg" fi # Notarize the dmg - if ! test -z "$NOTARY" ; then + if ! test -z "$NOTARY"; then msg "Notarizing the dmg:" zip "${dmg_name}.dmg.zip" "${dmg_name}.dmg" uuid=`xcrun altool --notarize-app --primary-bundle-id "com.rawtherapee" ${NOTARY} --file "${dmg_name}.dmg.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` @@ -369,12 +369,12 @@ function CreateDmg { do fullstatus=`xcrun altool --notarization-info "$uuid" ${NOTARY} 2>&1` # get the status status1=`echo "$fullstatus" | grep 'Status\:' | awk '{ print $2 }'` - if [ "$status1" = "success" ]; then + if [[ $status1 = "success" ]]; then xcrun stapler staple "${dmg_name}.dmg" # staple the ticket xcrun stapler validate -v "${dmg_name}.dmg" echo "dmg Notarization success" break - elif [ "$status1" = "in" ]; then + elif [[ $status1 = "in" ]]; then echo "dmg Notarization still in progress, sleeping for 15 seconds and trying again" sleep 15 else From 7ccf6304792fd80ea9249a948046267ce2dfce50 Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Mon, 24 Feb 2020 11:17:48 -0800 Subject: [PATCH 099/154] mac:use of Bash substring removal --- tools/osx/macosx_bundle.sh | 41 +++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 063dde984..2352133a9 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -51,13 +51,13 @@ function ModifyInstallNames { } # Source check -if [[ ! -d ${CMAKE_BUILD_TYPE} ]]; then +if [[ ! -d $CMAKE_BUILD_TYPE ]]; then msgError "${PWD}/${CMAKE_BUILD_TYPE} folder does not exist. Please execute 'make install' first." exit 1 fi # Update project version -if [[ -x $(which git) && -d ${PROJECT_SOURCE_DIR}/.git ]]; then +if [[ -x $(which git) && -d $PROJECT_SOURCE_DIR/.git ]]; then ### This section is copied from tools/generateReleaseInfo # Get version description. # Depending on whether you checked out a branch (dev) or a tag (release), @@ -87,7 +87,7 @@ if [[ -x $(which git) && -d ${PROJECT_SOURCE_DIR}/.git ]]; then fi MINIMUM_SYSTEM_VERSION="$(otool -l "${CMAKE_BUILD_TYPE}"/MacOS/rawtherapee | grep -A2 'LC_VERSION_MIN_MACOSX' | awk '$1 ~ /version/ { printf $2 }')" -if [[ -z ${MINIMUM_SYSTEM_VERSION} ]]; then +if [[ -z $MINIMUM_SYSTEM_VERSION ]]; then MINIMUM_SYSTEM_VERSION="$(sw_vers -productVersion | cut -d. -f-2)" fi @@ -105,12 +105,29 @@ PWD: ${PWD} __EOS__ minimum_macos_version=${MINIMUM_SYSTEM_VERSION} -LOCAL_PREFIX="$(cmake .. -LA -N | grep "LOCAL_PREFIX" | cut -d "=" -f2)" -EXPATLIB="$(cmake .. -LA -N | grep "pkgcfg_lib_EXPAT_expat" | cut -d "=" -f2)" -CODESIGNID="$(cmake .. -LA -N | grep "CODESIGNID" | cut -d "=" -f2)" -NOTARY="$(cmake .. -LA -N | grep "NOTARY" | cut -d "=" -f2)" -FANCY_DMG="$(cmake .. -LA -N | grep "FANCY_DMG" | cut -d "=" -f2)" -if [[ -n ${FANCY_DMG} ]]; then + +# Retreive cached values from cmake + +#In: LOCAL_PREFIX:STRING=/opt +#Out: /opt +LOCAL_PREFIX="$(cmake .. -L -N | grep LOCAL_PREFIX)"; LOCAL_PREFIX="${LOCAL_PREFIX#*=}" + +#In: pkgcfg_lib_EXPAT_expat:FILEPATH=/opt/local/lib/libexpat.dylib +#Out: /opt/local/lib/libexpat.dylib +EXPATLIB="$(cmake .. -LA -N | grep pkgcfg_lib_EXPAT_expat)"; pkgcfg_lib_EXPAT_expat="${pkgcfg_lib_EXPAT_expat#*=}" + +#In: CODESIGNID:STRING=Developer ID Application: Doctor Who (1234567890) +#Out: Developer ID Application: Doctor Who (1234567890) +CODESIGNID="$(cmake .. -L -N | grep CODESIGNID)"; CODESIGNID="${CODESIGNID#*=}" + +#In: NOTARY:STRING=--username drwho@bbc.com --password abcd-efgh-hijk-lmno +#Out: --username drwho@bbc.com --password abcd-efgh-hijk-lmno +NOTARY="$(cmake .. -L -N | grep NOTARY)"; NOTARY="${NOTARY#*=}" + +# In: FANCY_DMG:BOOL=ON +# Out: ON +FANCY_DMG="$(cmake .. -L -N | grep FANCY_DMG)"; FANCY_DMG="${FANCY_DMG#*=}" +if [[ -n $FANCY_DMG ]]; then echo "Fancy .dmg build is ON." fi @@ -270,7 +287,7 @@ install_name_tool -delete_rpath RawTherapee.app/Contents/Frameworks "${EXECUTABL install_name_tool -add_rpath @executable_path "${EXECUTABLE}"-cli # Codesign the app -if [[ -n ${CODESIGNID} ]]; then +if [[ -n $CODESIGNID ]]; then msg "Codesigning Application." install -m 0644 "${PROJECT_SOURCE_DATA_DIR}"/rt.entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements plutil -convert binary1 "${CMAKE_BUILD_TYPE}"/rt.entitlements @@ -330,12 +347,12 @@ function CreateDmg { # Disk image name dmg_name="${PROJECT_NAME// /_}_OSX_${MINIMUM_SYSTEM_VERSION}_${PROC_BIT_DEPTH}_${PROJECT_FULL_VERSION}" lower_build_type="$(tr '[:upper:]' '[:lower:]' <<< "$CMAKE_BUILD_TYPE")" - if [[ ${lower_build_type} != release ]]; then + if [[ $lower_build_type != release ]]; then dmg_name="${dmg_name}_${lower_build_type}" fi msg "Creating disk image:" - if [[ ! -z ${FANCY_DMG} ]]; then + if [[ ! -z $FANCY_DMG ]]; then echo "Building Fancy .dmg" mkdir "${srcDir}/.background" cp -R "${PROJECT_SOURCE_DATA_DIR}/rtdmg.icns" "${srcDir}/.VolumeIcon.icns" From 87136185ec985adbc3450ad54b670fdcf4bc2540 Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Mon, 24 Feb 2020 11:31:46 -0800 Subject: [PATCH 100/154] try git rm on UpdateInfo.cmake --- UpdateInfo.cmake | 110 ----------------------------------------------- 1 file changed, 110 deletions(-) delete mode 100644 UpdateInfo.cmake diff --git a/UpdateInfo.cmake b/UpdateInfo.cmake deleted file mode 100644 index c6f9d6ee3..000000000 --- a/UpdateInfo.cmake +++ /dev/null @@ -1,110 +0,0 @@ -# cmakefile executed within a makefile target - -# If we find ReleaseInfo.cmake we use the info from there and don't need Git to be installed -find_file(REL_INFO_FILE ReleaseInfo.cmake PATHS "${PROJECT_SOURCE_DIR}" NO_DEFAULT_PATH) -if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) - # we look for the git command in this paths by order of preference - if(WIN32) - find_program(GIT_CMD git.exe HINTS ENV Path PATH_SUFFIXES ../) - elseif(APPLE) - find_program(GIT_CMD git PATHS "/opt/local/bin" "/usr/local/bin" "/usr/bin") - find_program(GIT_CMD git) - set(SHELL "/bin/bash") - else(WIN32) # Linux - find_program(GIT_CMD git) - set(SHELL "/bin/bash") - endif(WIN32) - - # Fail if Git is not installed - if(GIT_CMD STREQUAL GIT_CMD-NOTFOUND) - message(FATAL_ERROR "git command not found!") - else() - message(STATUS "git command found: ${GIT_CMD}") - endif() - - # Get version description. - # Depending on whether you checked out a branch (dev) or a tag (release), - # "git describe" will return "5.0-gtk2-2-g12345678" or "5.0-gtk2", respectively. - execute_process(COMMAND ${GIT_CMD} describe --tags --always OUTPUT_VARIABLE GIT_DESCRIBE OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") - - # Get branch name. - # Will return empty if you checked out a commit or tag. Empty string handled later. - execute_process(COMMAND ${GIT_CMD} symbolic-ref --short -q HEAD OUTPUT_VARIABLE GIT_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") - - # Get commit hash. - execute_process(COMMAND ${GIT_CMD} rev-parse --short --verify HEAD OUTPUT_VARIABLE GIT_COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") - - # Get commit date, YYYY-MM-DD. - execute_process(COMMAND ${GIT_CMD} show -s --format=%cd --date=format:%Y-%m-%d OUTPUT_VARIABLE GIT_COMMIT_DATE OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") - - # Get number of commits since tagging. This is what "GIT_DESCRIBE" uses. - # Works when checking out branch, tag or commit. - # Get a list of all tags in repo: - execute_process(COMMAND ${GIT_CMD} tag --merged HEAD OUTPUT_VARIABLE GIT_TAG WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") - # Replace newlines with semicolons so that it can be split: - string(REPLACE "\n" ";" GIT_TAG_LIST "${GIT_TAG}") - execute_process(COMMAND ${GIT_CMD} rev-list --count HEAD --not ${GIT_TAG_LIST} OUTPUT_VARIABLE GIT_COMMITS_SINCE_TAG OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") - - # Get number of commits since branching. - # Works when checking out branch, tag or commit. - execute_process(COMMAND ${GIT_CMD} rev-list --count HEAD --not --tags OUTPUT_VARIABLE GIT_COMMITS_SINCE_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") - - # If user checked-out something which is not a branch, use the description as branch name. - if(GIT_BRANCH STREQUAL "") - set(GIT_BRANCH "${GIT_DESCRIBE}") - endif() - - # Create numeric version. - # This version is nonsense, either don't use it at all or use it only where you have no other choice, e.g. Inno Setup's VersionInfoVersion. - # Strip everything after hyphen, e.g. "5.0-gtk2" -> "5.0", "5.1-rc1" -> "5.1" (ergo BS). - if(GIT_COMMITS_SINCE_TAG STREQUAL "") - set(GIT_NUMERIC_VERSION_BS "0.0.0") - else() - string(REGEX REPLACE "-.*" "" GIT_NUMERIC_VERSION_BS ${GIT_DESCRIBE}) - set(GIT_NUMERIC_VERSION_BS "${GIT_NUMERIC_VERSION_BS}.${GIT_COMMITS_SINCE_TAG}") - endif() - - message(STATUS "Git checkout information:") - message(STATUS " Commit description: ${GIT_DESCRIBE}") - message(STATUS " Branch: ${GIT_BRANCH}") - message(STATUS " Commit: ${GIT_COMMIT}") - message(STATUS " Commit date: ${GIT_COMMIT_DATE}") - message(STATUS " Commits since tag: ${GIT_COMMITS_SINCE_TAG}") - message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}") - message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}") - - if(NOT DEFINED CACHE_NAME_SUFFIX) - set(CACHE_NAME_SUFFIX "${GIT_DESCRIBE}") - message(STATUS "CACHE_NAME_SUFFIX was not defined, it is now \"${CACHE_NAME_SUFFIX}\"") - else() - message(STATUS "CACHE_NAME_SUFFIX is \"${CACHE_NAME_SUFFIX}\"") - endif() - -else(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) - include("${PROJECT_SOURCE_DIR}/ReleaseInfo.cmake") -endif(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) - -if(WIN32) - if(BIT_DEPTH EQUAL 4) - set(BUILD_BIT_DEPTH 32) - # 32 bits builds has to be installable on 64 bits system, to support WinXP/64. - set(ARCHITECTURE_ALLOWED "x86 x64 ia64") - # installing in 32 bits mode even on 64 bits OS and architecture - set(INSTALL_MODE "") - elseif(BIT_DEPTH EQUAL 8) - set(BUILD_BIT_DEPTH 64) - # Restricting the 64 bits builds to 64 bits systems only - set(ARCHITECTURE_ALLOWED "x64 ia64") - # installing in 64 bits mode for all 64 bits processors, even for itanium architecture - set(INSTALL_MODE "x64 ia64") - endif(BIT_DEPTH EQUAL 4) - # set part of the output archive name - set(SYSTEM_NAME "WinVista") - - configure_file("${PROJECT_SOURCE_DIR}/tools/win/InnoSetup/WindowsInnoSetup.iss.in" "${CMAKE_BINARY_DIR}/rtdata/WindowsInnoSetup.iss") -endif(WIN32) - -# build version.h from template -configure_file("${PROJECT_SOURCE_DIR}/rtgui/version.h.in" "${CMAKE_BINARY_DIR}/rtgui/version.h") -# build AboutThisBuild.txt from template -configure_file("${PROJECT_SOURCE_DIR}/AboutThisBuild.txt.in" "${CMAKE_BINARY_DIR}/AboutThisBuild.txt") From 52172a1b6a7150e5145efb8b4308799b54eb15ef Mon Sep 17 00:00:00 2001 From: Richard Barber Date: Mon, 24 Feb 2020 11:34:11 -0800 Subject: [PATCH 101/154] copy UpdateInfo.cmake from fresh clone --- UpdateInfo.cmake | 110 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 UpdateInfo.cmake diff --git a/UpdateInfo.cmake b/UpdateInfo.cmake new file mode 100644 index 000000000..d1f532506 --- /dev/null +++ b/UpdateInfo.cmake @@ -0,0 +1,110 @@ +# cmakefile executed within a makefile target + +# If we find ReleaseInfo.cmake we use the info from there and don't need Git to be installed +find_file(REL_INFO_FILE ReleaseInfo.cmake PATHS "${PROJECT_SOURCE_DIR}" NO_DEFAULT_PATH) +if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) + # we look for the git command in this paths by order of preference + if(WIN32) + find_program(GIT_CMD git.exe HINTS ENV Path PATH_SUFFIXES ../) + elseif(APPLE) + find_program(GIT_CMD git PATHS "/opt/local/bin" "/usr/local/bin" "/usr/bin") + find_program(GIT_CMD git) + set(SHELL "/bin/bash") + else(WIN32) # Linux + find_program(GIT_CMD git) + set(SHELL "/bin/bash") + endif(WIN32) + + # Fail if Git is not installed + if(GIT_CMD STREQUAL GIT_CMD-NOTFOUND) + message(FATAL_ERROR "git command not found!") + else() + message(STATUS "git command found: ${GIT_CMD}") + endif() + + # Get version description. + # Depending on whether you checked out a branch (dev) or a tag (release), + # "git describe" will return "5.0-gtk2-2-g12345678" or "5.0-gtk2", respectively. + execute_process(COMMAND ${GIT_CMD} describe --tags --always OUTPUT_VARIABLE GIT_DESCRIBE OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") + + # Get branch name. + # Will return empty if you checked out a commit or tag. Empty string handled later. + execute_process(COMMAND ${GIT_CMD} symbolic-ref --short -q HEAD OUTPUT_VARIABLE GIT_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") + + # Get commit hash. + execute_process(COMMAND ${GIT_CMD} rev-parse --short --verify HEAD OUTPUT_VARIABLE GIT_COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") + + # Get commit date, YYYY-MM-DD. + execute_process(COMMAND ${GIT_CMD} show -s --format=%cd --date=format:%Y-%m-%d OUTPUT_VARIABLE GIT_COMMIT_DATE OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") + + # Get number of commits since tagging. This is what "GIT_DESCRIBE" uses. + # Works when checking out branch, tag or commit. + # Get a list of all tags in repo: + execute_process(COMMAND ${GIT_CMD} tag --merged HEAD OUTPUT_VARIABLE GIT_TAG WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") + # Replace newlines with semicolons so that it can be split: + string(REPLACE "\n" ";" GIT_TAG_LIST "${GIT_TAG}") + execute_process(COMMAND ${GIT_CMD} rev-list --count HEAD --not ${GIT_TAG_LIST} OUTPUT_VARIABLE GIT_COMMITS_SINCE_TAG OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") + + # Get number of commits since branching. + # Works when checking out branch, tag or commit. + execute_process(COMMAND ${GIT_CMD} rev-list --count HEAD --not --tags OUTPUT_VARIABLE GIT_COMMITS_SINCE_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") + + # If user checked-out something which is not a branch, use the description as branch name. + if(GIT_BRANCH STREQUAL "") + set(GIT_BRANCH "${GIT_DESCRIBE}") + endif() + + # Create numeric version. + # This version is nonsense, either don't use it at all or use it only where you have no other choice, e.g. Inno Setup's VersionInfoVersion. + # Strip everything after hyphen, e.g. "5.0-gtk2" -> "5.0", "5.1-rc1" -> "5.1" (ergo BS). + if(GIT_COMMITS_SINCE_TAG STREQUAL "") + set(GIT_NUMERIC_VERSION_BS "0.0.0") + else() + string(REGEX REPLACE "-.*" "" GIT_NUMERIC_VERSION_BS ${GIT_DESCRIBE}) + set(GIT_NUMERIC_VERSION_BS "${GIT_NUMERIC_VERSION_BS}.${GIT_COMMITS_SINCE_TAG}") + endif() + + message(STATUS "Git checkout information:") + message(STATUS " Commit description: ${GIT_DESCRIBE}") + message(STATUS " Branch: ${GIT_BRANCH}") + message(STATUS " Commit: ${GIT_COMMIT}") + message(STATUS " Commit date: ${GIT_COMMIT_DATE}") + message(STATUS " Commits since tag: ${GIT_COMMITS_SINCE_TAG}") + message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}") + message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}") + + if(NOT DEFINED CACHE_NAME_SUFFIX) + set(CACHE_NAME_SUFFIX "${GIT_DESCRIBE}") + message(STATUS "CACHE_NAME_SUFFIX was not defined, it is now \"${CACHE_NAME_SUFFIX}\"") + else() + message(STATUS "CACHE_NAME_SUFFIX is \"${CACHE_NAME_SUFFIX}\"") + endif() + +else(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) + include("${PROJECT_SOURCE_DIR}/ReleaseInfo.cmake") +endif(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) + +if(WIN32) + if(BIT_DEPTH EQUAL 4) + set(BUILD_BIT_DEPTH 32) + # 32 bits builds has to be installable on 64 bits system, to support WinXP/64. + set(ARCHITECTURE_ALLOWED "x86 x64 ia64") + # installing in 32 bits mode even on 64 bits OS and architecture + set(INSTALL_MODE "") + elseif(BIT_DEPTH EQUAL 8) + set(BUILD_BIT_DEPTH 64) + # Restricting the 64 bits builds to 64 bits systems only + set(ARCHITECTURE_ALLOWED "x64 ia64") + # installing in 64 bits mode for all 64 bits processors, even for itanium architecture + set(INSTALL_MODE "x64 ia64") + endif(BIT_DEPTH EQUAL 4) + # set part of the output archive name + set(SYSTEM_NAME "WinVista") + + configure_file("${PROJECT_SOURCE_DIR}/tools/win/InnoSetup/WindowsInnoSetup.iss.in" "${CMAKE_BINARY_DIR}/rtdata/WindowsInnoSetup.iss") +endif(WIN32) + +# build version.h from template +configure_file("${PROJECT_SOURCE_DIR}/rtgui/version.h.in" "${CMAKE_BINARY_DIR}/rtgui/version.h") +# build AboutThisBuild.txt from template +configure_file("${PROJECT_SOURCE_DIR}/AboutThisBuild.txt.in" "${CMAKE_BINARY_DIR}/AboutThisBuild.txt") From e80426bb2fbfb01453fad7f7fb942d2fca6db40d Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 25 Feb 2020 08:14:51 +0100 Subject: [PATCH 102/154] supress warning in colortemp.cc --- rtengine/colortemp.cc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index 896beafbe..0edd7aeb2 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -29,10 +29,6 @@ #include "settings.h" #include "iccstore.h" -#undef CLIPD -#define CLIPD(a) ((a)>0.0?((a)<1.0?(a):1.0):0.0) -#define CLIPQQ(a) ((a)>0?((a)<250?(a):250):0) -#define MAXR(a,b) ((a) > (b) ? (a) : (b)) namespace rtengine { From 10b85f14cdd83a3b0098527702fda1ec1dbf0666 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 25 Feb 2020 09:04:18 +0100 Subject: [PATCH 103/154] generateTranslationDiffs on default only --- rtdata/languages/default | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index c4a771e0d..a807ba9ea 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -789,16 +789,16 @@ HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor HISTORY_MSG_TRANS_Method;Geometry - Method HISTORY_MSG_WAVCLARI;Clarity -HISTORY_MSG_WAVUSHAMET;Clarity method -HISTORY_MSG_WAVMERGEL;Merge L +HISTORY_MSG_WAVEDGS;Edge stopping HISTORY_MSG_WAVMERGEC;Merge C +HISTORY_MSG_WAVMERGEL;Merge L +HISTORY_MSG_WAVRADIUS;Radius Shadows-Highlight +HISTORY_MSG_WAVSCALE;Scale +HISTORY_MSG_WAVSHOWMASK;Show wavelet mask HISTORY_MSG_WAVSIGMA;Sigma HISTORY_MSG_WAVSOFTRAD;Soft radius clarity HISTORY_MSG_WAVSOFTRADEND;Soft radius final -HISTORY_MSG_WAVSHOWMASK;Show wavelet mask -HISTORY_MSG_WAVEDGS;Edge stopping -HISTORY_MSG_WAVSCALE;Scale -HISTORY_MSG_WAVRADIUS;Radius Shadows-Highlight +HISTORY_MSG_WAVUSHAMET;Clarity method HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -2132,6 +2132,7 @@ TP_WAVELET_CHRO_TOOLTIP;Sets the wavelet level which will be the threshold betwe TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of "contrast levels" and "chroma-contrast link strength" TP_WAVELET_CHSL;Sliders TP_WAVELET_CHTYPE;Chrominance method +TP_WAVELET_CLA;Clarity TP_WAVELET_CLARI;Sharp-mask and Clarity TP_WAVELET_COLORT;Opacity Red-Green TP_WAVELET_COMPCONT;Contrast @@ -2215,8 +2216,8 @@ TP_WAVELET_MEDGREINF;First level TP_WAVELET_MEDI;Reduce artifacts in blue sky TP_WAVELET_MEDILEV;Edge detection TP_WAVELET_MEDILEV_TOOLTIP;When you enable Edge Detection, it is recommanded:\n- to disabled low contrast levels to avoid artifacts,\n- to use high values of gradient sensitivity.\n\nYou can modulate the strength with 'refine' from Denoise and Refine. -TP_WAVELET_MERGEL;Merge Luma TP_WAVELET_MERGEC;Merge Chroma +TP_WAVELET_MERGEL;Merge Luma TP_WAVELET_NEUTRAL;Neutral TP_WAVELET_NOIS;Denoise TP_WAVELET_NOISE;Denoise and Refine @@ -2241,6 +2242,8 @@ TP_WAVELET_RESCONH;Highlights TP_WAVELET_RESID;Residual Image TP_WAVELET_SAT;Saturated chroma TP_WAVELET_SETTINGS;Wavelet Settings +TP_WAVELET_SHA;Sharp mask +TP_WAVELET_SHOWMASK;Show wavelet 'mask' TP_WAVELET_SIGMA;Sigma TP_WAVELET_SKIN;Skin targetting/protection TP_WAVELET_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected. @@ -2261,23 +2264,20 @@ TP_WAVELET_TILESFULL;Full image TP_WAVELET_TILESIZE;Tiling method TP_WAVELET_TILESLIT;Little tiles TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements. +TP_WAVELET_TMEDGS;Edge stopping +TP_WAVELET_TMSCALE;Scale TP_WAVELET_TMSTRENGTH;Compression strength TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. TP_WAVELET_TMTYPE;Compression method -TP_WAVELET_TMEDGS;Edge stopping -TP_WAVELET_TMSCALE;Scale TP_WAVELET_TON;Toning -TP_WAVELET_USHARP;Clarity method TP_WAVELET_USH;None -TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, wavelet settings will be automatically positioned :\nBackground=black, Process=below, level=3...you can change level between 1 and 4.\n\nIf you select Clarity, wavelet settings will be automatically positioned :\nBackground=residual, Process=above, level=7..you can change level between 5 and 10 and wavelet levels. -TP_WAVELET_SHA;Sharp mask -TP_WAVELET_SHOWMASK;Show wavelet 'mask' -TP_WAVELET_CLA;Clarity -TP_WAVELET_USHARP;Sharp method +TP_WAVELET_USHARP;Clarity method TP_WAVELET_USHARP_TOOLTIP;Origin : the source file is the file before Wavelet.\nWavelet : the source file is the file including wavelet threatment +TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, wavelet settings will be automatically positioned :\nBackground=black, Process=below, level=3...you can change level between 1 and 4.\n\nIf you select Clarity, wavelet settings will be automatically positioned :\nBackground=residual, Process=above, level=7..you can change level between 5 and 10 and wavelet levels. TP_WBALANCE_AUTO;Auto -TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation\nThe lower the student value, the better the correlation\nValues below 0.002 are excellent\nValues below 0.005 are very good\nValues below 0.01 are good\nValues below 0.05 are good enough\nValues above 0.5 are poor\nVery good Student test results does not mean that the WB is good, if the illuminant is non-standard the results are erratic. -TP_WBALANCE_STUDLABEL;Student Itcwb: %1 +TP_WBALANCE_AUTOITCGREEN;Auto iterate temperature correlation +TP_WBALANCE_AUTOOLD;Auto RGB grey +TP_WBALANCE_AUTO_HEADER;Autos TP_WBALANCE_CAMERA;Camera TP_WBALANCE_CLOUDY;Cloudy TP_WBALANCE_CUSTOM;Custom @@ -2287,9 +2287,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behavior of "whi TP_WBALANCE_FLASH55;Leica TP_WBALANCE_FLASH60;Standard, Canon, Pentax, Olympus TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta -TP_WBALANCE_AUTO_HEADER;Autos -TP_WBALANCE_AUTOOLD;Auto RGB grey -TP_WBALANCE_AUTOITCGREEN;Auto iterate temperature correlation TP_WBALANCE_FLASH_HEADER;Flash TP_WBALANCE_FLUO1;F1 - Daylight TP_WBALANCE_FLUO2;F2 - Cool White @@ -2322,6 +2319,8 @@ TP_WBALANCE_SOLUX41;Solux 4100K TP_WBALANCE_SOLUX47;Solux 4700K (vendor) TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) TP_WBALANCE_SPOTWB;Use the pipette to pick the white balance from a neutral patch in the preview. +TP_WBALANCE_STUDLABEL;Student Itcwb: %1 +TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation\nThe lower the student value, the better the correlation\nValues below 0.002 are excellent\nValues below 0.005 are very good\nValues below 0.01 are good\nValues below 0.05 are good enough\nValues above 0.5 are poor\nVery good Student test results does not mean that the WB is good, if the illuminant is non-standard the results are erratic. TP_WBALANCE_TEMPBIAS;AWB temperature bias TP_WBALANCE_TEMPBIAS_TOOLTIP;Allows to alter the computation of the "auto white balance"\nby biasing it towards warmer or cooler temperatures. The bias\nis expressed as a percentage of the computed temperature,\nso that the result is given by "computedTemp + computedTemp * bias". TP_WBALANCE_TEMPERATURE;Temperature From 0055d0705d04b014e25b0465cb9be8a60f59295b Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 25 Feb 2020 09:16:11 +0100 Subject: [PATCH 104/154] Removed unnecessary test in rtengine/CMakeLists.txt --- rtengine/CMakeLists.txt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index 8d13f0d6e..5f59da371 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -195,8 +195,4 @@ target_link_libraries(rtengine rtexif ${KLT_LIBRARIES} ) -if(APPLE) - install(FILES ${CAMCONSTSFILE} DESTINATION "${DATADIR}" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ) -else() - install(FILES ${CAMCONSTSFILE} DESTINATION "${DATADIR}" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ) -endif() +install(FILES ${CAMCONSTSFILE} DESTINATION "${DATADIR}" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ) From 326153859a7fa956d59ea00fc8a2b18389540858 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 25 Feb 2020 10:06:35 +0100 Subject: [PATCH 105/154] Removed unnecessarily repeated test expressions --- UpdateInfo.cmake | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/UpdateInfo.cmake b/UpdateInfo.cmake index d1f532506..60e3c16b3 100644 --- a/UpdateInfo.cmake +++ b/UpdateInfo.cmake @@ -10,10 +10,10 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) find_program(GIT_CMD git PATHS "/opt/local/bin" "/usr/local/bin" "/usr/bin") find_program(GIT_CMD git) set(SHELL "/bin/bash") - else(WIN32) # Linux + else() # Linux find_program(GIT_CMD git) set(SHELL "/bin/bash") - endif(WIN32) + endif() # Fail if Git is not installed if(GIT_CMD STREQUAL GIT_CMD-NOTFOUND) @@ -79,10 +79,9 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) else() message(STATUS "CACHE_NAME_SUFFIX is \"${CACHE_NAME_SUFFIX}\"") endif() - -else(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) +else() include("${PROJECT_SOURCE_DIR}/ReleaseInfo.cmake") -endif(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) +endif() if(WIN32) if(BIT_DEPTH EQUAL 4) @@ -97,12 +96,12 @@ if(WIN32) set(ARCHITECTURE_ALLOWED "x64 ia64") # installing in 64 bits mode for all 64 bits processors, even for itanium architecture set(INSTALL_MODE "x64 ia64") - endif(BIT_DEPTH EQUAL 4) + endif() # set part of the output archive name set(SYSTEM_NAME "WinVista") configure_file("${PROJECT_SOURCE_DIR}/tools/win/InnoSetup/WindowsInnoSetup.iss.in" "${CMAKE_BINARY_DIR}/rtdata/WindowsInnoSetup.iss") -endif(WIN32) +endif() # build version.h from template configure_file("${PROJECT_SOURCE_DIR}/rtgui/version.h.in" "${CMAKE_BINARY_DIR}/rtgui/version.h") From 0206b578218c72daf777a3abc346130d28f6ad6d Mon Sep 17 00:00:00 2001 From: Beep6581 Date: Tue, 25 Feb 2020 11:53:20 +0100 Subject: [PATCH 106/154] Update main.yml formatting --- .github/workflows/main.yml | 138 ++++++++++++++++++++----------------- 1 file changed, 73 insertions(+), 65 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 45c877559..a129f1118 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,70 +1,78 @@ name: macOS build - -on: - push - +on: push jobs: build: - runs-on: macos-latest - steps: - - uses: actions/checkout@v1 - - name: Install dependencies - run: brew install gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++ little-cms2 libiptcdata fftw lensfun llvm expat pkgconfig libomp shared-mime-info - - name: patch libiconv - run: | - mkdir libiconv && cd libiconv - wget https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz - tar xf libiconv-1.16.tar.gz - cd libiconv-1.16 - patch -p1 < "${GITHUB_WORKSPACE}/tools/osx/libiconv_1.16_rt.patch" - mkdir build && cd build - destDir="$(pwd)" - ../configure --prefix=/opt/local --disable-static 'CFLAGS=-arch x86_64 -mmacosx-version-min=10.9' 'LDFLAGS=-arch x86_64 -mmacosx-version-min=10.9' CXXFLAGS="-arch x86_64 -mmacosx-version-min=10.9" - make --jobs - make DESTDIR="${destDir}" install - sudo mv opt/local /usr/local/opt/libiconv - - name: cmake - env: - CMAKE_CXX_STANDARD: 11 - PKG_CONFIG_PATH: /usr/local/opt/libffi/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig - RAW_THERAPEE_MAJOR: '5' - RAW_THERAPEE_MINOR: '8' - C_FLAGS: -Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/gdk-pixbuf/include -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/llvm/include - run: | - # GITHUB_REF is the ref that triggered the build, like refs/heads/new-feature - the next line parses that to REF: the branch name only (new-feature) - REF=${GITHUB_REF##*/} - mkdir build && cd build - cmake \ - -DCMAKE_BUILD_TYPE="release" \ - -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ - -DCMAKE_EXE_LINKER_FLAGS="-L/usr/local/lib -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib -L/usr/local/opt/gdk-pixbuf/lib -L/usr/local/opt/libiconv/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib" \ - -DCACHE_NAME_SUFFIX="${RAW_THERAPEE_MAJOR}.${RAW_THERAPEE_MINOR}-${REF}" \ - -DPROC_TARGET_NUMBER="2" \ - -DPROC_LABEL="generic processor" \ - -DWITH_LTO="OFF" \ - -DLENSFUNDBDIR="./share/lensfun" \ - -DOpenMP_C_FLAGS=-fopenmp=libomp \ - -DOpenMP_CXX_FLAGS=-fopenmp=libomp \ - -DOpenMP_C_LIB_NAMES="libomp" \ - -DOpenMP_CXX_LIB_NAMES="libomp" \ - -DOpenMP_libomp_LIBRARY="/usr/local/lib/libomp.dylib" \ - -DOpenMP_C_FLAGS="${C_FLAGS}" \ - -DOpenMP_CXX_FLAGS="${C_FLAGS}" \ - -DCMAKE_AR="/usr/local/opt/llvm/bin/llvm-ar" \ - -DCMAKE_RANLIB="/usr/local/opt/llvm/bin/llvm-ranlib" \ - -DCMAKE_OSX_DEPLOYMENT_TARGET="10.11" - .. - make --jobs - make install - sudo make macosx_bundle - ARTIFACT=(RawTherapee*.zip) - echo "=== artifact: ${ARTIFACT}" - # defining environment variables for next step as per https://github.com/actions/starter-workflows/issues/68 - echo "::set-env name=ARTIFACT_PATH::${GITHUB_WORKSPACE}/build/${ARTIFACT}" - echo "::set-env name=ARTIFACT_FILE::${ARTIFACT}" - - uses: actions/upload-artifact@v1 - with: - name: ${{env.ARTIFACT_FILE}} - path: ${{env.ARTIFACT_PATH}} + - uses: actions/checkout@v1 + - name: Install dependencies + run: > + brew install gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme + libsigc++ little-cms2 libiptcdata fftw lensfun llvm expat pkgconfig + libomp shared-mime-info + - name: patch libiconv + run: | + mkdir libiconv && cd libiconv + wget https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz + tar xf libiconv-1.16.tar.gz + cd libiconv-1.16 + patch -p1 < "${GITHUB_WORKSPACE}/tools/osx/libiconv_1.16_rt.patch" + mkdir build && cd build + destDir="$(pwd)" + ../configure --prefix=/opt/local --disable-static \ + CFLAGS='-arch x86_64 -mmacosx-version-min=10.9' \ + LDFLAGS='-arch x86_64 -mmacosx-version-min=10.9' \ + CXXFLAGS='-arch x86_64 -mmacosx-version-min=10.9' + make --jobs + make DESTDIR="${destDir}" install + sudo mv opt/local /usr/local/opt/libiconv + - name: cmake + env: + CMAKE_CXX_STANDARD: 11 + PKG_CONFIG_PATH: /usr/local/opt/libffi/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig + RAW_THERAPEE_MAJOR: '5' + RAW_THERAPEE_MINOR: '8' + C_FLAGS: > + -Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib + -I/usr/local/include -I/usr/local/opt/gdk-pixbuf/include + -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include + -I/usr/local/opt/expat/include -I/usr/local/opt/llvm/include + run: | + # GITHUB_REF is the ref that triggered the build, like + # refs/heads/new-feature - the next line parses that to REF: the branch + # name only (new-feature) + REF=${GITHUB_REF##*/} + mkdir build && cd build + cmake \ + -DCMAKE_BUILD_TYPE="release" \ + -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ + -DCMAKE_EXE_LINKER_FLAGS="-L/usr/local/lib -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib -L/usr/local/opt/gdk-pixbuf/lib -L/usr/local/opt/libiconv/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib" \ + -DCACHE_NAME_SUFFIX="${RAW_THERAPEE_MAJOR}.${RAW_THERAPEE_MINOR}-${REF}" \ + -DPROC_TARGET_NUMBER="2" \ + -DPROC_LABEL="generic processor" \ + -DWITH_LTO="OFF" \ + -DLENSFUNDBDIR="./share/lensfun" \ + -DOpenMP_C_FLAGS=-fopenmp=libomp \ + -DOpenMP_CXX_FLAGS=-fopenmp=libomp \ + -DOpenMP_C_LIB_NAMES="libomp" \ + -DOpenMP_CXX_LIB_NAMES="libomp" \ + -DOpenMP_libomp_LIBRARY="/usr/local/lib/libomp.dylib" \ + -DOpenMP_C_FLAGS="${C_FLAGS}" \ + -DOpenMP_CXX_FLAGS="${C_FLAGS}" \ + -DCMAKE_AR="/usr/local/opt/llvm/bin/llvm-ar" \ + -DCMAKE_RANLIB="/usr/local/opt/llvm/bin/llvm-ranlib" \ + -DCMAKE_OSX_DEPLOYMENT_TARGET="10.11" + .. + make --jobs + make install + sudo make macosx_bundle + ARTIFACT=(RawTherapee*.zip) + echo "=== artifact: ${ARTIFACT}" + # defining environment variables for next step as per + # https://github.com/actions/starter-workflows/issues/68 + echo "::set-env name=ARTIFACT_PATH::${GITHUB_WORKSPACE}/build/${ARTIFACT}" + echo "::set-env name=ARTIFACT_FILE::${ARTIFACT}" + - uses: actions/upload-artifact@v1 + with: + name: ${{env.ARTIFACT_FILE}} + path: ${{env.ARTIFACT_PATH}} From cdf4e6329dc4bfa25bc6b84b5c55c343b25df308 Mon Sep 17 00:00:00 2001 From: Beep6581 Date: Tue, 25 Feb 2020 11:53:49 +0100 Subject: [PATCH 107/154] Update main.yml fixes possible bug - missing continuation character --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a129f1118..46808ae40 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -61,7 +61,7 @@ jobs: -DOpenMP_CXX_FLAGS="${C_FLAGS}" \ -DCMAKE_AR="/usr/local/opt/llvm/bin/llvm-ar" \ -DCMAKE_RANLIB="/usr/local/opt/llvm/bin/llvm-ranlib" \ - -DCMAKE_OSX_DEPLOYMENT_TARGET="10.11" + -DCMAKE_OSX_DEPLOYMENT_TARGET="10.11" \ .. make --jobs make install From eeb24af8f0d9c76b107d4758412aec6a7427cae7 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 25 Feb 2020 12:48:23 +0100 Subject: [PATCH 108/154] Suppress message in console except verbose --- rtengine/improccoordinator.cc | 12 +++++++++--- rtengine/rawimagesource.cc | 4 +++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index d8d38e14a..f5bdbbc5d 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -255,7 +255,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) RAWParams rp = params->raw; ColorManagementParams cmp = params->icm; LCurveParams lcur = params->labCurve; - printf("metwb2=%s \n", params->wb.method.c_str()); + if (settings->verbose) { + printf("metwb2=%s \n", params->wb.method.c_str()); + } if (!highDetailNeeded) { // if below 100% magnification, take a fast path @@ -419,7 +421,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) bool autowb = false; autowb = (params->wb.method == "autold" || params->wb.method == "aut" || params->wb.method == "autosdw" || params->wb.method == "autedgsdw" || params->wb.method == "autitcgreen" || params->wb.method == "autedgrob" || params->wb.method == "autedg" || params->wb.method == "autorobust"); - printf("automethod=%s \n", params->wb.method.c_str()); + if (settings->verbose) { + printf("automethod=%s \n", params->wb.method.c_str()); + } if (todo & (M_INIT | M_LINDENOISE | M_HDR)) { MyMutex::MyLock initLock(minit); // Also used in crop window @@ -447,7 +451,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) currWBitc = imgsrc->getWB(); double tempref = currWBitc.getTemp() * (1. + params->wb.tempBias); double greenref = currWBitc.getGreen(); - printf("tempref=%f greref=%f\n", tempref, greenref); + if (settings->verbose) { + printf("tempref=%f greref=%f\n", tempref, greenref); + } imgsrc->getAutoWBMultipliersitc(tempref, greenref, tempitc, greenitc, studgood, 0, 0, fh, fw, 0, 0, fh, fw, rm, gm, bm, params->wb, params->icm, params->raw); diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 03992a648..9f7c08a8d 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -7034,7 +7034,9 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } - printf("ITCWB tempitc=%f gritc=%f stud=%f \n", tempitc, greenitc, studgood); + if (settings->verbose) { + printf("ITCWB tempitc=%f gritc=%f stud=%f \n", tempitc, greenitc, studgood); + } xc(0, 0); From 352873ea30d0c85c77f25c65b2a8a1818e71cec3 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 25 Feb 2020 13:19:52 +0100 Subject: [PATCH 109/154] Suppress dispaly Student itcwb in Pick --- rtengine/improccoordinator.cc | 4 ++-- rtgui/whitebalance.cc | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index f5bdbbc5d..0ed8b1f97 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -494,9 +494,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } // if (params->wb.method == "Auto" && awbListener && params->wb.enabled) { - if (autowb && awbListener) { + if (autowb && awbListener && params->wb.method == "autitcgreen") { awbListener->WBChanged(params->wb.temperature, params->wb.green, studgood); - } + } /* GammaValues g_a; diff --git a/rtgui/whitebalance.cc b/rtgui/whitebalance.cc index 5c57ca6a0..9a5f1a398 100644 --- a/rtgui/whitebalance.cc +++ b/rtgui/whitebalance.cc @@ -461,6 +461,7 @@ void WhiteBalance::optChanged () methconn.block(prevState); return; } + StudLabel->hide(); if (opt != row[methodColumns.colId]) { @@ -566,6 +567,8 @@ void WhiteBalance::optChanged () void WhiteBalance::spotPressed () { + StudLabel->hide(); + if (wblistener) { wblistener->spotWBRequested (getSize()); } From ad271a87eb448b1990a40181b42f8dce44069da7 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 25 Feb 2020 17:02:00 +0100 Subject: [PATCH 110/154] clang errors: variable-sized object initialization, fixes #5667 --- rtengine/rawimagesource.cc | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 9f7c08a8d..3cabaf5b2 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -6394,22 +6394,25 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } ; - int histxy[siza] = {};//number of values for each pair xy + int histxy[siza];//number of values for each pair xy - float area[siza] = {};//multiplier for compensation differences area ==> big areas are rare near limit prophotos or more + float area[siza];//multiplier for compensation differences area ==> big areas are rare near limit prophotos or more - int inter[siza] = {}; //interest for photographie 1 = small (limit gamut) 2 = normal 3 = major (skin, sky, neutral) + int inter[siza]; //interest for photographie 1 = small (limit gamut) 2 = normal 3 = major (skin, sky, neutral) - float xxx[siza] = {};//for color references calculated ==> max in images "like histogram" + float xxx[siza];//for color references calculated ==> max in images "like histogram" - float yyy[siza] = {}; + float yyy[siza]; - float YYY[siza] = {};//not used directly, but necessary to keep good range + float YYY[siza];//not used directly, but necessary to keep good range for (int p = 0; p < siza; p++) { histxy[p] = 0; area[p] = 20.f; inter[p] = 1; + xxx[p] = 0.f; + yyy[p] = 0.f; + YYY[p] = 0.f; } float estimchrom = 0.f; From 278f9d019ee6505a1c89bcdf0ae78265be3647fe Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 25 Feb 2020 17:09:27 +0100 Subject: [PATCH 111/154] Fix clang warnings --- rtengine/rawimagesource.h | 6 +++--- rtengine/stdimagesource.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 51c369a79..1b80804e9 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -143,9 +143,9 @@ public: void processFlatField(const procparams::RAWParams &raw, const RawImage *riFlatFile, const float black[4]); void copyOriginalPixels(const procparams::RAWParams &raw, RawImage *ri, RawImage *riDark, RawImage *riFlatFile, array2D &rawData ); void scaleColors (int winx, int winy, int winw, int winh, const procparams::RAWParams &raw, array2D &rawData); // raw for cblack - void WBauto(double &tempref, double &greenref, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const procparams::WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw); - void getAutoWBMultipliersitc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const procparams::WBParams & wbpar, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw); - void getrgbloc(bool local, bool gamma, bool cat02, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w); + void WBauto(double &tempref, double &greenref, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const procparams::WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw) override; + void getAutoWBMultipliersitc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const procparams::WBParams & wbpar, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw) override; + void getrgbloc(bool local, bool gamma, bool cat02, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w) override; void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const procparams::ToneCurveParams &hrp, const procparams::RAWParams &raw) override; eSensorType getSensorType () const override; diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h index 5b83ba42e..b88db42c4 100644 --- a/rtengine/stdimagesource.h +++ b/rtengine/stdimagesource.h @@ -58,15 +58,15 @@ public: int load (const Glib::ustring &fname) override; void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const procparams::ToneCurveParams &hrp, const procparams::RAWParams &raw) override; - void getrgbloc(bool local, bool gamma, bool cat02, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w); + void getrgbloc(bool local, bool gamma, bool cat02, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w) override; ColorTemp getWB () const override { return wb; } void getAutoWBMultipliers (double &rm, double &gm, double &bm) override; ColorTemp getSpotWB (std::vector &red, std::vector &green, std::vector &blue, int tran, double equal) override; - void WBauto(double &tempref, double &greenref, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const procparams::WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw); - void getAutoWBMultipliersitc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const procparams::WBParams & wbpar, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw); + void WBauto(double &tempref, double &greenref, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const procparams::WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw) override; + void getAutoWBMultipliersitc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const procparams::WBParams & wbpar, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw) override; eSensorType getSensorType() const override {return ST_NONE;} bool isMono() const override {return false;} From 603b55e69093626b4ca4ae8fa99198ad96a9ff2b Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 25 Feb 2020 17:28:19 +0100 Subject: [PATCH 112/154] Preset cat02 automatic --- rtdata/languages/default | 3 + rtengine/improccoordinator.cc | 6 +- rtengine/procparams.cc | 8 +- rtengine/procparams.h | 1 + rtgui/colorappearance.cc | 156 +++++++++++++++++++++++++++++++++- rtgui/colorappearance.h | 10 ++- rtgui/paramsedited.cc | 6 ++ rtgui/paramsedited.h | 1 + 8 files changed, 184 insertions(+), 7 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index a807ba9ea..59de4bb40 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -728,6 +728,7 @@ HISTORY_MSG_491;White Balance HISTORY_MSG_492;RGB Curves HISTORY_MSG_493;L*a*b* Adjustments HISTORY_MSG_494;Capture Sharpening +HISTORY_MSG_CAT02PRESET;Cat02 automatic preset HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -1447,6 +1448,8 @@ TP_COLORAPP_MODEL;WP Model TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. TP_COLORAPP_NEUTRAL;Reset TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values +TP_COLORAPP_PRESETCAT02;Preset cat02 automatic +TP_COLORAPP_PRESETCAT02_TIP;Set combobox, sliders, temp, green so that Cat02 automatic is preset.\nYou must change Cat02 adaptation Viewing conditions if need, and other settings if need. TP_COLORAPP_RSTPRO;Red & skin-tones protection TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. TP_COLORAPP_SURROUND;Surround diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 0ed8b1f97..2a5d7cf8f 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1160,15 +1160,15 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) ipf.ciecam_02float(ncie, float (adap), pW, 2, nprevl, params.get(), customColCurve1, customColCurve2, customColCurve3, histLCAM, histCCAM, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 0 , scale, execsharp, d, dj, yb, 1); - if ((params->colorappearance.autodegree || params->colorappearance.autodegreeout) && acListener && params->colorappearance.enabled) { + if ((params->colorappearance.autodegree || params->colorappearance.autodegreeout) && acListener && params->colorappearance.enabled && !params->colorappearance.presetcat02) { acListener->autoCamChanged(100.* (double)d, 100.* (double)dj); } - if (params->colorappearance.autoadapscen && acListener && params->colorappearance.enabled) { + if (params->colorappearance.autoadapscen && acListener && params->colorappearance.enabled && !params->colorappearance.presetcat02) { acListener->adapCamChanged(adap); //real value of adapt scene } - if (params->colorappearance.autoybscen && acListener && params->colorappearance.enabled) { + if (params->colorappearance.autoybscen && acListener && params->colorappearance.enabled && !params->colorappearance.presetcat02) { acListener->ybCamChanged((int) yb); //real value Yb scene } } else { diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 7d83b50d2..a4502b470 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1398,7 +1398,8 @@ ColorAppearanceParams::ColorAppearanceParams() : ybout(18), greenout(1.0), tempsc(5000), - greensc(1.0) + greensc(1.0), + presetcat02(false) { } @@ -1443,7 +1444,8 @@ bool ColorAppearanceParams::operator ==(const ColorAppearanceParams& other) cons && ybout == other.ybout && greenout == other.greenout && tempsc == other.tempsc - && greensc == other.greensc; + && greensc == other.greensc + && presetcat02 == other.presetcat02; } bool ColorAppearanceParams::operator !=(const ColorAppearanceParams& other) const @@ -3239,6 +3241,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->colorappearance.ybout, "Color appearance", "Ybout", colorappearance.ybout, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.datacie, "Color appearance", "Datacie", colorappearance.datacie, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.tonecie, "Color appearance", "Tonecie", colorappearance.tonecie, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.presetcat02, "Color appearance", "Presetcat02", colorappearance.presetcat02, keyFile); const std::map ca_mapping = { {ColorAppearanceParams::TcMode::LIGHT, "Lightness"}, @@ -4229,6 +4232,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Color appearance", "Ybout", pedited, colorappearance.ybout, pedited->colorappearance.ybout); assignFromKeyfile(keyFile, "Color appearance", "Datacie", pedited, colorappearance.datacie, pedited->colorappearance.datacie); assignFromKeyfile(keyFile, "Color appearance", "Tonecie", pedited, colorappearance.tonecie, pedited->colorappearance.tonecie); + assignFromKeyfile(keyFile, "Color appearance", "Presetcat02", pedited, colorappearance.presetcat02, pedited->colorappearance.presetcat02); const std::map tc_mapping = { {"Lightness", ColorAppearanceParams::TcMode::LIGHT}, diff --git a/rtengine/procparams.h b/rtengine/procparams.h index e6828f570..034577cb6 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -680,6 +680,7 @@ struct ColorAppearanceParams { double greenout; int tempsc; double greensc; + bool presetcat02; ColorAppearanceParams(); diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index 9468770fc..eed1c074b 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -25,6 +25,7 @@ #include "guiutils.h" #include "options.h" #include "rtimage.h" +#include "eventmapper.h" #include "../rtengine/color.h" #include "../rtengine/procparams.h" @@ -217,8 +218,16 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" milestones.push_back ( GradientMilestone (0., 0., 0., 0.) ); milestones.push_back ( GradientMilestone (1., 1., 1., 1.) ); + auto m = ProcEventMapper::getInstance(); + Evcatpreset = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_CAT02PRESET"); - // ------------------------ Process #1: Converting to CIECAM + //preset button cat02 + presetcat02 = Gtk::manage (new Gtk::CheckButton (M ("TP_COLORAPP_PRESETCAT02"))); + presetcat02->set_tooltip_markup (M("TP_COLORAPP_PRESETCAT02_TIP")); + presetcat02conn = presetcat02->signal_toggled().connect( sigc::mem_fun(*this, &ColorAppearance::presetcat02pressed)); + pack_start (*presetcat02, Gtk::PACK_SHRINK); + + // ----------------------- Process #1: Converting to CIECAM // Process 1 frame @@ -801,6 +810,7 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) tcmodeconn.block (true); tcmode2conn.block (true); tcmode3conn.block (true); + presetcat02conn.block (true); shape->setCurve (pp->colorappearance.curve); shape2->setCurve (pp->colorappearance.curve2); shape3->setCurve (pp->colorappearance.curve3); @@ -808,7 +818,12 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) toneCurveMode2->set_active (toUnderlying(pp->colorappearance.curveMode2)); toneCurveMode3->set_active (toUnderlying(pp->colorappearance.curveMode3)); curveMode3Changed(); // This will set the correct sensitive state of depending Adjusters + presetcat02->set_active(pp->colorappearance.presetcat02); + nexttemp = pp->wb.temperature; + nextgreen = pp->wb.green; + + printf("temp=%f green=%f\n", nexttemp, nextgreen); if (pedited) { degree->setEditedState (pedited->colorappearance.degree ? Edited : UnEdited); degreeout->setEditedState (pedited->colorappearance.degreeout ? Edited : UnEdited); @@ -858,6 +873,7 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) if (!pedited->colorappearance.curveMode3) { toneCurveMode3->set_active (3); } + presetcat02->set_inconsistent(!pedited->colorappearance.presetcat02); } @@ -993,6 +1009,10 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) ybout->setValue (pp->colorappearance.ybout); tempsc->setValue (pp->colorappearance.tempsc); greensc->setValue (pp->colorappearance.greensc); + presetcat02conn.block (true); + presetcat02->set_active (pp->colorappearance.presetcat02); + presetcat02conn.block (false); + lastpresetcat02 = pp->colorappearance.presetcat02; tcmode3conn.block (false); tcmode2conn.block (false); @@ -1045,6 +1065,7 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) pp->colorappearance.ybout = ybout->getValue (); pp->colorappearance.tempsc = tempsc->getValue (); pp->colorappearance.greensc = greensc->getValue (); + pp->colorappearance.presetcat02 = presetcat02->get_active(); int tcMode = toneCurveMode->get_active_row_number(); @@ -1114,6 +1135,7 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) pedited->colorappearance.ybout = ybout->getEditedState (); pedited->colorappearance.tempsc = tempsc->getEditedState (); pedited->colorappearance.greensc = greensc->getEditedState (); + pedited->colorappearance.presetcat02 = presetcat02->get_inconsistent (); } @@ -1309,6 +1331,130 @@ void ColorAppearance::badpix_toggled () { } */ +void ColorAppearance::presetcat02pressed () +{ + if (presetcat02->get_active ()) { + disableListener(); + jlight->resetValue (false); + qbright->resetValue (false); + chroma->resetValue (false); + schroma->resetValue (false); + mchroma->resetValue (false); + rstprotection->resetValue (false); + contrast->resetValue (false); + qcontrast->resetValue (false); + colorh->resetValue (false); + tempout->resetValue (false); + greenout->resetValue (false); + ybout->resetValue (false); + tempsc->resetValue (false); + greensc->resetValue (false); + badpixsl->resetValue (false); + wbmodel->set_active (0); + toneCurveMode->set_active (0); + toneCurveMode2->set_active (0); + toneCurveMode3->set_active (0); + shape->reset(); + shape2->reset(); + shape3->reset(); + gamutconn.block (true); + gamut->set_active (true); + gamutconn.block (false); + degree->setAutoValue (true); + degree->resetValue (false); + adapscen->resetValue (false); + adapscen->setAutoValue (true); + degreeout->resetValue (false); + degreeout->setAutoValue (true); + ybscen->resetValue (false); + ybscen->setAutoValue (true); + surrsrc->set_active (0); + wbmodel->set_active (2); + tempsc->resetValue (false); + greensc->resetValue (false); + adapscen->setValue(400.); + ybscen->setValue(18); + surround->set_active (0); + adaplum->setValue(400.); + degreeout->setValue(70); + ybout->setValue(18); + tempout->setValue (nexttemp); + greenout->setValue (nextgreen); + enableListener(); + } else { + disableListener(); +/* jlight->resetValue (false); + qbright->resetValue (false); + chroma->resetValue (false); + schroma->resetValue (false); + mchroma->resetValue (false); + rstprotection->resetValue (false); + contrast->resetValue (false); + qcontrast->resetValue (false); + colorh->resetValue (false); + tempout->resetValue (false); + greenout->resetValue (false); + ybout->resetValue (false); + tempsc->resetValue (false); + greensc->resetValue (false); + badpixsl->resetValue (false); + wbmodel->set_active (0); + toneCurveMode->set_active (0); + toneCurveMode2->set_active (0); + toneCurveMode3->set_active (0); + shape->reset(); + shape2->reset(); + shape3->reset(); + gamutconn.block (true); + gamut->set_active (true); + gamutconn.block (false); +*/ + degree->setAutoValue (true); + degree->resetValue (false); + adapscen->resetValue (false); + adapscen->setAutoValue (true); + degreeout->resetValue (false); + degreeout->setAutoValue (true); + ybscen->resetValue (false); + ybscen->setAutoValue (true); + surrsrc->set_active (0); + wbmodel->set_active (0); + tempsc->resetValue (false); + greensc->resetValue (false); + adapscen->resetValue (false); + ybscen->resetValue (false); + surround->set_active (0); + adaplum->resetValue (false); + degreeout->resetValue (false); + ybout->resetValue (false); + tempout->resetValue (false); + greenout->resetValue (false); + enableListener(); + + } + if (batchMode) { + if (presetcat02->get_inconsistent()) { + presetcat02->set_inconsistent (false); + presetcat02conn.block (true); + presetcat02->set_active (false); + presetcat02conn.block (false); + } else if (lastpresetcat02) { + presetcat02->set_inconsistent (true); + } + + lastpresetcat02 = presetcat02->get_active (); + } + + if (listener) { + if (presetcat02->get_active ()) { + listener->panelChanged (Evcatpreset, M ("GENERAL_ENABLED")); + } else { + listener->panelChanged (Evcatpreset, M ("GENERAL_DISABLED")); + } + } + +} + void ColorAppearance::datacie_toggled () { @@ -1470,6 +1616,10 @@ void ColorAppearance::autoCamChanged (double ccam, double ccamout) void ColorAppearance::adapCamChanged (double cadap) { + if(presetcat02->get_active()){ + return; + } + idle_register.add( [this, cadap]() -> bool { @@ -1483,6 +1633,10 @@ void ColorAppearance::adapCamChanged (double cadap) void ColorAppearance::ybCamChanged (int ybsc) { + if(presetcat02->get_active()){ + return; + } + idle_register.add( [this, ybsc]() -> bool { diff --git a/rtgui/colorappearance.h b/rtgui/colorappearance.h index c42bca774..7379eb9b0 100644 --- a/rtgui/colorappearance.h +++ b/rtgui/colorappearance.h @@ -66,7 +66,7 @@ public: bool adapCamComputed_ (); void ybCamChanged (int yb) override; bool ybCamComputed_ (); - + void presetcat02pressed (); void curveChanged (CurveEditor* ce) override; void curveMode1Changed (); bool curveMode1Changed_ (); @@ -99,6 +99,8 @@ public: void writeOptions (std::vector &tpOpen); private: + rtengine::ProcEvent Evcatpreset; + bool bgTTipQuery (int x, int y, bool keyboard_tooltip, const Glib::RefPtr& tooltip); bool srTTipQuery (int x, int y, bool keyboard_tooltip, const Glib::RefPtr& tooltip); void foldAllButMe (GdkEventButton* event, MyExpander *expander); @@ -143,6 +145,9 @@ private: Gtk::CheckButton* tonecie; // Gtk::CheckButton* sharpcie; Gtk::Button* neutral; + Gtk::CheckButton* presetcat02; + sigc::connection presetcat02conn; + MyComboBoxText* surrsrc; sigc::connection surrsrcconn; @@ -172,6 +177,9 @@ private: bool lastgamut; bool lastdatacie; bool lasttonecie; + bool lastpresetcat02; + double nexttemp; + double nextgreen; IdleRegister idle_register; }; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index f39c73e03..448b1316c 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -247,6 +247,7 @@ void ParamsEdited::set(bool v) colorappearance.ybout = v; colorappearance.tempsc = v; colorappearance.greensc = v; + colorappearance.presetcat02 = v; //colorBoost.amount = v; //colorBoost.avoidclip = v; @@ -837,6 +838,7 @@ void ParamsEdited::initFrom(const std::vector& colorappearance.ybout = colorappearance.ybout && p.colorappearance.ybout == other.colorappearance.ybout; colorappearance.tempsc = colorappearance.tempsc && p.colorappearance.tempsc == other.colorappearance.tempsc; colorappearance.greensc = colorappearance.greensc && p.colorappearance.greensc == other.colorappearance.greensc; + colorappearance.presetcat02 = colorappearance.presetcat02 && p.colorappearance.presetcat02 == other.colorappearance.presetcat02; //colorBoost.amount = colorBoost.amount && p.colorBoost.amount == other.colorBoost.amount; //colorBoost.avoidclip = colorBoost.avoidclip && p.colorBoost.avoidclip == other.colorBoost.avoidclip; @@ -2083,6 +2085,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.colorappearance.tonecie = mods.colorappearance.tonecie; } + if (colorappearance.presetcat02) { + toEdit.colorappearance.presetcat02 = mods.colorappearance.presetcat02; + } + // if (colorappearance.sharpcie) toEdit.colorappearance.sharpcie = mods.colorappearance.sharpcie; if (impulseDenoise.enabled) { toEdit.impulseDenoise.enabled = mods.impulseDenoise.enabled; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 23e90635e..47985400e 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -294,6 +294,7 @@ struct ColorAppearanceParamsEdited { bool ybout; bool tempsc; bool greensc; + bool presetcat02; }; struct DirPyrDenoiseParamsEdited { From e2bbc30bf2df9d356caaaf9ed551f5c6030a1747 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 25 Feb 2020 19:32:58 +0100 Subject: [PATCH 113/154] ip_wavelet.cc : be almost cppcheck clean --- rtengine/improcfun.h | 16 ++-- rtengine/ipwavelet.cc | 186 +++++++++++++++++++----------------------- 2 files changed, 90 insertions(+), 112 deletions(-) diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 39a229c7e..ebafa3d71 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -200,22 +200,22 @@ public: int pitch, int scale, const int luma, const int chroma/*, LUTf & Lcurve, LUTf & abcurve*/); 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 ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, LUTf &wavclCurve, int skip); + void ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip); - void WaveletcontAllL(LabImage * lab, float **varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_L, + void WaveletcontAllL(LabImage * lab, float **varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_L, struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili); - void WaveletcontAllLfinal(wavelet_decomposition &WaveletCoeffs_L, struct cont_params &cp, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL); - void WaveletcontAllAB(LabImage * lab, float **varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_a, const WavOpacityCurveW & waOpacityCurveW, + void WaveletcontAllLfinal(const wavelet_decomposition &WaveletCoeffs_L, const struct cont_params &cp, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL); + void WaveletcontAllAB(LabImage * lab, float **varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_a, const WavOpacityCurveW & waOpacityCurveW, struct cont_params &cp, const bool useChannelA); - void WaveletAandBAllAB(wavelet_decomposition &WaveletCoeffs_a, wavelet_decomposition &WaveletCoeffs_b, - struct cont_params &cp, FlatCurve* hhcurve, bool hhutili); + void WaveletAandBAllAB(const wavelet_decomposition &WaveletCoeffs_a, const wavelet_decomposition &WaveletCoeffs_b, + const struct cont_params &cp, FlatCurve* hhcurve, bool hhutili); void ContAllL(float **koeLi, float *maxkoeLi, bool lipschitz, int maxlvl, LabImage * lab, float **varhue, float **varchrom, float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp, int W_L, int H_L, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili); - void finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp, + void finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, const struct cont_params &cp, int W_L, int H_L, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL); void ContAllAB(LabImage * lab, int maxlvl, float **varhue, float **varchrom, float ** WavCoeffs_a, float * WavCoeffs_a0, int level, int dir, const WavOpacityCurveW & waOpacityCurveW, struct cont_params &cp, int W_ab, int H_ab, const bool useChannelA); - void Evaluate2(wavelet_decomposition &WaveletCoeffs_L, + void Evaluate2(const wavelet_decomposition &WaveletCoeffs_L, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN); void Eval2(float ** WavCoeffs_L, int level, int W_L, int H_L, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN); diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index b9a8132e4..2a5a332aa 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -136,7 +136,7 @@ struct cont_params { int wavNestedLevels = 1; -void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, LUTf &wavclCurve, int skip) +void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip) { @@ -151,12 +151,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const {wiprof[2][0], wiprof[2][1], wiprof[2][2]} }; const short int imheight = lab->H, imwidth = lab->W; - LabImage *provradius = nullptr; - - if (waparams.softradend > 0.f && params->wavelet.expfinal) { - provradius = new LabImage(lab->W, lab->H); - provradius->CopyFrom(lab); - } struct cont_params cp; @@ -192,15 +186,9 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.diag = params->wavelet.tmr; cp.balan = (float)params->wavelet.balance; cp.ite = params->wavelet.iter; - cp.tonemap = false; + cp.tonemap = params->wavelet.tmrs != 0; cp.bam = false; - if (params->wavelet.tmrs == 0) { - cp.tonemap = false; - } else { - cp.tonemap = true; - } - if (params->wavelet.TMmethod == "cont") { cp.contmet = 1; } else if (params->wavelet.TMmethod == "tm") { @@ -1122,12 +1110,12 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } for (; col < rowWidth; col++) { - float a = labco->a[i1][col]; - float b = labco->b[i1][col]; - atan2Buffer[col] = xatan2f(b, a); - float Chprov1 = sqrtf(SQR(a) + SQR(b)); - yBuffer[col] = (Chprov1 == 0.f) ? 1.f : a / Chprov1; - xBuffer[col] = (Chprov1 == 0.f) ? 0.f : b / Chprov1; + float la = labco->a[i1][col]; + float lb = labco->b[i1][col]; + atan2Buffer[col] = xatan2f(lb, la); + float Chprov1 = sqrtf(SQR(la) + SQR(lb)); + yBuffer[col] = (Chprov1 == 0.f) ? 1.f : la / Chprov1; + xBuffer[col] = (Chprov1 == 0.f) ? 0.f : lb / Chprov1; chprovBuffer[col] = Chprov1 / 327.68f; } } @@ -1154,7 +1142,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const sincosv.x = (Chprov1 == 0.0f) ? 0.f : b / (Chprov1); Chprov1 /= 327.68f; #endif - L = labco->L[i1][j1]; const float Lin = labco->L[i1][j1]; if (wavclCurve && cp.finena) { @@ -1261,6 +1248,9 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } if (waparams.softradend > 0.f && cp.finena) { + LabImage *provradius = new LabImage(lab->W, lab->H); + provradius->CopyFrom(lab); + array2D ble(lab->W, lab->H); array2D guid(lab->W, lab->H); Imagefloat *tmpImage = nullptr; @@ -1328,11 +1318,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } delete tmpImage; - } - - if (waparams.softradend > 0.f && cp.finena) { delete provradius; - provradius = NULL; } #ifdef _DEBUG @@ -1443,7 +1429,7 @@ void ImProcFunctions::Sigma(float * RESTRICT DataList, int datalen, float avera } -void ImProcFunctions::Evaluate2(wavelet_decomposition &WaveletCoeffs_L, +void ImProcFunctions::Evaluate2(const wavelet_decomposition &WaveletCoeffs_L, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN) { //StopWatch Stop1("Evaluate2"); @@ -1661,7 +1647,7 @@ void ImProcFunctions::EPDToneMapResid(float * WavCoeffs_L0, unsigned int Iterat } } -void ImProcFunctions::WaveletcontAllLfinal(wavelet_decomposition &WaveletCoeffs_L, struct cont_params &cp, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL) +void ImProcFunctions::WaveletcontAllLfinal(const wavelet_decomposition &WaveletCoeffs_L, const struct cont_params &cp, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL) { int maxlvl = WaveletCoeffs_L.maxlevel(); float * WavCoeffs_L0 = WaveletCoeffs_L.coeff0; @@ -1677,12 +1663,12 @@ void ImProcFunctions::WaveletcontAllLfinal(wavelet_decomposition &WaveletCoeffs_ } -void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_L, +void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_L, struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili) { - int maxlvl = WaveletCoeffs_L.maxlevel(); - int W_L = WaveletCoeffs_L.level_W(0); - int H_L = WaveletCoeffs_L.level_H(0); + const int maxlvl = WaveletCoeffs_L.maxlevel(); + const int W_L = WaveletCoeffs_L.level_W(0); + const int H_L = WaveletCoeffs_L.level_H(0); float * WavCoeffs_L0 = WaveletCoeffs_L.coeff0; float contrast = cp.contrast; @@ -1858,8 +1844,8 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * // I adapted the principle but have profoundly changed the algorithm // One can 1) change all parameters and found good parameters; //one can also change in calckoe - float edd = 3.f; - float eddlow = 15.f; + constexpr float edd = 3.f; + constexpr float eddlow = 15.f; float eddlipinfl = 0.005f * cp.edgsens + 0.4f; float eddlipampl = 1.f + cp.edgampl / 50.f; @@ -1878,11 +1864,8 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * for (int lvl = 0; lvl < 4; lvl++) { for (int dir = 1; dir < 4; dir++) { - int W_L = WaveletCoeffs_L.level_W(lvl); - int H_L = WaveletCoeffs_L.level_H(lvl); - float ** WavCoeffs_LL = WaveletCoeffs_L.level_coeffs(lvl); - calckoe(WavCoeffs_LL, cp, koeLi, lvl, dir, W_L, H_L, edd, maxkoeLi, tmC); + calckoe(WavCoeffs_LL, cp, koeLi, lvl, dir, WaveletCoeffs_L.level_W(lvl), WaveletCoeffs_L.level_H(lvl), edd, maxkoeLi, tmC); // return convolution KoeLi and maxkoeLi of level 0 1 2 3 and Dir Horiz, Vert, Diag } } @@ -2020,8 +2003,8 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } } -void ImProcFunctions::WaveletAandBAllAB(wavelet_decomposition &WaveletCoeffs_a, wavelet_decomposition &WaveletCoeffs_b, - struct cont_params &cp, FlatCurve* hhCurve, bool hhutili) +void ImProcFunctions::WaveletAandBAllAB(const wavelet_decomposition &WaveletCoeffs_a, const wavelet_decomposition &WaveletCoeffs_b, + const struct cont_params &cp, FlatCurve* hhCurve, bool hhutili) { // StopWatch Stop1("WaveletAandBAllAB"); if (hhutili && cp.resena) { // H=f(H) @@ -2088,7 +2071,7 @@ void ImProcFunctions::WaveletAandBAllAB(wavelet_decomposition &WaveletCoeffs_a, } -void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_ab, const WavOpacityCurveW & waOpacityCurveW, +void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_ab, const WavOpacityCurveW & waOpacityCurveW, struct cont_params &cp, const bool useChannelA) { @@ -2393,7 +2376,7 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, const struct cont_params& c } -void ImProcFunctions::finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp, +void ImProcFunctions::finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, const struct cont_params &cp, int W_L, int H_L, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL) { if (cp.diagcurv && cp.finena && MaxP[level] > 0.f && mean[level] != 0.f && sigma[level] != 0.f) { //curve @@ -2481,18 +2464,18 @@ void ImProcFunctions::finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, if (choiceDir == 0) { // All directions if (level != choicelevel) { // zero all for the levels != choicelevel - for (int dir = 1; dir < 4; dir++) { + for (int d = 1; d < 4; d++) { for (int i = 0; i < W_L * H_L; i++) { - WavCoeffs_L[dir][i] = 0.f; + WavCoeffs_L[d][i] = 0.f; } } } } else { // zero the unwanted directions for level == choicelevel if (choicelevel >= cp.maxilev) { - for (int dir = 1; dir < 4; dir++) { + for (int d = 1; d < 4; d++) { for (int i = 0; i < W_L * H_L; i++) { - WavCoeffs_L[dir][i] = 0.f; + WavCoeffs_L[d][i] = 0.f; } } } else if (level != choicelevel) { // zero all for the levels != choicelevel @@ -2504,9 +2487,9 @@ void ImProcFunctions::finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, } else if (choiceClevel == 1) { // Only below level if (choiceDir == 0) { // All directions if (level > choicelevel) { - for (int dir = 1; dir < 4; dir++) { + for (int d = 1; d < 4; d++) { for (int i = 0; i < W_L * H_L; i++) { - WavCoeffs_L[dir][i] = 0.f; + WavCoeffs_L[d][i] = 0.f; } } } @@ -2520,17 +2503,17 @@ void ImProcFunctions::finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, } else if (choiceClevel == 2) { // Only above level if (choiceDir == 0) { // All directions if (level <= choicelevel) { - for (int dir = 1; dir < 4; dir++) { + for (int d = 1; d < 4; d++) { for (int i = 0; i < W_L * H_L; i++) { - WavCoeffs_L[dir][i] = 0.f; + WavCoeffs_L[d][i] = 0.f; } } } } else { // zero the unwanted directions for level >= choicelevel if (choicelevel >= cp.maxilev) { - for (int dir = 1; dir < 4; dir++) { + for (int d = 1; d < 4; d++) { for (int i = 0; i < W_L * H_L; i++) { - WavCoeffs_L[dir][i] = 0.f; + WavCoeffs_L[d][i] = 0.f; } } } @@ -2560,13 +2543,13 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz scaleskip[sc] = scales[sc] / skip; } - float t_r = 40.f; - float t_l = 10.f; - float b_r = 75.f; - float edd = 3.f; - float eddstrength = 1.3f; - float aedstr = (eddstrength - 1.f) / 90.f; - float bedstr = 1.f - 10.f * aedstr; + constexpr float t_r = 40.f; + constexpr float t_l = 10.f; + constexpr float b_r = 75.f; + constexpr float edd = 3.f; + constexpr float eddstrength = 1.3f; + constexpr float aedstr = (eddstrength - 1.f) / 90.f; + constexpr float bedstr = 1.f - 10.f * aedstr; if (cp.val > 0 && cp.edgeena) { float * koe = nullptr; @@ -2664,19 +2647,18 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz float lim0 = 20.f; //arbitrary limit for low radius and level between 2 or 3 to 30 maxi float lev = float (level); float repart = (float)cp.til; - float brepart; - if (cp.reinforce == 1) { - brepart = 3.f; - } - - if (cp.reinforce == 3) { - brepart = 0.5f; //arbitrary value to increase / decrease repart, between 1 and 0 - } - - float arepart = -(brepart - 1.f) / (lim0 / 60.f); if (cp.reinforce != 2) { + float brepart; + + if (cp.reinforce == 1) { + brepart = 3.f; + } else /*if (cp.reinforce == 3) */{ + brepart = 0.5f; //arbitrary value to increase / decrease repart, between 1 and 0 + } + float arepart = -(brepart - 1.f) / (lim0 / 60.f); + if (rad < lim0 / 60.f) { repart *= (arepart * rad + brepart); //linear repartition of repart } @@ -2787,32 +2769,31 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz // kmul about max ==> 9 // we can change these values // result is different not best or bad than threshold slider...but similar - float abssd = 4.f; //amplification reference - float bbssd = 2.f; //mini ampli - float maxamp = 2.5f; //maxi ampli at end - float maxampd = 10.f; //maxi ampli at end - float a_abssd = (maxamp - abssd) / 0.333f; - float b_abssd = maxamp - a_abssd; - float da_abssd = (maxampd - abssd) / 0.333f; - float db_abssd = maxampd - da_abssd; - float am = (abssd - bbssd) / 0.666f; + constexpr float abssd = 4.f; //amplification reference + constexpr float bbssd = 2.f; //mini ampli float kmuld = 0.f; if (absciss > 0.666f && absciss < 1.f) { + constexpr float maxamp = 2.5f; //maxi ampli at end + constexpr float maxampd = 10.f; //maxi ampli at end + constexpr float a_abssd = (maxamp - abssd) / 0.333f; + constexpr float b_abssd = maxamp - a_abssd; + constexpr float da_abssd = (maxampd - abssd) / 0.333f; + constexpr float db_abssd = maxampd - da_abssd; kmul = a_abssd * absciss + b_abssd; //about max ==> kinterm kmuld = da_abssd * absciss + db_abssd; } else { + constexpr float am = (abssd - bbssd) / 0.666f; kmul = kmuld = absciss * am + bbssd; } - kinterm = 1.f; - float kc = kmul * (wavCLVCcurve[absciss * 500.f] - 0.5f); - float kcd = kmuld * (wavCLVCcurve[absciss * 500.f] - 0.5f); + const float kc = kmul * (wavCLVCcurve[absciss * 500.f] - 0.5f); if (kc >= 0.f) { float reduceeffect = 0.6f; kinterm = 1.f + reduceeffect * kmul * (wavCLVCcurve[absciss * 500.f] - 0.5f); //about 1 to 3 general and big amplification for max (under 0) } else { + const float kcd = kmuld * (wavCLVCcurve[absciss * 500.f] - 0.5f); kinterm = 1.f - (SQR(kcd)) / 10.f; } @@ -2821,10 +2802,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz } edge *= kinterm; - - if (edge < 1.f) { - edge = 1.f; - } + edge = rtengine::max(edge, 1.f); } WavCoeffs_L[dir][k] *= edge; @@ -3226,10 +3204,10 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz float k1 = 600.f; float k2 = 300.f; float LL100 = labco->L[ii * 2][jj * 2] / 327.68f; - float aa = 4970.f; - float bb = -397000.f; - float b0 = 100000.f; - float a0 = -4970.f; + constexpr float aa = 4970.f; + constexpr float bb = -397000.f; + constexpr float b0 = 100000.f; + constexpr float a0 = -4970.f; if (LL100 > 80.f) { k1 = aa * LL100 + bb; @@ -3261,8 +3239,8 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz } // to see each level of wavelet ...level from 0 to 8 - int choicelevel = params->wavelet.Lmethod - 1; - choicelevel = choicelevel == -1 ? 4 : choicelevel; +// int choicelevel = params->wavelet.Lmethod - 1; +// choicelevel = choicelevel == -1 ? 4 : choicelevel; } void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, float **varchrom, float ** WavCoeffs_ab, float * WavCoeffs_ab0, int level, int dir, const WavOpacityCurveW & waOpacityCurveW, struct cont_params &cp, @@ -3486,10 +3464,10 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f float k1 = 600.f; float k2 = 300.f; float LL100 = labco->L[ii * 2][jj * 2] / 327.68f; - float aa = 4970.f; - float bb = -397000.f; - float b0 = 100000.f; - float a0 = -4970.f; + constexpr float aa = 4970.f; + constexpr float bb = -397000.f; + constexpr float b0 = 100000.f; + constexpr float a0 = -4970.f; if (LL100 > 80.f) { k1 = aa * LL100 + bb; @@ -3563,17 +3541,17 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f if (choiceClevel == 0) { // Only one level if (choiceDir == 0) { // All directions if (level != choicelevel) { // zero all for the levels != choicelevel - for (int dir = 1; dir < 4; dir++) { + for (int d = 1; d < 4; d++) { for (int i = 0; i < W_ab * H_ab; i++) { - WavCoeffs_ab[dir][i] = 0.f; + WavCoeffs_ab[d][i] = 0.f; } } } } else { // zero the unwanted directions for level == choicelevel if (choicelevel >= cp.maxilev) { - for (int dir = 1; dir < 4; dir++) { + for (int d = 1; d < 4; d++) { for (int i = 0; i < W_ab * H_ab; i++) { - WavCoeffs_ab[dir][i] = 0.f; + WavCoeffs_ab[d][i] = 0.f; } } } else if (level != choicelevel) { // zero all for the levels != choicelevel @@ -3585,9 +3563,9 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f } else if (choiceClevel == 1) { // Only below level if (choiceDir == 0) { // All directions if (level > choicelevel) { - for (int dir = 1; dir < 4; dir++) { + for (int d = 1; d < 4; d++) { for (int i = 0; i < W_ab * H_ab; i++) { - WavCoeffs_ab[dir][i] = 0.f; + WavCoeffs_ab[d][i] = 0.f; } } } @@ -3601,17 +3579,17 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f } else if (choiceClevel == 2) { // Only above level if (choiceDir == 0) { // All directions if (level <= choicelevel) { - for (int dir = 1; dir < 4; dir++) { + for (int d = 1; d < 4; d++) { for (int i = 0; i < W_ab * H_ab; i++) { - WavCoeffs_ab[dir][i] = 0.f; + WavCoeffs_ab[d][i] = 0.f; } } } } else { // zero the unwanted directions for level >= choicelevel if (choicelevel >= cp.maxilev) { - for (int dir = 1; dir < 4; dir++) { + for (int d = 1; d < 4; d++) { for (int i = 0; i < W_ab * H_ab; i++) { - WavCoeffs_ab[dir][i] = 0.f; + WavCoeffs_ab[d][i] = 0.f; } } } else if (level <= choicelevel) { From b4084b2c86599495c2e234660a9a79d32b8a3c7a Mon Sep 17 00:00:00 2001 From: Beep6581 Date: Tue, 25 Feb 2020 21:27:11 +0100 Subject: [PATCH 114/154] Disable macOS GitHub action until fixed --- .github/workflows/main.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 46808ae40..13aa6677a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,5 +1,8 @@ name: macOS build -on: push +on: + push: + branches-ignore: + - '**' jobs: build: runs-on: macos-latest From cb0f81d0a0749eacd02747ad34d4d2af70941336 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 25 Feb 2020 21:41:12 +0100 Subject: [PATCH 115/154] Use tabs for consistency and better formatting --- UpdateInfo.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/UpdateInfo.cmake b/UpdateInfo.cmake index dfac6c07c..6fa8e289c 100644 --- a/UpdateInfo.cmake +++ b/UpdateInfo.cmake @@ -78,10 +78,10 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}") message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}") message(STATUS "Build information:") - message(STATUS " Build OS: ${BUILDINFO_OS}") - message(STATUS " Build date: ${BUILDINFO_DATE}") - message(STATUS " Epoch: ${BUILDINFO_EPOCH}") - message(STATUS " UUID: ${BUILDINFO_UUID}") + message(STATUS " Build OS: ${BUILDINFO_OS}") + message(STATUS " Build date: ${BUILDINFO_DATE}") + message(STATUS " Epoch: ${BUILDINFO_EPOCH}") + message(STATUS " UUID: ${BUILDINFO_UUID}") if(NOT DEFINED CACHE_NAME_SUFFIX) set(CACHE_NAME_SUFFIX "${GIT_DESCRIBE}") From 224659f47383b39cef8d06130b0e9169a2b915ac Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 26 Feb 2020 08:48:07 +0100 Subject: [PATCH 116/154] Change limit for b_r --- rtengine/ipwavelet.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 2a5a332aa..be26f431f 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -2865,7 +2865,8 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz // If we move sliders to the left, local contrast is reduced // if we move sliders to the right local contrast is increased // MaxP, MaxN, mean, sigma are calculated if necessary (val > 0) by evaluate2(), eval2(), aver() , sigma() - if (b_r < 100.f && cp.edg_max / b_r > 1.f) { //in case of b_r < 100 and slider move to right +// if (b_r < 100.f && cp.edg_max / b_r > 1.f) { //in case of b_r < 100 and slider move to right + if (cp.edg_max / b_r > 1.f) { //in case of b_r < 100 and slider move to right if (WavCoeffs_L[dir][k] > MaxPCompare * cp.edg_max / b_r) { edge *= edgMaxFsup; From f05c10ce55a1cf7c710962994837a0e13749158b Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 26 Feb 2020 14:16:52 +0100 Subject: [PATCH 117/154] ipwavelet.cc : cleanup, speedup, reduced memory usage --- rtengine/color.cc | 20 +-- rtengine/color.h | 12 +- rtengine/improcfun.h | 8 +- rtengine/ipwavelet.cc | 372 +++++++++++++++--------------------------- 4 files changed, 156 insertions(+), 256 deletions(-) diff --git a/rtengine/color.cc b/rtengine/color.cc index cda92ef45..ed617057f 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -1725,6 +1725,13 @@ void Color::Lab2XYZ(float L, float a, float b, float &x, float &y, float &z) y = (LL > epskap) ? 65535.0f * fy * fy * fy : 65535.0f * LL / kappa; } +float Color::L2Y(float L) +{ + const float LL = L / 327.68f; + const float fy = (c1By116 * LL) + c16By116; // (L+16)/116 + return (LL > epskapf) ? 65535.f * fy * fy * fy : 65535.f * LL / kappaf; +} + void Color::L2XYZ(float L, float &x, float &y, float &z) // for black & white { float LL = L / 327.68f; @@ -1767,19 +1774,6 @@ inline float Color::computeXYZ2Lab(float f) } } - -inline float Color::computeXYZ2LabY(float f) -{ - if (f < 0.f) { - return 327.68 * (kappa * f / MAXVALF); - } else if (f > 65535.f) { - return 327.68f * (116.f * xcbrtf(f / MAXVALF) - 16.f); - } else { - return cachefy[f]; - } -} - - void Color::RGB2Lab(float *R, float *G, float *B, float *L, float *a, float *b, const float wp[3][3], int width) { diff --git a/rtengine/color.h b/rtengine/color.h index 78198bc66..79250819b 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -101,7 +101,6 @@ private: #endif static float computeXYZ2Lab(float f); - static float computeXYZ2LabY(float f); public: @@ -185,6 +184,16 @@ public: static void init (); static void cleanup (); + static inline float computeXYZ2LabY(float f) + { + if (f < 0.f) { + return 327.68 * (kappa * f / MAXVALF); + } else if (f > 65535.f) { + return 327.68f * (116.f * xcbrtf(f / MAXVALF) - 16.f); + } else { + return cachefy[f]; + } + } /** * @brief Extract luminance "sRGB" from red/green/blue values @@ -610,6 +619,7 @@ public: */ static void Lab2XYZ(float L, float a, float b, float &x, float &y, float &z); static void L2XYZ(float L, float &x, float &y, float &z); + static float L2Y(float L); #ifdef __SSE2__ static void Lab2XYZ(vfloat L, vfloat a, vfloat b, vfloat &x, vfloat &y, vfloat &z); diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index ebafa3d71..a06670b72 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -204,14 +204,14 @@ public: void WaveletcontAllL(LabImage * lab, float **varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_L, struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili); - void WaveletcontAllLfinal(const wavelet_decomposition &WaveletCoeffs_L, const struct cont_params &cp, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL); + void WaveletcontAllLfinal(const wavelet_decomposition &WaveletCoeffs_L, const cont_params &cp, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL); void WaveletcontAllAB(LabImage * lab, float **varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_a, const WavOpacityCurveW & waOpacityCurveW, struct cont_params &cp, const bool useChannelA); void WaveletAandBAllAB(const wavelet_decomposition &WaveletCoeffs_a, const wavelet_decomposition &WaveletCoeffs_b, - const struct cont_params &cp, FlatCurve* hhcurve, bool hhutili); + const cont_params &cp, FlatCurve* hhcurve, bool hhutili); void ContAllL(float **koeLi, float *maxkoeLi, bool lipschitz, int maxlvl, LabImage * lab, float **varhue, float **varchrom, float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp, int W_L, int H_L, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili); - void finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, const struct cont_params &cp, + void finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, const cont_params &cp, int W_L, int H_L, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL); void ContAllAB(LabImage * lab, int maxlvl, float **varhue, float **varchrom, float ** WavCoeffs_a, float * WavCoeffs_a0, int level, int dir, const WavOpacityCurveW & waOpacityCurveW, struct cont_params &cp, int W_ab, int H_ab, const bool useChannelA); @@ -222,7 +222,7 @@ public: void Aver(float * HH_Coeffs, int datalen, float &averagePlus, float &averageNeg, float &max, float &min); void Sigma(float * HH_Coeffs, int datalen, float averagePlus, float averageNeg, float &sigmaPlus, float &sigmaNeg); - void calckoe(float ** WavCoeffs_LL, const struct cont_params& cp, float ** koeLi, int level, int dir, int W_L, int H_L, float edd, float *maxkoeLi, float **tmC = nullptr); + void calckoe(float ** WavCoeffs_LL, const cont_params& cp, float ** koeLi, int level, int dir, int W_L, int H_L, float edd, float *maxkoeLi, float **tmC = nullptr); diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index be26f431f..8da9eb50f 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -26,8 +26,6 @@ #include #include -#include "../rtgui/threadutils.h" - #include "array2D.h" #include "color.h" #include "curves.h" @@ -44,7 +42,6 @@ #include "sleef.h" #include "../rtgui/options.h" #include "guidedfilter.h" -#include "imagefloat.h" #ifdef _OPENMP #include #endif @@ -150,7 +147,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const {wiprof[1][0], wiprof[1][1], wiprof[1][2]}, {wiprof[2][0], wiprof[2][1], wiprof[2][2]} }; - const short int imheight = lab->H, imwidth = lab->W; + const int imheight = lab->H, imwidth = lab->W; struct cont_params cp; @@ -158,26 +155,18 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (params->wavelet.Medgreinf == "more") { cp.reinforce = 1; - } - - if (params->wavelet.Medgreinf == "none") { + } else if (params->wavelet.Medgreinf == "none") { cp.reinforce = 2; - } - - if (params->wavelet.Medgreinf == "less") { + } else if (params->wavelet.Medgreinf == "less") { cp.reinforce = 3; } if (params->wavelet.NPmethod == "none") { cp.lip3 = false; - } - - if (params->wavelet.NPmethod == "low") { + } else if (params->wavelet.NPmethod == "low") { cp.lip3 = true; cp.neigh = 0; - } - - if (params->wavelet.NPmethod == "high") { + } else if (params->wavelet.NPmethod == "high") { cp.lip3 = true; cp.neigh = 1; } @@ -197,19 +186,16 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (params->wavelet.BAmethod != "none") { cp.bam = true; + if (params->wavelet.BAmethod == "sli") { + cp.BAmet = 1; + } else if (params->wavelet.BAmethod == "cur") { + cp.BAmet = 2; + } } - if (params->wavelet.BAmethod == "sli") { - cp.BAmet = 1; - } - - if (params->wavelet.BAmethod == "cur") { - cp.BAmet = 2; - } cp.sigm = params->wavelet.sigma; cp.tmstrength = params->wavelet.tmrs; - //cp.tonemap = params->wavelet.tmr; cp.contena = params->wavelet.expcontrast; cp.chromena = params->wavelet.expchroma; cp.edgeena = params->wavelet.expedge; @@ -220,13 +206,9 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (params->wavelet.Backmethod == "black") { cp.backm = 0; - } - - if (params->wavelet.Backmethod == "grey") { + } else if (params->wavelet.Backmethod == "grey") { cp.backm = 1; - } - - if (params->wavelet.Backmethod == "resid") { + } else if (params->wavelet.Backmethod == "resid") { cp.backm = 2; } @@ -243,8 +225,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.edgampl = (float) params->wavelet.edgeampli; } - //int N = imheight * imwidth; - int maxmul = params->wavelet.thres; + const int maxmul = params->wavelet.thres; cp.maxilev = maxmul; static const float scales[10] = {1.f, 2.f, 4.f, 8.f, 16.f, 32.f, 64.f, 128.f, 256.f, 512.f}; float scaleskip[10]; @@ -253,42 +234,30 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const scaleskip[sc] = scales[sc] / skip; } - float atten0 = 0.40f; - float atten123 = 0.90f; + constexpr float atten0 = 0.40f; + constexpr float atten123 = 0.90f; //int DaubLen = settings->daubech ? 8 : 6; int DaubLen; if (params->wavelet.daubcoeffmethod == "2_") { DaubLen = 4; - } - - if (params->wavelet.daubcoeffmethod == "4_") { + } else if (params->wavelet.daubcoeffmethod == "4_") { DaubLen = 6; - } - - if (params->wavelet.daubcoeffmethod == "6_") { + } else if (params->wavelet.daubcoeffmethod == "6_") { DaubLen = 8; - } - - if (params->wavelet.daubcoeffmethod == "10_") { + } else if (params->wavelet.daubcoeffmethod == "10_") { DaubLen = 12; - } - - if (params->wavelet.daubcoeffmethod == "14_") { + } else /* if (params->wavelet.daubcoeffmethod == "14_") */{ DaubLen = 16; } cp.CHSLmet = 1; -// if(params->wavelet.CHSLmethod=="SL") cp.CHSLmet=1; -// if(params->wavelet.CHSLmethod=="CU") cp.CHSLmet=2; cp.EDmet = 1; if (params->wavelet.EDmethod == "SL") { cp.EDmet = 1; - } - - if (params->wavelet.EDmethod == "CU") { + } else if (params->wavelet.EDmethod == "CU") { cp.EDmet = 2; } @@ -310,9 +279,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (params->wavelet.CHmethod == "with") { cp.CHmet = 1; - } - - if (params->wavelet.CHmethod == "link") { + } else if (params->wavelet.CHmethod == "link") { cp.CHmet = 2; } @@ -320,7 +287,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.HSmet = true; } - cp.strength = min(1.f, max(0.f, ((float)params->wavelet.strength / 100.f))); + cp.strength = rtengine::min(1.f, rtengine::max(0.f, ((float)params->wavelet.strength / 100.f))); for (int m = 0; m < maxmul; m++) { cp.mulC[m] = waparams.ch[m]; @@ -444,7 +411,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.t_rsl = static_cast(params->wavelet.bllev.getTopRight()); cp.numlevS = params->wavelet.threshold2; int maxlevS = 9 - cp.numlevH; - cp.numlevS = MIN(cp.numlevS, maxlevS); + cp.numlevS = rtengine::min(cp.numlevS, maxlevS); //printf("levHigh=%d levShad=%d\n",cp.numlevH,cp.numlevS); //highlight cp.b_lhl = static_cast(params->wavelet.hllev.getBottomLeft()); @@ -479,7 +446,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.detectedge = params->wavelet.medianlev; //printf("low=%f mean=%f sd=%f max=%f\n",cp.edg_low,cp.edg_mean,cp.edg_sd,cp.edg_max); - int minwin = min(imwidth, imheight); + int minwin = rtengine::min(imwidth, imheight); int maxlevelcrop = 9; if (cp.mul[9] != 0) { @@ -515,10 +482,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const levwav = 10; } - levwav = min(maxlevelcrop, levwav); + levwav = rtengine::min(maxlevelcrop, levwav); // determine number of levels to process. - // for(levwav=min(maxlevelcrop,levwav);levwav>0;levwav--) + // for(levwav=rtengine::min(maxlevelcrop,levwav);levwav>0;levwav--) // if(cp.mul[levwav-1]!=0.f || cp.curv) // if(cp.mul[levwav-1]!=0.f) // break; @@ -566,7 +533,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const //now we have tile dimensions, overlaps //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - int minsizetile = min(tilewidth, tileheight); + int minsizetile = rtengine::min(tilewidth, tileheight); int maxlev2 = 10; if (minsizetile < 1024 && levwav == 10) { @@ -585,7 +552,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const maxlev2 = 6; } - levwav = min(maxlev2, levwav); + levwav = rtengine::min(maxlev2, levwav); //printf("levwav = %d\n",levwav); #ifdef _OPENMP @@ -629,13 +596,13 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const // Calculate number of tiles. If less than omp_get_max_threads(), then limit num_threads to number of tiles if (options.rgbDenoiseThreadLimit > 0) { - maxnumberofthreadsforwavelet = min(max(options.rgbDenoiseThreadLimit / 2, 1), maxnumberofthreadsforwavelet); + maxnumberofthreadsforwavelet = rtengine::min(rtengine::max(options.rgbDenoiseThreadLimit / 2, 1), maxnumberofthreadsforwavelet); } - numthreads = MIN(numtiles, omp_get_max_threads()); + numthreads = rtengine::min(numtiles, omp_get_max_threads()); if (maxnumberofthreadsforwavelet > 0) { - numthreads = MIN(numthreads, maxnumberofthreadsforwavelet); + numthreads = rtengine::min(numthreads, maxnumberofthreadsforwavelet); } #ifdef _OPENMP @@ -669,26 +636,22 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const float MaxP[10]; float MaxN[10]; + array2D varchro(tilewidth, tileheight); + float** varhue = new float*[tileheight]; for (int i = 0; i < tileheight; i++) { varhue[i] = new float[tilewidth]; } - float** varchro = new float*[tileheight]; - - for (int i = 0; i < tileheight; i++) { - varchro[i] = new float[tilewidth]; - } - #ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif for (int tiletop = 0; tiletop < imheight; tiletop += tileHskip) { for (int tileleft = 0; tileleft < imwidth ; tileleft += tileWskip) { - int tileright = MIN(imwidth, tileleft + tilewidth); - int tilebottom = MIN(imheight, tiletop + tileheight); + int tileright = rtengine::min(imwidth, tileleft + tilewidth); + int tilebottom = rtengine::min(imheight, tiletop + tileheight); int width = tileright - tileleft; int height = tilebottom - tiletop; LabImage * labco; @@ -718,36 +681,31 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const #endif for (int i = tiletop; i < tilebottom; i++) { - int i1 = i - tiletop; - int j; + const int i1 = i - tiletop; + int j = tileleft; #ifdef __SSE2__ - __m128 c327d68v = _mm_set1_ps(327.68f); - __m128 av, bv, huev, chrov; + const vfloat c327d68v = F2V(327.68f); - for (j = tileleft; j < tileright - 3; j += 4) { - int j1 = j - tileleft; - av = LVFU(lab->a[i][j]); - bv = LVFU(lab->b[i][j]); - huev = xatan2f(bv, av); - chrov = vsqrtf(SQRV(av) + SQRV(bv)) / c327d68v; - _mm_storeu_ps(&varhue[i1][j1], huev); - _mm_storeu_ps(&varchro[i1][j1], chrov); + for (; j < tileright - 3; j += 4) { + const int j1 = j - tileleft; + const vfloat av = LVFU(lab->a[i][j]); + const vfloat bv = LVFU(lab->b[i][j]); + STVFU(varhue[i1][j1], xatan2f(bv, av)); + STVFU(varchro[i1][j1], vsqrtf(SQRV(av) + SQRV(bv)) / c327d68v); if (labco != lab) { - _mm_storeu_ps(&(labco->L[i1][j1]), LVFU(lab->L[i][j])); - _mm_storeu_ps(&(labco->a[i1][j1]), av); - _mm_storeu_ps(&(labco->b[i1][j1]), bv); + STVFU((labco->L[i1][j1]), LVFU(lab->L[i][j])); + STVFU((labco->a[i1][j1]), av); + STVFU((labco->b[i1][j1]), bv); } } -#else - j = tileleft; #endif for (; j < tileright; j++) { - int j1 = j - tileleft; - float a = lab->a[i][j]; - float b = lab->b[i][j]; + const int j1 = j - tileleft; + const float a = lab->a[i][j]; + const float b = lab->b[i][j]; varhue[i1][j1] = xatan2f(b, a); varchro[i1][j1] = (sqrtf(a * a + b * b)) / 327.68f; @@ -856,7 +814,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const // if(levwavL < 3) levwavL=3;//to allow edge => I always allocate 3 (4) levels..because if user select wavelet it is to do something !! // } if (levwavL > 0) { - wavelet_decomposition* Ldecomp = new wavelet_decomposition(labco->data, labco->W, labco->H, levwavL, 1, skip, max(1, wavNestedLevels), DaubLen); + wavelet_decomposition* Ldecomp = new wavelet_decomposition(labco->data, labco->W, labco->H, levwavL, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen); if (!Ldecomp->memoryAllocationFailed) { @@ -904,10 +862,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if ((cp.lev0n > 0.1f || cp.lev1n > 0.1f || cp.lev2n > 0.1f || cp.lev3n > 0.1f) && cp.noiseena) { int edge = 1; - vari[0] = max(0.0001f, vari[0]); - vari[1] = max(0.0001f, vari[1]); - vari[2] = max(0.0001f, vari[2]); - vari[3] = max(0.0001f, vari[3]); + vari[0] = rtengine::max(0.0001f, vari[0]); + vari[1] = rtengine::max(0.0001f, vari[1]); + vari[2] = rtengine::max(0.0001f, vari[2]); + vari[3] = rtengine::max(0.0001f, vari[3]); float* noisevarlum = nullptr; // we need a dummy to pass it to WaveletDenoiseAllL WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, vari, edge); @@ -968,7 +926,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const //printf("Levwava after: %d\n",levwava); if (levwava > 0) { - wavelet_decomposition* adecomp = new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwava, 1, skip, max(1, wavNestedLevels), DaubLen); + wavelet_decomposition* adecomp = new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwava, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen); if (!adecomp->memoryAllocationFailed) { WaveletcontAllAB(labco, varhue, varchro, *adecomp, waOpacityCurveW, cp, true); @@ -989,7 +947,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const // printf("Levwavb after: %d\n",levwavb); if (levwavb > 0) { - wavelet_decomposition* bdecomp = new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, max(1, wavNestedLevels), DaubLen); + wavelet_decomposition* bdecomp = new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen); if (!bdecomp->memoryAllocationFailed) { WaveletcontAllAB(labco, varhue, varchro, *bdecomp, waOpacityCurveW, cp, false); @@ -1010,8 +968,8 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const // printf("Levwavab after: %d\n",levwavab); if (levwavab > 0) { - wavelet_decomposition* adecomp = new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwavab, 1, skip, max(1, wavNestedLevels), DaubLen); - wavelet_decomposition* bdecomp = new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavab, 1, skip, max(1, wavNestedLevels), DaubLen); + wavelet_decomposition* adecomp = new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen); + wavelet_decomposition* bdecomp = new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen); if (!adecomp->memoryAllocationFailed && !bdecomp->memoryAllocationFailed) { WaveletcontAllAB(labco, varhue, varchro, *adecomp, waOpacityCurveW, cp, true); @@ -1074,35 +1032,31 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const #endif for (int i = tiletop; i < tilebottom; i++) { - int i1 = i - tiletop; + const int i1 = i - tiletop; float L, a, b; #ifdef __SSE2__ - int rowWidth = tileright - tileleft; + const int rowWidth = tileright - tileleft; float atan2Buffer[rowWidth] ALIGNED64; float chprovBuffer[rowWidth] ALIGNED64; float xBuffer[rowWidth] ALIGNED64; float yBuffer[rowWidth] ALIGNED64; if (cp.avoi) { - int col; - __m128 av, bv; - __m128 cv, yv, xv; - __m128 zerov = _mm_setzero_ps(); - __m128 onev = _mm_set1_ps(1.f); - __m128 c327d68v = _mm_set1_ps(327.68f); - vmask xyMask; + int col = 0; + const vfloat onev = F2V(1.f); + const vfloat c327d68v = F2V(327.68f); - for (col = 0; col < rowWidth - 3; col += 4) { - av = LVFU(labco->a[i1][col]); - bv = LVFU(labco->b[i1][col]); + for (; col < rowWidth - 3; col += 4) { + const vfloat av = LVFU(labco->a[i1][col]); + const vfloat bv = LVFU(labco->b[i1][col]); STVF(atan2Buffer[col], xatan2f(bv, av)); - cv = vsqrtf(SQRV(av) + SQRV(bv)); - yv = av / cv; - xv = bv / cv; - xyMask = vmaskf_eq(zerov, cv); + const vfloat cv = vsqrtf(SQRV(av) + SQRV(bv)); + vfloat yv = av / cv; + vfloat xv = bv / cv; + const vmask xyMask = vmaskf_eq(ZEROV, cv); yv = vself(xyMask, onev, yv); - xv = vself(xyMask, zerov, xv); + xv = vselfnotzero(xyMask, xv); STVF(yBuffer[col], yv); STVF(xBuffer[col], xv); STVF(chprovBuffer[col], cv / c327d68v); @@ -1110,10 +1064,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } for (; col < rowWidth; col++) { - float la = labco->a[i1][col]; - float lb = labco->b[i1][col]; + const float la = labco->a[i1][col]; + const float lb = labco->b[i1][col]; atan2Buffer[col] = xatan2f(lb, la); - float Chprov1 = sqrtf(SQR(la) + SQR(lb)); + const float Chprov1 = sqrtf(SQR(la) + SQR(lb)); yBuffer[col] = (Chprov1 == 0.f) ? 1.f : la / Chprov1; xBuffer[col] = (Chprov1 == 0.f) ? 0.f : lb / Chprov1; chprovBuffer[col] = Chprov1 / 327.68f; @@ -1123,7 +1077,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const #endif for (int j = tileleft; j < tileright; j++) { - int j1 = j - tileleft; + const int j1 = j - tileleft; if (cp.avoi) { //Gamut and Munsell #ifdef __SSE2__ @@ -1168,7 +1122,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const float correctionHue = 0.0f; // Munsell's correction float correctlum = 0.0f; Lprov1 = L / 327.68f; - float Chprov = sqrtf(SQR(a) + SQR(b)) / 327.68f; + const float Chprov = sqrtf(SQR(a) + SQR(b)) / 327.68f; #ifdef _DEBUG Color::AllMunsellLch(true, Lprov1, Lprov2, HH, Chprov, memChprov, correctionHue, correctlum, MunsDebugInfo); #else @@ -1176,7 +1130,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const #endif if (correctionHue != 0.f || correctlum != 0.f) { // only calculate sin and cos if HH changed - if (fabs(correctionHue) < 0.015f) { + if (std::fabs(correctionHue) < 0.015f) { HH += correctlum; // correct only if correct Munsell chroma very little. } @@ -1230,13 +1184,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } delete [] varhue; - - for (int i = 0; i < tileheight; i++) { - delete [] varchro[i]; - } - - delete [] varchro; - } #ifdef _OPENMP omp_set_nested(oldNested); @@ -1248,13 +1195,8 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } if (waparams.softradend > 0.f && cp.finena) { - LabImage *provradius = new LabImage(lab->W, lab->H); - provradius->CopyFrom(lab); - array2D ble(lab->W, lab->H); array2D guid(lab->W, lab->H); - Imagefloat *tmpImage = nullptr; - tmpImage = new Imagefloat(lab->W, lab->H); bool multiTh = false; @@ -1264,61 +1206,35 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const multiTh = true; } -#endif - -#ifdef _OPENMP #pragma omp parallel for #endif - for (int ir = 0; ir < lab->H; ir++) + for (int ir = 0; ir < lab->H; ir++) { for (int jr = 0; jr < lab->W; jr++) { - float X, Y, Z; - float L = provradius->L[ir][jr]; - float a = provradius->a[ir][jr]; - float b = provradius->b[ir][jr]; - Color::Lab2XYZ(L, a, b, X, Y, Z); - - guid[ir][jr] = Y / 32768.f; - float La = dst->L[ir][jr]; - float aa = dst->a[ir][jr]; - float ba = dst->b[ir][jr]; - Color::Lab2XYZ(La, aa, ba, X, Y, Z); - tmpImage->r(ir, jr) = X; - tmpImage->g(ir, jr) = Y; - tmpImage->b(ir, jr) = Z; - ble[ir][jr] = Y / 32768.f; - + guid[ir][jr] = Color::L2Y(lab->L[ir][jr]) / 32768.f; + ble[ir][jr] = Color::L2Y(dst->L[ir][jr]) / 32768.f; } + } - double epsilmax = 0.001; - double epsilmin = 0.0001; - double aepsil = (epsilmax - epsilmin) / 90.f; - double bepsil = epsilmax - 100.f * aepsil; - double epsil = aepsil * waparams.softradend + bepsil; + constexpr double epsilmax = 0.001; + constexpr double epsilmin = 0.0001; + constexpr double aepsil = (epsilmax - epsilmin) / 90.f; + constexpr double bepsil = epsilmax - 100.f * aepsil; + const double epsil = aepsil * waparams.softradend + bepsil; - float blur = 10.f / scale * (0.001f + 0.8f * waparams.softradend); + const float blur = 10.f / scale * (0.001f + 0.8f * waparams.softradend); rtengine::guidedFilter(guid, ble, ble, blur, epsil, multiTh); - - #ifdef _OPENMP #pragma omp parallel for #endif - for (int ir = 0; ir < lab->H; ir++) + for (int ir = 0; ir < lab->H; ir++) { for (int jr = 0; jr < lab->W; jr++) { - float X = tmpImage->r(ir, jr); - float Y = 32768.f * ble[ir][jr]; - float Z = tmpImage->b(ir, jr); - float L, a, b; - Color::XYZ2Lab(X, Y, Z, L, a, b); - - dst->L[ir][jr] = L; + dst->L[ir][jr] = Color::computeXYZ2LabY(32768.f * ble[ir][jr]); } - - delete tmpImage; - delete provradius; + } } #ifdef _DEBUG @@ -1327,21 +1243,16 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } -#undef TS -#undef fTS -#undef offset -#undef epsilon - -void ImProcFunctions::Aver(float * RESTRICT DataList, int datalen, float &averagePlus, float &averageNeg, float &max, float &min) +void ImProcFunctions::Aver(float * RESTRICT DataList, int datalen, float &averagePlus, float &averageNeg, float &max, float &min) { //find absolute mean int countP = 0, countN = 0; double averaP = 0.0, averaN = 0.0; // use double precision for large summations - float thres = 5.f;//different fom zero to take into account only data large enough + constexpr float thres = 5.f;//different fom zero to take into account only data large enough max = 0.f; - min = 0.f; + min = RT_INFINITY_F; #ifdef _OPENMP #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif @@ -1354,19 +1265,11 @@ void ImProcFunctions::Aver(float * RESTRICT DataList, int datalen, float &avera for (int i = 0; i < datalen; i++) { if (DataList[i] >= thres) { averaP += static_cast(DataList[i]); - - if (DataList[i] > lmax) { - lmax = DataList[i]; - } - + lmax = rtengine::max(lmax, DataList[i]); countP++; } else if (DataList[i] < -thres) { averaN += static_cast(DataList[i]); - - if (DataList[i] < lmin) { - lmin = DataList[i]; - } - + lmin = rtengine::min(lmin, DataList[i]); countN++; } } @@ -1375,8 +1278,8 @@ void ImProcFunctions::Aver(float * RESTRICT DataList, int datalen, float &avera #pragma omp critical #endif { - max = max > lmax ? max : lmax; - min = min < lmin ? min : lmin; + max = rtengine::max(max, lmax); + min = rtengine::min(min, lmin); } } @@ -1521,7 +1424,7 @@ void ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compress #pragma omp parallel #endif { - vfloat exponentv = F2V(exponent); + const vfloat exponentv = F2V(exponent); #ifdef _OPENMP #pragma omp for #endif @@ -1647,7 +1550,7 @@ void ImProcFunctions::EPDToneMapResid(float * WavCoeffs_L0, unsigned int Iterat } } -void ImProcFunctions::WaveletcontAllLfinal(const wavelet_decomposition &WaveletCoeffs_L, const struct cont_params &cp, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL) +void ImProcFunctions::WaveletcontAllLfinal(const wavelet_decomposition &WaveletCoeffs_L, const cont_params &cp, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL) { int maxlvl = WaveletCoeffs_L.maxlevel(); float * WavCoeffs_L0 = WaveletCoeffs_L.coeff0; @@ -2004,7 +1907,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } void ImProcFunctions::WaveletAandBAllAB(const wavelet_decomposition &WaveletCoeffs_a, const wavelet_decomposition &WaveletCoeffs_b, - const struct cont_params &cp, FlatCurve* hhCurve, bool hhutili) + const cont_params &cp, FlatCurve* hhCurve, bool hhutili) { // StopWatch Stop1("WaveletAandBAllAB"); if (hhutili && cp.resena) { // H=f(H) @@ -2031,12 +1934,10 @@ void ImProcFunctions::WaveletAandBAllAB(const wavelet_decomposition &WaveletCoef int k; for (k = 0; k < W_L - 3; k += 4) { - __m128 av = LVFU(WavCoeffs_a0[i * W_L + k]); - __m128 bv = LVFU(WavCoeffs_b0[i * W_L + k]); - __m128 huev = xatan2f(bv, av); - __m128 chrv = vsqrtf(SQRV(av) + SQRV(bv)); - STVF(huebuffer[k], huev); - STVF(chrbuffer[k], chrv); + const vfloat av = LVFU(WavCoeffs_a0[i * W_L + k]); + const vfloat bv = LVFU(WavCoeffs_b0[i * W_L + k]); + STVF(huebuffer[k], xatan2f(bv, av)); + STVF(chrbuffer[k], vsqrtf(SQRV(av) + SQRV(bv))); } for (; k < W_L; k++) { @@ -2217,7 +2118,7 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void ImProcFunctions::calckoe(float ** WavCoeffs_LL, const struct cont_params& cp, float *koeLi[12], int level, int dir, int W_L, int H_L, float edd, float *maxkoeLi, float **tmC) +void ImProcFunctions::calckoe(float ** WavCoeffs_LL, const cont_params& cp, float *koeLi[12], int level, int dir, int W_L, int H_L, float edd, float *maxkoeLi, float **tmC) { int borderL = 2; @@ -2360,8 +2261,8 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, const struct cont_params& c // float temp = WavCoeffs_LL[dir][i*W_L + j]; // if(temp>=0.f && temp < thr) temp = thr; // if(temp < 0.f && temp > -thr) temp = -thr; - float temp = max(fabsf(WavCoeffs_LL[dir][i * W_L + j]), thr); - koeLi[level * 3 + dir - 1][i * W_L + j] = min(thr2, fabs(tmC[i][j] / temp)); // limit maxi + float temp = rtengine::max(std::fabs(WavCoeffs_LL[dir][i * W_L + j]), thr); + koeLi[level * 3 + dir - 1][i * W_L + j] = rtengine::min(thr2, std::fabs(tmC[i][j] / temp)); // limit maxi //it will be more complicated to calculate both Wh and Wv, but we have also Wd==> pseudo Lipschitz if (koeLi[level * 3 + dir - 1][i * W_L + j] > maxkoeLi[level * 3 + dir - 1]) { @@ -2376,7 +2277,7 @@ void ImProcFunctions::calckoe(float ** WavCoeffs_LL, const struct cont_params& c } -void ImProcFunctions::finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, const struct cont_params &cp, +void ImProcFunctions::finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, const cont_params &cp, int W_L, int H_L, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL) { if (cp.diagcurv && cp.finena && MaxP[level] > 0.f && mean[level] != 0.f && sigma[level] != 0.f) { //curve @@ -2397,15 +2298,15 @@ void ImProcFunctions::finalContAllL(float ** WavCoeffs_L, float * WavCoeffs_L0, for (int i = 0; i < W_L * H_L; i++) { float absciss; - if (fabsf(WavCoeffs_L[dir][i]) >= (mean[level] + sigma[level])) { //for max - float valcour = xlogf(fabsf(WavCoeffs_L[dir][i])); + if (std::fabs(WavCoeffs_L[dir][i]) >= (mean[level] + sigma[level])) { //for max + float valcour = xlogf(std::fabs(WavCoeffs_L[dir][i])); float valc = valcour - logmax; float vald = valc * rap; absciss = xexpf(vald); - } else if (fabsf(WavCoeffs_L[dir][i]) >= mean[level]) { - absciss = asig * fabsf(WavCoeffs_L[dir][i]) + bsig; + } else if (std::fabs(WavCoeffs_L[dir][i]) >= mean[level]) { + absciss = asig * std::fabs(WavCoeffs_L[dir][i]) + bsig; } else { - absciss = amean * fabsf(WavCoeffs_L[dir][i]); + absciss = amean * std::fabs(WavCoeffs_L[dir][i]); } float kc = waOpacityCurveWL[absciss * 500.f] - 0.5f; @@ -2606,11 +2507,9 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz temp = -thr; } - koe[i * W_L + j] = min(thr2, fabs(tmC[i][j] / temp)); + koe[i * W_L + j] = rtengine::min(thr2, std::fabs(tmC[i][j] / temp)); - if (koe[i * W_L + j] > maxkoe) { - maxkoe = koe[i * W_L + j]; - } + maxkoe = rtengine::max(maxkoe, koe[i * W_L + j]); float diff = maxkoe - koe[i * W_L + j]; diff *= (cp.eddet / 100.f); @@ -2650,14 +2549,11 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz if (cp.reinforce != 2) { - float brepart; - - if (cp.reinforce == 1) { - brepart = 3.f; - } else /*if (cp.reinforce == 3) */{ - brepart = 0.5f; //arbitrary value to increase / decrease repart, between 1 and 0 - } - float arepart = -(brepart - 1.f) / (lim0 / 60.f); + const float brepart = + cp.reinforce == 1 + ? 3.f + : 0.5f; + const float arepart = -(brepart - 1.f) / (lim0 / 60.f); if (rad < lim0 / 60.f) { repart *= (arepart * rad + brepart); //linear repartition of repart @@ -2670,7 +2566,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz float ak = -(al0 - al10) / 10.f; //10 = maximum levels float bk = al0; float koef = ak * level + bk; //modulate for levels : more levels high, more koef low ==> concentrated action on low levels, without or near for high levels - float expkoef = -pow(fabs(rad - lev), koef); //reduce effect for high levels + float expkoef = -std::pow(std::fabs(rad - lev), koef); //reduce effect for high levels if (cp.reinforce == 3) { if (rad < lim0 / 60.f && level == 0) { @@ -2750,16 +2646,16 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz } if (cp.edgcurv) { - if (fabs(WavCoeffs_L[dir][k]) >= (mean[level] + sigma[level])) { //for max - float valcour = log(fabs(WavCoeffs_L[dir][k])); + if (std::fabs(WavCoeffs_L[dir][k]) >= (mean[level] + sigma[level])) { //for max + float valcour = xlogf(std::fabs(WavCoeffs_L[dir][k])); float valc = valcour - logmax; float vald = valc * rap; absciss = exp(vald); - } else if (fabs(WavCoeffs_L[dir][k]) >= mean[level] && fabs(WavCoeffs_L[dir][k]) < (mean[level] + sigma[level])) { - absciss = asig * fabs(WavCoeffs_L[dir][k]) + bsig; - } else if (fabs(WavCoeffs_L[dir][k]) < mean[level]) { - absciss = amean * fabs(WavCoeffs_L[dir][k]); + } else if (std::fabs(WavCoeffs_L[dir][k]) >= mean[level] && std::fabs(WavCoeffs_L[dir][k]) < (mean[level] + sigma[level])) { + absciss = asig * std::fabs(WavCoeffs_L[dir][k]) + bsig; + } else if (std::fabs(WavCoeffs_L[dir][k]) < mean[level]) { + absciss = amean * std::fabs(WavCoeffs_L[dir][k]); } // Threshold adjuster settings==> approximative for curve @@ -2897,8 +2793,8 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz } } - if (fabs(WavCoeffs_L[dir][k]) >= edgeMeanCompare && fabs(WavCoeffs_L[dir][k]) < edgeSdCompare) { - //if (fabs(WavCoeffs_L[dir][i]) > edgeSdCompare) { + if (std::fabs(WavCoeffs_L[dir][k]) >= edgeMeanCompare && std::fabs(WavCoeffs_L[dir][k]) < edgeSdCompare) { + //if (std::fabs(WavCoeffs_L[dir][i]) > edgeSdCompare) { edge *= edgeSdFactor; if (edge < 1.f) { @@ -2906,7 +2802,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz } }//modify effect if sd change - if (fabs(WavCoeffs_L[dir][k]) < edgeMeanCompare) { + if (std::fabs(WavCoeffs_L[dir][k]) < edgeMeanCompare) { edge *= edgeMeanFactor; if (edge < 1.f) { @@ -2914,7 +2810,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz } } // modify effect if mean change - if (fabs(WavCoeffs_L[dir][k]) < edgeLowCompare) { + if (std::fabs(WavCoeffs_L[dir][k]) < edgeLowCompare) { edge *= edgeLowFactor; if (edge < 1.f) { @@ -3004,7 +2900,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz if (cpMul < 0.f) { beta = 1.f; // disabled for negatives values "less contrast" } else { - float WavCL = fabsf(WavCoeffs_L[dir][i]); + float WavCL = std::fabs(WavCoeffs_L[dir][i]); //reduction amplification: max action between mean / 2 and mean + sigma // arbitrary coefficient, we can add a slider !! @@ -3041,7 +2937,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz float LL = labco->L[ii * 2][jj * 2]; LL100 = LL100init = LL / 327.68f; LL100res = WavCoeffs_L0[i] / 327.68f; - float delta = fabs(LL100init - LL100res) / (maxlvl / 2); + float delta = std::fabs(LL100init - LL100res) / (maxlvl / 2); for (int ml = 0; ml < maxlvl; ml++) { if (ml < maxlvl / 2) { From 8cfc4e33af5b4720f50865a8270ecd904829a954 Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 26 Feb 2020 15:22:28 +0100 Subject: [PATCH 118/154] partial fixed wrong old WB auto --- rtengine/improccoordinator.cc | 9 +++------ rtengine/procparams.cc | 23 ++++++++++++++++++++--- rtgui/ppversion.h | 2 +- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 0ed8b1f97..108dac114 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -37,6 +37,7 @@ #include "procparams.h" #include "refreshmap.h" #include "guidedfilter.h" +#include "../rtgui/version.h" #include "../rtgui/options.h" @@ -238,7 +239,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) // Check if any detail crops need high detail. If not, take a fast path short cut if (!highDetailNeeded) { for (size_t i = 0; i < crops.size(); i++) { - if (crops[i]->get_skip() == 1) { // skip=1 -> full resolution + if (crops[i]->get_skip() == 1) { // skip=1 -> full resolution highDetailNeeded = true; break; } @@ -255,10 +256,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) RAWParams rp = params->raw; ColorManagementParams cmp = params->icm; LCurveParams lcur = params->labCurve; - if (settings->verbose) { - printf("metwb2=%s \n", params->wb.method.c_str()); - } - + if (!highDetailNeeded) { // if below 100% magnification, take a fast path if (rp.bayersensor.method != RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::NONE) && rp.bayersensor.method != RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::MONO)) { @@ -424,7 +422,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if (settings->verbose) { printf("automethod=%s \n", params->wb.method.c_str()); } - if (todo & (M_INIT | M_LINDENOISE | M_HDR)) { MyMutex::MyLock initLock(minit); // Also used in crop window diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 7d83b50d2..fe3766287 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1305,6 +1305,8 @@ bool WBParams::operator !=(const WBParams& other) const const std::vector& WBParams::getWbEntries() { + + static const std::vector wb_entries = { {"Camera", WBEntry::Type::CAMERA, M("TP_WBALANCE_CAMERA"), 0, 1.f, 1.f, 0.f}, // {"Auto", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTO"), 0, 1.f, 1.f, 0.f}, @@ -1349,7 +1351,6 @@ const std::vector& WBParams::getWbEntries() // Should remain the last one {"Custom", WBEntry::Type::CUSTOM, M("TP_WBALANCE_CUSTOM"), 0, 1.f, 1.f, 0.f} }; - return wb_entries; } @@ -4164,10 +4165,26 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Vibrance", "PastSatTog", pedited, vibrance.pastsattog, pedited->vibrance.pastsattog); assignFromKeyfile(keyFile, "Vibrance", "SkinTonesCurve", pedited, vibrance.skintonescurve, pedited->vibrance.skintonescurve); } - if (keyFile.has_group("White Balance")) { assignFromKeyfile(keyFile, "White Balance", "Enabled", pedited, wb.enabled, pedited->wb.enabled); - assignFromKeyfile(keyFile, "White Balance", "Setting", pedited, wb.method, pedited->wb.method); + if (keyFile.has_key("White Balance", "Setting")) { +// if(ppVersion < 349) { + Glib::ustring prov = keyFile.get_string("White Balance", "Setting"); +// printf("Prov=%s\n", prov.c_str()); + if(prov == "Auto") { + printf("OK Auto\n"); + prov = "autold"; + wb.method = prov; + keyFile.set_string("White Balance", "Setting",wb.method ); + if (pedited) { + pedited->wb.method = true; + } + assignFromKeyfile(keyFile, "White Balance", "Setting", pedited, wb.method, pedited->wb.method); + + } else { + assignFromKeyfile(keyFile, "White Balance", "Setting", pedited, wb.method, pedited->wb.method); + } + } assignFromKeyfile(keyFile, "White Balance", "Temperature", pedited, wb.temperature, pedited->wb.temperature); assignFromKeyfile(keyFile, "White Balance", "Green", pedited, wb.green, pedited->wb.green); assignFromKeyfile(keyFile, "White Balance", "Equal", pedited, wb.equal, pedited->wb.equal); diff --git a/rtgui/ppversion.h b/rtgui/ppversion.h index 89f93ed44..3a4019b36 100644 --- a/rtgui/ppversion.h +++ b/rtgui/ppversion.h @@ -1,7 +1,7 @@ #pragma once // This number has to be incremented whenever the PP3 file format is modified or the behaviour of a tool changes -#define PPVERSION 346 +#define PPVERSION 349 #define PPVERSION_AEXP 301 //value of PPVERSION when auto exposure algorithm was modified /* From 4863c7a372ee8acb006d62addb28e902176c7e2f Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 26 Feb 2020 15:37:49 +0100 Subject: [PATCH 119/154] clean unused changes --- rtengine/improccoordinator.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 108dac114..1115fa4fc 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -37,7 +37,6 @@ #include "procparams.h" #include "refreshmap.h" #include "guidedfilter.h" -#include "../rtgui/version.h" #include "../rtgui/options.h" From 5960899c048f0de0f36d6302e03b8791decc0d8b Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 26 Feb 2020 16:36:00 +0100 Subject: [PATCH 120/154] Minor cleanup --- rtengine/color.h | 2 +- rtengine/ipwavelet.cc | 28 ++++++---------------------- 2 files changed, 7 insertions(+), 23 deletions(-) diff --git a/rtengine/color.h b/rtengine/color.h index 79250819b..3f63ad312 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -187,7 +187,7 @@ public: static inline float computeXYZ2LabY(float f) { if (f < 0.f) { - return 327.68 * (kappa * f / MAXVALF); + return 327.68f * (kappa * f / MAXVALF); } else if (f > 65535.f) { return 327.68f * (116.f * xcbrtf(f / MAXVALF) - 16.f); } else { diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 8da9eb50f..758a9147b 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -596,7 +596,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const // Calculate number of tiles. If less than omp_get_max_threads(), then limit num_threads to number of tiles if (options.rgbDenoiseThreadLimit > 0) { - maxnumberofthreadsforwavelet = rtengine::min(rtengine::max(options.rgbDenoiseThreadLimit / 2, 1), maxnumberofthreadsforwavelet); + maxnumberofthreadsforwavelet = rtengine::LIM(options.rgbDenoiseThreadLimit / 2, 1, maxnumberofthreadsforwavelet); } numthreads = rtengine::min(numtiles, omp_get_max_threads()); @@ -796,25 +796,18 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const ref0 = true; } - // printf("LevwavL before: %d\n",levwavL); if (cp.contrast == 0.f && !cp.tonemap && cp.conres == 0.f && cp.conresH == 0.f && cp.val == 0 && !ref0 && params->wavelet.CLmethod == "all") { // no processing of residual L or edge=> we probably can reduce the number of levels while (levwavL > 0 && cp.mul[levwavL - 1] == 0.f) { // cp.mul[level] == 0.f means no changes to level levwavL--; } } - // printf("LevwavL after: %d\n",levwavL); - // if(cp.noiseena){ if (levwavL < 4) { levwavL = 4; //to allow edge => I always allocate 3 (4) levels..because if user select wavelet it is to do something !! } - // } - // else { - // if(levwavL < 3) levwavL=3;//to allow edge => I always allocate 3 (4) levels..because if user select wavelet it is to do something !! - // } if (levwavL > 0) { - wavelet_decomposition* Ldecomp = new wavelet_decomposition(labco->data, labco->W, labco->H, levwavL, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen); + const std::unique_ptr Ldecomp(new wavelet_decomposition(labco->data, labco->W, labco->H, levwavL, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!Ldecomp->memoryAllocationFailed) { @@ -896,8 +889,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const Ldecomp->reconstruct(labco->data, cp.strength); } - - delete Ldecomp; } //Flat curve for H=f(H) in residual image @@ -926,14 +917,12 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const //printf("Levwava after: %d\n",levwava); if (levwava > 0) { - wavelet_decomposition* adecomp = new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwava, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen); + const std::unique_ptr adecomp(new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwava, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!adecomp->memoryAllocationFailed) { WaveletcontAllAB(labco, varhue, varchro, *adecomp, waOpacityCurveW, cp, true); adecomp->reconstruct(labco->data + datalen, cp.strength); } - - delete adecomp; } int levwavb = levwav; @@ -947,14 +936,12 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const // printf("Levwavb after: %d\n",levwavb); if (levwavb > 0) { - wavelet_decomposition* bdecomp = new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen); + const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!bdecomp->memoryAllocationFailed) { WaveletcontAllAB(labco, varhue, varchro, *bdecomp, waOpacityCurveW, cp, false); bdecomp->reconstruct(labco->data + 2 * datalen, cp.strength); } - - delete bdecomp; } } else {// a and b int levwavab = levwav; @@ -968,8 +955,8 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const // printf("Levwavab after: %d\n",levwavab); if (levwavab > 0) { - wavelet_decomposition* adecomp = new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen); - wavelet_decomposition* bdecomp = new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen); + const std::unique_ptr adecomp(new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); + const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!adecomp->memoryAllocationFailed && !bdecomp->memoryAllocationFailed) { WaveletcontAllAB(labco, varhue, varchro, *adecomp, waOpacityCurveW, cp, true); @@ -980,9 +967,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const bdecomp->reconstruct(labco->data + 2 * datalen, cp.strength); } - - delete adecomp; - delete bdecomp; } } From 13e2bc41521f18c3bfbb425e431b7d855b18c4e8 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 26 Feb 2020 18:32:32 +0100 Subject: [PATCH 121/154] White balance shows wrong method when opening a file which was set to Auto in 5.8, #5668 --- rtengine/procparams.cc | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index fe3766287..88178d0e0 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -4167,23 +4167,9 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } if (keyFile.has_group("White Balance")) { assignFromKeyfile(keyFile, "White Balance", "Enabled", pedited, wb.enabled, pedited->wb.enabled); - if (keyFile.has_key("White Balance", "Setting")) { -// if(ppVersion < 349) { - Glib::ustring prov = keyFile.get_string("White Balance", "Setting"); -// printf("Prov=%s\n", prov.c_str()); - if(prov == "Auto") { - printf("OK Auto\n"); - prov = "autold"; - wb.method = prov; - keyFile.set_string("White Balance", "Setting",wb.method ); - if (pedited) { - pedited->wb.method = true; - } - assignFromKeyfile(keyFile, "White Balance", "Setting", pedited, wb.method, pedited->wb.method); - - } else { - assignFromKeyfile(keyFile, "White Balance", "Setting", pedited, wb.method, pedited->wb.method); - } + assignFromKeyfile(keyFile, "White Balance", "Setting", pedited, wb.method, pedited->wb.method); + if (wb.method == "Auto") { + wb.method = "autold"; } assignFromKeyfile(keyFile, "White Balance", "Temperature", pedited, wb.temperature, pedited->wb.temperature); assignFromKeyfile(keyFile, "White Balance", "Green", pedited, wb.green, pedited->wb.green); From d7234c5aacbbf3e68665b0e5b3a51d1e1e5e204b Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 27 Feb 2020 08:08:33 +0100 Subject: [PATCH 122/154] reinitialize ppversion --- rtgui/ppversion.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/ppversion.h b/rtgui/ppversion.h index 3a4019b36..89f93ed44 100644 --- a/rtgui/ppversion.h +++ b/rtgui/ppversion.h @@ -1,7 +1,7 @@ #pragma once // This number has to be incremented whenever the PP3 file format is modified or the behaviour of a tool changes -#define PPVERSION 349 +#define PPVERSION 346 #define PPVERSION_AEXP 301 //value of PPVERSION when auto exposure algorithm was modified /* From 32f3273a2a070db7e97f61f9c4fd95308d5b1b46 Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 27 Feb 2020 08:50:08 +0100 Subject: [PATCH 123/154] Change some tooltips --- rtdata/languages/default | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 59de4bb40..be3594a84 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1449,7 +1449,7 @@ TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's TP_COLORAPP_NEUTRAL;Reset TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values TP_COLORAPP_PRESETCAT02;Preset cat02 automatic -TP_COLORAPP_PRESETCAT02_TIP;Set combobox, sliders, temp, green so that Cat02 automatic is preset.\nYou must change Cat02 adaptation Viewing conditions if need, and other settings if need. +TP_COLORAPP_PRESETCAT02_TIP;Set combobox, sliders, temp, green so that Cat02 automatic is preset.\nYou must change Cat02 adaptation Viewing conditions if need.\nYou can change Temperature and Tint Viewing conditions if need, and other settings if need. TP_COLORAPP_RSTPRO;Red & skin-tones protection TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. TP_COLORAPP_SURROUND;Surround From 5a9f4309336fc392bc98c438cf350c8ef11f6f15 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Thu, 27 Feb 2020 10:43:21 +0100 Subject: [PATCH 124/154] Update rtexif using ExifTool 11.89 --- rtexif/canonattribs.cc | 2 +- rtexif/olympusattribs.cc | 1 + rtexif/pentaxattribs.cc | 2 ++ rtexif/sonyminoltaattribs.cc | 2 ++ 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/rtexif/canonattribs.cc b/rtexif/canonattribs.cc index 636bf4328..a91b7266c 100644 --- a/rtexif/canonattribs.cc +++ b/rtexif/canonattribs.cc @@ -845,7 +845,7 @@ public: {195, "Canon EF 35-105mm f/4.5-5.6 USM"}, {196, "Canon EF 75-300mm f/4-5.6 USM"}, {197, "Canon EF 75-300mm f/4-5.6 IS USM or Sigma Lens"}, - {197, "Sigma 18-300mm f/3.5-6.3 DC Macro OS HS"}, + {197, "Sigma 18-300mm f/3.5-6.3 DC Macro OS HSM"}, {198, "Canon EF 50mm f/1.4 USM or Other Lens"}, {198, "Zeiss Otus 55mm f/1.4 ZE"}, {198, "Zeiss Otus 85mm f/1.4 ZE"}, diff --git a/rtexif/olympusattribs.cc b/rtexif/olympusattribs.cc index ec7ab98c7..52fbec55d 100644 --- a/rtexif/olympusattribs.cc +++ b/rtexif/olympusattribs.cc @@ -131,6 +131,7 @@ public: lenses["00 32 10"] = "Olympus M.Zuiko Digital ED 12-200mm f/3.5-6.3"; lenses["00 33 00"] = "Olympus Zuiko Digital 25mm f/2.8"; lenses["00 34 00"] = "Olympus Zuiko Digital ED 9-18mm f/4.0-5.6"; + lenses["00 34 10"] = "Olympus M.Zuiko Digital ED 12-45mm f/4.0 Pro"; lenses["00 35 00"] = "Olympus Zuiko Digital 14-54mm f/2.8-3.5 II"; lenses["01 01 00"] = "Sigma 18-50mm f/3.5-5.6 DC"; lenses["01 01 10"] = "Sigma 30mm f/2.8 EX DN"; diff --git a/rtexif/pentaxattribs.cc b/rtexif/pentaxattribs.cc index da940f5cb..d6b9a9c84 100644 --- a/rtexif/pentaxattribs.cc +++ b/rtexif/pentaxattribs.cc @@ -782,6 +782,7 @@ public: choices.insert (p_t (256 * 4 + 2, "smc PENTAX-FA 80-320mm f/4.5-5.6")); choices.insert (p_t (256 * 4 + 3, "smc PENTAX-FA 43mm f/1.9 Limited")); choices.insert (p_t (256 * 4 + 6, "smc PENTAX-FA 35-80mm f/4-5.6")); + choices.insert (p_t (256 * 4 + 8, "Irix 150mm f/2.8 Macro")); choices.insert (p_t (256 * 4 + 9, "Irix 11mm f/4 Firefly")); choices.insert (p_t (256 * 4 + 10, "Irix 15mm f/2.4")); choices.insert (p_t (256 * 4 + 12, "smc PENTAX-FA 50mm f/1.4")); @@ -938,6 +939,7 @@ public: choices.insert (p_t (256 * 8 + 62, "HD PENTAX-D FA 24-70mm f/2.8 ED SDM WR")); choices.insert (p_t (256 * 8 + 63, "HD PENTAX-D FA 15-30mm f/2.8 ED SDM WR")); choices.insert (p_t (256 * 8 + 64, "HD PENTAX-D FA* 50mm f/1.4 SDM AW")); + choices.insert (p_t (256 * 8 + 65, "HD PENTAX-D FA 70-210mm f/4 ED SDM WR")); choices.insert (p_t (256 * 8 + 196, "HD PENTAX-DA* 11-18mm f/2.8 ED DC AW")); choices.insert (p_t (256 * 8 + 197, "HD PENTAX-DA 55-300mm f/4.5-6.3 ED PLM WR RE")); choices.insert (p_t (256 * 8 + 198, "smc PENTAX-DA L 18-50mm f/4-5.6 DC WR RE")); diff --git a/rtexif/sonyminoltaattribs.cc b/rtexif/sonyminoltaattribs.cc index 88251b131..4c901b8c0 100644 --- a/rtexif/sonyminoltaattribs.cc +++ b/rtexif/sonyminoltaattribs.cc @@ -1126,6 +1126,7 @@ public: choices.insert (p_t (49458, "Tamron 17-28mm f/2.8 Di III RXD")); choices.insert (p_t (49459, "Tamron 35mm f/2.8 Di III OSD M1:2")); choices.insert (p_t (49460, "Tamron 24mm f/2.8 Di III OSD M1:2")); + choices.insert (p_t (49461, "Tamron 20mm f/2.8 Di III OSD M1:2")); choices.insert (p_t (49712, "Tokina FiRIN 20mm f/2 FE AF")); choices.insert (p_t (49713, "Tokina FiRIN 100mm f/2.8 FE MACRO")); choices.insert (p_t (50480, "Sigma 30mm f/1.4 DC DN | C")); @@ -1152,6 +1153,7 @@ public: choices.insert (p_t (50514, "Sigma 45mm f/2.8 DG DN | C")); choices.insert (p_t (50515, "Sigma 35mm f/1.2 DG DN | A")); choices.insert (p_t (50516, "Sigma 14-24mm f/2.8 DG DN | A")); + choices.insert (p_t (50517, "Sigma 24-70mm f/2.8 DG DN | A")); choices.insert (p_t (50992, "Voigtlander SUPER WIDE-HELIAR 15mm f/4.5 III")); choices.insert (p_t (50993, "Voigtlander HELIAR-HYPER WIDE 10mm f/5.6")); choices.insert (p_t (50994, "Voigtlander ULTRA WIDE-HELIAR 12mm f/5.6 III")); From 2bc9396569c574f1e5c41768dea947b8775ee9e5 Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 27 Feb 2020 13:33:51 +0100 Subject: [PATCH 125/154] Fixed show wavelet levels --- rtengine/dcrop.cc | 4 ++-- rtengine/improccoordinator.cc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index b9594a709..3e9e2a6a8 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -1008,12 +1008,12 @@ void Crop::update(int todo) params.wavelet.CLmethod = provis; } - +/* if (!WaveParams.expclari && WaveParams.CLmethod != "all") { params.wavelet.CLmethod = "all"; params.wavelet.Backmethod = "grey"; } - +*/ if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { WaveParams.expcontrast = false; WaveParams.expchroma = false; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 1115fa4fc..35834a976 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -906,12 +906,12 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) params->wavelet.CLmethod = provis; } - +/* if (!WaveParams.expclari && WaveParams.CLmethod != "all") { params->wavelet.CLmethod = "all"; params->wavelet.Backmethod = "grey"; } - +*/ if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { WaveParams.expcontrast = false; WaveParams.expchroma = false; From d2f78efd3266ba32a9c516a32ca1043392d53702 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 27 Feb 2020 14:20:28 +0100 Subject: [PATCH 126/154] improccoordinator.cc : be cppcheck clean --- rtengine/improccoordinator.cc | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 35834a976..6c9105036 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -351,7 +351,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) bayerAutoContrastListener->autoContrastChanged(contrastThreshold); } else if (imgsrc->getSensorType() == ST_FUJI_XTRANS && xtransAutoContrastListener && autoContrast) { - xtransAutoContrastListener->autoContrastChanged(autoContrast ? contrastThreshold : -1.0); + xtransAutoContrastListener->autoContrastChanged(contrastThreshold); } // if a demosaic happened we should also call getimage later, so we need to set the M_INIT flag todo |= (M_INIT | M_CSHARP); @@ -905,14 +905,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) params->wavelet.CLmethod = provis; - } -/* - if (!WaveParams.expclari && WaveParams.CLmethod != "all") { - params->wavelet.CLmethod = "all"; - params->wavelet.Backmethod = "grey"; - } -*/ - if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { WaveParams.expcontrast = false; WaveParams.expchroma = false; WaveParams.expedge = false; From 19b6e4ca68c440874411989e0a0a6f942d56827b Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 27 Feb 2020 14:30:59 +0100 Subject: [PATCH 127/154] dcrop.cc : be cppcheck clean --- rtengine/dcrop.cc | 8 -------- 1 file changed, 8 deletions(-) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 3e9e2a6a8..243ea1b62 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -1007,14 +1007,6 @@ void Crop::update(int todo) params.wavelet.CLmethod = provis; - } -/* - if (!WaveParams.expclari && WaveParams.CLmethod != "all") { - params.wavelet.CLmethod = "all"; - params.wavelet.Backmethod = "grey"; - } -*/ - if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { WaveParams.expcontrast = false; WaveParams.expchroma = false; WaveParams.expedge = false; From 4590607ea58013b5c20f40c0a2c4702ddc23ed7e Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 27 Feb 2020 14:54:17 +0100 Subject: [PATCH 128/154] simpleprocess.cc : be cppcheck clean --- rtengine/simpleprocess.cc | 77 ++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 45 deletions(-) diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 28188b0f6..779f2b33d 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -68,7 +68,7 @@ public: pl(pl), flush(flush), // internal state - ii(nullptr), + initialImage(nullptr), imgsrc(nullptr), fw(0), fh(0), @@ -97,6 +97,7 @@ public: hlcomprthresh(0), baseImg(nullptr), labView(nullptr), + ctColorCurve(), autili(false), butili(false) { @@ -150,10 +151,10 @@ private: pl->setProgress(0.0); } - ii = job->initialImage; + initialImage = job->initialImage; - if (!ii) { - ii = InitialImage::load(job->fname, job->isRaw, &errorCode); + if (!initialImage) { + initialImage = InitialImage::load(job->fname, job->isRaw, &errorCode); if (errorCode) { delete job; @@ -164,7 +165,7 @@ private: procparams::ProcParams& params = job->pparams; // acquire image from imagesource - imgsrc = ii->getImageSource(); + imgsrc = initialImage->getImageSource(); tr = getCoarseBitMask(params.coarse); @@ -245,7 +246,6 @@ private: if (params.retinex.enabled) { //enabled Retinex LUTf cdcurve(65536, 0); LUTf mapcurve(65536, 0); - LUTu dummy; RetinextransmissionCurve dehatransmissionCurve; RetinexgaintransmissionCurve dehagaintransmissionCurve; bool dehacontlutili = false; @@ -921,11 +921,11 @@ private: if (profile == "sRGB" || profile == "Adobe RGB" || profile == "ProPhoto" || profile == "WideGamut" || profile == "BruceRGB" || profile == "Beta RGB" || profile == "BestRGB" || profile == "Rec2020" || profile == "ACESp0" || profile == "ACESp1") { const int cw = baseImg->getWidth(); const int ch = baseImg->getHeight(); - cmsHTRANSFORM dummy = nullptr; + cmsHTRANSFORM dummyTransForm = nullptr; // put gamma TRC to 1 - ipf.workingtrc(baseImg, baseImg, cw, ch, -5, params.icm.workingProfile, 2.4, 12.92310, dummy, true, false, false); + ipf.workingtrc(baseImg, baseImg, cw, ch, -5, params.icm.workingProfile, 2.4, 12.92310, dummyTransForm, true, false, false); //adjust TRC - ipf.workingtrc(baseImg, baseImg, cw, ch, 5, params.icm.workingProfile, params.icm.workingTRCGamma, params.icm.workingTRCSlope, dummy, false, true, false); + ipf.workingtrc(baseImg, baseImg, cw, ch, 5, params.icm.workingProfile, params.icm.workingTRCGamma, params.icm.workingTRCSlope, dummyTransForm, false, true, false); } } @@ -1155,9 +1155,7 @@ private: ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); unshar->CopyFrom(labView); params.wavelet.CLmethod = provis; - } - if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { WaveParams.expcontrast = false; WaveParams.expchroma = false; WaveParams.expedge = false; @@ -1402,9 +1400,6 @@ private: } } - cmsHPROFILE jprof = nullptr; - constexpr bool customGamma = false; - constexpr bool useLCMS = false; bool bwonly = params.blackwhite.enabled && !params.colorToning.enabled && !autili && !butili && !params.colorappearance.enabled; ///////////// Custom output gamma has been removed, the user now has to create @@ -1453,12 +1448,12 @@ private: case MetaDataParams::TUNNEL: // Sending back the whole first root, which won't necessarily be the selected frame number // and may contain subframe depending on initial raw's hierarchy - readyImg->setMetadata(ii->getMetaData()->getRootExifData()); + readyImg->setMetadata(initialImage->getMetaData()->getRootExifData()); break; case MetaDataParams::EDIT: // ask for the correct frame number, but may contain subframe depending on initial raw's hierarchy - readyImg->setMetadata(ii->getMetaData()->getBestExifData(imgsrc, ¶ms.raw), params.exif, params.iptc); + readyImg->setMetadata(initialImage->getMetaData()->getBestExifData(imgsrc, ¶ms.raw), params.exif, params.iptc); break; default: // case MetaDataParams::STRIP @@ -1468,36 +1463,28 @@ private: // Setting the output curve to readyImg - if (customGamma) { - if (!useLCMS) { - // use corrected sRGB profile in order to apply a good TRC if present, otherwise use LCMS2 profile generated by lab2rgb16 w/ gamma - ProfileContent pc(jprof); + // use the selected output profile if present, otherwise use LCMS2 profile generate by lab2rgb16 w/ gamma + + if (!params.icm.outputProfile.empty() && params.icm.outputProfile != ColorManagementParams::NoICMString) { + + // if ICCStore::getInstance()->getProfile send back an object, then ICCStore::getInstance()->getContent will do too + cmsHPROFILE jprof = ICCStore::getInstance()->getProfile(params.icm.outputProfile); //get outProfile + + if (jprof == nullptr) { + if (settings->verbose) { + printf("\"%s\" ICC output profile not found!\n - use LCMS2 substitution\n", params.icm.outputProfile.c_str()); + } + } else { + if (settings->verbose) { + printf("Using \"%s\" output profile\n", params.icm.outputProfile.c_str()); + } + + ProfileContent pc = ICCStore::getInstance()->getContent(params.icm.outputProfile); readyImg->setOutputProfile(pc.getData().c_str(), pc.getData().size()); } } else { - // use the selected output profile if present, otherwise use LCMS2 profile generate by lab2rgb16 w/ gamma - - if (!params.icm.outputProfile.empty() && params.icm.outputProfile != ColorManagementParams::NoICMString) { - - // if ICCStore::getInstance()->getProfile send back an object, then ICCStore::getInstance()->getContent will do too - cmsHPROFILE jprof = ICCStore::getInstance()->getProfile(params.icm.outputProfile); //get outProfile - - if (jprof == nullptr) { - if (settings->verbose) { - printf("\"%s\" ICC output profile not found!\n - use LCMS2 substitution\n", params.icm.outputProfile.c_str()); - } - } else { - if (settings->verbose) { - printf("Using \"%s\" output profile\n", params.icm.outputProfile.c_str()); - } - - ProfileContent pc = ICCStore::getInstance()->getContent(params.icm.outputProfile); - readyImg->setOutputProfile(pc.getData().c_str(), pc.getData().size()); - } - } else { - // No ICM - readyImg->setOutputProfile(nullptr, 0); - } + // No ICM + readyImg->setOutputProfile(nullptr, 0); } // t2.set(); @@ -1505,7 +1492,7 @@ private: // printf("Total:- %d usec\n", t2.etime(t1)); if (!job->initialImage) { - ii->decreaseRef(); + initialImage->decreaseRef(); } delete job; @@ -1669,7 +1656,7 @@ private: // internal state std::unique_ptr ipf_p; - InitialImage *ii; + InitialImage *initialImage; ImageSource *imgsrc; int fw; int fh; From d56c53b1ae9c69e8ddbbcb4f3c1962578393824c Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 27 Feb 2020 18:06:30 +0100 Subject: [PATCH 129/154] Change tooltip --- rtdata/languages/default | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index a807ba9ea..7069d44ed 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2320,7 +2320,7 @@ TP_WBALANCE_SOLUX47;Solux 4700K (vendor) TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) TP_WBALANCE_SPOTWB;Use the pipette to pick the white balance from a neutral patch in the preview. TP_WBALANCE_STUDLABEL;Student Itcwb: %1 -TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation\nThe lower the student value, the better the correlation\nValues below 0.002 are excellent\nValues below 0.005 are very good\nValues below 0.01 are good\nValues below 0.05 are good enough\nValues above 0.5 are poor\nVery good Student test results does not mean that the WB is good, if the illuminant is non-standard the results are erratic. +TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation\nThe lower the student value, the better the correlation\nValues below 0.002 are excellent\nValues below 0.005 are very good\nValues below 0.01 are good\nValues below 0.05 are good enough\nValues above 0.5 are poor\nVery good Student test results does not mean that the WB is good, if the illuminant is non-standard the results are erratic.\nStudent=1000 meeans the calculations were not restarted but results are probably goods TP_WBALANCE_TEMPBIAS;AWB temperature bias TP_WBALANCE_TEMPBIAS_TOOLTIP;Allows to alter the computation of the "auto white balance"\nby biasing it towards warmer or cooler temperatures. The bias\nis expressed as a percentage of the computed temperature,\nso that the result is given by "computedTemp + computedTemp * bias". TP_WBALANCE_TEMPERATURE;Temperature From 10af444786e6b5dc4baa3e35756525674872458a Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 27 Feb 2020 18:08:02 +0100 Subject: [PATCH 130/154] Change tooltip orthographe --- rtdata/languages/default | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 7069d44ed..5af093b6b 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2320,7 +2320,7 @@ TP_WBALANCE_SOLUX47;Solux 4700K (vendor) TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) TP_WBALANCE_SPOTWB;Use the pipette to pick the white balance from a neutral patch in the preview. TP_WBALANCE_STUDLABEL;Student Itcwb: %1 -TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation\nThe lower the student value, the better the correlation\nValues below 0.002 are excellent\nValues below 0.005 are very good\nValues below 0.01 are good\nValues below 0.05 are good enough\nValues above 0.5 are poor\nVery good Student test results does not mean that the WB is good, if the illuminant is non-standard the results are erratic.\nStudent=1000 meeans the calculations were not restarted but results are probably goods +TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation\nThe lower the student value, the better the correlation\nValues below 0.002 are excellent\nValues below 0.005 are very good\nValues below 0.01 are good\nValues below 0.05 are good enough\nValues above 0.5 are poor\nVery good Student test results does not mean that the WB is good, if the illuminant is non-standard the results are erratic.\nStudent=1000 means the calculations were not restarted but results are probably goods TP_WBALANCE_TEMPBIAS;AWB temperature bias TP_WBALANCE_TEMPBIAS_TOOLTIP;Allows to alter the computation of the "auto white balance"\nby biasing it towards warmer or cooler temperatures. The bias\nis expressed as a percentage of the computed temperature,\nso that the result is given by "computedTemp + computedTemp * bias". TP_WBALANCE_TEMPERATURE;Temperature From a3c2264cde6af6296c62c526ecce8a64febbea04 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 27 Feb 2020 19:56:42 +0100 Subject: [PATCH 131/154] eahd_demosaic.cc : be cppcheck clean --- rtengine/eahd_demosaic.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rtengine/eahd_demosaic.cc b/rtengine/eahd_demosaic.cc index ad4bda3cd..009be0714 100644 --- a/rtengine/eahd_demosaic.cc +++ b/rtengine/eahd_demosaic.cc @@ -360,8 +360,8 @@ void RawImageSource::eahd_demosaic () int wh = 0; - for (int dmi = 0; dmi < 9; dmi++) { - wh += (dLmaph[dmi] <= eL) * (dCamaph[dmi] <= eCa) * (dCbmaph[dmi] <= eCb); + for (int d = 0; d < 9; ++d) { + wh += (dLmaph[d] <= eL) * (dCamaph[d] <= eCa) * (dCbmaph[d] <= eCb); } homh[imx][j - 1] += wh; @@ -376,8 +376,8 @@ void RawImageSource::eahd_demosaic () int wv = 0; - for (int dmi = 0; dmi < 9; dmi++) { - wv += (dLmapv[dmi] <= eL) * (dCamapv[dmi] <= eCa) * (dCbmapv[dmi] <= eCb); + for (int d = 0; d < 9; ++d) { + wv += (dLmapv[d] <= eL) * (dCamapv[d] <= eCa) * (dCbmapv[d] <= eCb); } homv[imx][j - 1] += wv; From f7792aa936143ff56f270fa22b4a934eed62392c Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 27 Feb 2020 21:22:34 +0100 Subject: [PATCH 132/154] some cleanups --- rtengine/imagesource.h | 3 +- rtengine/procparams.cc | 7 - rtengine/rawimagesource.cc | 836 ++++++++++++------------------------- rtengine/rawimagesource.h | 3 +- rtengine/simpleprocess.cc | 3 +- rtengine/stdimagesource.cc | 2 +- rtengine/stdimagesource.h | 2 +- 7 files changed, 282 insertions(+), 574 deletions(-) diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index f01d52059..22b8cdc08 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -98,8 +98,7 @@ public: virtual void retinex (const procparams::ColorManagementParams& cmp, const procparams::RetinexParams &deh, const procparams::ToneCurveParams& Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) {}; virtual void retinexPrepareCurves (const procparams::RetinexParams &retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI) {}; virtual void retinexPrepareBuffers (const procparams::ColorManagementParams& cmp, const procparams::RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) {}; - virtual void flushRawData () {}; - virtual void flushRGB () {}; + virtual void flush () = 0; virtual void HLRecovery_Global (const procparams::ToneCurveParams &hrp) {}; virtual void HLRecovery_inpaint (float** red, float** green, float** blue) {}; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 88178d0e0..40a5ae68a 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1309,15 +1309,8 @@ const std::vector& WBParams::getWbEntries() static const std::vector wb_entries = { {"Camera", WBEntry::Type::CAMERA, M("TP_WBALANCE_CAMERA"), 0, 1.f, 1.f, 0.f}, - // {"Auto", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTO"), 0, 1.f, 1.f, 0.f}, {"autitcgreen", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOITCGREEN"), 0, 1.f, 1.f, 0.f}, {"autold", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOOLD"), 0, 1.f, 1.f, 0.f}, - // {"aut", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTODEM"), 0, 1.f, 1.f, 0.f}, - // {"autedg", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOEDGE"), 0, 1.f, 1.f, 0.f}, - // {"autorobust", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOROB"), 0, 1.f, 1.f, 0.f}, - // {"autosdw", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOSDW"), 0, 1.f, 1.f, 0.f}, - // {"autedgsdw", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOEDGESW"), 0, 1.f, 1.f, 0.f}, - // {"autedgrob", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOEDGEROB"), 0, 1.f, 1.f, 0.f}, {"Daylight", WBEntry::Type::DAYLIGHT, M("TP_WBALANCE_DAYLIGHT"), 5300, 1.f, 1.f, 0.f}, {"Cloudy", WBEntry::Type::CLOUDY, M("TP_WBALANCE_CLOUDY"), 6200, 1.f, 1.f, 0.f}, {"Shade", WBEntry::Type::SHADE, M("TP_WBALANCE_SHADE"), 7600, 1.f, 1.f, 0.f}, diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 3cabaf5b2..b55ec4bf1 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -196,7 +196,7 @@ void transLineD1x (const float* const red, const float* const green, const float } if(i == 2 && oddHeight) { - int row = 2 * imheight; + row = 2 * imheight; for (int j = 0; j < imwidth; j++) { int col = imwidth - 1 - j; @@ -448,6 +448,7 @@ RawImageSource::RawImageSource () , initialGain(0.0) , camInitialGain(0.0) , defGain(0.0) + , camProfile(nullptr) , ri(nullptr) , rawData(0, 0) , green(0, 0) @@ -462,7 +463,6 @@ RawImageSource::RawImageSource () , rawDirty(true) , histMatchingParams(new procparams::ColorManagementParams) { - camProfile = nullptr; embProfile = nullptr; rgbSourceModified = false; for(int i = 0; i < 4; ++i) { @@ -488,9 +488,6 @@ RawImageSource::~RawImageSource () delete rawDataBuffer[i]; } - flushRGB(); - flushRawData(); - if (camProfile) { cmsCloseProfile (camProfile); } @@ -897,9 +894,9 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima } // last row - int b = (a == 1 && image->getHeight() % 2) || (a == 0 && image->getHeight() % 2 == 0); + int offset = (a == 1 && image->getHeight() % 2) || (a == 0 && image->getHeight() % 2 == 0); - for (int j = 1 + b; j < image->getWidth() - 1; j += 2) { + for (int j = 1 + offset; j < image->getWidth() - 1; j += 2) { image->r(image->getHeight() - 1, j) = (image->r(image->getHeight() - 2, j) + image->r(image->getHeight() - 1, j + 1) + image->r(image->getHeight() - 1, j - 1)) / 3; image->g(image->getHeight() - 1, j) = (image->g(image->getHeight() - 2, j) + image->g(image->getHeight() - 1, j + 1) + image->g(image->getHeight() - 1, j - 1)) / 3; image->b(image->getHeight() - 1, j) = (image->b(image->getHeight() - 2, j) + image->b(image->getHeight() - 1, j + 1) + image->b(image->getHeight() - 1, j - 1)) / 3; @@ -2208,7 +2205,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara { float aa = conversionBuffer[0][i - border][j - border]; float bb = conversionBuffer[1][i - border][j - border]; - float Chprov1 = sqrt(SQR(aa) + SQR(bb)) / 327.68f; + float Chprov1 = std::sqrt(SQR(aa) + SQR(bb)) / 327.68f; sqrtBuffer[j - border] = Chprov1; float HH = xatan2f(bb, aa); atan2Buffer[j - border] = HH; @@ -2236,7 +2233,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara #else float aa = conversionBuffer[0][i - border][j - border]; float bb = conversionBuffer[1][i - border][j - border]; - float Chprov1 = sqrt(SQR(aa) + SQR(bb)) / 327.68f; + float Chprov1 = std::sqrt(SQR(aa) + SQR(bb)) / 327.68f; float HH = xatan2f(bb, aa); float2 sincosval;// = xsincosf(HH); @@ -2350,15 +2347,16 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara } -void RawImageSource::flushRawData() +void RawImageSource::flush() { + for(size_t i = 0; i + 1 < numFrames; ++i) { + delete rawDataBuffer[i]; + rawDataBuffer[i] = nullptr; + } + if (rawData) { rawData(0, 0); } -} - -void RawImageSource::flushRGB() -{ if (green) { green(0, 0); } @@ -2382,7 +2380,6 @@ void RawImageSource::flushRGB() if (blueloc) { blueloc(0, 0); } - } void RawImageSource::HLRecovery_Global(const ToneCurveParams &hrp) @@ -2435,6 +2432,7 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw } } } else { + #ifdef _OPENMP #pragma omp parallel for #endif @@ -3409,8 +3407,6 @@ void RawImageSource::HLRecovery_blend(float* rin, float* gin, float* bin, int wi constexpr float trans[ColorCount][ColorCount] = { { 1, 1, 1 }, { 1.7320508, -1.7320508, 0 }, { -1, -1, 2 } }; constexpr float itrans[ColorCount][ColorCount] = { { 1, 0.8660254, -0.5 }, { 1, -0.8660254, -0.5 }, { 1, 0, 1 } }; -#define FOREACHCOLOR for (int c=0; c < ColorCount; c++) - float minpt = min(hlmax[0], hlmax[1], hlmax[2]); //min of the raw clip points //float maxpt=max(hlmax[0],hlmax[1],hlmax[2]);//max of the raw clip points //float medpt=hlmax[0]+hlmax[1]+hlmax[2]-minpt-maxpt;//median of the raw clip points @@ -3421,7 +3417,9 @@ void RawImageSource::HLRecovery_blend(float* rin, float* gin, float* bin, int wi const float satthresh = 0.5; float clip[3]; - FOREACHCOLOR clip[c] = min(maxave, hlmax[c]); + for (int c = 0; c < ColorCount; ++c) { + clip[c] = min(maxave, hlmax[c]); + } // Determine the maximum level (clip) of all channels const float clippt = clipthresh * maxval; @@ -3438,20 +3436,20 @@ void RawImageSource::HLRecovery_blend(float* rin, float* gin, float* bin, int wi rgb[2] = bin[col]; // If no channel is clipped, do nothing on pixel - int c; + int cc; - for (c = 0; c < ColorCount; c++) { - if (rgb[c] > clippt) { + for (cc = 0; cc < ColorCount; ++cc) { + if (rgb[cc] > clippt) { break; } } - if (c == ColorCount) { + if (cc == ColorCount) { continue; } // Initialize cam with raw input [0] and potentially clipped input [1] - FOREACHCOLOR { + for (int c = 0; c < ColorCount; ++c) { lratio += min(rgb[c], clip[c]); cam[0][c] = rgb[c]; cam[1][c] = min(cam[0][c], maxval); @@ -3459,7 +3457,7 @@ void RawImageSource::HLRecovery_blend(float* rin, float* gin, float* bin, int wi // Calculate the lightness correction ratio (chratio) for (int i = 0; i < 2; i++) { - FOREACHCOLOR { + for (int c = 0; c < ColorCount; ++c) { lab[i][c] = 0; for (int j = 0; j < ColorCount; j++) @@ -3475,7 +3473,7 @@ void RawImageSource::HLRecovery_blend(float* rin, float* gin, float* bin, int wi } } - chratio = (sqrt(sum[1] / sum[0])); + chratio = (std::sqrt(sum[1] / sum[0])); // Apply ratio to lightness in LCH space for (int c = 1; c < ColorCount; c++) { @@ -3483,7 +3481,7 @@ void RawImageSource::HLRecovery_blend(float* rin, float* gin, float* bin, int wi } // Transform back from LCH to RGB - FOREACHCOLOR { + for (int c = 0; c < ColorCount; ++c) { cam[0][c] = 0; for (int j = 0; j < ColorCount; j++) @@ -3491,7 +3489,9 @@ void RawImageSource::HLRecovery_blend(float* rin, float* gin, float* bin, int wi cam[0][c] += itrans[c][j] * lab[0][j]; } } - FOREACHCOLOR rgb[c] = cam[0][c] / ColorCount; + for (int c = 0; c < ColorCount; ++c) { + rgb[c] = cam[0][c] / ColorCount; + } // Copy converted pixel back if (rin[col] > fixpt) { @@ -3545,7 +3545,7 @@ void RawImageSource::HLRecovery_Luminance (float* rin, float* gin, float* bin, f double Ho = 2 * bo - ro - go; if (r != g && g != b) { - double ratio = sqrt ((Co * Co + Ho * Ho) / (C * C + H * H)); + double ratio = std::sqrt ((Co * Co + Ho * Ho) / (C * C + H * H)); C *= ratio; H *= ratio; } @@ -3759,7 +3759,7 @@ void RawImageSource::getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LU #ifdef _OPENMP int numThreads; // reduce the number of threads under certain conditions to avoid overhead of too many critical regions - numThreads = sqrt((((H - 2 * border) * (W - 2 * border)) / 262144.f)); + numThreads = std::sqrt((((H - 2 * border) * (W - 2 * border)) / 262144.f)); numThreads = std::min(std::max(numThreads, 1), omp_get_max_threads()); #pragma omp parallel num_threads(numThreads) @@ -3895,12 +3895,10 @@ void RawImageSource::getRowStartEnd (int x, int &start, int &end) } -static void histoxyY(int bfhitc, int bfwitc, array2D & xc, array2D & yc, array2D & Yc, float *xxx, float * yyy, float * YYY, int * histxy, float * area, int * inter) +static void histoxyY(int bfhitc, int bfwitc, const array2D & xc, const array2D & yc, const array2D & Yc, float *xxx, float * yyy, float * YYY, int * histxy, float * area, int * inter) { - int nh = 0; -// int nc = 0; - // int nc2 = 0; + int nh; for (int y = 0; y < bfhitc ; y++) { for (int x = 0; x < bfwitc ; x++) { @@ -5407,7 +5405,7 @@ static void histoxyY(int bfhitc, int bfwitc, array2D & xc, array2D -void static studentXY(array2D & YYcurr, array2D & reffYY, int sizcurr, int Nc, int tt, float & student) +void static studentXY(const array2D & YYcurr, const array2D & reffYY, int sizcurr, int Nc, int tt, float & student) { //calculate Student coeff YY float somcurrY = 0.f; @@ -5448,7 +5446,7 @@ void static studentXY(array2D & YYcurr, array2D & reffYY, int siz somsquecreffY = somreff2Y - (SQR(somreffY)) / sizestureffY; //sum sqr differences second - float diviY = sqrt(((somsqueccurrY + somsquecreffY) * (1.f / (float)sizestucurrY + 1.f / (float)sizestureffY)) / (sizestucurrY + sizestureffY - 2)); + float diviY = std::sqrt(((somsqueccurrY + somsquecreffY) * (1.f / (float)sizestucurrY + 1.f / (float)sizestureffY)) / (sizestucurrY + sizestureffY - 2)); //divisor student float numerY = ((float)somcurrY / (float)sizestucurrY) - ((float)somreffY / (float)sizestureffY); //numerator student @@ -5567,15 +5565,15 @@ static void SdwWB(const array2D &redloc, const array2D &greenloc, SigmaB[i] = sigmab; if (ng > 0) { - SigmaG[i] = sqrt(SigmaG[i] / ng); + SigmaG[i] = std::sqrt(SigmaG[i] / ng); } if (nr > 0) { - SigmaR[i] = sqrt(SigmaR[i] / nr); + SigmaR[i] = std::sqrt(SigmaR[i] / nr); } if (nb > 0) { - SigmaB[i] = sqrt(SigmaB[i] / nb); + SigmaB[i] = std::sqrt(SigmaB[i] / nb); } #ifdef _OPENMP @@ -5830,9 +5828,9 @@ static void SobelWB(array2D &redsobel, array2D &greensobel, array2 //Edge strength //we can add if need teta = atan2 (sumYr, sumXr) - redsobel[y][x] = CLIP(sqrt(SQR(sumXr) + SQR(sumYr))); - greensobel[y][x] = CLIP(sqrt(SQR(sumXg) + SQR(sumYg))); - bluesobel[y][x] = CLIP(sqrt(SQR(sumXb) + SQR(sumYb))); + redsobel[y][x] = CLIP(std::sqrt(SQR(sumXr) + SQR(sumYr))); + greensobel[y][x] = CLIP(std::sqrt(SQR(sumXg) + SQR(sumYg))); + bluesobel[y][x] = CLIP(std::sqrt(SQR(sumXb) + SQR(sumYb))); } } } @@ -5964,7 +5962,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double float snedecor;//1. actually but put in case of confiance interval } WbGreen; - WbGreen gree[118] = {//symetric coefficient between 0.717 and 1.40 + constexpr WbGreen gree[118] = {//symetric coefficient between 0.717 and 1.40 {0.400, 1.f}, {0.500, 1.f}, {0.550, 1.f}, @@ -6130,7 +6128,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } WbTxyz; //we can change step to increase precision if need - also in Colortemp.cc with same changes //I don't know how to pass this structure to Colortemp ! - WbTxyz Txyz[118] = {//temperature Xwb Zwb 118 values x wb and y wb are calculated after + constexpr WbTxyz Txyz[118] = {//temperature Xwb Zwb 118 values x wb and y wb are calculated after {2001., 1.273842, 0.145295}, {2101., 1.244008, 0.167533}, {2201., 1.217338, 0.190697}, @@ -6325,7 +6323,6 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double bmm = new float [N_t]; int siza = 167;//size of histogram - int maxval = 25; //tempref and greenref are camera wb values. // I used them by default to select good spectral values !! @@ -6363,7 +6360,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double gm = new_scale_mul[1] / scale_mul[1] * gain; bm = new_scale_mul[2] / scale_mul[2] * gain; rmm[tt] = rm / gm; - gmm[tt] = gm / gm; + gmm[tt] = 1.f; bmm[tt] = bm / gm; } @@ -6431,270 +6428,261 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double //here we select the good spectral color inside the 113 values //call tempxy to calculate for 114 color references Temp and XYZ with cat02 - if (separated) { - ColorTemp::tempxy(separated, repref, Tx, Ty, Tz, Ta, Tb, TL, TX, TY, TZ, wbpar); //calculate chroma xy (xyY) for Z known colors on under 90 illuminants + ColorTemp::tempxy(separated, repref, Tx, Ty, Tz, Ta, Tb, TL, TX, TY, TZ, wbpar); //calculate chroma xy (xyY) for Z known colors on under 90 illuminants - //find the good spectral values - //calculate xy reference spectral for tempref - for (int j = 0; j < Nc ; j++) { - reff_spect_xx_camera[j][repref] = TX[j] / (TX[j] + TY[j] + TZ[j]); // x from xyY - reff_spect_yy_camera[j][repref] = TY[j] / (TX[j] + TY[j] + TZ[j]); // y from xyY + //find the good spectral values + //calculate xy reference spectral for tempref + for (int j = 0; j < Nc ; j++) { + reff_spect_xx_camera[j][repref] = TX[j] / (TX[j] + TY[j] + TZ[j]); // x from xyY + reff_spect_yy_camera[j][repref] = TY[j] / (TX[j] + TY[j] + TZ[j]); // y from xyY + } + + int deltarepref = settings->itcwb_delta; + + for (int nn = 0; nn <= 2; nn++) { + //three loop to refine color if temp camera is probably not very good + int drep = 0; + + if (nn == 0) { + drep = -deltarepref; } - int deltarepref = settings->itcwb_delta; - - for (int nn = 0; nn <= 2; nn++) { - //three loop to refine color if temp camera is probably not very good - int drep = 0; - - if (nn == 0) { - drep = -deltarepref; - } - - if (nn == 2) { - drep = +deltarepref; - } - - int rep = repref + drep; - - if (rep > N_t) { - rep = N_t; - } - - if (rep < 0) { - rep = 0; - } - - //initialize calculation of xy current for tempref - for (int y = 0; y < bfh ; y += 10) { - for (int x = 0; x < bfw ; x += 10) { - int yy = y / 10; - int xx = x / 10 ; - float x_c = 0.f, y_c = 0.f, Y_c = 0.f; - float x_x = 0.f, y_y = 0.f, z_z = 0.f; - float RR = rmm[rep] * redloc[y][x]; - float GG = gmm[rep] * greenloc[y][x]; - float BB = bmm[rep] * blueloc[y][x]; - Color::rgbxyY(RR, GG, BB, x_c, y_c, Y_c, x_x, y_y, z_z, wp); - xc[yy][xx] = x_c; - yc[yy][xx] = y_c; - Yc[yy][xx] = Y_c; - } - - } - - //histogram xy depend of temp...but in most cases D45 ..D65.. - //calculate for this image the mean values for each family of color, near histogram x y (number) - //xy vary from x 0..0.77 y 0..0.82 - //neutral values are near x=0.34 0.33 0.315 0.37 y =0.35 0.36 0.34 - //skin are about x 0.45 0.49 y 0.4 0.47 - //blue sky x=0.25 y=0.28 and x=0.29 y=0.32 - // step about 0.02 x 0.32 0.34 y= 0.34 0.36 skin -- sky x 0.24 0.30 y 0.28 0.32 - //big step about 0.2 - - histoxyY(bfhitc, bfwitc, xc, yc, Yc, xxx, yyy, YYY, histxy, area, inter); + if (nn == 2) { + drep = +deltarepref; } - //calculate x y Y - int sizcurrref = siza;//choice of number of correlate colors in image - histcurrref(N_t, sizcurrref); - xx_curref(N_t, sizcurrref); - yy_curref(N_t, sizcurrref); - YY_curref(N_t, sizcurrref); - xx_curref_reduc(N_t, sizcurrref); - yy_curref_reduc(N_t, sizcurrref); - YY_curref_reduc(N_t, sizcurrref); - R_curref_reduc(N_t, sizcurrref); - G_curref_reduc(N_t, sizcurrref); - B_curref_reduc(N_t, sizcurrref); + int rep = repref + drep; - - hiss Wbhis [siza]; - int n1 = 0; - int n4 = 0; - int n15 = 0; - int n30 = 0; - int ntr = 0; - - for (int nh = 0; nh < siza; nh++) { - Wbhis[nh].histnum = histxy[nh]; - Wbhis[nh].index = nh; - Wbhis[nh].interest = inter[nh]; + if (rep > N_t) { + rep = N_t; } - //sort in ascending order - std::sort(Wbhis, Wbhis + siza, Wbhis[0]); + if (rep < 0) { + rep = 0; + } - for (int nh = 0; nh < siza; nh++) { + //initialize calculation of xy current for tempref + for (int y = 0; y < bfh ; y += 10) { + for (int x = 0; x < bfw ; x += 10) { + int yy = y / 10; + int xx = x / 10 ; + float x_c = 0.f, y_c = 0.f, Y_c = 0.f; + float x_x = 0.f, y_y = 0.f, z_z = 0.f; + float RR = rmm[rep] * redloc[y][x]; + float GG = gmm[rep] * greenloc[y][x]; + float BB = bmm[rep] * blueloc[y][x]; + Color::rgbxyY(RR, GG, BB, x_c, y_c, Y_c, x_x, y_y, z_z, wp); + xc[yy][xx] = x_c; + yc[yy][xx] = y_c; + Yc[yy][xx] = Y_c; + } + + } + + //histogram xy depend of temp...but in most cases D45 ..D65.. + //calculate for this image the mean values for each family of color, near histogram x y (number) + //xy vary from x 0..0.77 y 0..0.82 + //neutral values are near x=0.34 0.33 0.315 0.37 y =0.35 0.36 0.34 + //skin are about x 0.45 0.49 y 0.4 0.47 + //blue sky x=0.25 y=0.28 and x=0.29 y=0.32 + // step about 0.02 x 0.32 0.34 y= 0.34 0.36 skin -- sky x 0.24 0.30 y 0.28 0.32 + //big step about 0.2 + + histoxyY(bfhitc, bfwitc, xc, yc, Yc, xxx, yyy, YYY, histxy, area, inter); + } + + //calculate x y Y + int sizcurrref = siza;//choice of number of correlate colors in image + histcurrref(N_t, sizcurrref); + xx_curref(N_t, sizcurrref); + yy_curref(N_t, sizcurrref); + YY_curref(N_t, sizcurrref); + xx_curref_reduc(N_t, sizcurrref); + yy_curref_reduc(N_t, sizcurrref); + YY_curref_reduc(N_t, sizcurrref); + R_curref_reduc(N_t, sizcurrref); + G_curref_reduc(N_t, sizcurrref); + B_curref_reduc(N_t, sizcurrref); + + + hiss Wbhis [siza]; + int n1 = 0; + int n4 = 0; + int n15 = 0; + int n30 = 0; + int ntr = 0; + + for (int nh = 0; nh < siza; nh++) { + Wbhis[nh].histnum = histxy[nh]; + Wbhis[nh].index = nh; + Wbhis[nh].interest = inter[nh]; + } + + //sort in ascending order + std::sort(Wbhis, Wbhis + siza, Wbhis[0]); + + for (int nh = 0; nh < siza; nh++) { // printf("nh=%i", Wbhis[nh].index); + } + + //part to improve + for (int nh = 0; nh < siza; nh++) { + if (Wbhis[nh].histnum < 1) { + n1++; //keep only existing color but avoid to small } - //part to improve - for (int nh = 0; nh < siza; nh++) { - if (Wbhis[nh].histnum < 1) { - n1++; //keep only existing color but avoid to small - } - - if (Wbhis[nh].histnum < 4) { - n4++; //keep only existing color but avoid to small - } - - if (Wbhis[nh].histnum < 15) { - n15++; //keep only existing color but avoid to small - } - - if (Wbhis[nh].histnum < 30) { - n30++; //keep only existing color but avoid to small - } + if (Wbhis[nh].histnum < 4) { + n4++; //keep only existing color but avoid to small + } + if (Wbhis[nh].histnum < 15) { + n15++; //keep only existing color but avoid to small + } + if (Wbhis[nh].histnum < 30) { + n30++; //keep only existing color but avoid to small } - ntr = n30; - - if (ntr > (siza - 25)) { - ntr = n15; //if to less elements 25 elements mini - } - - if (ntr > (siza - 23)) { - ntr = n4; //if to less elements 25 elements mini - } - - if (ntr > (siza - 20)) { - ntr = n1; //if to less elements 20 elements mini - normally never be used ! - } - - int sizcurr2ref = sizcurrref - ntr; - int sizcu30 = sizcurrref - n30; - int sizcu4 = sizcurrref - n4; - -// printf("sizcurr2ref=%i sizcur_30=%i siecur_4=%i \n", sizcurr2ref, sizcu30, sizcu4); - sizcu4 = sizcu30;//arbitrary mini size if 30 result, ==> in full image 3000 pixels - - if (sizcu4 > 55) { - sizcu4 = 55; - } - - chrom wbchro[sizcu4]; - double swpr = (Txyz[repref].XX + Txyz[repref].ZZ + 1.); - double xwpr = Txyz[repref].XX / swpr;//white point for tt in xy coordiantes - double ywpr = 1. / swpr; + } - for (int i = 0; i < sizcu4; i++) { //take the max values - int j = i; - histcurrref[j][repref] = (float) Wbhis[siza - (j + 1)].histnum; - xx_curref[j][repref] = xxx[Wbhis[siza - (j + 1)].index] / histcurrref[j][repref]; - yy_curref[j][repref] = yyy[Wbhis[siza - (j + 1)].index] / histcurrref[j][repref]; - YY_curref[j][repref] = YYY[Wbhis[siza - (j + 1)].index] / histcurrref[j][repref]; + ntr = n30; + + if (ntr > (siza - 25)) { + ntr = n15; //if to less elements 25 elements mini + } + + if (ntr > (siza - 23)) { + ntr = n4; //if to less elements 25 elements mini + } + + if (ntr > (siza - 20)) { + ntr = n1; //if to less elements 20 elements mini - normally never be used ! + } + + int sizcurr2ref = sizcurrref - ntr; + const int sizcu30 = sizcurrref - n30; + const int sizcu4 = rtengine::min(sizcu30, 55); + + + chrom wbchro[sizcu4]; + double swpr = (Txyz[repref].XX + Txyz[repref].ZZ + 1.); + double xwpr = Txyz[repref].XX / swpr;//white point for tt in xy coordiantes + double ywpr = 1. / swpr; + + + for (int i = 0; i < sizcu4; i++) { //take the max values + int j = i; + histcurrref[j][repref] = (float) Wbhis[siza - (j + 1)].histnum; + xx_curref[j][repref] = xxx[Wbhis[siza - (j + 1)].index] / histcurrref[j][repref]; + yy_curref[j][repref] = yyy[Wbhis[siza - (j + 1)].index] / histcurrref[j][repref]; + YY_curref[j][repref] = YYY[Wbhis[siza - (j + 1)].index] / histcurrref[j][repref]; // printf("xx=%f yy=%f\n", xx_curref[j][repref], yy_curref[j][repref]); - } + } - estimchrom = 0.f; + estimchrom = 0.f; - for (int nh = 0; nh < sizcu4; nh++) { - float chxy = sqrt(SQR(xx_curref[nh][repref] - xwpr) + SQR(yy_curref[nh][repref] - ywpr)); - wbchro[nh].chroxy_number = chxy * sqrt(histcurrref[nh][repref]); - wbchro[nh].chroxy = sqrt(chxy); - wbchro[nh].chrox = xx_curref[nh][repref]; - wbchro[nh].chroy = yy_curref[nh][repref]; - wbchro[nh].Y = YY_curref[nh][repref]; - wbchro[nh].index = nh; - estimchrom += chxy; - } + for (int nh = 0; nh < sizcu4; nh++) { + float chxy = std::sqrt(SQR(xx_curref[nh][repref] - xwpr) + SQR(yy_curref[nh][repref] - ywpr)); + wbchro[nh].chroxy_number = chxy * std::sqrt(histcurrref[nh][repref]); + wbchro[nh].chroxy = std::sqrt(chxy); + wbchro[nh].chrox = xx_curref[nh][repref]; + wbchro[nh].chroy = yy_curref[nh][repref]; + wbchro[nh].Y = YY_curref[nh][repref]; + wbchro[nh].index = nh; + estimchrom += chxy; + } - estimchrom /= sizcu4; - //printf("estimchrom=%f \n", estimchrom); + estimchrom /= sizcu4; + //printf("estimchrom=%f \n", estimchrom); - if (settings->itcwb_sort) { //sort in ascending with chroma values + if (settings->itcwb_sort) { //sort in ascending with chroma values - std::sort(wbchro, wbchro + sizcu4, wbchro[0]); - } + std::sort(wbchro, wbchro + sizcu4, wbchro[0]); + } - /* - for (int nh = 0; nh < sizcu4; nh++) { - printf("nh=%i chroma_xy=%f chrox=%f chroy=%f\n", nh, wbchro[nh].chroxy, wbchro[nh].chrox, wbchro[nh].chroy); - } - */ - maxval = settings->itcwb_thres;//max values of color to find correllation - - if (maxval < 10) { - maxval = 10; - } - - if (maxval > 55) { - maxval = 55; - } - - if (sizcurr2ref > maxval) { - sizcurr2ref = maxval; //keep about the biggest values, - } - - - for (int i = 0; i < sizcurr2ref; i++) { - //is condition chroxy necessary ? - if (((wbchro[sizcu4 - (i + 1)].chrox > 0.1f) && (wbchro[sizcu4 - (i + 1)].chroy > 0.1f)) && wbchro[sizcu4 - (i + 1)].chroxy > 0.0f) { //suppress value too far from reference spectral - w++; - xx_curref_reduc[w][repref] = wbchro[sizcu4 - (i + 1)].chrox; - yy_curref_reduc[w][repref] = wbchro[sizcu4 - (i + 1)].chroy; - YY_curref_reduc[w][repref] = wbchro[sizcu4 - (i + 1)].Y; - // printf("xx_cu=%f yy_cu=%f Y=%f chro=%f\n", xx_curref_reduc[w][repref], yy_curref_reduc[w][repref], YY_curref_reduc[w][repref],sqrt(wbchro[sizcu4 - (i + 1)].chroxy)); + /* + for (int nh = 0; nh < sizcu4; nh++) { + printf("nh=%i chroma_xy=%f chrox=%f chroy=%f\n", nh, wbchro[nh].chroxy, wbchro[nh].chrox, wbchro[nh].chroy); } + */ + int maxval = settings->itcwb_thres;//max values of color to find correllation + + if (maxval < 10) { + maxval = 10; + } + + if (maxval > 55) { + maxval = 55; + } + + if (sizcurr2ref > maxval) { + sizcurr2ref = maxval; //keep about the biggest values, + } + + + for (int i = 0; i < sizcurr2ref; i++) { + //is condition chroxy necessary ? + if (((wbchro[sizcu4 - (i + 1)].chrox > 0.1f) && (wbchro[sizcu4 - (i + 1)].chroy > 0.1f)) && wbchro[sizcu4 - (i + 1)].chroxy > 0.0f) { //suppress value too far from reference spectral + w++; + xx_curref_reduc[w][repref] = wbchro[sizcu4 - (i + 1)].chrox; + yy_curref_reduc[w][repref] = wbchro[sizcu4 - (i + 1)].chroy; + YY_curref_reduc[w][repref] = wbchro[sizcu4 - (i + 1)].Y; + // printf("xx_cu=%f yy_cu=%f Y=%f chro=%f\n", xx_curref_reduc[w][repref], yy_curref_reduc[w][repref], YY_curref_reduc[w][repref],std::sqrt(wbchro[sizcu4 - (i + 1)].chroxy)); } + } - //calculate deltaE xx to find best values of spectrals datas - int maxnb = settings->itcwb_sizereference; + //calculate deltaE xx to find best values of spectrals datas + int maxnb = settings->itcwb_sizereference; - if (maxnb > 5) { - maxnb = 5; - } + if (maxnb > 5) { + maxnb = 5; + } - if (maxnb < 1) { - maxnb = 1; - } + if (maxnb < 1) { + maxnb = 1; + } - if (settings->itcwb_thres > 39) { - maxnb = 200 / settings->itcwb_thres; - } + if (settings->itcwb_thres > 39) { + maxnb = 200 / settings->itcwb_thres; + } - for (int nb = 1; nb <= maxnb; nb ++) { //max 5 iterations for Itcwb_thres=33, after trial 3 is good in most cases but in some cases 5 - for (int i = 0; i < w; i++) { - float mindeltaE = 100000.f; - int kN = 0; + for (int nb = 1; nb <= maxnb; nb ++) { //max 5 iterations for Itcwb_thres=33, after trial 3 is good in most cases but in some cases 5 + for (int i = 0; i < w; i++) { + float mindeltaE = 100000.f; + int kN = 0; - for (int j = 0; j < Nc ; j++) { - if (good_spectral[j] == 0) { - float deltaE = SQR(xx_curref_reduc[i][repref] - reff_spect_xx_camera[j][repref]) + SQR(yy_curref_reduc[i][repref] - reff_spect_yy_camera[j][repref]); + for (int j = 0; j < Nc ; j++) { + if (good_spectral[j] == 0) { + float deltaE = SQR(xx_curref_reduc[i][repref] - reff_spect_xx_camera[j][repref]) + SQR(yy_curref_reduc[i][repref] - reff_spect_yy_camera[j][repref]); - if (deltaE < mindeltaE) { - mindeltaE = deltaE; - kN = j; - } + if (deltaE < mindeltaE) { + mindeltaE = deltaE; + kN = j; } } - - good_spectral[kN] = 1;//good spectral are spectral color that match color histogram xy - //printf("k=%i ", kN); } + + good_spectral[kN] = 1;//good spectral are spectral color that match color histogram xy + //printf("k=%i ", kN); } + } //reconvert to RGB for "reduction" - for (int i = 0; i < w; i++) { - float X = 65535.f * xx_curref_reduc[i][repref] * YY_curref_reduc[i][repref] / yy_curref_reduc[i][repref]; - float Y = 65535.f * YY_curref_reduc[i][repref]; - float Z = 65535.f * (1.f - xx_curref_reduc[i][repref] - yy_curref_reduc[i][repref]) * YY_curref_reduc[i][repref] / yy_curref_reduc[i][repref]; - float r, g, b; - Color::xyz2rgb(X, Y, Z, r, g, b, wip); - r /= rmm[repref]; - g /= gmm[repref]; - b /= bmm[repref]; - R_curref_reduc[i][repref] = r; - G_curref_reduc[i][repref] = g; - B_curref_reduc[i][repref] = b; - - } + for (int i = 0; i < w; i++) { + float X = 65535.f * xx_curref_reduc[i][repref] * YY_curref_reduc[i][repref] / yy_curref_reduc[i][repref]; + float Y = 65535.f * YY_curref_reduc[i][repref]; + float Z = 65535.f * (1.f - xx_curref_reduc[i][repref] - yy_curref_reduc[i][repref]) * YY_curref_reduc[i][repref] / yy_curref_reduc[i][repref]; + float r, g, b; + Color::xyz2rgb(X, Y, Z, r, g, b, wip); + r /= rmm[repref]; + g /= gmm[repref]; + b /= bmm[repref]; + R_curref_reduc[i][repref] = r; + G_curref_reduc[i][repref] = g; + B_curref_reduc[i][repref] = b; } @@ -6706,8 +6694,6 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double separated = false; ColorTemp::tempxy(separated, repref, Tx, Ty, Tz, Ta, Tb, TL, TX, TY, TZ, wbpar); //calculate chroma xy (xyY) for Z known colors on under 90 illuminants - int kk = -1; - //calculate x y Y int sizcurr = siza;//choice of number of correlate colors in image histcurr(N_t, sizcurr); @@ -6720,7 +6706,6 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double YYcurr_reduc(N_t, sizcurr); //calculate x y z for each pixel with multiplier rmm gmm bmm - kk = -1; for (int tt = 0; tt < N_t; tt++) {//N_t // double swp = (Txyz[tt].XX + Txyz[tt].ZZ + 1.); @@ -6752,7 +6737,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } - kk = -1; + int kk = -1; for (int i = 0; i < Nc ; i++) { if (good_spectral[i] == 1) { @@ -6767,34 +6752,6 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } } - - /* - //cat02 not need and does not work well - float nnx, nny, nnz; - - if(wbpar.wbcat02Method == "cam") {//code no update... - for(int k=0;k < sizcurr3; k++) { - float nnx = xxyycurr[2 * k][tt]*YYcurr[k][tt] / xxyycurr[2 * k + 1][tt]; - float nny = YYcurr[k][tt]; - float nnz = (1.f -xxyycurr[2 * k][tt] - xxyycurr[2 * k + 1][tt] )*YYcurr[k][tt]/xxyycurr[2 * k + 1][tt]; - float CAM02BB00 = 1.0f, CAM02BB01=1.0f, CAM02BB02=1.0f, CAM02BB10=1.0f, CAM02BB11=1.0f, CAM02BB12=1.0f, CAM02BB20=1.0f, CAM02BB21=1.0f, CAM02BB22=1.0f; //for CIECAT02 - float Xwb = Txyz[20].XX; - float Ywb = 1.; - float Zwb = Txyz[20].ZZ; - float xn, yn, zn; - ColorTemp::icieCAT02float(Xwb, Ywb, Zwb, CAM02BB00, CAM02BB01, CAM02BB02, CAM02BB10, CAM02BB11, CAM02BB12, CAM02BB20, CAM02BB21, CAM02BB22, 1.0f); - - xn = CAM02BB00 * nnx + CAM02BB01 * nny + CAM02BB02 * nnz ; - yn = CAM02BB10 * nnx + CAM02BB11 * nny + CAM02BB12 * nnz ; - zn = CAM02BB20 * nnx + CAM02BB21 * nny + CAM02BB22 * nnz; - float som = xn + yn + zn; - xxyycurr[2 * k][tt] = xn / som; - xxyycurr[2 * k + 1][tt] = yn / som; - YYcurr[k][tt] = yn; - } - } - */ - float student = 0.f; @@ -6846,8 +6803,6 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double scantempend = N_t - 1; } - int kkg = -1; - for (int gr = Rangegreenused.begin; gr < Rangegreenused.end; gr++) { float minstudgr = 100000.f; int goodrefgr = 1; @@ -6871,7 +6826,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double gm = new_scale_mul[1] / scale_mul[1] * gain; bm = new_scale_mul[2] / scale_mul[2] * gain; rmm[tt] = rm / gm; - gmm[tt] = gm / gm; + gmm[tt] = 1.f; bmm[tt] = bm / gm; } @@ -6904,8 +6859,6 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } - kkg = -1; - //degrade correllation with color high chroma, but not too much...seems not good, but keep in case of?? if (estimchrom < 0.025f) {//very smal value of chroma for image @@ -6924,6 +6877,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } + int kkg = -1; for (int i = 0; i < Nc ; i++) { if (good_spectral[i] == 1) { kkg++; @@ -7083,43 +7037,6 @@ void RawImageSource::WBauto(double & tempref, double & greenref, array2D { // BENCHFUN //auto white balance -// printf ("AUtoWB OK\n"); -/* - array2D redsobel; - array2D greensobel; - array2D bluesobel; - - redsobel(bfw, bfh); - greensobel(bfw, bfh); - bluesobel(bfw, bfh); -*/ - double avg_r = 0.; - double avg_g = 0.; - double avg_b = 0.; - int rn = 0, gn = 0, bn = 0; -// constexpr double clipHigh = 65500.0; -// constexpr double clipLow = 0; //1500.0; - bool edg = false; - bool greyn = false; - bool robust = false; - bool itc = false; - - if (wbpar.method == "autorobust") { - // printf("autorob\n"); - // RobustWB(redloc, greenloc, blueloc, bfw, bfh, avg_rm, avg_gm, avg_bm); - - } - - if (wbpar.method == "autedg") { - // printf("autoedge\n"); - // edg = true; - } - - if (wbpar.method == "aut") { -// greyn = true; - } - - if (wbpar.method == "autitcgreen") { bool extra = false; @@ -7135,134 +7052,16 @@ void RawImageSource::WBauto(double & tempref, double & greenref, array2D extra = true; } - // greenref = wbpar.green; -// printf("gree=%f\n", greenref); tempitc = 5000.; -// greenitc = greenref; - itc = true; - if (itc) { - ItcWB(extra, tempref, greenref, tempitc, greenitc, studgood, redloc, greenloc, blueloc, bfw, bfh, avg_rm, avg_gm, avg_bm, cmp, raw, wbpar); - } + ItcWB(extra, tempref, greenref, tempitc, greenitc, studgood, redloc, greenloc, blueloc, bfw, bfh, avg_rm, avg_gm, avg_bm, cmp, raw, wbpar); } - - if (wbpar.method == "autedgsdw") { - // SobelWB(redsobel, greensobel, bluesobel, redloc, greenloc, blueloc, bfw, bfh); - // SdwWB(redsobel, greensobel, bluesobel, bfw, bfh, avg_rm, avg_gm, avg_bm); - - } - - if (wbpar.method == "autedgrob") { - // SobelWB(redsobel, greensobel, bluesobel, redloc, greenloc, blueloc, bfw, bfh); - // RobustWB(redsobel, greensobel, bluesobel, bfw, bfh, avg_rm, avg_gm, avg_bm); - - } - - if (wbpar.method == "autosdw") { - // SdwWB(redloc, greenloc, blueloc, bfw, bfh, avg_rm, avg_gm, avg_bm); - - - // printf("bfw=%i bfh=%i begx=%i begy=%i xEn=%i yEn=%i cx=%i\n", bfw, bfh, begx, begy, xEn, yEn, cx); - } - -/* - if (edg) { - SobelWB(redsobel, greensobel, bluesobel, redloc, greenloc, blueloc, bfw, bfh); - -#ifdef _OPENMP - #pragma omp parallel for reduction(+:avg_r, avg_g, avg_b, rn, gn, bn) -#endif - - for (int y = 0; y < bfh ; y++) { - for (int x = 0; x < bfw ; x++) { - if (redsobel[y][x] < clipHigh && redsobel[y][x] > clipLow) { - avg_r += redsobel[y][x]; - rn++; - } - - if (greensobel[y][x] < clipHigh && greensobel[y][x] > clipLow) { - avg_g += greensobel[y][x]; - gn++; - } - - if (bluesobel[y][x] < clipHigh && bluesobel[y][x] > clipLow) { - avg_b += bluesobel[y][x]; - bn++; - } - } - } - } -*/ -/* - if (greyn) { -#ifdef _OPENMP - #pragma omp parallel for reduction(+:avg_r, avg_g, avg_b, rn, gn, bn) -#endif - - for (int y = 0; y < bfh ; y++) { - for (int x = 0; x < bfw ; x++) { - if (redloc[y][x] < clipHigh && redloc[y][x] > clipLow) { - avg_r += redloc[y][x]; - rn++; - } - - if (greenloc[y][x] < clipHigh && greenloc[y][x] > clipLow) { - avg_g += greenloc[y][x]; - gn++; - } - - if (blueloc[y][x] < clipHigh && blueloc[y][x] > clipLow) { - avg_b += blueloc[y][x]; - bn++; - } - } - } - } -*/ -// float varir = localr.equal; -// float varib = 1.f - (varir - 1.f); - - - -//CAT02 inverse - -// - if (greyn || edg) { - avg_rm = avg_r / rn; - avg_gm = avg_g / gn; - avg_bm = avg_b / bn; - } - - /* - //inverse cat02 - if (localr.wbcamMethod == "cat" || localr.wbcamMethod == "gamcat") { - //printf("Inverse CAT02\n"); - float x, y, z; - // cat02_to_xyzfloatraw ( x, y, z, avg_rm, avg_gm, avg_bm); - Color::xyz2rgbraw (x, y, z, avg_rm, avg_gm, avg_bm, wip); - } - */ - if (edg) { - // printf("Local sobel avgr = % f avgg = % f avgb = % f \n", avg_rm, avg_gm, avg_bm); - } - - if (greyn || robust) { - // printf("Local rgb avgr = % f avgg = % f avgb = % f \n", avg_rm, avg_gm, avg_bm); - } - -/* - redsobel(0, 0); - greensobel(0, 0); - bluesobel(0, 0); -*/ } void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w) { //used by auto WB local to calculate red, green, blue in local region - // printf("OK RGBLOC\n"); - // int bfh = bf_h + 3, bfw = bf_w + 3; int bfh = H, bfw = W; if (local) { @@ -7270,36 +7069,6 @@ void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, in bfw = bf_w + 3; } - // printf ("bfh=%i bfw=%i H=%i W=%i \n", bf_h, bf_w, H, W); - ColorManagementParams cmp; - - //TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(cmp.working); - // TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (cmp.working); - /* - float toxyz[3][3] = { - { - static_cast ( wprof[0][0] / Color::D50x), - static_cast ( wprof[0][1] / Color::D50x), - static_cast ( wprof[0][2] / Color::D50x) - }, { - static_cast ( wprof[1][0]), - static_cast ( wprof[1][1]), - static_cast ( wprof[1][2]) - }, { - static_cast ( wprof[2][0] / Color::D50z), - static_cast ( wprof[2][1] / Color::D50z), - static_cast ( wprof[2][2] / Color::D50z) - } - }; - */ - /* - double wp[3][3] = { - {wprof[0][0], wprof[0][1], wprof[0][2]}, - {wprof[1][0], wprof[1][1], wprof[1][2]}, - {wprof[2][0], wprof[2][1], wprof[2][2]} - }; - */ -// printf("wp00=%f wp02=%f\n", wp[0][0], wp[0][2]); if (! greenloc) { greenloc(bfw, bfh); } @@ -7312,8 +7081,7 @@ void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, in blueloc(bfw, bfh); } - float avgL = 0.f; - float redmm = 0.f, greenmm = 0.f, bluemm = 0.f; + double avgL = 0.0; //center data on normal values int nn = 0; @@ -7324,20 +7092,19 @@ void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, in int loy = cy + i; if (!local) { - redmm = redloc[i][j] = red[i][j]; - greenmm = greenloc[i][j] = green[i][j]; - bluemm = blueloc[i][j] = blue[i][j]; - float LL = (0.299f * redmm + 0.587f * greenmm + 0.114f * bluemm); - avgL += LL; + const float redmm = redloc[i][j] = red[i][j]; + const float greenmm = greenloc[i][j] = green[i][j]; + const float bluemm = blueloc[i][j] = blue[i][j]; + const float LL = (0.299f * redmm + 0.587f * greenmm + 0.114f * bluemm); + avgL += static_cast(LL); nn++; } else { - if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) { - redmm = redloc[loy - begy][lox - begx] = red[i][j]; - greenmm = greenloc[loy - begy][lox - begx] = green[i][j]; - bluemm = blueloc[loy - begy][lox - begx] = blue[i][j]; - float LL = (0.299f * redmm + 0.587f * greenmm + 0.114f * bluemm); - avgL += LL; + const float redmm = redloc[loy - begy][lox - begx] = red[i][j]; + const float greenmm = greenloc[loy - begy][lox - begx] = green[i][j]; + const float bluemm = blueloc[loy - begy][lox - begx] = blue[i][j]; + const float LL = (0.299f * redmm + 0.587f * greenmm + 0.114f * bluemm); + avgL += static_cast(LL); nn++; } } @@ -7345,7 +7112,6 @@ void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, in avgL /= nn; - float sig = 0.f; float vari = 0.f; int mm = 0; @@ -7356,10 +7122,9 @@ void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, in mm++; } - sig = sqrt(vari / mm); - float multip = 60000.f / (avgL + 2.f * sig); + const float sig = std::sqrt(vari / mm); + const float multip = 60000.f / (avgL + 2.f * sig); - // printf("multip=%f \n", multip); for (int i = 0; i < bfh; i++) for (int j = 0; j < bfw; j++) { redloc[i][j] *= multip; @@ -7368,8 +7133,6 @@ void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, in } if (gamma) { - // printf("gamma loc\n"); - for (int i = 0; i < bfh; i++) for (int j = 0; j < bfw; j++) { redloc[i][j] = Color::gammatab_srgb[redloc[i][j]]; @@ -7401,7 +7164,6 @@ void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, in } -//void RawImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) void RawImageSource::getAutoWBMultipliersitc(double & tempref, double & greenref, double & tempitc, double & greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double & rm, double & gm, double & bm, const WBParams & wbpar, const ColorManagementParams & cmp, const RAWParams & raw) { // BENCHFUN @@ -7411,30 +7173,14 @@ void RawImageSource::getAutoWBMultipliersitc(double & tempref, double & greenref rm = gm = bm = 1; return; } -/* - if (redAWBMul != -1.) { - rm = redAWBMul; - gm = greenAWBMul; - bm = blueAWBMul; - return; - } - if (!isWBProviderReady()) { - rm = -1.0; - gm = -1.0; - bm = -1.0; - return; - } -*/ double avg_r = 0; double avg_g = 0; double avg_b = 0; int rn = 0, gn = 0, bn = 0; double avg_rm, avg_gm, avg_bm; - // int bfh = bf_h + 3, bfw = bf_w + 3; int bfh = H, bfw = W; if (wbpar.method == "autold") { - // printf("OK auto OLD\n"); if (fuji) { for (int i = 32; i < H - 32; i++) { int fw = ri->get_FujiWidth(); @@ -7608,44 +7354,28 @@ void RawImageSource::getAutoWBMultipliersitc(double & tempref, double & greenref } } - if (wbpar.method == "aut" || wbpar.method == "autosdw" || wbpar.method == "autedgsdw" || wbpar.method == "autitcgreen" || wbpar.method == "autedgrob" || wbpar.method == "autedg" || wbpar.method == "autorobust") { + if (wbpar.method == "autitcgreen") { bool twotimes = false; - // printf("OK avant auto\n"); WBauto(tempref, greenref, redloc, greenloc, blueloc, bfw, bfh, avg_rm, avg_gm, avg_bm, tempitc, greenitc, studgood, twotimes, wbpar, begx, begy, yEn, xEn, cx, cy, cmp, raw); - // printf("OK apres auto\n"); - } redloc(0, 0); greenloc(0, 0); blueloc(0, 0); - if( settings->verbose ) { + if (settings->verbose) { printf ("AVG: %g %g %g\n", avg_r / std::max(1, rn), avg_g / std::max(1, gn), avg_b / std::max(1, bn)); } - // return ColorTemp (pow(avg_r/rn, 1.0/6.0)*img_r, pow(avg_g/gn, 1.0/6.0)*img_g, pow(avg_b/bn, 1.0/6.0)*img_b); - double reds = 0., greens = 0., blues = 0.; - - if (wbpar.method == "aut" || wbpar.method == "autosdw" || wbpar.method == "autedgsdw" || wbpar.method == "autedgrob" || wbpar.method == "autedg" || wbpar.method == "autorobust") { - //twotimes = true; - reds = avg_rm * refwb_red; - greens = avg_gm * refwb_green; - blues = avg_bm * refwb_blue; - } - - if (wbpar.method == "autold") { - reds = avg_r / std::max(1, rn) * refwb_red; - greens = avg_g / std::max(1, gn) * refwb_green; - blues = avg_b / std::max(1, bn) * refwb_blue; - } - if (wbpar.method == "autitcgreen") { //not used redAWBMul = rm = avg_rm * refwb_red; greenAWBMul = gm = avg_gm * refwb_green; blueAWBMul = bm = avg_bm * refwb_blue; } else { + const double reds = avg_r / std::max(1, rn) * refwb_red; + const double greens = avg_g / std::max(1, gn) * refwb_green; + const double blues = avg_b / std::max(1, bn) * refwb_blue; redAWBMul = rm = imatrices.rgb_cam[0][0] * reds + imatrices.rgb_cam[0][1] * greens + imatrices.rgb_cam[0][2] * blues; greenAWBMul = gm = imatrices.rgb_cam[1][0] * reds + imatrices.rgb_cam[1][1] * greens + imatrices.rgb_cam[1][2] * blues; blueAWBMul = bm = imatrices.rgb_cam[2][0] * reds + imatrices.rgb_cam[2][1] * greens + imatrices.rgb_cam[2][2] * blues; @@ -7653,12 +7383,6 @@ void RawImageSource::getAutoWBMultipliersitc(double & tempref, double & greenref } - - - - - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% void RawImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) { // BENCHFUN @@ -7875,9 +7599,6 @@ void RawImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) blueAWBMul = bm = imatrices.rgb_cam[2][0] * reds + imatrices.rgb_cam[2][1] * greens + imatrices.rgb_cam[2][2] * blues; } -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - ColorTemp RawImageSource::getSpotWB (std::vector &red, std::vector &green, std::vector &blue, int tran, double equal) { @@ -8090,9 +7811,6 @@ ColorTemp RawImageSource::getSpotWB (std::vector &red, std::vector &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) override; void retinexPrepareCurves (const procparams::RetinexParams &retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI) override; void retinexPrepareBuffers (const procparams::ColorManagementParams& cmp, const procparams::RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) override; - void flushRawData () override; - void flushRGB () override; + void flush () override; void HLRecovery_Global (const procparams::ToneCurveParams &hrp) override; void refinement(int PassCount); void setBorder(unsigned int rawBorder) override {border = rawBorder;} diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 779f2b33d..d097ead72 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -801,8 +801,7 @@ private: // commented out because it makes the application crash when batch processing... // TODO: find a better place to flush rawData and rawRGB if (flush) { - imgsrc->flushRawData(); - imgsrc->flushRGB(); + imgsrc->flush(); } return true; diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index 9da4417e2..763621171 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -366,7 +366,7 @@ ColorTemp StdImageSource::getSpotWB (std::vector &red, std::vectorallocate(0, 0); }; diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h index b88db42c4..9f4fbdfbe 100644 --- a/rtengine/stdimagesource.h +++ b/rtengine/stdimagesource.h @@ -118,7 +118,7 @@ public: void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) override { R = G = B = 0;} - void flushRGB () override; + void flush () override; void captureSharpening(const procparams::CaptureSharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold, double &radius) override {}; }; From ae0586719ae39a0c6e3f8b2cc229848ceef77e1a Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 28 Feb 2020 08:33:12 +0100 Subject: [PATCH 133/154] Enabled bencfun for Itcwb --- rtdata/languages/default | 2 +- rtengine/rawimagesource.cc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 5af093b6b..7e5830ec5 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2320,7 +2320,7 @@ TP_WBALANCE_SOLUX47;Solux 4700K (vendor) TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) TP_WBALANCE_SPOTWB;Use the pipette to pick the white balance from a neutral patch in the preview. TP_WBALANCE_STUDLABEL;Student Itcwb: %1 -TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation\nThe lower the student value, the better the correlation\nValues below 0.002 are excellent\nValues below 0.005 are very good\nValues below 0.01 are good\nValues below 0.05 are good enough\nValues above 0.5 are poor\nVery good Student test results does not mean that the WB is good, if the illuminant is non-standard the results are erratic.\nStudent=1000 means the calculations were not restarted but results are probably goods +TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation\nThe lower the student value, the better the correlation\nValues below 0.002 are excellent\nValues below 0.005 are very good\nValues below 0.01 are good\nValues below 0.05 are good enough\nValues above 0.5 are poor\nVery good Student test results does not mean that the WB is good, if the illuminant is non-standard the results are erratic.\nStudent=1000 means the calculations were not restarted but results are probably goods, use previous results TP_WBALANCE_TEMPBIAS;AWB temperature bias TP_WBALANCE_TEMPBIAS_TOOLTIP;Allows to alter the computation of the "auto white balance"\nby biasing it towards warmer or cooler temperatures. The bias\nis expressed as a percentage of the computed temperature,\nso that the result is given by "computedTemp + computedTemp * bias". TP_WBALANCE_TEMPERATURE;Temperature diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 3cabaf5b2..63a75cee6 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -43,7 +43,7 @@ #include "rtlensfun.h" #include "../rtgui/options.h" -//#define BENCHMARK +#define BENCHMARK #include "StopWatch.h" #ifdef _OPENMP @@ -5902,7 +5902,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double itcwb_delta : 1 by defaut can be set between 0 to 5 ==> delta temp to build histogram xy - if camera temp is not probably good */ // BENCHFUN - // BENCHFUN + BENCHFUN TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix("sRGB"); From a9e2bde610dfcbbc641677445b88e9c99866f3dd Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 28 Feb 2020 11:44:25 +0100 Subject: [PATCH 134/154] use autold instead of auto, #5676 --- rtengine/improccoordinator.cc | 2 +- rtengine/rtthumbnail.cc | 2 +- rtgui/thumbnail.cc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 6c9105036..795bcaabb 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1584,7 +1584,7 @@ void ImProcCoordinator::saveInputICCReference(const Glib::ustring& fname, bool a if (params->wb.method == "Camera") { currWB = imgsrc->getWB(); - } else if (params->wb.method == "Auto") { + } else if (params->wb.method == "autold") { if (lastAwbEqual != params->wb.equal || lastAwbTempBias != params->wb.tempBias) { double rm, gm, bm; imgsrc->getAutoWBMultipliers(rm, gm, bm); diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 4507f2b40..a063d965b 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -1130,7 +1130,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT double cam_g = colorMatrix[1][0] * camwbRed + colorMatrix[1][1] * camwbGreen + colorMatrix[1][2] * camwbBlue; double cam_b = colorMatrix[2][0] * camwbRed + colorMatrix[2][1] * camwbGreen + colorMatrix[2][2] * camwbBlue; currWB = ColorTemp (cam_r, cam_g, cam_b, params.wb.equal); - } else if (params.wb.method == "Auto") { + } else if (params.wb.method == "autold") { currWB = ColorTemp (autoWBTemp, autoWBGreen, wbEqual, "Custom"); } diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 87bc730eb..7452c9d72 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -216,7 +216,7 @@ const ProcParams& Thumbnail::getProcParamsU () double ct; getCamWB (ct, pparams->wb.green); pparams->wb.temperature = ct; - } else if (pparams->wb.method == "Auto") { + } else if (pparams->wb.method == "autold") { double ct; getAutoWB (ct, pparams->wb.green, pparams->wb.equal, pparams->wb.tempBias); pparams->wb.temperature = ct; From 77be7605d80ffd85aea48fb3191e4fa28ffbb87f Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 28 Feb 2020 12:02:38 +0100 Subject: [PATCH 135/154] "Auto" => "autold", #5676 --- rtengine/simpleprocess.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 779f2b33d..8fdfefdd7 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -276,7 +276,7 @@ private: currWB = ColorTemp(); } else if (params.wb.method == "Camera") { currWB = imgsrc->getWB(); - } else if (params.wb.method == "Auto") { + } else if (params.wb.method == "autold") { double rm, gm, bm; imgsrc->getAutoWBMultipliers(rm, gm, bm); currWB.update(rm, gm, bm, params.wb.equal, params.wb.tempBias); From c7c1dec9cbe63016ceb54b1d181fc467b4201d85 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 28 Feb 2020 13:19:10 +0100 Subject: [PATCH 136/154] whitebalance : fix bug in changing method, #5676 --- rtgui/whitebalance.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/whitebalance.cc b/rtgui/whitebalance.cc index 9a5f1a398..5d1c907df 100644 --- a/rtgui/whitebalance.cc +++ b/rtgui/whitebalance.cc @@ -897,7 +897,7 @@ int WhiteBalance::_setActiveMethod(Glib::ustring &label, Gtk::TreeModel::Childre if (row[methodColumns.colLabel] == label) { method->set_active(iter); - found = method->get_active_row_number(); + found = row[methodColumns.colId]; } if (found != -1) { From fbe718b64f0fac722ec665b74c7b1434abae8818 Mon Sep 17 00:00:00 2001 From: Benitoite Date: Fri, 28 Feb 2020 10:20:40 -0800 Subject: [PATCH 137/154] fixes macOS autobuild (#5674) * update macOS autobuild yaml * updates */CMakeLists* for macOS autobuild compatibility * "" a dir for cmake * Un empty an empty EXTRA_INCDIR * use a cmake operator * Use the . dir to un-empty a string * fix minutes timer in macos yaml * test & skip instead of load & include * disregard fractional part of minutes in mac yaml * add another cmake test * fix typo in mac yaml * fix other part of same typo * correct a filename in mac yaml * test all include dirs * fix of mac yaml * mac:fix a path in yaml * mac:and its antecedent * options.h include a dir * test __has_include (gcc 5.* & up & clang) * remove a printf() in mac yaml * mac:change a "" and an elseif() to else() * fix a whitespace error * fix 2 whitespace errors * ZULU>UTC * add a "UTC * on the other side of the " * mac:properly set default LOCAL_PREFIX in CACHE * use of zsh subshells in macos yaml * mac:remove some && * mac:remove some " * mac:floating point divisors * mac:use double paren (()) * mac:add a dir * mac:floatize with decimal point * mac:zsh -c certain lines * remove a marker --- .github/workflows/main.yml | 107 +++++++++++++++++++++---------------- AboutThisBuild.txt.in | 2 +- CMakeLists.txt | 64 +++++++++++++--------- UpdateInfo.cmake | 27 +++++----- rtdata/CMakeLists.txt | 18 +++---- rtengine/CMakeLists.txt | 81 ++++++++++++++++++---------- rtexif/CMakeLists.txt | 6 +-- rtgui/CMakeLists.txt | 18 +++---- rtgui/options.h | 5 ++ tools/osx/macosx_bundle.sh | 1 + 10 files changed, 193 insertions(+), 136 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 13aa6677a..e483ace01 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,81 +1,96 @@ name: macOS build on: push: - branches-ignore: - - '**' + branches: + - dev + - patch** + - newlocallab + pull_request: + branches: + - dev + - newlocallab + release: + types: + - created jobs: build: - runs-on: macos-latest + runs-on: macos-10.15 steps: - uses: actions/checkout@v1 - name: Install dependencies - run: > - brew install gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme - libsigc++ little-cms2 libiptcdata fftw lensfun llvm expat pkgconfig - libomp shared-mime-info - - name: patch libiconv run: | - mkdir libiconv && cd libiconv - wget https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz - tar xf libiconv-1.16.tar.gz - cd libiconv-1.16 - patch -p1 < "${GITHUB_WORKSPACE}/tools/osx/libiconv_1.16_rt.patch" - mkdir build && cd build - destDir="$(pwd)" - ../configure --prefix=/opt/local --disable-static \ - CFLAGS='-arch x86_64 -mmacosx-version-min=10.9' \ - LDFLAGS='-arch x86_64 -mmacosx-version-min=10.9' \ - CXXFLAGS='-arch x86_64 -mmacosx-version-min=10.9' - make --jobs - make DESTDIR="${destDir}" install - sudo mv opt/local /usr/local/opt/libiconv - - name: cmake + date -u + mkdir build + date +%s > build/stamp + brew uninstall --ignore-dependencies libtiff + brew install libtiff gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++ little-cms2 libiptcdata fftw lensfun expat pkgconfig libomp shared-mime-info | tee -a depslog + date -u + echo "----====Pourage====----" + cat depslog | grep Pouring + zsh -c 'echo "Completed installation of dependencies in $(printf "%0.2f" $(($[$(date +%s)-$(cat build/stamp)]/$((60.))))) minutes"' + - name: Configure build system env: CMAKE_CXX_STANDARD: 11 - PKG_CONFIG_PATH: /usr/local/opt/libffi/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig + PKG_CONFIG_PATH: /usr/local/opt/libtiff/lib/pkgconfig:/usr/local/opt/libffi/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig RAW_THERAPEE_MAJOR: '5' RAW_THERAPEE_MINOR: '8' C_FLAGS: > - -Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib - -I/usr/local/include -I/usr/local/opt/gdk-pixbuf/include - -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include - -I/usr/local/opt/expat/include -I/usr/local/opt/llvm/include + -arch x86_64 -mtune=generic -Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/gdk-pixbuf/include -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/libtiff/include run: | # GITHUB_REF is the ref that triggered the build, like # refs/heads/new-feature - the next line parses that to REF: the branch # name only (new-feature) - REF=${GITHUB_REF##*/} - mkdir build && cd build + export REF=${GITHUB_REF##*/} + export C_FLAGS=$(echo -e $C_FLAGS | tr -d '\n') + cd build && date -u && date +%s > configstamp cmake \ - -DCMAKE_BUILD_TYPE="release" \ + -DCMAKE_BUILD_TYPE="Release" \ -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ - -DCMAKE_EXE_LINKER_FLAGS="-L/usr/local/lib -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib -L/usr/local/opt/gdk-pixbuf/lib -L/usr/local/opt/libiconv/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib" \ + -DCMAKE_EXE_LINKER_FLAGS="-L. -L/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -L/usr/local/opt/gdk-pixbuf/lib -L/usr/local/opt/libiconv/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib" \ -DCACHE_NAME_SUFFIX="${RAW_THERAPEE_MAJOR}.${RAW_THERAPEE_MINOR}-${REF}" \ - -DPROC_TARGET_NUMBER="2" \ + -DPROC_TARGET_NUMBER="1" \ -DPROC_LABEL="generic processor" \ -DWITH_LTO="OFF" \ - -DLENSFUNDBDIR="./share/lensfun" \ - -DOpenMP_C_FLAGS=-fopenmp=libomp \ - -DOpenMP_CXX_FLAGS=-fopenmp=libomp \ - -DOpenMP_C_LIB_NAMES="libomp" \ - -DOpenMP_CXX_LIB_NAMES="libomp" \ - -DOpenMP_libomp_LIBRARY="/usr/local/lib/libomp.dylib" \ + -DLENSFUNDBDIR="/Applications/RawTherapee.app/Contents/Resources/share/lensfun" \ + -DCMAKE_C_COMPILER=/usr/local/opt/llvm/bin/clang \ + -DCMAKE_CXX_COMPILER=/usr/local/opt/llvm/bin/clang++ \ + -DCMAKE_C_FLAGS="-arch x86_64 -Wno-pass-failed -Wno-deprecated-register -Wno-unused-command-line-argument" \ + -DCMAKE_CXX_FLAGS="-arch x86_64 -Wno-pass-failed -Wno-deprecated-register -Wno-unused-command-line-argument" \ -DOpenMP_C_FLAGS="${C_FLAGS}" \ -DOpenMP_CXX_FLAGS="${C_FLAGS}" \ - -DCMAKE_AR="/usr/local/opt/llvm/bin/llvm-ar" \ - -DCMAKE_RANLIB="/usr/local/opt/llvm/bin/llvm-ranlib" \ - -DCMAKE_OSX_DEPLOYMENT_TARGET="10.11" \ + -DOpenMP_C_LIB_NAMES=libomp \ + -DOpenMP_CXX_LIB_NAMES=libomp \ + -DOpenMP_libomp_LIBRARY=/usr/local/lib/libomp.dylib \ + -DCMAKE_AR=/usr/bin/ar \ + -DCMAKE_RANLIB=/usr/bin/ranlib \ + -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 \ .. - make --jobs - make install - sudo make macosx_bundle - ARTIFACT=(RawTherapee*.zip) + zsh -c 'echo "Configured in $(printf "%0.2f" $(($[$(date +%s)-$(cat configstamp)]/$((60.))))) minutes"' + - name: Compile RawTherapee + run: | + date -u && date +%s > build/compilestamp + cd build + export REF=${GITHUB_REF##*/} + make -j$(sysctl -a | grep machdep.cpu.thread_count | tail -c 2) install + zsh -c 'echo "Compiled in $(printf "%0.2f" $(($[$(date +%s)-$(cat compilestamp)]/$((60.))))) minutes"' + - name: Create application bundle + run: | + zsh + date +%s > build/bundlestamp && date -u && cd build + export REF=${GITHUB_REF##*/} && export LOCAL_PREFIX=/usr && sudo make macosx_bundle + export ARTIFACT=(RawTherapee*.zip) echo "=== artifact: ${ARTIFACT}" # defining environment variables for next step as per # https://github.com/actions/starter-workflows/issues/68 echo "::set-env name=ARTIFACT_PATH::${GITHUB_WORKSPACE}/build/${ARTIFACT}" echo "::set-env name=ARTIFACT_FILE::${ARTIFACT}" + zsh -c 'echo "Bundled in $(printf "%0.2f" $(($[$(date +%s)-$(cat bundlestamp)]/$((60.))))) minutes"' + exit - uses: actions/upload-artifact@v1 with: name: ${{env.ARTIFACT_FILE}} path: ${{env.ARTIFACT_PATH}} + - name: Finish build + run: | + date -u + zsh -c 'echo "Build completed in $(printf "%0.2f" $(($[$(date +%s)-$(cat build/stamp)]/$((60.))))) minutes"' diff --git a/AboutThisBuild.txt.in b/AboutThisBuild.txt.in index 06f628187..4d8f4f3fe 100644 --- a/AboutThisBuild.txt.in +++ b/AboutThisBuild.txt.in @@ -14,6 +14,6 @@ Link flags: ${LFLAGS} OpenMP support: ${OPTION_OMP} MMAP support: ${WITH_MYFILE_MMAP} Build OS: ${BUILDINFO_OS} -Build date: ${BUILDINFO_DATE} ZULU +Build date: ${BUILDINFO_DATE} UTC Build epoch: ${BUILDINFO_EPOCH} Build UUID: ${BUILDINFO_UUID} diff --git a/CMakeLists.txt b/CMakeLists.txt index 5998ccb50..e3ae3b7ff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,14 @@ -cmake_minimum_required(VERSION 3.5) +# Use of SOURCE_DIR target property begins at cmake 3.7 +if(APPLE) + cmake_minimum_required(VERSION 3.7) +else() + cmake_minimum_required(VERSION 3.5) +endif() # Compiler id for Apple Clang if(APPLE) cmake_policy(SET CMP0025 NEW) + cmake_policy(SET CMP0037 NEW) endif() # Must stay before the project() command: @@ -145,7 +151,7 @@ if(WIN32) CACHE STRING "Additional search paths") endif() -if(APPLE) +if(APPLE) # TODO make -mtune generic conditional and/or specifiable. if(CMAKE_CXX_COMPILER MATCHES "g\\+\\+-mp-4.[5-8]" OR CMAKE_CXX_COMPILER_ARG1 MATCHES "g\\+\\+-mp-4.[5-8]") set(CMAKE_EXE_LINKER_FLAGS @@ -210,7 +216,7 @@ endif() if(NOT DEFINED BUNDLE_BASE_INSTALL_DIR) if(APPLE) - set(BUNDLE_BASE_INSTALL_DIR "${CMAKE_BUILD_TYPE}/MacOS") + set(BUNDLE_BASE_INSTALL_DIR "${PROJECT_SOURCE_DIR}/build/${CMAKE_BUILD_TYPE}/MacOS") else() set(BUNDLE_BASE_INSTALL_DIR "${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}") endif() @@ -219,7 +225,7 @@ endif() if(BUILD_BUNDLE) if(APPLE) set(BINDIR "${BUNDLE_BASE_INSTALL_DIR}") - set(CMAKE_INSTALL_PREFIX ".") + set(CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}/build") else() set(BINDIR .) set(CMAKE_INSTALL_PREFIX "${BUNDLE_BASE_INSTALL_DIR}") @@ -233,7 +239,7 @@ endif() if(NOT DEFINED DATADIR) if(BUILD_BUNDLE) if(APPLE) - set(DATADIR "${CMAKE_BUILD_TYPE}/Resources/share") + set(DATADIR "${PROJECT_SOURCE_DIR}/build/${CMAKE_BUILD_TYPE}/Resources/share") else() set(DATADIR .) endif() @@ -245,7 +251,7 @@ endif() if(NOT DEFINED LIBDIR) if(BUILD_BUNDLE) if(APPLE) - set(LIBDIR "${CMAKE_BUILD_TYPE}/Frameworks") + set(LIBDIR "${PROJECT_SOURCE_DIR}/build/${CMAKE_BUILD_TYPE}/Frameworks") else() set(LIBDIR .) endif() @@ -362,8 +368,10 @@ if(APPLE) set(LOCAL_PREFIX "${LOCAL_PREFIX}" CACHE STRING "macos/gtk parent directory ie /usr or /opt") - elseif(NOT DEFINED LOCAL_PREFIX) - set(LOCAL_PREFIX "/usr") + else() + set(LOCAL_PREFIX + /usr + CACHE STRING "macos/gtk parent directory ie /usr or /opt") endif() if("${FANCY_DMG}") set(FANCY_DMG @@ -612,12 +620,10 @@ else() set(PROC_BIT_DEPTH 64 bits) endif() -# Get compiler name and version. Only CMake > 2.8.7 knows -# CMAKE_*_COMPILER_VERSION -if(CMAKE_VERSION VERSION_GREATER 2.8.7) +# Get compiler name and version. get_filename_component(COMPILER_INFO ${CMAKE_C_COMPILER} NAME_WE) set(COMPILER_INFO "${COMPILER_INFO} ${CMAKE_C_COMPILER_VERSION}") -else() +if(NOT APPLE) execute_process( COMMAND gcc -dumpversion OUTPUT_VARIABLE GCC_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) @@ -633,15 +639,18 @@ set(LFLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${UPPER_CMAKE_BUILD_TYPE}}" ) -set(ABOUT_COMMAND_WITH_ARGS - ${CMAKE_COMMAND} -DPROJECT_SOURCE_DIR:STRING=${PROJECT_SOURCE_DIR} - -DCACHE_NAME_SUFFIX:STRING=${CACHE_NAME_SUFFIX} - -DPROC_LABEL:STRING="${PROC_LABEL}" - -DPROC_BIT_DEPTH:STRING="${PROC_BIT_DEPTH}" - -DBUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} - -DGTKMM_VERSION:STRING=${GTKMM_VERSION} -DOPTION_OMP:STRING=${OPTION_OMP} - -DWITH_MYFILE_MMAP:STRING=${WITH_MYFILE_MMAP} - -DLENSFUN_VERSION:STRING=${LENSFUN_VERSION}) +if(NOT APPLE) + set(ABOUT_COMMAND_WITH_ARGS + ${CMAKE_COMMAND} -DPROJECT_SOURCE_DIR:STRING=${PROJECT_SOURCE_DIR} + -DCACHE_NAME_SUFFIX:STRING=${CACHE_NAME_SUFFIX} + -DPROC_LABEL:STRING="${PROC_LABEL}" + -DPROC_BIT_DEPTH:STRING="${PROC_BIT_DEPTH}" + -DBUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} + -DGTKMM_VERSION:STRING=${GTKMM_VERSION} + -DOPTION_OMP:STRING=${OPTION_OMP} + -DWITH_MYFILE_MMAP:STRING=${WITH_MYFILE_MMAP} + -DLENSFUN_VERSION:STRING=${LENSFUN_VERSION}) +endif() if(WIN32) list( @@ -654,16 +663,19 @@ if(WIN32) -DCMAKE_INSTALL_PREFIX:STRING="${CMAKE_INSTALL_PREFIX}" -DBIT_DEPTH:STRING="${CMAKE_SIZEOF_VOID_P}") elseif(APPLE) - list(APPEND ABOUT_COMMAND_WITH_ARGS -DSYSTEM:STRING=Apple - -DCXX_FLAGS:STRING=${CXX_FLAGS} -DLFLAGS:STRING=${LFLAGS} - -DCOMPILER_INFO:STRING=${COMPILER_INFO}) + set( + ABOUT_COMMAND_WITH_ARGS + cmake -DPROJECT_SOURCE_DIR:STRING=${PROJECT_SOURCE_DIR} -P ${PROJECT_SOURCE_DIR}/UpdateInfo.cmake -DSYSTEM:STRING=Apple -DCXX_FLAGS:STRING=${CXX_FLAGS} -DLFLAGS:STRING=${LFLAGS} -DCOMPILER_INFO:STRING=${COMPILER_INFO} -DCACHE_NAME_SUFFIX:STRING=${CACHE_NAME_SUFFIX}) else() list(APPEND ABOUT_COMMAND_WITH_ARGS -DSYSTEM:STRING=Linux -DCXX_FLAGS:STRING=${CXX_FLAGS} -DLFLAGS:STRING=${LFLAGS} -DCOMPILER_INFO:STRING=${COMPILER_INFO}) endif() - -list(APPEND ABOUT_COMMAND_WITH_ARGS -P "${PROJECT_SOURCE_DIR}/UpdateInfo.cmake") +if(NOT APPLE) + list(APPEND + ABOUT_COMMAND_WITH_ARGS + -P "${PROJECT_SOURCE_DIR}/UpdateInfo.cmake") +endif() add_custom_target( UpdateInfo ALL diff --git a/UpdateInfo.cmake b/UpdateInfo.cmake index 6fa8e289c..473c68364 100644 --- a/UpdateInfo.cmake +++ b/UpdateInfo.cmake @@ -1,5 +1,9 @@ # cmakefile executed within a makefile target +if(APPLE) + set(PROJECT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/..") +endif() + # If we find ReleaseInfo.cmake we use the info from there and don't need Git to be installed find_file(REL_INFO_FILE ReleaseInfo.cmake PATHS "${PROJECT_SOURCE_DIR}" NO_DEFAULT_PATH) if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) @@ -68,20 +72,19 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) execute_process(COMMAND date -Ru OUTPUT_VARIABLE BUILDINFO_DATE OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND date +%s OUTPUT_VARIABLE BUILDINFO_EPOCH OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND uuidgen COMMAND tr "A-Z" "a-z" OUTPUT_VARIABLE BUILDINFO_UUID OUTPUT_STRIP_TRAILING_WHITESPACE) - message(STATUS "Git checkout information:") - message(STATUS " Commit description: ${GIT_DESCRIBE}") - message(STATUS " Branch: ${GIT_BRANCH}") - message(STATUS " Commit: ${GIT_COMMIT}") - message(STATUS " Commit date: ${GIT_COMMIT_DATE}") - message(STATUS " Commits since tag: ${GIT_COMMITS_SINCE_TAG}") - message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}") - message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}") + message(STATUS " Commit description: ${GIT_DESCRIBE}") + message(STATUS " Branch: ${GIT_BRANCH}") + message(STATUS " Commit: ${GIT_COMMIT}") + message(STATUS " Commit date: ${GIT_COMMIT_DATE}") + message(STATUS " Commits since tag: ${GIT_COMMITS_SINCE_TAG}") + message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}") + message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}") message(STATUS "Build information:") - message(STATUS " Build OS: ${BUILDINFO_OS}") - message(STATUS " Build date: ${BUILDINFO_DATE}") - message(STATUS " Epoch: ${BUILDINFO_EPOCH}") - message(STATUS " UUID: ${BUILDINFO_UUID}") + message(STATUS " Build OS: ${BUILDINFO_OS}") + message(STATUS " Build date: ${BUILDINFO_DATE} UTC") + message(STATUS " Epoch: ${BUILDINFO_EPOCH}") + message(STATUS " UUID: ${BUILDINFO_UUID}") if(NOT DEFINED CACHE_NAME_SUFFIX) set(CACHE_NAME_SUFFIX "${GIT_DESCRIBE}") diff --git a/rtdata/CMakeLists.txt b/rtdata/CMakeLists.txt index 76804c0f0..00a32c0cc 100644 --- a/rtdata/CMakeLists.txt +++ b/rtdata/CMakeLists.txt @@ -47,8 +47,8 @@ if(WIN32) install(FILES ${FONTS} DESTINATION "${DATADIR}/fonts") endif() -install(DIRECTORY ${PROFILESDIR} DESTINATION "${DATADIR}" FILES_MATCHING PATTERN "*.pp3") -install(DIRECTORY ${THEMEDIR} DESTINATION "${DATADIR}") +install(DIRECTORY "${PROFILESDIR}" DESTINATION "${DATADIR}" FILES_MATCHING PATTERN "*.pp3") +install(DIRECTORY "${THEMEDIR}" DESTINATION "${DATADIR}") install(FILES ${IMG_SVG} DESTINATION "${DATADIR}/images") install(FILES ${IMG_PNG} DESTINATION "${DATADIR}/images") @@ -57,19 +57,15 @@ install(FILES ${IMG_ICO} DESTINATION "${DATADIR}/images") if(APPLE) # CMake escapes first item quote character. Do not remove 'DUMMY_VARIABLE=' set(MACOSX_BUNDLE_COMMAND DUMMY_VARIABLE= - PROJECT_NAME="${PROJECT_NAME}" + PROJECT_NAME=${PROJECT_NAME} PROJECT_SOURCE_DIR="${PROJECT_SOURCE_DIR}" - CMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE}" + CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} GTK_PREFIX="${GTK_PREFIX}") - if(PROC_BIT_DEPTH MATCHES 32) - list(APPEND MACOSX_BUNDLE_COMMAND PROC_BIT_DEPTH=32) - else() - list(APPEND MACOSX_BUNDLE_COMMAND PROC_BIT_DEPTH=64) - endif() - list(APPEND MACOSX_BUNDLE_COMMAND sh "${PROJECT_SOURCE_DIR}/tools/osx/macosx_bundle.sh") + list(APPEND MACOSX_BUNDLE_COMMAND PROC_BIT_DEPTH=64) + list(APPEND MACOSX_BUNDLE_COMMAND sh ${PROJECT_SOURCE_DIR}/tools/osx/macosx_bundle.sh) add_custom_target(macosx_bundle COMMAND ${MACOSX_BUNDLE_COMMAND} - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/build COMMENT "Creating macOS bundle") endif() diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index 5f59da371..3813c5708 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -1,35 +1,60 @@ -include_directories(${EXTRA_INCDIR} - ${EXPAT_INCLUDE_DIRS} - ${FFTW3F_INCLUDE_DIRS} - ${GLIB2_INCLUDE_DIRS} - ${GLIBMM_INCLUDE_DIRS} - ${GOBJECT_INCLUDE_DIRS} - ${GTHREAD_INCLUDE_DIRS} - ${GTKMM_INCLUDE_DIRS} - ${GTK_INCLUDE_DIRS} - ${IPTCDATA_INCLUDE_DIRS} - ${LCMS_INCLUDE_DIRS} - ${LENSFUN_INCLUDE_DIRS} - ${RSVG_INCLUDE_DIRS} -) +if(EXTRA_INCDIR) + include_directories("${EXTRA_INCDIR}") +endif() +if(EXPAT_INCLUDE_DIRS) + include_directories("${EXPAT_INCLUDE_DIRS}") +endif() +if(FFTW3F_INCLUDE_DIRS) + include_directories("${FFTW3F_INCLUDE_DIRS}") +endif() +if(GLIB2_INCLUDE_DIRS) + include_directories("${GLIB2_INCLUDE_DIRS}") +endif() +if(GLIBMM_INCLUDE_DIRS) + include_directories("${GLIBMM_INCLUDE_DIRS}") +endif() +if(GOBJECT_INCLUDE_DIRS) + include_directories("${GOBJECT_INCLUDE_DIRS}") +endif() +if(GTHREAD_INCLUDE_DIRS) + include_directories("${GTHREAD_INCLUDE_DIRS}") +endif() +if(GTKMM_INCLUDE_DIRS) + include_directories("${GTKMM_INCLUDE_DIRS}") +endif() +if(GTK_INCLUDE_DIRS) + include_directories("${GTK_INCLUDE_DIRS}") +endif() +if(IPTCDATA_INCLUDE_DIRS) + include_directories("${IPTCDATA_INCLUDE_DIRS}") +endif() +if(LCMS_INCLUDE_DIRS) + include_directories("${LCMS_INCLUDE_DIRS}") +endif() +if(LENSFUN_INCLUDE_DIRS) + include_directories("${LENSFUN_INCLUDE_DIRS}") +endif() +if(RSVG_INCLUDE_DIRS) + include_directories("${RSVG_INCLUDE_DIRS}") +endif() if(NOT WITH_SYSTEM_KLT) include_directories("${CMAKE_SOURCE_DIR}/rtengine/klt") else() - include_directories(${KLT_INCLUDE_DIRS}) + include_directories("${KLT_INCLUDE_DIRS}") endif() link_directories("${PROJECT_SOURCE_DIR}/rtexif" - ${EXPAT_LIBRARY_DIRS} - ${EXTRA_LIBDIR} - ${FFTW3F_LIBRARY_DIRS} - ${GLIB2_LIBRARY_DIRS} - ${GLIBMM_LIBRARY_DIRS} - ${GOBJECT_LIBRARY_DIRS} - ${GTHREAD_LIBRARY_DIRS} - ${IPTCDATA_LIBRARY_DIRS} - ${LCMS_LIBRARY_DIRS} - ${LENSFUN_LIBRARY_DIRS} - ${RSVG_LIBRARY_DIRS} + "${EXPAT_LIBRARY_DIRS}" + "${EXTRA_LIBDIR}" + "${FFTW3F_LIBRARY_DIRS}" + "${GLIB2_LIBRARY_DIRS}" + "${GLIBMM_LIBRARY_DIRS}" + "${GOBJECT_LIBRARY_DIRS}" + "${GTHREAD_LIBRARY_DIRS}" + "${IPTCDATA_LIBRARY_DIRS}" + "${LCMS_LIBRARY_DIRS}" + "${LENSFUN_LIBRARY_DIRS}" + "${RSVG_LIBRARY_DIRS}" ) set(CAMCONSTSFILE "camconst.json") @@ -165,13 +190,13 @@ endif() include_directories(BEFORE "${CMAKE_CURRENT_BINARY_DIR}") -add_library(rtengine STATIC ${RTENGINESOURCEFILES}) +add_library(rtengine STATIC "${RTENGINESOURCEFILES}") add_dependencies(rtengine UpdateInfo) # It may be nice to store library version too if(BUILD_SHARED_LIBS) - install(TARGETS rtengine DESTINATION ${LIBDIR}) + install(TARGETS rtengine DESTINATION "${LIBDIR}") endif() set_target_properties(rtengine PROPERTIES COMPILE_FLAGS "${RTENGINE_CXX_FLAGS}") diff --git a/rtexif/CMakeLists.txt b/rtexif/CMakeLists.txt index 5a3831455..836f832e2 100644 --- a/rtexif/CMakeLists.txt +++ b/rtexif/CMakeLists.txt @@ -18,12 +18,12 @@ if(WIN32) link_directories(. "${PROJECT_SOURCE_DIR}/rtexif" ${EXTRA_LIBDIR} ${GLIB2_LIBRARY_DIRS} ${GLIBMM_LIBRARY_DIRS} ${GTK_LIBRARY_DIRS} ${GTKMM_LIBRARY_DIRS} ${LENSFUN_LIBRARY_DIRS}) else() set_target_properties(rtexif PROPERTIES COMPILE_FLAGS " -fPIC") - include_directories(${EXTRA_INCDIR} ${GLIB2_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ${GTK_INCLUDE_DIRS} ${GTKMM_INCLUDE_DIRS}) - link_directories(${EXTRA_LIBDIR} ${GLIB2_LIBRARY_DIRS} ${GLIBMM_LIBRARY_DIRS} ${GTK_LIBRARY_DIRS} ${GTKMM_LIBRARY_DIRS} ${LENSFUN_LIBRARY_DIRS}) + include_directories("${EXTRA_INCDIR} ${GLIB2_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ${GTK_INCLUDE_DIRS} ${GTKMM_INCLUDE_DIRS}") + link_directories("${EXTRA_LIBDIR} ${GLIB2_LIBRARY_DIRS} ${GLIBMM_LIBRARY_DIRS} ${GTK_LIBRARY_DIRS} ${GTKMM_LIBRARY_DIRS} ${LENSFUN_LIBRARY_DIRS}") endif() include_directories(BEFORE "${CMAKE_CURRENT_BINARY_DIR}") if(BUILD_SHARED_LIBS) - install(TARGETS rtexif DESTINATION ${LIBDIR}) + install(TARGETS rtexif DESTINATION "${LIBDIR}") endif() diff --git a/rtgui/CMakeLists.txt b/rtgui/CMakeLists.txt index 4b21ce421..828151338 100644 --- a/rtgui/CMakeLists.txt +++ b/rtgui/CMakeLists.txt @@ -164,13 +164,13 @@ set(NONCLISOURCEFILES zoompanel.cc ) -include_directories(BEFORE "${CMAKE_CURRENT_BINARY_DIR}") +include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}) if(APPLE) find_package(MacIntegration REQUIRED) # At the time of writing CMake has no module finder for gtkmacintegration so here we have it hard-coded, if installed via macports it should be in /opt/local/... - set(EXTRA_LIB_RTGUI ${MacIntegration_LIBRARIES}) - set(EXTRA_INCDIR ${EXTRA_INCDIR} ${MacIntegration_INCLUDE_DIRS}) + set(EXTRA_LIB_RTGUI "${MacIntegration_LIBRARIES}") + set(EXTRA_INCDIR "${EXTRA_INCDIR}" "${MacIntegration_INCLUDE_DIRS}") endif() if(WIN32) @@ -236,16 +236,16 @@ else() endif() # Excluding libatomic needed by Clang/FreeBSD, #3636 -if(OPENMP_FOUND AND NOT APPLE AND NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD") - set(EXTRA_LIB_RTGUI ${EXTRA_LIB_RTGUI} "atomic") +if(OPENMP_FOUND AND NOT APPLE AND NOT ${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD") + set(EXTRA_LIB_RTGUI "${EXTRA_LIB_RTGUI}" "atomic") endif() # Create config.h which defines where data are stored configure_file("${CMAKE_CURRENT_SOURCE_DIR}/config.h.in" "${CMAKE_CURRENT_BINARY_DIR}/config.h") # Create new executables targets -add_executable(rth ${EXTRA_SRC_NONCLI} ${NONCLISOURCEFILES}) -add_executable(rth-cli ${EXTRA_SRC_CLI} ${CLISOURCEFILES}) +add_executable(rth "${EXTRA_SRC_NONCLI}" "${NONCLISOURCEFILES}") +add_executable(rth-cli "${EXTRA_SRC_CLI}" "${CLISOURCEFILES}") # Add dependencies to executables targets add_dependencies(rth UpdateInfo) @@ -311,5 +311,5 @@ target_link_libraries(rth-cli rtengine ) # Install executables -install(TARGETS rth DESTINATION ${BINDIR}) -install(TARGETS rth-cli DESTINATION ${BINDIR}) +install(TARGETS rth DESTINATION "${BINDIR}") +install(TARGETS rth-cli DESTINATION "${BINDIR}") diff --git a/rtgui/options.h b/rtgui/options.h index c0ed2138b..0bc421300 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -20,7 +20,12 @@ #include #include +#if __has_include() #include +#else +#include +#endif + #include "../rtengine/settings.h" #include diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 2352133a9..9258810c0 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -404,6 +404,7 @@ function CreateDmg { # Zip disk image for redistribution msg "Zipping disk image for redistribution:" + zip "${dmg_name}.zip" "${dmg_name}.dmg" rm "${dmg_name}.dmg" msg "Removing disk image caches:" rm -rf "${srcDir}" From 28cff72eb0bd2f18db20c1935614c878034a966e Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 28 Feb 2020 20:18:45 +0100 Subject: [PATCH 138/154] rawimagesource.cc : cleanup, also speedup and bugfix for ItcWB, #5676, #5675 --- rtengine/LUT.h | 1 - rtengine/color.cc | 10 +- rtengine/color.h | 2 +- rtengine/rawimagesource.cc | 3322 +++++++++--------------------------- 4 files changed, 783 insertions(+), 2552 deletions(-) diff --git a/rtengine/LUT.h b/rtengine/LUT.h index a80e5996d..6ba7d570f 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -254,7 +254,6 @@ public: } // handy to sum up per thread histograms. #pragma omp simd speeds up the loop by about factor 3 for LUTu (uint32_t). - template::value>::type> LUT & operator+=(const LUT& rhs) { if (rhs.size == this->size) { diff --git a/rtengine/color.cc b/rtengine/color.cc index ed617057f..89be69e9d 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -941,12 +941,12 @@ void Color::rgbxyz (float r, float g, float b, float &x, float &y, float &z, con z = ((xyz_rgb[2][0] * r + xyz_rgb[2][1] * g + xyz_rgb[2][2] * b)) ; } -void Color::rgbxyY(float r, float g, float b, float &x, float &y, float &Y, float &xx, float &yy, float &zz, const double xyz_rgb[3][3]) +void Color::rgbxyY(float r, float g, float b, float &x, float &y, float &Y, const float xyz_rgb[3][3]) { - xx = ((xyz_rgb[0][0] * r + xyz_rgb[0][1] * g + xyz_rgb[0][2] * b)) ; - yy = ((xyz_rgb[1][0] * r + xyz_rgb[1][1] * g + xyz_rgb[1][2] * b)) ; - zz = ((xyz_rgb[2][0] * r + xyz_rgb[2][1] * g + xyz_rgb[2][2] * b)) ; - float som = xx + yy + zz; + const float xx = xyz_rgb[0][0] * r + xyz_rgb[0][1] * g + xyz_rgb[0][2] * b; + const float yy = xyz_rgb[1][0] * r + xyz_rgb[1][1] * g + xyz_rgb[1][2] * b; + const float zz = xyz_rgb[2][0] * r + xyz_rgb[2][1] * g + xyz_rgb[2][2] * b; + const float som = xx + yy + zz; x = xx / som; y = yy / som; Y = yy / 65535.f; diff --git a/rtengine/color.h b/rtengine/color.h index 3f63ad312..045e062ad 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -602,7 +602,7 @@ public: * @param xyz_rgb[3][3] transformation matrix to use for the conversion */ static void rgbxyz (float r, float g, float b, float &x, float &y, float &z, const double xyz_rgb[3][3]); - static void rgbxyY(float r, float g, float b, float &x, float &y, float &Y, float &xx, float &yy, float &zz, const double xyz_rgb[3][3]); + static void rgbxyY(float r, float g, float b, float &x, float &y, float &Y, const float xyz_rgb[3][3]); static void rgbxyz (float r, float g, float b, float &x, float &y, float &z, const float xyz_rgb[3][3]); #ifdef __SSE2__ static void rgbxyz (vfloat r, vfloat g, vfloat b, vfloat &x, vfloat &y, vfloat &z, const vfloat xyz_rgb[3][3]); diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index b55ec4bf1..765d0c0ac 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -195,7 +195,7 @@ void transLineD1x (const float* const red, const float* const green, const float image->b(row, col) = (blue[j] + image->b(row + 1, col)) / 2; } - if(i == 2 && oddHeight) { + if (i == 2 && oddHeight) { row = 2 * imheight; for (int j = 0; j < imwidth; j++) { @@ -232,7 +232,7 @@ void transLineD1x (const float* const red, const float* const green, const float image->g(row, col) = MAX(0.f, -0.0625f * (green[j] + image->g(row + 3, col)) + 0.5625f * (image->g(row - 1, col) + image->g(row + 1, col))); image->b(row, col) = MAX(0.f, -0.0625f * (blue[j] + image->b(row + 3, col)) + 0.5625f * (image->b(row - 1, col) + image->b(row + 1, col))); - if(clip) { + if (clip) { image->r(row, col) = MIN(image->r(row, col), rtengine::MAXVALF); image->g(row, col) = MIN(image->g(row, col), rtengine::MAXVALF); image->b(row, col) = MIN(image->b(row, col), rtengine::MAXVALF); @@ -243,7 +243,7 @@ void transLineD1x (const float* const red, const float* const green, const float break; case TR_R90: // rotate right - if( i == 0) { + if (i == 0) { for (int j = 0; j < imwidth; j++) { image->r(j, 2 * imheight - 1) = red[j]; image->g(j, 2 * imheight - 1) = green[j]; @@ -265,7 +265,7 @@ void transLineD1x (const float* const red, const float* const green, const float image->g(j, col) = (green[j] + image->g(j, col + 1)) / 2; image->b(j, col) = (blue[j] + image->b(j, col + 1)) / 2; - if(oddHeight && i == 2) { + if (oddHeight && i == 2) { image->r(j, 2 * imheight) = (red[j] + image->r(j, 2 * imheight - 2)) / 2; image->g(j, 2 * imheight) = (green[j] + image->g(j, 2 * imheight - 2)) / 2; image->b(j, 2 * imheight) = (blue[j] + image->b(j, 2 * imheight - 2)) / 2; @@ -295,7 +295,7 @@ void transLineD1x (const float* const red, const float* const green, const float image->g(j, col) = MAX(0.f, -0.0625f * (green[j] + image->g(j, col + 3)) + 0.5625f * (image->g(j, col - 1) + image->g(j, col + 1))); image->b(j, col) = MAX(0.f, -0.0625f * (blue[j] + image->b(j, col + 3)) + 0.5625f * (image->b(j, col - 1) + image->b(j, col + 1))); - if(clip) { + if (clip) { image->r(j, col) = MIN(image->r(j, col), rtengine::MAXVALF); image->g(j, col) = MIN(image->g(j, col), rtengine::MAXVALF); image->b(j, col) = MIN(image->b(j, col), rtengine::MAXVALF); @@ -327,7 +327,7 @@ void transLineD1x (const float* const red, const float* const green, const float image->g(row, 2 * i - 3) = MAX(0.f, -0.0625f * (green[j] + image->g(row, 2 * i - 6)) + 0.5625f * (image->g(row, 2 * i - 2) + image->g(row, 2 * i - 4))); image->b(row, 2 * i - 3) = MAX(0.f, -0.0625f * (blue[j] + image->b(row, 2 * i - 6)) + 0.5625f * (image->b(row, 2 * i - 2) + image->b(row, 2 * i - 4))); - if(clip) { + if (clip) { image->r(row, 2 * i - 3) = MIN(image->r(row, 2 * i - 3), rtengine::MAXVALF); image->g(row, 2 * i - 3) = MIN(image->g(row, 2 * i - 3), rtengine::MAXVALF); image->b(row, 2 * i - 3) = MIN(image->b(row, 2 * i - 3), rtengine::MAXVALF); @@ -345,7 +345,7 @@ void transLineD1x (const float* const red, const float* const green, const float image->g(row, 2 * i - 1) = MAX(0.f, -0.0625f * (green[j] + image->g(row, 2 * i - 4)) + 0.5625f * (image->g(row, 2 * i) + image->g(row, 2 * i - 2))); image->b(row, 2 * i - 1) = MAX(0.f, -0.0625f * (blue[j] + image->b(row, 2 * i - 4)) + 0.5625f * (image->b(row, 2 * i) + image->b(row, 2 * i - 2))); - if(clip) { + if (clip) { image->r(j, 2 * i - 1) = MIN(image->r(j, 2 * i - 1), rtengine::MAXVALF); image->g(j, 2 * i - 1) = MIN(image->g(j, 2 * i - 1), rtengine::MAXVALF); image->b(j, 2 * i - 1) = MIN(image->b(j, 2 * i - 1), rtengine::MAXVALF); @@ -383,7 +383,7 @@ void transLineD1x (const float* const red, const float* const green, const float image->g(2 * i - 3, j) = MAX(0.f, -0.0625f * (green[j] + image->g(2 * i - 6, j)) + 0.5625f * (image->g(2 * i - 2, j) + image->g(2 * i - 4, j))); image->b(2 * i - 3, j) = MAX(0.f, -0.0625f * (blue[j] + image->b(2 * i - 6, j)) + 0.5625f * (image->b(2 * i - 2, j) + image->b(2 * i - 4, j))); - if(clip) { + if (clip) { image->r(2 * i - 3, j) = MIN(image->r(2 * i - 3, j), rtengine::MAXVALF); image->g(2 * i - 3, j) = MIN(image->g(2 * i - 3, j), rtengine::MAXVALF); image->b(2 * i - 3, j) = MIN(image->b(2 * i - 3, j), rtengine::MAXVALF); @@ -397,7 +397,7 @@ void transLineD1x (const float* const red, const float* const green, const float image->g(2 * i - 1, j) = MAX(0.f, -0.0625f * (green[j] + image->g(2 * i - 4, j)) + 0.5625f * (image->g(2 * i, j) + image->g(2 * i - 2, j))); image->b(2 * i - 1, j) = MAX(0.f, -0.0625f * (blue[j] + image->b(2 * i - 4, j)) + 0.5625f * (image->b(2 * i, j) + image->b(2 * i - 2, j))); - if(clip) { + if (clip) { image->r(2 * i - 1, j) = MIN(image->r(2 * i - 1, j), rtengine::MAXVALF); image->g(2 * i - 1, j) = MIN(image->g(2 * i - 1, j), rtengine::MAXVALF); image->b(2 * i - 1, j) = MIN(image->b(2 * i - 1, j), rtengine::MAXVALF); @@ -465,7 +465,7 @@ RawImageSource::RawImageSource () { embProfile = nullptr; rgbSourceModified = false; - for(int i = 0; i < 4; ++i) { + for (int i = 0; i < 4; ++i) { psRedBrightness[i] = psGreenBrightness[i] = psBlueBrightness[i] = 1.f; } } @@ -480,11 +480,11 @@ RawImageSource::~RawImageSource () delete greenCache; delete blueCache; - for(size_t i = 0; i < numFrames; ++i) { + for (size_t i = 0; i < numFrames; ++i) { delete riFrames[i]; } - for(size_t i = 0; i + 1 < numFrames; ++i) { + for (size_t i = 0; i + 1 < numFrames; ++i) { delete rawDataBuffer[i]; } @@ -550,11 +550,11 @@ void RawImageSource::transformRect (const PreviewProps &pp, int tran, int &ssx1, sh = w; } - if( pp_width > sw - 2 * border) { + if (pp_width > sw - 2 * border) { pp_width = sw - 2 * border; } - if( pp_height > sh - 2 * border) { + if (pp_height > sh - 2 * border) { pp_height = sh - 2 * border; } @@ -594,16 +594,16 @@ void RawImageSource::transformRect (const PreviewProps &pp, int tran, int &ssx1, // atszamoljuk a koordinatakat fuji-ra: // recalculate the coordinates fuji-ra: ssx1 = (sx1 + sy1) / 2; - ssy1 = (sy1 - sx2 ) / 2 + ri->get_FujiWidth(); + ssy1 = (sy1 - sx2) / 2 + ri->get_FujiWidth(); int ssx2 = (sx2 + sy2) / 2 + 1; int ssy2 = (sy2 - sx1) / 2 + ri->get_FujiWidth(); - fw = (sx2 - sx1) / 2 / pp.getSkip(); - width = (ssx2 - ssx1) / pp.getSkip() + ((ssx2 - ssx1) % pp.getSkip() > 0); + fw = (sx2 - sx1) / 2 / pp.getSkip(); + width = (ssx2 - ssx1) / pp.getSkip() + ((ssx2 - ssx1) % pp.getSkip() > 0); height = (ssy2 - ssy1) / pp.getSkip() + ((ssy2 - ssy1) % pp.getSkip() > 0); } else { ssx1 = sx1; ssy1 = sy1; - width = (sx2 + 1 - sx1) / pp.getSkip() + ((sx2 + 1 - sx1) % pp.getSkip() > 0); + width = (sx2 + 1 - sx1) / pp.getSkip() + ((sx2 + 1 - sx1) % pp.getSkip() > 0); height = (sy2 + 1 - sy1) / pp.getSkip() + ((sy2 + 1 - sy1) % pp.getSkip() > 0); } } @@ -636,7 +636,7 @@ float calculate_scale_mul(float scale_mul[4], const float pre_mul_[4], const flo return gain; } -void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const RAWParams &raw ) +void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const RAWParams &raw) { MyMutex::MyLock lock(getImageMutex); @@ -841,9 +841,9 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima hlRecovery (hrp.method, line_red, line_grn, line_blue, imwidth, hlmax); } - if(d1x) { + if (d1x) { transLineD1x (line_red, line_grn, line_blue, ix, image, tran, imwidth, imheight, d1xHeightOdd, doClip); - } else if(fuji) { + } else if (fuji) { transLineFuji (line_red, line_grn, line_blue, ix, image, tran, imheight, fw); } else { transLineStandard (line_red, line_grn, line_blue, ix, image, tran, imwidth, imheight); @@ -913,7 +913,7 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima } // Colour correction (only when running on full resolution) - if(pp.getSkip() == 1) { + if (pp.getSkip() == 1) { switch(ri->getSensorType()) { case ST_BAYER: processFalseColorCorrection (image, raw.bayersensor.ccSteps); @@ -1029,7 +1029,7 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) errCode = 0; - if(numFrames >= 7) { + if (numFrames >= 7) { // special case to avoid crash when loading Hasselblad H6D-100cMS pixelshift files // limit to 6 frames and skip first frame, as first frame is not bayer if (firstFrameOnly) { @@ -1045,8 +1045,8 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) #ifdef _OPENMP #pragma omp for nowait #endif - for(unsigned int i = 0; i < numFrames; ++i) { - if(i == 0) { + for (unsigned int i = 0; i < numFrames; ++i) { + if (i == 0) { riFrames[i] = ri; errCodeThr = riFrames[i]->loadRaw (true, i + 1, true, plistener, 0.8); } else { @@ -1061,7 +1061,7 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) errCode = errCodeThr ? errCodeThr : errCode; } } - } else if(numFrames > 1) { + } else if (numFrames > 1) { #ifdef _OPENMP #pragma omp parallel #endif @@ -1070,8 +1070,8 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) #ifdef _OPENMP #pragma omp for nowait #endif - for(unsigned int i = 0; i < numFrames; ++i) { - if(i == 0) { + for (unsigned int i = 0; i < numFrames; ++i) { + if (i == 0) { riFrames[i] = ri; errCodeThr = riFrames[i]->loadRaw (true, i, true, plistener, 0.8); } else { @@ -1091,16 +1091,16 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) errCode = riFrames[0]->loadRaw (true, 0, true, plistener, 0.8); } - if(!errCode) { - for(unsigned int i = 0; i < numFrames; ++i) { + if (!errCode) { + for (unsigned int i = 0; i < numFrames; ++i) { riFrames[i]->compress_image(i); } } else { return errCode; } - if(numFrames > 1 ) { // this disables multi frame support for Fuji S5 until I found a solution to handle different dimensions - if(riFrames[0]->get_width() != riFrames[1]->get_width() || riFrames[0]->get_height() != riFrames[1]->get_height()) { + if (numFrames > 1) { // this disables multi frame support for Fuji S5 until I found a solution to handle different dimensions + if (riFrames[0]->get_width() != riFrames[1]->get_width() || riFrames[0]->get_height() != riFrames[1]->get_height()) { numFrames = 1; } } @@ -1123,15 +1123,15 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) // first arg is matrix, second arg is inverse inverse33 (imatrices.rgb_cam, imatrices.cam_rgb); - d1x = ! ri->get_model().compare("D1X"); + d1x = ! ri->get_model().compare("D1X"); - if(ri->getSensorType() == ST_FUJI_XTRANS) { + if (ri->getSensorType() == ST_FUJI_XTRANS) { border = 7; - } else if(ri->getSensorType() == ST_FOVEON) { + } else if (ri->getSensorType() == ST_FOVEON) { border = 0; } - if ( ri->get_profile() ) { + if (ri->get_profile()) { embProfile = cmsOpenProfileFromMem (ri->get_profile(), ri->get_profileLen()); } @@ -1150,7 +1150,7 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) // First we get the "as shot" ("Camera") white balance and store it float pre_mul[4]; // FIXME: get_colorsCoeff not so much used nowadays, when we have calculate_scale_mul() function here - ri->get_colorsCoeff( pre_mul, scale_mul, c_black, false);//modify for black level + ri->get_colorsCoeff(pre_mul, scale_mul, c_black, false);//modify for black level camInitialGain = max(scale_mul[0], scale_mul[1], scale_mul[2], scale_mul[3]) / min(scale_mul[0], scale_mul[1], scale_mul[2], scale_mul[3]); double camwb_red = ri->get_pre_mul(0) / pre_mul[0]; @@ -1166,7 +1166,7 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) { // ...then we re-get the constants but now with auto which gives us better demosaicing and CA auto-correct // performance for strange white balance settings (such as UniWB) - ri->get_colorsCoeff( ref_pre_mul, scale_mul, c_black, true); + ri->get_colorsCoeff(ref_pre_mul, scale_mul, c_black, true); refwb_red = ri->get_pre_mul(0) / ref_pre_mul[0]; refwb_green = ri->get_pre_mul(1) / ref_pre_mul[1]; refwb_blue = ri->get_pre_mul(2) / ref_pre_mul[2]; @@ -1187,9 +1187,9 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) ColorTemp d50wb = ColorTemp(5000.0, 1.0, 1.0, "Custom"); double rm,gm,bm,r,g,b; d50wb.getMultipliers(r, g, b); - camwb_red = imatrices.cam_rgb[0][0]*r + imatrices.cam_rgb[0][1]*g + imatrices.cam_rgb[0][2]*b; + camwb_red = imatrices.cam_rgb[0][0]*r + imatrices.cam_rgb[0][1]*g + imatrices.cam_rgb[0][2]*b; camwb_green = imatrices.cam_rgb[1][0]*r + imatrices.cam_rgb[1][1]*g + imatrices.cam_rgb[1][2]*b; - camwb_blue = imatrices.cam_rgb[2][0]*r + imatrices.cam_rgb[2][1]*g + imatrices.cam_rgb[2][2]*b; + camwb_blue = imatrices.cam_rgb[2][0]*r + imatrices.cam_rgb[2][1]*g + imatrices.cam_rgb[2][2]*b; double pre_mul[3], dmax = 0; pre_mul[0] = ri->get_pre_mul(0) / camwb_red; pre_mul[1] = ri->get_pre_mul(1) / camwb_green; @@ -1212,7 +1212,7 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) initialGain = 1.0 / min(pre_mul[0], pre_mul[1], pre_mul[2]); }*/ - for(unsigned int i = 0;i < numFrames; ++i) { + for (unsigned int i = 0;i < numFrames; ++i) { riFrames[i]->set_prefilters(); } @@ -1234,7 +1234,7 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) plistener = nullptr; // This must be reset, because only load() is called through progressConnector t2.set(); - if( settings->verbose ) { + if (settings->verbose) { printf("Load %s: %d usec\n", fname.c_str(), t2.etime(t1)); } @@ -1253,27 +1253,27 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le RawImage *rid = nullptr; if (!raw.df_autoselect) { - if( !raw.dark_frame.empty()) { - rid = dfm.searchDarkFrame( raw.dark_frame ); + if (!raw.dark_frame.empty()) { + rid = dfm.searchDarkFrame(raw.dark_frame); } } else { rid = dfm.searchDarkFrame(idata->getMake(), idata->getModel(), idata->getISOSpeed(), idata->getShutterSpeed(), idata->getDateTimeAsTS()); } - if( rid && settings->verbose) { - printf( "Subtracting Darkframe:%s\n", rid->get_filename().c_str()); + if (rid && settings->verbose) { + printf("Subtracting Darkframe:%s\n", rid->get_filename().c_str()); } std::unique_ptr bitmapBads; int totBP = 0; // Hold count of bad pixels to correct - if(ri->zeroIsBad()) { // mark all pixels with value zero as bad, has to be called before FF and DF. dcraw sets this flag only for some cameras (mainly Panasonic and Leica) + if (ri->zeroIsBad()) { // mark all pixels with value zero as bad, has to be called before FF and DF. dcraw sets this flag only for some cameras (mainly Panasonic and Leica) bitmapBads.reset(new PixelsMap(W, H)); totBP = findZeroPixels(*(bitmapBads.get())); - if( settings->verbose) { - printf( "%d pixels with value zero marked as bad pixels\n", totBP); + if (settings->verbose) { + printf("%d pixels with value zero marked as bad pixels\n", totBP); } } @@ -1281,28 +1281,28 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le RawImage *rif = nullptr; if (!raw.ff_AutoSelect) { - if( !raw.ff_file.empty()) { - rif = ffm.searchFlatField( raw.ff_file ); + if (!raw.ff_file.empty()) { + rif = ffm.searchFlatField(raw.ff_file); } } else { - rif = ffm.searchFlatField( idata->getMake(), idata->getModel(), idata->getLens(), idata->getFocalLen(), idata->getFNumber(), idata->getDateTimeAsTS()); + rif = ffm.searchFlatField(idata->getMake(), idata->getModel(), idata->getLens(), idata->getFocalLen(), idata->getFNumber(), idata->getDateTimeAsTS()); } bool hasFlatField = (rif != nullptr); - if( hasFlatField && settings->verbose) { - printf( "Flat Field Correction:%s\n", rif->get_filename().c_str()); + if (hasFlatField && settings->verbose) { + printf("Flat Field Correction:%s\n", rif->get_filename().c_str()); } - if(numFrames == 4) { + if (numFrames == 4) { int bufferNumber = 0; - for(unsigned int i=0; i<4; ++i) { - if(i==currFrame) { + for (unsigned int i=0; i<4; ++i) { + if (i==currFrame) { copyOriginalPixels(raw, ri, rid, rif, rawData); rawDataFrames[i] = &rawData; } else { - if(!rawDataBuffer[bufferNumber]) { + if (!rawDataBuffer[bufferNumber]) { rawDataBuffer[bufferNumber] = new array2D; } rawDataFrames[i] = rawDataBuffer[bufferNumber]; @@ -1311,7 +1311,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le } } } else if (numFrames == 2 && currFrame == 2) { // average the frames - if(!rawDataBuffer[0]) { + if (!rawDataBuffer[0]) { rawDataBuffer[0] = new array2D; } rawDataFrames[1] = rawDataBuffer[0]; @@ -1330,16 +1330,16 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le // Always correct camera badpixels from .badpixels file - std::vector *bp = dfm.getBadPixels( ri->get_maker(), ri->get_model(), idata->getSerialNumber() ); + std::vector *bp = dfm.getBadPixels(ri->get_maker(), ri->get_model(), idata->getSerialNumber()); - if( bp ) { - if(!bitmapBads) { + if (bp) { + if (!bitmapBads) { bitmapBads.reset(new PixelsMap(W, H)); } totBP += bitmapBads->set(*bp); - if( settings->verbose ) { + if (settings->verbose) { std::cout << "Correcting " << bp->size() << " pixels from .badpixels" << std::endl; } } @@ -1347,30 +1347,30 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le // If darkframe selected, correct hotpixels found on darkframe bp = nullptr; - if( raw.df_autoselect ) { + if (raw.df_autoselect) { bp = dfm.getHotPixels(idata->getMake(), idata->getModel(), idata->getISOSpeed(), idata->getShutterSpeed(), idata->getDateTimeAsTS()); - } else if( !raw.dark_frame.empty() ) { - bp = dfm.getHotPixels( raw.dark_frame ); + } else if (!raw.dark_frame.empty()) { + bp = dfm.getHotPixels(raw.dark_frame); } - if(bp) { - if(!bitmapBads) { + if (bp) { + if (!bitmapBads) { bitmapBads.reset(new PixelsMap(W, H)); } totBP += bitmapBads->set(*bp); - if( settings->verbose && !bp->empty()) { + if (settings->verbose && !bp->empty()) { std::cout << "Correcting " << bp->size() << " hotpixels from darkframe" << std::endl; } } - if(numFrames == 4) { - for(int i=0; i<4; ++i) { - scaleColors( 0, 0, W, H, raw, *rawDataFrames[i]); + if (numFrames == 4) { + for (int i=0; i<4; ++i) { + scaleColors(0, 0, W, H, raw, *rawDataFrames[i]); } } else { - scaleColors( 0, 0, W, H, raw, rawData); //+ + raw parameters for black level(raw.blackxx) + scaleColors(0, 0, W, H, raw, rawData); //+ + raw parameters for black level(raw.blackxx) } // Correct vignetting of lens profile @@ -1389,14 +1389,14 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le if (pmap) { LensCorrection &map = *pmap; if (ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS || ri->get_colors() == 1) { - if(numFrames == 4) { - for(int i = 0; i < 4; ++i) { + if (numFrames == 4) { + for (int i = 0; i < 4; ++i) { map.processVignette(W, H, *rawDataFrames[i]); } } else { map.processVignette(W, H, rawData); } - } else if(ri->get_colors() == 3) { + } else if (ri->get_colors() == 3) { map.processVignette3Channels(W, H, rawData); } } @@ -1404,21 +1404,21 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le defGain = 0.0;//log(initialGain) / log(2.0); - if ( ri->getSensorType() == ST_BAYER && (raw.hotPixelFilter > 0 || raw.deadPixelFilter > 0)) { + if (ri->getSensorType() == ST_BAYER && (raw.hotPixelFilter > 0 || raw.deadPixelFilter > 0)) { if (plistener) { plistener->setProgressStr ("PROGRESSBAR_HOTDEADPIXELFILTER"); plistener->setProgress (0.0); } - if(!bitmapBads) { + if (!bitmapBads) { bitmapBads.reset(new PixelsMap(W, H)); } - int nFound = findHotDeadPixels(*(bitmapBads.get()), raw.hotdeadpix_thresh, raw.hotPixelFilter, raw.deadPixelFilter ); + int nFound = findHotDeadPixels(*(bitmapBads.get()), raw.hotdeadpix_thresh, raw.hotPixelFilter, raw.deadPixelFilter); totBP += nFound; - if( settings->verbose && nFound > 0) { - printf( "Correcting %d hot/dead pixels found inside image\n", nFound ); + if (settings->verbose && nFound > 0) { + printf("Correcting %d hot/dead pixels found inside image\n", nFound); } } @@ -1457,13 +1457,13 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le return cc && cc->get_globalGreenEquilibration(); }; - if ( ri->getSensorType() == ST_BAYER && (raw.bayersensor.greenthresh || (globalGreenEq() && raw.bayersensor.method != RAWParams::BayerSensor::getMethodString( RAWParams::BayerSensor::Method::VNG4))) ) { + if (ri->getSensorType() == ST_BAYER && (raw.bayersensor.greenthresh || (globalGreenEq() && raw.bayersensor.method != RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::VNG4)))) { if (settings->verbose) { printf("Performing global green equilibration...\n"); } // global correction - if(numFrames == 4) { - for(int i = 0; i < 4; ++i) { + if (numFrames == 4) { + for (int i = 0; i < 4; ++i) { green_equilibrate_global(*rawDataFrames[i]); } } else { @@ -1471,7 +1471,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le } } - if ( ri->getSensorType() == ST_BAYER && raw.bayersensor.greenthresh > 0) { + if (ri->getSensorType() == ST_BAYER && raw.bayersensor.greenthresh > 0) { if (plistener) { plistener->setProgressStr ("PROGRESSBAR_GREENEQUIL"); plistener->setProgress (0.0); @@ -1479,8 +1479,8 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le GreenEqulibrateThreshold thresh(0.01 * raw.bayersensor.greenthresh); - if(numFrames == 4) { - for(int i = 0; i < 4; ++i) { + if (numFrames == 4) { + for (int i = 0; i < 4; ++i) { green_equilibrate(thresh, *rawDataFrames[i]); } } else { @@ -1489,23 +1489,23 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le } - if( totBP ) { - if ( ri->getSensorType() == ST_BAYER ) { - if(numFrames == 4) { - for(int i = 0; i < 4; ++i) { + if (totBP) { + if (ri->getSensorType() == ST_BAYER) { + if (numFrames == 4) { + for (int i = 0; i < 4; ++i) { interpolateBadPixelsBayer(*(bitmapBads.get()), *rawDataFrames[i]); } } else { interpolateBadPixelsBayer(*(bitmapBads.get()), rawData); } - } else if ( ri->getSensorType() == ST_FUJI_XTRANS ) { + } else if (ri->getSensorType() == ST_FUJI_XTRANS) { interpolateBadPixelsXtrans(*(bitmapBads.get())); } else { interpolateBadPixelsNColours(*(bitmapBads.get()), ri->get_colors()); } } - if ( ri->getSensorType() == ST_BAYER && raw.bayersensor.linenoise > 0 ) { + if (ri->getSensorType() == ST_BAYER && raw.bayersensor.linenoise > 0) { if (plistener) { plistener->setProgressStr ("PROGRESSBAR_LINEDENOISE"); plistener->setProgress (0.0); @@ -1522,15 +1522,15 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le cfa_linedn(0.00002 * (raw.bayersensor.linenoise), int(raw.bayersensor.linenoiseDirection) & int(RAWParams::BayerSensor::LineNoiseDirection::VERTICAL), int(raw.bayersensor.linenoiseDirection) & int(RAWParams::BayerSensor::LineNoiseDirection::HORIZONTAL), *line_denoise_rowblender); } - if ( (raw.ca_autocorrect || fabs(raw.cared) > 0.001 || fabs(raw.cablue) > 0.001) && ri->getSensorType() == ST_BAYER ) { // Auto CA correction disabled for X-Trans, for now... + if ((raw.ca_autocorrect || std::fabs(raw.cared) > 0.001 || std::fabs(raw.cablue) > 0.001) && ri->getSensorType() == ST_BAYER) { // Auto CA correction disabled for X-Trans, for now... if (plistener) { plistener->setProgressStr ("PROGRESSBAR_RAWCACORR"); plistener->setProgress (0.0); } - if(numFrames == 4) { + if (numFrames == 4) { double fitParams[64]; float *buffer = CA_correct_RT(raw.ca_autocorrect, raw.caautoiterations, raw.cared, raw.cablue, raw.ca_avoidcolourshift, *rawDataFrames[0], fitParams, false, true, nullptr, false, options.chunkSizeCA, options.measure); - for(int i = 1; i < 3; ++i) { + for (int i = 1; i < 3; ++i) { CA_correct_RT(raw.ca_autocorrect, raw.caautoiterations, raw.cared, raw.cablue, raw.ca_avoidcolourshift, *rawDataFrames[i], fitParams, true, false, buffer, false, options.chunkSizeCA, options.measure); } CA_correct_RT(raw.ca_autocorrect, raw.caautoiterations, raw.cared, raw.cablue, raw.ca_avoidcolourshift, *rawDataFrames[3], fitParams, true, false, buffer, true, options.chunkSizeCA, options.measure); @@ -1539,7 +1539,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le } } - if(prepareDenoise && dirpyrdenoiseExpComp == RT_INFINITY) { + if (prepareDenoise && dirpyrdenoiseExpComp == RT_INFINITY) { LUTu aehist; int aehistcompr; double clip = 0; @@ -1550,7 +1550,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le t2.set(); - if( settings->verbose ) { + if (settings->verbose) { printf("Preprocessing: %d usec\n", t2.etime(t1)); } @@ -1565,13 +1565,13 @@ void RawImageSource::demosaic(const RAWParams &raw, bool autoContrast, double &c t1.set(); if (ri->getSensorType() == ST_BAYER) { - if ( raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::HPHD) ) { + if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::HPHD)) { hphd_demosaic (); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::VNG4) ) { + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::VNG4)) { vng4_demosaic (rawData, red, green, blue); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AHD) ) { + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AHD)) { ahd_demosaic (); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZE) ) { + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZE)) { amaze_demosaic_RT (0, 0, W, H, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure); } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZEVNG4) || raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::DCBVNG4) @@ -1582,9 +1582,9 @@ void RawImageSource::demosaic(const RAWParams &raw, bool autoContrast, double &c } else { dual_demosaic_RT (true, raw, W, H, rawData, red, green, blue, contrastThreshold, true); } - } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT) ) { + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT)) { pixelshift(0, 0, W, H, raw, currFrame, ri->get_maker(), ri->get_model(), raw.expos); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::DCB) ) { + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::DCB)) { dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance); } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::EAHD)) { eahd_demosaic (); @@ -1592,21 +1592,21 @@ void RawImageSource::demosaic(const RAWParams &raw, bool autoContrast, double &c igv_interpolate(W, H); } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::LMMSE)) { lmmse_interpolate_omp(W, H, rawData, red, green, blue, raw.bayersensor.lmmse_iterations); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::FAST) ) { + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::FAST)) { fast_demosaic(); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::MONO) ) { + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::MONO)) { nodemosaic(true); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::RCD) ) { + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::RCD)) { rcd_demosaic(options.chunkSizeRCD, options.measure); } else { nodemosaic(false); } } else if (ri->getSensorType() == ST_FUJI_XTRANS) { - if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FAST) ) { + if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FAST)) { fast_xtrans_interpolate(rawData, red, green, blue); } else if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::ONE_PASS)) { xtrans_interpolate(1, false, options.chunkSizeXT, options.measure); - } else if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::THREE_PASS) ) { + } else if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::THREE_PASS)) { xtrans_interpolate(3, true, options.chunkSizeXT, options.measure); } else if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FOUR_PASS) || raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::TWO_PASS)) { if (!autoContrast) { @@ -1615,7 +1615,7 @@ void RawImageSource::demosaic(const RAWParams &raw, bool autoContrast, double &c } else { dual_demosaic_RT (false, raw, W, H, rawData, red, green, blue, contrastThreshold, true); } - } else if(raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::MONO) ) { + } else if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::MONO)) { nodemosaic(true); } else { nodemosaic(false); @@ -1673,7 +1673,7 @@ void RawImageSource::demosaic(const RAWParams &raw, bool autoContrast, double &c delete blueCache; blueCache = nullptr; } - if( settings->verbose ) { + if (settings->verbose) { if (getSensorType() == ST_BAYER) { printf("Demosaicing Bayer data: %s - %d usec\n", raw.bayersensor.method.c_str(), t2.etime(t1)); } else if (getSensorType() == ST_FUJI_XTRANS) { @@ -1695,20 +1695,20 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con LUTf *retinexgamtab = nullptr;//gamma before and after Retinex to restore tones LUTf lutTonereti; - if(retinexParams.gammaretinex == "low") { + if (retinexParams.gammaretinex == "low") { retinexgamtab = &(Color::gammatab_115_2); - } else if(retinexParams.gammaretinex == "mid") { + } else if (retinexParams.gammaretinex == "mid") { retinexgamtab = &(Color::gammatab_13_2); - } else if(retinexParams.gammaretinex == "hig") { + } else if (retinexParams.gammaretinex == "hig") { retinexgamtab = &(Color::gammatab_145_3); - } else if(retinexParams.gammaretinex == "fre") { + } else if (retinexParams.gammaretinex == "fre") { GammaValues g_a; double pwr = 1.0 / retinexParams.gam; double gamm = retinexParams.gam; double ts = retinexParams.slope; double gamm2 = retinexParams.gam; - if(gamm2 < 1.) { + if (gamm2 < 1.) { std::swap(pwr, gamm); } @@ -1719,7 +1719,7 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con double start; double add; - if(gamm2 < 1.) { + if (gamm2 < 1.) { start = g_a[2]; add = g_a[4]; } else { @@ -1735,7 +1735,7 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con double val = (i) / 65535.; double x; - if(gamm2 < 1.) { + if (gamm2 < 1.) { x = Color::igammareti (val, gamm, start, ts, mul , add); } else { x = Color::gammareti (val, gamm, start, ts, mul , add); @@ -1764,15 +1764,15 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con printf("rr2=%f gg2=%f bb2=%f \n",rr,gg,bb); */ /* - if(retinexParams.highlig < 100 && retinexParams.retinexMethod == "highliplus") {//try to recover magenta...very difficult ! + if (retinexParams.highlig < 100 && retinexParams.retinexMethod == "highliplus") {//try to recover magenta...very difficult ! float hig = ((float)retinexParams.highlig)/100.f; float higgb = ((float)retinexParams.grbl)/100.f; #ifdef _OPENMP #pragma omp parallel for #endif - for (int i = border; i < H - border; i++ ) { - for (int j = border; j < W - border; j++ ) { + for (int i = border; i < H - border; i++) { + for (int j = border; j < W - border; j++) { float R_,G_,B_; R_=red[i][j]; G_=green[i][j]; @@ -1780,20 +1780,20 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con //empirical method to find highlight magenta with no conversion RGB and no white balance //red = master Gr and Bl default higgb=0.5 - // if(R_>65535.f*hig && G_ > 65535.f*higgb && B_ > 65535.f*higgb) conversionBuffer[3][i - border][j - border] = R_; + // if (R_>65535.f*hig && G_ > 65535.f*higgb && B_ > 65535.f*higgb) conversionBuffer[3][i - border][j - border] = R_; // else conversionBuffer[3][i - border][j - border] = 0.f; } } } */ - if(retinexParams.gammaretinex != "none" && retinexParams.str != 0 && retinexgamtab) {//gamma + if (retinexParams.gammaretinex != "none" && retinexParams.str != 0 && retinexgamtab) {//gamma #ifdef _OPENMP #pragma omp parallel for #endif - for (int i = border; i < H - border; i++ ) { - for (int j = border; j < W - border; j++ ) { + for (int i = border; i < H - border; i++) { + for (int j = border; j < W - border; j++) { float R_, G_, B_; R_ = red[i][j]; G_ = green[i][j]; @@ -1806,7 +1806,7 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con } } - if(useHsl) { + if (useHsl) { #ifdef _OPENMP #pragma omp parallel #endif @@ -1814,7 +1814,7 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con // one LUT per thread LUTu lhist16RETIThr; - if(lhist16RETI) + if (lhist16RETI) { lhist16RETIThr(lhist16RETI.getSize()); lhist16RETIThr.clear(); @@ -1827,7 +1827,7 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con #pragma omp for #endif - for (int i = border; i < H - border; i++ ) + for (int i = border; i < H - border; i++) { int j = border; #ifdef __SSE2__ @@ -1841,9 +1841,9 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con STVFU(conversionBuffer[2][i - border][j - border], L); STVFU(conversionBuffer[3][i - border][j - border], H); - if(lhist16RETI) { - for(int p = 0; p < 4; p++) { - int pos = ( conversionBuffer[2][i - border][j - border + p]);//histogram in curve HSL + if (lhist16RETI) { + for (int p = 0; p < 4; p++) { + int pos = (conversionBuffer[2][i - border][j - border + p]);//histogram in curve HSL lhist16RETIThr[pos]++; } } @@ -1858,7 +1858,7 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con L *= 32768.f; conversionBuffer[2][i - border][j - border] = L; - if(lhist16RETI) { + if (lhist16RETI) { int pos = L; lhist16RETIThr[pos]++; } @@ -1868,7 +1868,7 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con #ifdef _OPENMP #pragma omp critical { - if(lhist16RETI) + if (lhist16RETI) { lhist16RETI += lhist16RETIThr; // Add per Thread LUT to global LUT } @@ -1893,7 +1893,7 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con // one LUT per thread LUTu lhist16RETIThr; - if(lhist16RETI) { + if (lhist16RETI) { lhist16RETIThr(lhist16RETI.getSize()); lhist16RETIThr.clear(); } @@ -1902,7 +1902,7 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con #pragma omp for schedule(dynamic,16) #endif - for (int i = border; i < H - border; i++ ) + for (int i = border; i < H - border; i++) for (int j = border; j < W - border; j++) { float X, Y, Z, L, aa, bb; //rgb=>lab @@ -1914,9 +1914,9 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con conversionBuffer[2][i - border][j - border] = L; conversionBuffer[3][i - border][j - border] = xatan2f(bb, aa); -// if(R_>40000.f && G_ > 30000.f && B_ > 30000.f) conversionBuffer[3][i - border][j - border] = R_; +// if (R_>40000.f && G_ > 30000.f && B_ > 30000.f) conversionBuffer[3][i - border][j - border] = R_; // else conversionBuffer[3][i - border][j - border] = 0.f; - if(lhist16RETI) { + if (lhist16RETI) { int pos = L; lhist16RETIThr[pos]++;//histogram in Curve Lab } @@ -1925,7 +1925,7 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con #ifdef _OPENMP #pragma omp critical { - if(lhist16RETI) { + if (lhist16RETI) { lhist16RETI += lhist16RETIThr; // Add per Thread LUT to global LUT } } @@ -1942,7 +1942,7 @@ void RawImageSource::retinexPrepareCurves(const RetinexParams &retinexParams, LU { useHsl = (retinexParams.retinexcolorspace == "HSLLOG" || retinexParams.retinexcolorspace == "HSLLIN"); - if(useHsl) { + if (useHsl) { CurveFactory::curveDehaContL (retinexcontlutili, retinexParams.cdHcurve, cdcurve, 1, lhist16RETI, histLRETI); } else { CurveFactory::curveDehaContL (retinexcontlutili, retinexParams.cdcurve, cdcurve, 1, lhist16RETI, histLRETI); @@ -1967,13 +1967,13 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara LUTf *retinexigamtab = nullptr;//gamma before and after Retinex to restore tones - if(deh.gammaretinex == "low") { + if (deh.gammaretinex == "low") { retinexigamtab = &(Color::igammatab_115_2); - } else if(deh.gammaretinex == "mid") { + } else if (deh.gammaretinex == "mid") { retinexigamtab = &(Color::igammatab_13_2); - } else if(deh.gammaretinex == "hig") { + } else if (deh.gammaretinex == "hig") { retinexigamtab = &(Color::igammatab_145_3); - } else if(deh.gammaretinex == "fre") { + } else if (deh.gammaretinex == "fre") { GammaValues g_a; double pwr = 1.0 / deh.gam; double gamm = deh.gam; @@ -1981,7 +1981,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara double ts = deh.slope; int mode = 0; - if(gamm2 < 1.) { + if (gamm2 < 1.) { std::swap(pwr, gamm); } @@ -1991,7 +1991,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara double add; double start; - if(gamm2 < 1.) { + if (gamm2 < 1.) { start = g_a[3]; add = g_a[3]; } else { @@ -2004,7 +2004,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara double val = (i) / 65535.; double x; - if(gamm2 < 1.) { + if (gamm2 < 1.) { x = Color::gammareti (val, gamm, start, ts, mul , add); } else { x = Color::igammareti (val, gamm, start, ts, mul , add); @@ -2026,7 +2026,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara LUTf dLcurve; LUTu hist16RET; - if(dehacontlutili && histLRETI) { + if (dehacontlutili && histLRETI) { hist16RET(32768); hist16RET.clear(); histLRETI.clear(); @@ -2058,7 +2058,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara // one LUT per thread LUTu hist16RETThr; - if(hist16RET) { + if (hist16RET) { hist16RETThr(hist16RET.getSize()); hist16RETThr.clear(); } @@ -2067,12 +2067,12 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara #pragma omp for #endif - for (int i = 0; i < H - 2 * border; i++ ) - if(dehacontlutili) + for (int i = 0; i < H - 2 * border; i++) + if (dehacontlutili) for (int j = 0; j < W - 2 * border; j++) { LBuffer[i][j] = cdcurve[2.f * temp[i][j]] / 2.f; - if(histLRETI) { + if (histLRETI) { int pos = LBuffer[i][j]; hist16RETThr[pos]++; //histogram in Curve } @@ -2086,13 +2086,13 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara #pragma omp critical #endif { - if(hist16RET) { + if (hist16RET) { hist16RET += hist16RETThr; // Add per Thread LUT to global LUT } } } - if(hist16RET) {//update histogram + if (hist16RET) {//update histogram // TODO : When rgbcurvesspeedup branch is merged into master, replace this by the following 1-liner // hist16RET.compressTo(histLRETI); // also remove declaration and init of dLcurve some lines above then and finally remove this comment :) @@ -2110,13 +2110,13 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara MSR(LBuffer, conversionBuffer[2], conversionBuffer[3], mapcurve, mapcontlutili, WNew, HNew, deh, dehatransmissionCurve, dehagaintransmissionCurve, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax); - if(useHsl) { - if(chutili) { + if (useHsl) { + if (chutili) { #ifdef _OPENMP #pragma omp parallel for #endif - for (int i = border; i < H - border; i++ ) { + for (int i = border; i < H - border; i++) { int j = border; for (; j < W - border; j++) { @@ -2132,7 +2132,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara #pragma omp parallel for #endif - for (int i = border; i < H - border; i++ ) { + for (int i = border; i < H - border; i++) { int j = border; #ifdef __SSE2__ vfloat c32768 = F2V(32768.f); @@ -2180,7 +2180,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara #pragma omp for #endif - for (int i = border; i < H - border; i++ ) { + for (int i = border; i < H - border; i++) { #ifdef __SSE2__ // vectorized precalculation { @@ -2210,7 +2210,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara float HH = xatan2f(bb, aa); atan2Buffer[j - border] = HH; - if(Chprov1 == 0.0f) { + if (Chprov1 == 0.0f) { sincosyBuffer[j - border] = 1.f; sincosxBuffer[j - border] = 0.0f; } else { @@ -2237,7 +2237,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara float HH = xatan2f(bb, aa); float2 sincosval;// = xsincosf(HH); - if(Chprov1 == 0.0f) { + if (Chprov1 == 0.0f) { sincosval.y = 1.f; sincosval.x = 0.0f; } else { @@ -2247,7 +2247,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara #endif - if(chutili) { // c=f(H) + if (chutili) { // c=f(H) float valp = float((chcurve->getVal(Color::huelab_to_huehsv2(HH)) - 0.5f)); Chprov1 *= (1.f + 2.f * valp); } @@ -2275,8 +2275,8 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara #ifdef __SSE2__ vfloat wipv[3][3]; - for(int i = 0; i < 3; i++) - for(int j = 0; j < 3; j++) { + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) { wipv[i][j] = F2V(wiprof[i][j]); } @@ -2285,7 +2285,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara #pragma omp parallel for #endif - for (int i = border; i < H - border; i++ ) { + for (int i = border; i < H - border; i++) { int j = border; #ifdef __SSE2__ @@ -2319,13 +2319,13 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara delete chcurve; } - if(deh.gammaretinex != "none" && deh.str != 0) { //inverse gamma + if (deh.gammaretinex != "none" && deh.str != 0) { //inverse gamma #ifdef _OPENMP #pragma omp parallel for #endif - for (int i = border; i < H - border; i++ ) { - for (int j = border; j < W - border; j++ ) { + for (int i = border; i < H - border; i++) { + for (int j = border; j < W - border; j++) { float R_, G_, B_; R_ = red[i][j]; G_ = green[i][j]; @@ -2341,7 +2341,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara t5.set(); - if( settings->verbose ) { + if (settings->verbose) { printf("Retinex=%d usec\n", t5.etime(t4)); } @@ -2349,7 +2349,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara void RawImageSource::flush() { - for(size_t i = 0; i + 1 < numFrames; ++i) { + for (size_t i = 0; i + 1 < numFrames; ++i) { delete rawDataBuffer[i]; rawDataBuffer[i] = nullptr; } @@ -2385,7 +2385,7 @@ void RawImageSource::flush() void RawImageSource::HLRecovery_Global(const ToneCurveParams &hrp) { if (hrp.hrenabled && hrp.method == "Color") { - if(!rgbSourceModified) { + if (!rgbSourceModified) { if (settings->verbose) { printf ("Applying Highlight Recovery: Color propagation...\n"); } @@ -2400,7 +2400,7 @@ void RawImageSource::HLRecovery_Global(const ToneCurveParams &hrp) /* Copy original pixel data and * subtract dark frame (if present) from current image and apply flat field correction (if present) */ -void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, RawImage *riDark, RawImage *riFlatFile, array2D &rawData ) +void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, RawImage *riDark, RawImage *riFlatFile, array2D &rawData) { const float black[4] = { static_cast(ri->get_cblack(0)), static_cast(ri->get_cblack(1)), @@ -2419,9 +2419,9 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw #endif for (int row = 0; row < H; row++) { const int c0 = FC(row, 0); - const float black0 = black[(c0 == 1 && !(row & 1) ) ? 3 : c0]; + const float black0 = black[(c0 == 1 && !(row & 1)) ? 3 : c0]; const int c1 = FC(row, 1); - const float black1 = black[(c1 == 1 && !(row & 1) ) ? 3 : c1]; + const float black1 = black[(c1 == 1 && !(row & 1)) ? 3 : c1]; int col; for (col = 0; col < W - 1; col += 2) { rawData[row][col] = max(src->data[row][col] + black0 - riDark->data[row][col], 0.0f); @@ -2480,8 +2480,8 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw if (riDark && W == riDark->get_width() && H == riDark->get_height()) { for (int row = 0; row < H; row++) { for (int col = 0; col < W; col++) { - int c = FC(row, col); - int c4 = ( c == 1 && !(row & 1) ) ? 3 : c; + int c = FC(row, col); + int c4 = (c == 1 && !(row & 1)) ? 3 : c; rawData[row][3 * col + 0] = max(src->data[row][3 * col + 0] + black[c4] - riDark->data[row][3 * col + 0], 0.0f); rawData[row][3 * col + 1] = max(src->data[row][3 * col + 1] + black[c4] - riDark->data[row][3 * col + 1], 0.0f); rawData[row][3 * col + 2] = max(src->data[row][3 * col + 2] + black[c4] - riDark->data[row][3 * col + 2], 0.0f); @@ -2508,7 +2508,7 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R //adjust black level (eg Canon) bool isMono = false; - if (getSensorType() == ST_BAYER || getSensorType() == ST_FOVEON ) { + if (getSensorType() == ST_BAYER || getSensorType() == ST_FOVEON) { black_lev[0] = raw.bayersensor.black1; //R black_lev[1] = raw.bayersensor.black0; //G1 @@ -2526,8 +2526,8 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R isMono = RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::MONO) == raw.xtranssensor.method; } - for(int i = 0; i < 4 ; i++) { - cblacksom[i] = max( c_black[i] + black_lev[i], 0.0f ); // adjust black level + for (int i = 0; i < 4 ; i++) { + cblacksom[i] = max(c_black[i] + black_lev[i], 0.0f); // adjust black level } for (int i = 0; i < 4; ++i) { @@ -2537,7 +2537,7 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R initialGain = calculate_scale_mul(scale_mul, ref_pre_mul, c_white, cblacksom, isMono, ri->get_colors()); // recalculate scale colors with adjusted levels //fprintf(stderr, "recalc: %f [%f %f %f %f]\n", initialGain, scale_mul[0], scale_mul[1], scale_mul[2], scale_mul[3]); - for(int i = 0; i < 4 ; i++) { + for (int i = 0; i < 4 ; i++) { clmax[i] = (c_white[i] - cblacksom[i]) * scale_mul[i]; // raw clip level } @@ -2545,7 +2545,7 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R // scale image colors - if( ri->getSensorType() == ST_BAYER) { + if (ri->getSensorType() == ST_BAYER) { #ifdef _OPENMP #pragma omp parallel #endif @@ -2559,8 +2559,8 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R for (int row = winy; row < winy + winh; row ++) { for (int col = winx; col < winx + winw; col++) { - const int c = FC(row, col); // three colors, 0=R, 1=G, 2=B - const int c4 = ( c == 1 && !(row & 1) ) ? 3 : c; // four colors, 0=R, 1=G1, 2=B, 3=G2 + const int c = FC(row, col); // three colors, 0=R, 1=G, 2=B + const int c4 = (c == 1 && !(row & 1)) ? 3 : c; // four colors, 0=R, 1=G1, 2=B, 3=G2 const float val = max(0.f, rawData[row][col] - cblacksom[c4]) * scale_mul[c4]; rawData[row][col] = val; tmpchmax[c] = max(tmpchmax[c], val); @@ -2576,7 +2576,7 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R chmax[2] = max(tmpchmax[2], chmax[2]); } } - } else if ( ri->get_colors() == 1 ) { + } else if (ri->get_colors() == 1) { #ifdef _OPENMP #pragma omp parallel #endif @@ -2602,7 +2602,7 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R chmax[0] = chmax[1] = chmax[2] = chmax[3] = max(tmpchmax, chmax[0]); } } - } else if(ri->getSensorType() == ST_FUJI_XTRANS) { + } else if (ri->getSensorType() == ST_FUJI_XTRANS) { #ifdef _OPENMP #pragma omp parallel #endif @@ -3125,7 +3125,7 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, const ColorManagemen transform_via_pcs_lab = true; separate_pcs_lab_highlights = true; // We transform to Lab because we can and that we avoid getting an unnecessary unmatched gamma conversion which we would need to revert. - hTransform = cmsCreateTransform (in, TYPE_RGB_FLT, nullptr, TYPE_Lab_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); + hTransform = cmsCreateTransform (in, TYPE_RGB_FLT, nullptr, TYPE_Lab_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { @@ -3143,7 +3143,7 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, const ColorManagemen case CAMERA_ICC_TYPE_NIKON: case CAMERA_ICC_TYPE_GENERIC: default: - hTransform = cmsCreateTransform (in, TYPE_RGB_FLT, prophoto, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety + hTransform = cmsCreateTransform (in, TYPE_RGB_FLT, prophoto, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE); // NOCACHE is important for thread safety break; } @@ -3152,7 +3152,7 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, const ColorManagemen if (hTransform == nullptr) { // Fallback: create transform from camera profile. Should not happen normally. lcmsMutex->lock (); - hTransform = cmsCreateTransform (camprofile, TYPE_RGB_FLT, prophoto, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); + hTransform = cmsCreateTransform (camprofile, TYPE_RGB_FLT, prophoto, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE); lcmsMutex->unlock (); } @@ -3174,11 +3174,11 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, const ColorManagemen #pragma omp for schedule(static) #endif - for ( int h = 0; h < im->getHeight(); ++h ) { + for (int h = 0; h < im->getHeight(); ++h) { float *p = buffer.data, *pR = im->r(h), *pG = im->g(h), *pB = im->b(h); // Apply pre-processing - for ( int w = 0; w < im->getWidth(); ++w ) { + for (int w = 0; w < im->getWidth(); ++w) { float r = *(pR++); float g = *(pG++); float b = *(pB++); @@ -3261,7 +3261,7 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, const ColorManagemen pG = im->g(h); pB = im->b(h); - for ( int w = 0; w < im->getWidth(); ++w ) { + for (int w = 0; w < im->getWidth(); ++w) { float r, g, b, hr = 0.f, hg = 0.f, hb = 0.f; @@ -3328,9 +3328,9 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, const ColorManagemen // to a small space such as sRGB we may end up with negative values and values larger than max. if (!working_space_is_prophoto) { //convert from Prophoto to XYZ - float x = (toxyz[0][0] * r + toxyz[0][1] * g + toxyz[0][2] * b ) ; - float y = (toxyz[1][0] * r + toxyz[1][1] * g + toxyz[1][2] * b ) ; - float z = (toxyz[2][0] * r + toxyz[2][1] * g + toxyz[2][2] * b ) ; + float x = (toxyz[0][0] * r + toxyz[0][1] * g + toxyz[0][2] * b) ; + float y = (toxyz[1][0] * r + toxyz[1][1] * g + toxyz[1][2] * b) ; + float z = (toxyz[2][0] * r + toxyz[2][1] * g + toxyz[2][2] * b) ; //convert from XYZ to cmp.working (sRGB...Adobe...Wide..) r = ((torgb[0][0] * x + torgb[0][1] * y + torgb[0][2] * z)) ; g = ((torgb[1][0] * x + torgb[1][1] * y + torgb[1][2] * z)) ; @@ -3623,7 +3623,7 @@ void RawImageSource::HLRecovery_CIELab (float* rin, float* gin, float* bin, floa //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void RawImageSource::hlRecovery (const std::string &method, float* red, float* green, float* blue, int width, float* hlmax ) +void RawImageSource::hlRecovery (const std::string &method, float* red, float* green, float* blue, int width, float* hlmax) { if (method == "Luminance") { @@ -3673,7 +3673,7 @@ void RawImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr) tmphistogram[(int)(refwb1 * rawData[i][j + 1])] += 4; } - if(j < end) { + if (j < end) { tmphistogram[(int)(refwb0 * rawData[i][j])] += 4; } } else if (ri->getSensorType() == ST_FUJI_XTRANS) { @@ -3793,23 +3793,23 @@ void RawImageSource::getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LU if (ri->getSensorType() == ST_BAYER) { int j; int c1 = FC(i, start); - c1 = ( fourColours && c1 == 1 && !(i & 1) ) ? 3 : c1; + c1 = (fourColours && c1 == 1 && !(i & 1)) ? 3 : c1; int c2 = FC(i, start + 1); - c2 = ( fourColours && c2 == 1 && !(i & 1) ) ? 3 : c2; + c2 = (fourColours && c2 == 1 && !(i & 1)) ? 3 : c2; for (j = start; j < end - 1; j += 2) { tmphist[c1][(int)(ri->data[i][j] * scale)]++; tmphist[c2][(int)(ri->data[i][j + 1] * scale)]++; } - if(j < end) { // last pixel of row if width is odd + if (j < end) { // last pixel of row if width is odd tmphist[c1][(int)(ri->data[i][j] * scale)]++; } } else if (ri->get_colors() == 1) { for (int j = start; j < end; j++) { tmphist[0][(int)(ri->data[i][j] * scale)]++; } - } else if(ri->getSensorType() == ST_FUJI_XTRANS) { + } else if (ri->getSensorType() == ST_FUJI_XTRANS) { for (int j = start; j < end - 1; j += 2) { int c = ri->XTRANSFC(i, j); tmphist[c][(int)(ri->data[i][j] * scale)]++; @@ -3847,7 +3847,7 @@ void RawImageSource::getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LU return f > 0.f ? (f < 1.f ? 1 : std::min(int(f), 255)) : 0; }; - for(int i = 0; i < histoSize; i++) { + for (int i = 0; i < histoSize; i++) { int idx = getidx(0, i); histRedRaw[idx] += hist[0][i]; @@ -3869,11 +3869,11 @@ void RawImageSource::getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LU for (int i = 0; i < 256; i++) { histGreenRaw[i] >>= 1; } - else if(ri->getSensorType() == ST_FUJI_XTRANS) // since Xtrans has 2.5 as many greens, correct for it + else if (ri->getSensorType() == ST_FUJI_XTRANS) // since Xtrans has 2.5 as many greens, correct for it for (int i = 0; i < 256; i++) { histGreenRaw[i] = (histGreenRaw[i] * 2) / 5; } - else if(ri->get_colors() == 1) { // monochrome sensor => set all histograms equal + else if (ri->get_colors() == 1) { // monochrome sensor => set all histograms equal histGreenRaw += histRedRaw; histBlueRaw += histRedRaw; } @@ -3895,1516 +3895,403 @@ void RawImageSource::getRowStartEnd (int x, int &start, int &end) } -static void histoxyY(int bfhitc, int bfwitc, const array2D & xc, const array2D & yc, const array2D & Yc, float *xxx, float * yyy, float * YYY, int * histxy, float * area, int * inter) +static void histoxyY(int bfhitc, int bfwitc, const array2D & xc, const array2D & yc, const array2D & Yc, LUTf &xxx, LUTf &yyy, LUTf &YYY, LUTu &histxy) { - int nh; - - for (int y = 0; y < bfhitc ; y++) { - for (int x = 0; x < bfwitc ; x++) { - - if (xc[y][x] < 0.12f && xc[y][x] > 0.03f) { // near Prophoto - - if (yc[y][x] < 0.2f && yc[y][x] > 0.1f) { - nh = 0; - histxy[nh]++; - area[nh] = 50.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - - YYY[nh] += Yc[y][x]; - - // nc = 0; - //blue hard - } else if (yc[y][x] < 0.3f) { - nh = 1; - histxy[nh]++; - area[nh] = 60.f; - inter[nh] = 1; - YYY[nh] += Yc[y][x]; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - - // nc = 1; - - //blue - } else if (yc[y][x] < 0.4f) { - nh = 2; - histxy[nh]++; - area[nh] = 80.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - // nc = 1; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.5f) { - //blue green - nh = 3; - histxy[nh]++; - area[nh] = 100.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - // nc = 1; - - } else if (yc[y][x] < 0.6f) { - nh = 4; - histxy[nh]++; - area[nh] = 120.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - // nc = 1; - - } else if (yc[y][x] < 0.82f) { - //green - nh = 5; - histxy[nh]++; - area[nh] = 240.f; - inter[nh] = 1; - // nc = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - +#ifdef _OPENMP + #pragma omp parallel +#endif + { + LUTu histxythr(histxy.getSize()); + histxythr.clear(); + LUTf xxxthr(xxx.getSize()); + xxxthr.clear(); + LUTf yyythr(yyy.getSize()); + yyythr.clear(); + LUTf YYYthr(YYY.getSize()); + YYYthr.clear(); +#ifdef _OPENMP + #pragma omp for schedule(dynamic, 4) nowait +#endif + for (int y = 0; y < bfhitc ; y++) { + for (int x = 0; x < bfwitc ; x++) { + int nh = -1; + if (xc[y][x] < 0.12f && xc[y][x] > 0.03f && yc[y][x] > 0.1f) { // near Prophoto + if (yc[y][x] < 0.2f) { + nh = 0; + //blue hard + } else if (yc[y][x] < 0.3f) { + nh = 1; + //blue + } else if (yc[y][x] < 0.4f) { + nh = 2; + } else if (yc[y][x] < 0.5f) { + //blue green + nh = 3; + } else if (yc[y][x] < 0.6f) { + nh = 4; + } else if (yc[y][x] < 0.82f) { + //green + nh = 5; + } + } else if (xc[y][x] < 0.24f && yc[y][x] > 0.05f) { + if (yc[y][x] < 0.2f) { + nh = 6; + } else if (yc[y][x] < 0.3f) { + nh = 7; + } else if (yc[y][x] < 0.4f) { + nh = 8; + } else if (yc[y][x] < 0.5f) { + nh = 9; + } else if (yc[y][x] < 0.6f) { + nh = 10; + } else if (yc[y][x] < 0.75f) { + nh = 11; + } + } else if (xc[y][x] < 0.28f && yc[y][x] > 0.1f) {//blue sky and other + if (yc[y][x] < 0.2f) { + nh = 12; + } else if (yc[y][x] < 0.25f) { + nh = 13; + } else if (yc[y][x] < 0.29f) { + nh = 14; + } else if (yc[y][x] < 0.33f) { + nh = 15; + } else if (yc[y][x] < 0.37f) { + nh = 16; + } else if (yc[y][x] < 0.4f) { + nh = 17; + } else if (yc[y][x] < 0.45f) { + nh = 18; + } else if (yc[y][x] < 0.5f) { + nh = 19; + } else if (yc[y][x] < 0.6f) { + nh = 20; + } else if (yc[y][x] < 0.75f) { + nh = 21; + } + } else if (xc[y][x] < 0.31f && yc[y][x] > 0.1f) {//near neutral others + if (yc[y][x] < 0.2f) { + nh = 22; + } else if (yc[y][x] < 0.24f) { + nh = 23; + } else if (yc[y][x] < 0.29f) { + nh = 24; + } else if (yc[y][x] < 0.32f) { + nh = 25; + } else if (yc[y][x] < 0.36f) { + nh = 26; + } else if (yc[y][x] < 0.4f) { + nh = 27; + } else if (yc[y][x] < 0.5f) { + nh = 28; + } else if (yc[y][x] < 0.7f) { + nh = 29; + } + } else if (xc[y][x] < 0.325f && yc[y][x] > 0.1f) {//neutral 34 + if (yc[y][x] < 0.2f) { + nh = 30; + } else if (yc[y][x] < 0.24f) { + nh = 31; + } else if (yc[y][x] < 0.29f) { + nh = 32; + } else if (yc[y][x] < 0.32f) { + nh = 33; + } else if (yc[y][x] < 0.34f) { + nh = 34; + } else if (yc[y][x] < 0.37f) { + nh = 35; + } else if (yc[y][x] < 0.4f) { + nh = 36; + } else if (yc[y][x] < 0.45f) { + nh = 37; + } else if (yc[y][x] < 0.5f) { + nh = 38; + } else if (yc[y][x] < 0.55f) { + nh = 39; + } else if (yc[y][x] < 0.7f) { + nh = 40; + } + } else if (xc[y][x] < 0.335f && yc[y][x] > 0.1f) {//neutral + if (yc[y][x] < 0.2f) { + nh = 41; + } else if (yc[y][x] < 0.24f) { + nh = 42; + } else if (yc[y][x] < 0.29f) { + nh = 43; + } else if (yc[y][x] < 0.32f) { + nh = 44; + } else if (yc[y][x] < 0.33f) { + nh = 45; + } else if (yc[y][x] < 0.34f) { + nh = 46; + } else if (yc[y][x] < 0.35f) { + nh = 47; + } else if (yc[y][x] < 0.36f) { + nh = 48; + } else if (yc[y][x] < 0.37f) { + nh = 47; + } else if (yc[y][x] < 0.38f) { + nh = 48; + } else if (yc[y][x] < 0.4f) { + nh = 49; + } else if (yc[y][x] < 0.45f) { + nh = 50; + } else if (yc[y][x] < 0.5f) { + nh = 51; + } else if (yc[y][x] < 0.55f) { + nh = 52; + } else if (yc[y][x] < 0.7f) { + nh = 53; + } + } else if (xc[y][x] < 0.345f && yc[y][x] > 0.1f) {//neutral 37 + if (yc[y][x] < 0.2f) { + nh = 54; + } else if (yc[y][x] < 0.24f) { + nh = 55; + } else if (yc[y][x] < 0.29f) { + nh = 56; + } else if (yc[y][x] < 0.32f) { + nh = 57; + } else if (yc[y][x] < 0.33f) {//34 + nh = 58; + } else if (yc[y][x] < 0.34f) { + nh = 59; + } else if (yc[y][x] < 0.35f) {//34 + nh = 60; + } else if (yc[y][x] < 0.36f) {//34 + nh = 61; + } else if (yc[y][x] < 0.37f) { + nh = 62; + } else if (yc[y][x] < 0.38f) { + nh = 63; + } else if (yc[y][x] < 0.39f) { + nh = 64; + } else if (yc[y][x] < 0.4f) { + nh = 65; + } else if (yc[y][x] < 0.42f) { + nh = 66; + } else if (yc[y][x] < 0.45f) { + nh = 67; + } else if (yc[y][x] < 0.48f) { + nh = 68; + } else if (yc[y][x] < 0.5f) { + nh = 69; + } else if (yc[y][x] < 0.55f) { + nh = 70; + } else if (yc[y][x] < 0.65f) { + nh = 71; + } + } else if (xc[y][x] < 0.355f && yc[y][x] > 0.1f) {//neutral 37 + if (yc[y][x] < 0.2f) { + nh = 72; + } else if (yc[y][x] < 0.24f) { + nh = 73; + } else if (yc[y][x] < 0.29f) { + nh = 74; + } else if (yc[y][x] < 0.32f) { + nh = 75; + } else if (yc[y][x] < 0.33f) {//34 + nh = 76; + } else if (yc[y][x] < 0.34f) { + nh = 77; + } else if (yc[y][x] < 0.35f) {//34 + nh = 78; + } else if (yc[y][x] < 0.36f) {//34 + nh = 79; + } else if (yc[y][x] < 0.37f) { + nh = 80; + } else if (yc[y][x] < 0.38f) { + nh = 81; + } else if (yc[y][x] < 0.39f) { + nh = 82; + } else if (yc[y][x] < 0.4f) { + nh = 83; + } else if (yc[y][x] < 0.42f) { + nh = 84; + } else if (yc[y][x] < 0.45f) { + nh = 85; + } else if (yc[y][x] < 0.48f) { + nh = 86; + } else if (yc[y][x] < 0.5f) { + nh = 87; + } else if (yc[y][x] < 0.55f) { + nh = 88; + } else if (yc[y][x] < 0.65f) { + nh = 89; + } + } else if (xc[y][x] < 0.365f && yc[y][x] > 0.15f) { //0.4 + if (yc[y][x] < 0.2f) { + nh = 90; + } else if (yc[y][x] < 0.24f) { + nh = 91; + } else if (yc[y][x] < 0.29f) { + nh = 92; + } else if (yc[y][x] < 0.32f) { + nh = 93; + } else if (yc[y][x] < 0.33f) { + nh = 94; + } else if (yc[y][x] < 0.34f) { + nh = 95; + } else if (yc[y][x] < 0.36f) { + nh = 96; + } else if (yc[y][x] < 0.37f) { + nh = 97; + } else if (yc[y][x] < 0.38f) { + nh = 98; + } else if (yc[y][x] < 0.39f) { + nh = 99; + } else if (yc[y][x] < 0.4f) { + nh = 100; + } else if (yc[y][x] < 0.42f) { + nh = 101; + } else if (yc[y][x] < 0.45f) { + nh = 102; + } else if (yc[y][x] < 0.5f) { + nh = 103; + } else if (yc[y][x] < 0.55f) { + nh = 104; + } else if (yc[y][x] < 0.63f) { + nh = 105; + } + } else if (xc[y][x] < 0.405f && yc[y][x] > 0.15f) {//45 + if (yc[y][x] < 0.2f) { + nh = 106; + } else if (yc[y][x] < 0.24f) { + nh = 107; + } else if (yc[y][x] < 0.29f) { + nh = 108; + } else if (yc[y][x] < 0.32f) { + nh = 109; + } else if (yc[y][x] < 0.34f) { + nh = 110; + } else if (yc[y][x] < 0.37f) { + nh = 111; + } else if (yc[y][x] < 0.4f) { + nh = 112; + } else if (yc[y][x] < 0.45f) { + nh = 113; + } else if (yc[y][x] < 0.5f) { + nh = 114; + } else if (yc[y][x] < 0.55f) { + nh = 115; + } else if (yc[y][x] < 0.6f) { + nh = 116; + } + } else if (xc[y][x] < 0.445f && yc[y][x] > 0.15f) {//45 + if (yc[y][x] < 0.2f) { + nh = 117; + } else if (yc[y][x] < 0.24f) { + nh = 118; + } else if (yc[y][x] < 0.29f) { + nh = 119; + } else if (yc[y][x] < 0.32f) { + nh = 120; + } else if (yc[y][x] < 0.34f) { + nh = 121; + } else if (yc[y][x] < 0.37f) { + nh = 122; + } else if (yc[y][x] < 0.4f) { + nh = 123; + } else if (yc[y][x] < 0.45f) { + nh = 124; + } else if (yc[y][x] < 0.5f) { + nh = 125; + } else if (yc[y][x] < 0.55f) { + nh = 126; + } else if (yc[y][x] < 0.58f) { + nh = 127; + } + } else if (xc[y][x] < 0.495f && yc[y][x] > 0.15f) { + if (yc[y][x] < 0.2f) { + nh = 128; + } else if (yc[y][x] < 0.24f) { + nh = 129; + } else if (yc[y][x] < 0.29f) { + nh = 130; + } else if (yc[y][x] < 0.32f) { + nh = 131; + } else if (yc[y][x] < 0.34f) { + nh = 132; + } else if (yc[y][x] < 0.37f) { + nh = 133; + } else if (yc[y][x] < 0.4f) { + nh = 134; + } else if (yc[y][x] < 0.45f) { + nh = 135; + } else if (yc[y][x] < 0.5f) { + nh = 136; + } else if (yc[y][x] < 0.55f) { + nh = 137; + } + } else if (xc[y][x] < 0.545f && yc[y][x] > 0.15f) { + if (yc[y][x] < 0.2f) { + nh = 138; + } else if (yc[y][x] < 0.24f) { + nh = 139; + } else if (yc[y][x] < 0.29f) { + nh = 140; + } else if (yc[y][x] < 0.32f) { + nh = 141; + } else if (yc[y][x] < 0.34f) { + nh = 142; + } else if (yc[y][x] < 0.37f) { + nh = 143; + } else if (yc[y][x] < 0.4f) { + nh = 144; + } else if (yc[y][x] < 0.45f) { + nh = 145; + } else if (yc[y][x] < 0.5f) { + nh = 146; + } + } else if (xc[y][x] < 0.595f && yc[y][x] > 0.15f) { + if (yc[y][x] < 0.22f) { + nh = 147; + } else if (yc[y][x] < 0.25f) { + nh = 148; + } else if (yc[y][x] < 0.3f) { + nh = 149; + } else if (yc[y][x] < 0.35f) { + nh = 150; + } else if (yc[y][x] < 0.4f) { + nh = 151; + } else if (yc[y][x] < 0.45f) { + nh = 152; + } + } else if (xc[y][x] < 0.65f && yc[y][x] > 0.12f) { + if (yc[y][x] < 0.25f) { + nh = 153; + } else if (yc[y][x] < 0.3f) { + nh = 154; + } else if (yc[y][x] < 0.35f) { + nh = 155; + } else if (yc[y][x] < 0.45f) { + nh = 156; + } + } else if (xc[y][x] < 0.75f && yc[y][x] > 0.1f) { + nh = 157; } - } else if (xc[y][x] < 0.24f) { - if (yc[y][x] < 0.2f && yc[y][x] > 0.05f) { - nh = 6; - histxy[nh]++; - area[nh] = 230.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - // nc = 2; - - } else if (yc[y][x] < 0.3f) { - nh = 7; - histxy[nh]++; - area[nh] = 240.f; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - // nc = 2; - - } else if (yc[y][x] < 0.4f) { - nh = 8; - histxy[nh]++; - area[nh] = 240.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - // nc = 2; - - } else if (yc[y][x] < 0.5f) { - nh = 9; - histxy[nh]++; - area[nh] = 240.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - // nc = 2; - // nc2 = 3; - - } else if (yc[y][x] < 0.6f) { - nh = 10; - histxy[nh]++; - area[nh] = 240.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - // nc = 3; - - } else if (yc[y][x] < 0.75f) { - nh = 11; - histxy[nh]++; - area[nh] = 400.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - // nc = 3; - + if (nh >= 0) { + histxythr[nh]++; + xxxthr[nh] += xc[y][x]; + yyythr[nh] += yc[y][x]; + YYYthr[nh] += Yc[y][x]; } - - } else if (xc[y][x] < 0.28f) {//blue sky and other - if (yc[y][x] < 0.2f && yc[y][x] > 0.1f) { - nh = 12; - histxy[nh]++; - area[nh] = 80.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.25f) { - nh = 13; - histxy[nh]++; - area[nh] = 20.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.29f) { - nh = 14; - histxy[nh]++; - area[nh] = 20.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.33f) { - nh = 15; - histxy[nh]++; - area[nh] = 20.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.37f) { - nh = 16; - histxy[nh]++; - area[nh] = 20.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.4f) { - nh = 17; - histxy[nh]++; - area[nh] = 15.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.45f) { - nh = 18; - histxy[nh]++; - area[nh] = 25.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - - } else if (yc[y][x] < 0.5f) { - nh = 19; - histxy[nh]++; - area[nh] = 25.f; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.6f) { - nh = 20; - histxy[nh]++; - area[nh] = 50.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.75f) { - nh = 21; - histxy[nh]++; - area[nh] = 60.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } - } else if (xc[y][x] < 0.31f) {//near neutral others - if (yc[y][x] < 0.2f && yc[y][x] > 0.1f) { - nh = 22; - histxy[nh]++; - area[nh] = 50.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.24f) { - nh = 23; - histxy[nh]++; - area[nh] = 12.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.29f) { - nh = 24; - histxy[nh]++; - area[nh] = 15.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - - } else if (yc[y][x] < 0.32f) { - nh = 25; - histxy[nh]++; - area[nh] = 9.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.36f) { - nh = 26; - histxy[nh]++; - area[nh] = 12.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.4f) { - nh = 27; - histxy[nh]++; - area[nh] = 12.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - - } else if (yc[y][x] < 0.5f) { - nh = 28; - histxy[nh]++; - area[nh] = 30.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.7f) { - nh = 29; - histxy[nh]++; - area[nh] = 45.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } - } else if (xc[y][x] < 0.325f) {//neutral 34 - if (yc[y][x] < 0.2f && yc[y][x] > 0.1f) { - nh = 30; - histxy[nh]++; - area[nh] = 25.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.24f) { - nh = 31; - histxy[nh]++; - area[nh] = 6.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.29f) { - nh = 32; - histxy[nh]++; - area[nh] = 7.5f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.32f) { - nh = 33; - histxy[nh]++; - area[nh] = 4.5f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.34f) { - nh = 34; - histxy[nh]++; - area[nh] = 3.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.37f) { - nh = 35; - histxy[nh]++; - area[nh] = 4.5f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.4f) { - nh = 36; - histxy[nh]++; - area[nh] = 4.5f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.45f) { - nh = 37; - histxy[nh]++; - area[nh] = 7.5f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.5f) { - nh = 38; - histxy[nh]++; - area[nh] = 7.5f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.55f) { - nh = 39; - histxy[nh]++; - area[nh] = 7.5f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.7f) { - nh = 40; - histxy[nh]++; - area[nh] = 20.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } - - } else if (xc[y][x] < 0.335f) {//neutral - if (yc[y][x] < 0.2f && yc[y][x] > 0.1f) { - nh = 41; - histxy[nh]++; - area[nh] = 15.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.24f) { - nh = 42; - histxy[nh]++; - area[nh] = 4.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.29f) { - nh = 43; - histxy[nh]++; - area[nh] = 5.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.32f) { - nh = 44; - histxy[nh]++; - area[nh] = 3.f; - inter[nh] = 5; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.33f) { - nh = 45; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 5; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - } else if (yc[y][x] < 0.34f) { - nh = 46; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 5; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - } else if (yc[y][x] < 0.35f) { - nh = 47; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 5; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - } else if (yc[y][x] < 0.36f) { - nh = 48; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 5; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.37f) { - nh = 47; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - } else if (yc[y][x] < 0.38f) { - nh = 48; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.4f) { - nh = 49; - histxy[nh]++; - area[nh] = 2.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.45f) { - nh = 50; - histxy[nh]++; - area[nh] = 5.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.5f) { - nh = 51; - histxy[nh]++; - area[nh] = 5.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.55f) { - nh = 52; - histxy[nh]++; - area[nh] = 5.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.7f) { - nh = 53; - histxy[nh]++; - area[nh] = 10.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } - - } else if (xc[y][x] < 0.345f) {//neutral 37 - if (yc[y][x] < 0.2f && yc[y][x] > 0.1f) { - nh = 54; - histxy[nh]++; - area[nh] = 20.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.24f) { - nh = 55; - histxy[nh]++; - area[nh] = 4.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.29f) { - nh = 56; - histxy[nh]++; - area[nh] = 5.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.32f) { - nh = 57; - histxy[nh]++; - area[nh] = 3.f; - inter[nh] = 5; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.33f) {//34 - nh = 58; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 5; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - } else if (yc[y][x] < 0.34f) { - nh = 59; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 5; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.35f) {//34 - nh = 60; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 5; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - } else if (yc[y][x] < 0.36f) {//34 - nh = 61; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 5; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.37f) { - nh = 62; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - } else if (yc[y][x] < 0.38f) { - nh = 63; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - } else if (yc[y][x] < 0.39f) { - nh = 64; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.4f) { - nh = 65; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - } else if (yc[y][x] < 0.42f) { - nh = 66; - histxy[nh]++; - area[nh] = 2.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.45f) { - nh = 67; - histxy[nh]++; - area[nh] = 3.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - } else if (yc[y][x] < 0.48f) { - nh = 68; - histxy[nh]++; - area[nh] = 3.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.5f) { - nh = 69; - histxy[nh]++; - area[nh] = 2.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.55f) { - nh = 70; - histxy[nh]++; - area[nh] = 5.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.65f) { - nh = 71; - histxy[nh]++; - area[nh] = 2.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } - - } else if (xc[y][x] < 0.355f) {//neutral 37 - if (yc[y][x] < 0.2f && yc[y][x] > 0.1f) { - nh = 72; - histxy[nh]++; - area[nh] = 20.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.24f) { - nh = 73; - histxy[nh]++; - area[nh] = 4.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.29f) { - nh = 74; - histxy[nh]++; - area[nh] = 5.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.32f) { - nh = 75; - histxy[nh]++; - area[nh] = 3.f; - inter[nh] = 5; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.33f) {//34 - nh = 76; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 5; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - } else if (yc[y][x] < 0.34f) { - nh = 77; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 5; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.35f) {//34 - nh = 78; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 5; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - } else if (yc[y][x] < 0.36f) {//34 - nh = 79; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 5; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.37f) { - nh = 80; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - } else if (yc[y][x] < 0.38f) { - nh = 81; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - } else if (yc[y][x] < 0.39f) { - nh = 82; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.4f) { - nh = 83; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - } else if (yc[y][x] < 0.42f) { - nh = 84; - histxy[nh]++; - area[nh] = 2.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.45f) { - nh = 85; - histxy[nh]++; - area[nh] = 3.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - } else if (yc[y][x] < 0.48f) { - nh = 68; - histxy[nh]++; - area[nh] = 3.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.5f) { - nh = 86; - histxy[nh]++; - area[nh] = 2.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.55f) { - nh = 87; - histxy[nh]++; - area[nh] = 5.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.65f) { - nh = 88; - histxy[nh]++; - area[nh] = 2.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } - - } else if (xc[y][x] < 0.365f) { //0.4 - if (yc[y][x] < 0.2f && yc[y][x] > 0.15f) { - nh = 89; - histxy[nh]++; - area[nh] = 20.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - - } else if (yc[y][x] < 0.24f) { - nh = 90; - histxy[nh]++; - area[nh] = 4.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.29f) { - nh = 91; - histxy[nh]++; - area[nh] = 5.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.32f) { - nh = 92; - histxy[nh]++; - area[nh] = 3.f; - inter[nh] = 5; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - } else if (yc[y][x] < 0.33f) { - nh = 93; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 5; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.34f) { - nh = 94; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 5; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - } else if (yc[y][x] < 0.36f) { - nh = 95; - histxy[nh]++; - area[nh] = 2.f; - inter[nh] = 5; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.37f) { - nh = 96; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - } else if (yc[y][x] < 0.38f) { - nh = 97; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - } else if (yc[y][x] < 0.39f) { - nh = 98; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.4f) { - nh = 99; - histxy[nh]++; - area[nh] = 1.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - } else if (yc[y][x] < 0.42f) { - nh = 100; - histxy[nh]++; - area[nh] = 2.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.45f) { - nh = 101; - histxy[nh]++; - area[nh] = 3.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.5f) { - nh = 102; - histxy[nh]++; - area[nh] = 5.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.55f) { - nh = 103; - histxy[nh]++; - area[nh] = 5.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - - } else if (yc[y][x] < 0.63f) { - nh = 104; - histxy[nh]++; - area[nh] = 10.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } - - } else if (xc[y][x] < 0.405f) {//45 - if (yc[y][x] < 0.2f && yc[y][x] > 0.15f) { - nh = 105; - histxy[nh]++; - area[nh] = 40.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.24f) { - nh = 106; - histxy[nh]++; - area[nh] = 16.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.29f) { - nh = 107; - histxy[nh]++; - area[nh] = 20.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.32f) { - nh = 108; - histxy[nh]++; - area[nh] = 12.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.34f) { - nh = 109; - histxy[nh]++; - area[nh] = 8.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.37f) { - nh = 110; - histxy[nh]++; - area[nh] = 12.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.4f) { - nh = 111; - histxy[nh]++; - area[nh] = 12.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.45f) { - nh = 112; - histxy[nh]++; - area[nh] = 20.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.5f) { - nh = 113; - histxy[nh]++; - area[nh] = 20.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.55f) { - nh = 114; - histxy[nh]++; - area[nh] = 20.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - - } else if (yc[y][x] < 0.6f) { - nh = 115; - histxy[nh]++; - area[nh] = 16.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } - - } else if (xc[y][x] < 0.445f) {//45 - if (yc[y][x] < 0.2f && yc[y][x] > 0.15f) { - nh = 116; - histxy[nh]++; - area[nh] = 40.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.24f) { - nh = 117; - histxy[nh]++; - area[nh] = 16.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.29f) { - nh = 118; - histxy[nh]++; - area[nh] = 20.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.32f) { - nh = 119; - histxy[nh]++; - area[nh] = 12.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.34f) { - nh = 120; - histxy[nh]++; - area[nh] = 8.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.37f) { - nh = 121; - histxy[nh]++; - area[nh] = 12.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.4f) { - nh = 122; - histxy[nh]++; - area[nh] = 12.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.45f) { - nh = 123; - histxy[nh]++; - area[nh] = 20.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.5f) { - nh = 124; - histxy[nh]++; - area[nh] = 20.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.55f) { - nh = 125; - histxy[nh]++; - area[nh] = 20.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - - } else if (yc[y][x] < 0.58f) { - nh = 126; - histxy[nh]++; - area[nh] = 16.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } - - } else if (xc[y][x] < 0.495f) { - if (yc[y][x] < 0.2f && yc[y][x] > 0.15f) { - nh = 127; - histxy[nh]++; - area[nh] = 40.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.24f) { - nh = 128; - histxy[nh]++; - area[nh] = 20.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.29f) { - nh = 129; - histxy[nh]++; - area[nh] = 25.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.32f) { - nh = 130; - histxy[nh]++; - area[nh] = 15.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.34f) { - nh = 131; - histxy[nh]++; - area[nh] = 10.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.37f) { - nh = 132; - histxy[nh]++; - area[nh] = 15.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.4f) { - nh = 133; - histxy[nh]++; - area[nh] = 15.f; - inter[nh] = 3; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.45f) { - nh = 134; - histxy[nh]++; - area[nh] = 25.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.5f) { - nh = 135; - histxy[nh]++; - area[nh] = 25.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.55f) { - nh = 136; - histxy[nh]++; - area[nh] = 20.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } - } else if (xc[y][x] < 0.545f) { - if (yc[y][x] < 0.2f && yc[y][x] > 0.15f) { - nh = 137; - histxy[nh]++; - area[nh] = 25.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.24f) { - nh = 138; - histxy[nh]++; - area[nh] = 20.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.29f) { - nh = 139; - histxy[nh]++; - area[nh] = 25.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.32f) { - nh = 140; - histxy[nh]++; - area[nh] = 15.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.34f) { - nh = 141; - histxy[nh]++; - area[nh] = 10.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.37f) { - nh = 142; - histxy[nh]++; - area[nh] = 15.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.4f) { - nh = 143; - histxy[nh]++; - area[nh] = 15.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.45f) { - nh = 144; - histxy[nh]++; - area[nh] = 25.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.5f) { - nh = 145; - histxy[nh]++; - area[nh] = 25.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - - - } - - } else if (xc[y][x] < 0.595f) { - if (yc[y][x] < 0.22f && yc[y][x] > 0.15f) { - nh = 146; - histxy[nh]++; - area[nh] = 15.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.25f) { - nh = 147; - histxy[nh]++; - area[nh] = 25.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.3f) { - nh = 148; - histxy[nh]++; - area[nh] = 25.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.35f) { - nh = 149; - histxy[nh]++; - area[nh] = 25.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.4f) { - nh = 160; - histxy[nh]++; - area[nh] = 25.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - - } else if (yc[y][x] < 0.45f) { - nh = 161; - histxy[nh]++; - area[nh] = 15.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } - - } else if (xc[y][x] < 0.65f) { - if (yc[y][x] < 0.25f && yc[y][x] > 0.12f) { - nh = 162; - histxy[nh]++; - area[nh] = 15.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - - } else if (yc[y][x] < 0.3f) { - nh = 163; - histxy[nh]++; - area[nh] = 25.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } else if (yc[y][x] < 0.35f) { - nh = 164; - histxy[nh]++; - area[nh] = 25.f; - inter[nh] = 2; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - - } else if (yc[y][x] < 0.45f) { - nh = 165; - histxy[nh]++; - area[nh] = 15.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } - - } else if (xc[y][x] < 0.75f && yc[y][x] > 0.1f) { - nh = 166; - histxy[nh]++; - area[nh] = 25.f; - inter[nh] = 1; - xxx[nh] += xc[y][x]; - yyy[nh] += yc[y][x]; - YYY[nh] += Yc[y][x]; - - } - + } +#ifdef _OPENMP + #pragma omp critical +#endif + { + histxy += histxythr; + xxx += xxxthr; + yyy += yyythr; + YYY += YYYthr; } } } - - - void static studentXY(const array2D & YYcurr, const array2D & reffYY, int sizcurr, int Nc, int tt, float & student) { //calculate Student coeff YY @@ -5456,388 +4343,6 @@ void static studentXY(const array2D & YYcurr, const array2D & reff //student coeeficient } -/* -static void SdwWB(const array2D &redloc, const array2D &greenloc, const array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm) -{ - //Standard deviation weighted Gary World - from Lan rt al. - constexpr float clipHigh = 64000.f; - constexpr float clipLow = 1500.f; - - float MeanG[12] = { }; - float SigmaG[12] = { }; - - float MeanR[12] = { }; - float SigmaR[12] = { }; - - float MeanB[12] = { }; - float SigmaB[12] = { }; - - //divide in 12 areas - int partw, parth; - int yh, xw; - - if (bfw > bfh) { - partw = bfw / 4; - parth = bfh / 3; - xw = 4; - yh = 3; - } else { - partw = bfw / 3; - parth = bfh / 4; - xw = 3; - yh = 4; - } - - float SigmaGG = 0.f, SigmaRR = 0.f, SigmaBB = 0.f; - -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic) collapse(2) -#endif - - for (int w = 0; w < xw ; ++w) { - for (int h = 0; h < yh ; ++h) { - float meanr = 0.f; - float meang = 0.f; - float meanb = 0.f; - int nr = 0; - int ng = 0; - int nb = 0; - - for (int y = h * parth; y < (h + 1) * parth; ++y) { - for (int x = w * partw; x < (w + 1) * partw; ++x) { - if (greenloc[y][x] > clipLow && greenloc[y][x] < clipHigh) { - meang += greenloc[y][x]; - ng++; - } - - if (redloc[y][x] > clipLow && redloc[y][x] < clipHigh) { - meanr += redloc[y][x]; - nr++; - } - - if (blueloc[y][x] > clipLow && blueloc[y][x] < clipHigh) { - meanb += blueloc[y][x]; - nb++; - } - } - } - - int i = w + h * xw; - - if (ng > 0) { - meang /= ng; - } - - if (nr > 0) { - meanr /= nr; - } - - if (nb > 0) { - meanb /= nb; - } - - MeanG[i] = meang; - MeanR[i] = meanr; - MeanB[i] = meanb; - - float sigmar = 0.f; - float sigmag = 0.f; - float sigmab = 0.f; - - for (int y = h * parth; y < (h + 1) * parth; ++y) { - for (int x = w * partw; x < (w + 1) * partw; ++x) { - if (greenloc[y][x] > clipLow && greenloc[y][x] < clipHigh) { - sigmag += SQR(meang - greenloc[y][x]) ; - } - - if (redloc[y][x] > clipLow && redloc[y][x] < clipHigh) { - sigmar += SQR(meanr - redloc[y][x]); - } - - if (blueloc[y][x] > clipLow && blueloc[y][x] < clipHigh) { - sigmab += SQR(meanb - blueloc[y][x]); - } - } - } - - SigmaG[i] = sigmag; - SigmaR[i] = sigmar; - SigmaB[i] = sigmab; - - if (ng > 0) { - SigmaG[i] = std::sqrt(SigmaG[i] / ng); - } - - if (nr > 0) { - SigmaR[i] = std::sqrt(SigmaR[i] / nr); - } - - if (nb > 0) { - SigmaB[i] = std::sqrt(SigmaB[i] / nb); - } - -#ifdef _OPENMP - #pragma omp critical -#endif - { - SigmaGG += SigmaG[i]; - SigmaRR += SigmaR[i]; - SigmaBB += SigmaB[i]; - } - } - } - - float StdavgG = 0.f, StdavgR = 0.f, StdavgB = 0.f; - constexpr float epsilo = 0.01f; - - for (int k = 0; k < 12 ; k++) { - StdavgG += (SigmaG[k] * MeanG[k]) / (SigmaGG + epsilo); - StdavgR += (SigmaR[k] * MeanR[k]) / (SigmaRR + epsilo); - StdavgB += (SigmaB[k] * MeanB[k]) / (SigmaBB + epsilo); - - } - - avg_gm = (StdavgG + StdavgB + StdavgR) / (3 * StdavgG); - avg_rm = (StdavgG + StdavgB + StdavgR) / (3 * StdavgR); - avg_bm = (StdavgG + StdavgB + StdavgR) / (3 * StdavgB); - - avg_gm *= 10000.f; - avg_rm *= 10000.f; - avg_bm *= 10000.f; - -} -*/ - -/* -static void RobustWB(array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm) -{ - BENCHFUN - // inspired by "Robust automatic WB algorithm using grey colour points in Images" - // Jy Huo, Yl Chang, J.Wang Xx Wei - // robust = true; -// printf("Robust WB\n"); - const int bfwr = bfw / 4 + 1 ;//5 middle value to keep good result and reduce time - const int bfhr = bfh / 4 + 1; - - array2D rl(bfwr, bfhr); - array2D gl(bfwr, bfhr); - array2D bl(bfwr, bfhr); - - // copy data to smaller arrays to reduce memory pressure in do-while loop -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int y = 0; y < bfh ; y += 4) { - int yy = y / 4; - - for (int x = 0; x < bfw ; x += 4) { - int xx = x / 4; - rl[yy][xx] = redloc[y][x]; - gl[yy][xx] = greenloc[y][x]; - bl[yy][xx] = blueloc[y][x]; - } - } - - float *Uba = new float [204]; - float *Vba = new float [204]; - - constexpr float Th = 0.1321f; //Threshold 0.1321f 0.097f 0.2753f if necessary - //wr, wb, wg multipliers for each channel RGB - float wr = 1.f; - float wg = 1.f; - float wb = 1.f; - constexpr float mu = 0.002f;//std variation - constexpr float mu2 = 0.0012f;//first reduce variation - constexpr float mu3 = 0.0007f;//second variation - int itera = 0; - int minim = 1; - int realitera = 1; - - int Kx = 0; - - do {//iterative WB - float Ubarohm = 0.f, Vbarohm = 0.f; - itera++; - int Nf = 0; -#ifdef _OPENMP - #pragma omp parallel for reduction(+:Ubarohm, Vbarohm, Nf) schedule(dynamic,16) -#endif - - for (int y = 0; y < bfhr ; ++y) { - for (int x = 0; x < bfwr ; ++x) { - - //calculate YUV from RGB and wr, wg, wb - float Y0 = 0.299f * wr * rl[y][x] + 0.587f * wg * gl[y][x] + 0.114f * wb * bl[y][x]; - float U0 = -0.14713f * wr * rl[y][x] - 0.28886f * wg * gl[y][x] + 0.436f * wb * bl[y][x]; - float V0 = 0.615f * wr * rl[y][x] - 0.51498f * wg * gl[y][x] - 0.10001f * wb * bl[y][x]; - - //FYUX function to detect grey points - if (fabs(U0) + fabs(V0) < Th * Y0) {//grey values - Nf++; - Ubarohm += U0; - Vbarohm += V0; - } - - - } - } - - Ubarohm /= Nf; - Uba[itera] = Ubarohm;//stock value Ubarohm - Vba[itera] = Vbarohm;//stock value Vbarohm - - if (itera > 5 && minim < 2) { - if ((fabs(Uba[itera] - Uba[itera - 2]) < 0.001f) && (fabs(Vba[itera] - Vba[itera - 2]) < 0.001f)) { - //printf("DUba=%f Dvba=%f\n", Uba[itera] - Uba[itera - 2], Vba[itera] - Vba[itera - 2]); - realitera = itera; - minim = 2; //accelerate convergence - not in original algorithm - } - } - - if (itera > 10 && minim == 2 && itera > realitera + 3) { - if ((fabs(Uba[itera] - Uba[itera - 2]) < 0.001f) && (fabs(Vba[itera] - Vba[itera - 2]) < 0.001f)) { - minim = 3; //accelerate second time if necessary convergence, - not in original algorithm - } - - } - - Vbarohm /= Nf; // QUESTION INGO: why is this not done before the value is saved to Vba[itera]? Bug or intentional? - // printf ("Nf=%i max=%i U=%f V=%f\n", Nf, bfh*bfw, Ubarohm, Vbarohm); - Kx = 0; - constexpr float aa = 0.8f;//superior limit if epsil > aa increase variation - constexpr float bb = 0.15f;//inferior limit if epsil < bb exit - int ind = 1; - - float phi = 0.f; - - if ((fabs(Ubarohm) > fabs(Vbarohm)) || (Ubarohm != 0.f && fabs(Ubarohm) == fabs(Vbarohm))) { - phi = Ubarohm; - ind = 1; - } else if (fabs(Ubarohm) < fabs(Vbarohm)) { - phi = Vbarohm; - ind = 2; - } else if (Ubarohm == 0.f && Vbarohm == 0.f) { - phi = 0.f; - ind = 3; - } - - int sign = SGN(-phi); - - if (fabs(phi) >= aa) { - Kx = 2 * sign; - } - - if (fabs(phi) < aa && fabs(phi) >= bb) { - Kx = sign; - } - - if (fabs(phi) < bb) { - Kx = 0; - } - - // - float mur = mu; - - if (minim == 2) { - mur = mu2; - } else if (minim == 3) { - mur = mu3; - } - - if (ind == 1) { - wb += mur * Kx; - } else if (ind == 2) { - wr += mur * Kx; - } - - //printf ("epsil=%f iter=%i wb=%f wr=%f U=%f V=%f mu=%f\n", fabs (epsil), itera, wb, wr, Ubarohm, Vbarohm, mur); - } while (Kx != 0 && itera <= 200); //stop iterations in normal case Kx =0, or if WB iteration do not converge - - delete Uba; - delete Vba; -// printf("epsil=%f iter=%i wb=%f wr=%f mu=%f\n", fabs(epsil), itera, wb, wr, mur); - - avg_rm = 10000.* wr; - avg_gm = 10000.* wg; - avg_bm = 10000.* wb; - // printf("Robust ar%f ag=%f ab=%f\n", avg_rm, avg_gm, avg_bm); - -} -*/ -/* -static void SobelWB(array2D &redsobel, array2D &greensobel, array2D &bluesobel, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh) -{ - BENCHFUN - int GX[3][3]; - int GY[3][3]; - - //Sobel Horizontal - GX[0][0] = 1; - GX[0][1] = 0; - GX[0][2] = -1; - GX[1][0] = 2; - GX[1][1] = 0; - GX[1][2] = -2; - GX[2][0] = 1; - GX[2][1] = 0; - GX[2][2] = -1; - - //Sobel Vertical - GY[0][0] = 1; - GY[0][1] = 2; - GY[0][2] = 1; - GY[1][0] = 0; - GY[1][1] = 0; - GY[1][2] = 0; - GY[2][0] = -1; - GY[2][1] = -2; - GY[2][2] = -1; - // inspired from Chen Guanghua Zhang Xiaolong - // edge detection to improve auto WB - - { -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int y = 0; y < bfh ; y++) { - for (int x = 0; x < bfw ; x++) { - if (y == 0 || y == bfh - 1 || x == 0 || x == bfw - 1) { - redsobel[y][x] = 0.f; - greensobel[y][x] = 0.f; - bluesobel[y][x] = 0.f; - } else { - float sumXr = 0.f; - float sumYr = 0.f; - float sumXg = 0.f; - float sumYg = 0.f; - float sumXb = 0.f; - float sumYb = 0.f; - - for (int i = -1; i < 2; i++) { - for (int j = -1; j < 2; j++) { - sumXr += GX[j + 1][i + 1] * redloc[y + i][x + j]; - sumXg += GX[j + 1][i + 1] * greenloc[y + i][x + j]; - sumXb += GX[j + 1][i + 1] * blueloc[y + i][x + j]; - sumYr += GY[j + 1][i + 1] * redloc[y + i][x + j]; - sumYg += GY[j + 1][i + 1] * greenloc[y + i][x + j]; - sumYb += GY[j + 1][i + 1] * blueloc[y + i][x + j]; - } - } - - //Edge strength - //we can add if need teta = atan2 (sumYr, sumXr) - redsobel[y][x] = CLIP(std::sqrt(SQR(sumXr) + SQR(sumYr))); - greensobel[y][x] = CLIP(std::sqrt(SQR(sumXg) + SQR(sumYg))); - bluesobel[y][x] = CLIP(std::sqrt(SQR(sumXb) + SQR(sumYb))); - } - } - } - } -} -*/ - void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, const ColorManagementParams &cmp, const RAWParams &raw, const WBParams & wbpar) { /* @@ -5845,41 +4350,41 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double This algorithm try to find temperature correlation between 20 to 200 color between 200 spectral color and about 20 to 55 color found in the image, I just found the idea in the web "correlate with chroma" instead of RGB grey point,but I don't use any algo found on the web. - I have test many many algo to find the first one that work :) - Probably (sure) there are improvment to do... + I have test many many algorithms to find the first one that work :) + Probably (sure) there are improvement to do... I have create a table temperature with temp and white point with 100 values between 2000K and 12000K we can obviously change these values, more...with different steps - I have create or recuparate and transformed 200 spectral colors from Colorchecker24, others color and my 468 colors target, or from web flowers, etc. with a step of 5nm, I think it is largey enough. + I have create or recuparate and transformed 200 spectral colors from Colorchecker24, others color and my 468 colors target, or from web flowers, etc. with a step of 5nm, I think it is large enough. I think this value of 200 is now complete: I tested correlation with 60, 90, 100, 120, 155...better student increase with number of color, but now it seems stabilized Of course we can increase this number :) - 1) for the cuurent raw file we create a table for each temp of RGB multipliers + 1) for the current raw file we create a table for each temp of RGB multipliers 2) then, I choose the "camera temp" to initialize calculation (why not) - 3) for this temp, I calculated XYZ values for the 200 spectrals datas + 3) for this temp, I calculated XYZ values for the 200 spectral datas 4) then I create for the image an "histogram", but for xyY (Cie 1931 color space) 5) for each pixel (in fact to accelerate only 1/10 for and 1/10 for y), I determine for each couple xy, the number of occurences 6) I sort this result in ascending order - 7) in option we can sort in another maner to take into account chroma : chromax = x - white point x, chromay = y - white point y + 7) in option we can sort in another manner to take into account chroma : chromax = x - white point x, chromay = y - white point y 8) then I compare this result, with spectral datas found above in 3) with deltaE (limited to chroma) 9) at this point we have xyY values that match Camera temp, and spectral datas associated 10) then I recalculate RGB values from xyY histogram 11) after, I vary temp, between 2000K to 12000K - 12) RGB values are recalcualted from 10) with RGB multipliers, and then xyY are calcualted for each temp - 13) spectral datas choose are recalculated with temp betwen 2000K to 12000K with matrix spectral calculation, that leeds to xyY values + 12) RGB values are recalculated from 10) with RGB multipliers, and then xyY are calculated for each temp + 13) spectral datas choose are recalculated with temp between 2000K to 12000K with matrix spectral calculation, that leads to xyY values 14) I calculated for each couple xy, Student correlation (without Snedecor test) 15) the good result, is the best correlation - 16) we have found the best temperature where color image and color refences are correlate + 16) we have found the best temperature where color image and color references are correlate 17) after we pass this value to improccoordinator 18) in a second part if camera green is out, I used an "extra" algorithm 19) we make vary green between 2 limits (settings in option) - 20) betwen these green limits, we make slightly vary temp (settings in options) and recalculated RGB multipliers + 20) between these green limits, we make slightly vary temp (settings in options) and recalculated RGB multipliers 21) with this multipliers for the RGB color find in histogram we recalculate xyY 22) we re-adjust references color for these xyY from 20) 23) we add if chroma image is very low, k colors to degrad correlation 24) then find all Student correlation for each couple green / temp 25) sort these Student values, and choose the minimum - 26) then for the 3 better couple "temp / green" choose the one wher grren is neraest from 1. + 26) then for the 3 better couple "temp / green" choose the one where green is nearest from 1. Some variables or function are not used, keep in case of I have test with cat02 but result are not stable enough ! why ??, therefore cat02 neutralized @@ -5892,22 +4397,22 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double You can change 4 parameters in option.cc Itcwb_thres : 34 by default ==> number of color used in final algorithm - between 10 and max 55 - Itcwb_sort : false by default, can improve algo if true, ==> sort value in something near chroma order, instead of histogram number + Itcwb_sort : false by default, can improve algorithm if true, ==> sort value in something near chroma order, instead of histogram number Itcwb_greenrange : 0 amplitude of green variation - between 0 to 2 Itcwb_greendeltatemp : 1 - delta temp in green iterate loop for "extra" - between 0 to 4 - Itcwb_forceextra : false - if true force algorithm "extra" ("extra" is used when cmaera wbsettings are wrong) to all images - Itcwb_sizereference : 3 by default, can be set to 5 ==> size of reference color comapre to size of histogram real color - itcwb_delta : 1 by defaut can be set between 0 to 5 ==> delta temp to build histogram xy - if camera temp is not probably good + Itcwb_forceextra : false - if true force algorithm "extra" ("extra" is used when camera wbsettings are wrong) to all images + Itcwb_sizereference : 3 by default, can be set to 5 ==> size of reference color compare to size of histogram real color + itcwb_delta : 1 by default can be set between 0 to 5 ==> delta temp to build histogram xy - if camera temp is not probably good */ // BENCHFUN // BENCHFUN TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix("sRGB"); - double wp[3][3] = { - {wprof[0][0], wprof[0][1], wprof[0][2]}, - {wprof[1][0], wprof[1][1], wprof[1][2]}, - {wprof[2][0], wprof[2][1], wprof[2][2]} + const float wp[3][3] = { + {static_cast(wprof[0][0]), static_cast(wprof[0][1]), static_cast(wprof[0][2])}, + {static_cast(wprof[1][0]), static_cast(wprof[1][1]), static_cast(wprof[1][2])}, + {static_cast(wprof[2][0]), static_cast(wprof[2][1]), static_cast(wprof[2][2])} }; TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix("sRGB"); @@ -5922,8 +4427,6 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double array2D yc; array2D Yc; - - array2D histcurr; array2D histcurrref; @@ -6248,87 +4751,28 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double {11001., 0.957747, 1.541281}, {12001., 0.960440, 1.601019} }; - int N_t = sizeof(Txyz) / sizeof(Txyz[0]); //number of temperature White point - int nbt = N_t; - float **Tx = nullptr; - float **Ty = nullptr; - float **Tz = nullptr; - float **Ta = nullptr; - float **Tb = nullptr; - float **TL = nullptr; - double *TX = nullptr; - double *TY = nullptr; - double *TZ = nullptr; - int *good_spectral = nullptr; - // float studgood = 1000.f; + const int N_t = sizeof(Txyz) / sizeof(Txyz[0]); //number of temperature White point + constexpr int Nc = 200 + 1;//200 number of reference spectral colors, I think it is enough to retrieve good values + array2D Tx(Nc, N_t); + array2D Ty(Nc, N_t); + array2D Tz(Nc, N_t); + array2D Ta(Nc, N_t); + array2D Tb(Nc, N_t); + array2D TL(Nc, N_t); + double TX[Nc]; + double TY[Nc]; + double TZ[Nc]; + std::vector good_spectral(Nc, false); - int Nc = 200 + 1;//200 number of reference spectral colors, I think it is enough to retrieve good values - Tx = new float*[Nc]; + float rmm[N_t]; + float gmm[N_t]; + float bmm[N_t]; - for (int i = 0; i < Nc; i++) { - Tx[i] = new float[nbt]; - } - - Ty = new float*[Nc]; - - for (int i = 0; i < Nc; i++) { - Ty[i] = new float[nbt]; - } - - Tz = new float*[Nc]; - - for (int i = 0; i < Nc; i++) { - Tz[i] = new float[nbt]; - } - - Ta = new float*[Nc]; - - for (int i = 0; i < Nc; i++) { - Ta[i] = new float[nbt]; - } - - Tb = new float*[Nc]; - - for (int i = 0; i < Nc; i++) { - Tb[i] = new float[nbt]; - } - - TL = new float*[Nc]; - - for (int i = 0; i < Nc; i++) { - TL[i] = new float[nbt]; - } - - TX = new double [Nc]; - - - TY = new double [Nc]; - - - TZ = new double [Nc]; - - good_spectral = new int [Nc]; - - for (int i = 0; i < Nc; i++) { - good_spectral[i] = 0; - } - - float *rmm = nullptr; - rmm = new float [N_t]; - - float *gmm = nullptr; - gmm = new float [N_t]; - - float *bmm = nullptr; - bmm = new float [N_t]; - - int siza = 167;//size of histogram + constexpr int siza = 158;//size of histogram //tempref and greenref are camera wb values. // I used them by default to select good spectral values !! - if (tempref > 12000.f) { - tempref = 12000.f; - } + tempref = rtengine::min(tempref, 12000.0); int repref = 0; @@ -6339,8 +4783,9 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } } - //calculate R G B multiplier in function illuminant and temperature + const bool isMono = (ri->getSensorType() == ST_FUJI_XTRANS && raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::MONO)) + || (ri->getSensorType() == ST_BAYER && raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::MONO)); for (int tt = 0; tt < N_t; tt++) { double r, g, b; float rm, gm, bm; @@ -6352,9 +4797,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double const float new_pre_mul[4] = { ri->get_pre_mul(0) / rm, ri->get_pre_mul(1) / gm, ri->get_pre_mul(2) / bm, ri->get_pre_mul(3) / gm }; float new_scale_mul[4]; - bool isMono = (ri->getSensorType() == ST_FUJI_XTRANS && raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::MONO)) - || (ri->getSensorType() == ST_BAYER && raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::MONO)); - float gain = calculate_scale_mul(new_scale_mul, new_pre_mul, c_white, cblacksom, isMono, ri->get_colors()); + const float gain = calculate_scale_mul(new_scale_mul, new_pre_mul, c_white, cblacksom, isMono, ri->get_colors()); rm = new_scale_mul[0] / scale_mul[0] * gain; gm = new_scale_mul[1] / scale_mul[1] * gain; @@ -6367,7 +4810,6 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double struct hiss { int histnum; int index; - int interest; bool operator()(const hiss& lhis, const hiss& rhis) { return lhis.histnum < rhis.histnum; @@ -6391,28 +4833,15 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } ; - int histxy[siza];//number of values for each pair xy + LUTu histxy(siza); //number of values for each pair xy + histxy.clear(); - float area[siza];//multiplier for compensation differences area ==> big areas are rare near limit prophotos or more - - int inter[siza]; //interest for photographie 1 = small (limit gamut) 2 = normal 3 = major (skin, sky, neutral) - - float xxx[siza];//for color references calculated ==> max in images "like histogram" - - float yyy[siza]; - - float YYY[siza];//not used directly, but necessary to keep good range - - for (int p = 0; p < siza; p++) { - histxy[p] = 0; - area[p] = 20.f; - inter[p] = 1; - xxx[p] = 0.f; - yyy[p] = 0.f; - YYY[p] = 0.f; - } - - float estimchrom = 0.f; + LUTf xxx(siza);//for color references calculated ==> max in images "like histogram" + xxx.clear(); + LUTf yyy(siza); + yyy.clear(); + LUTf YYY(siza);//not used directly, but necessary to keep good range + YYY.clear(); bool separated = true; int w = -1; @@ -6422,9 +4851,6 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double reff_spect_yy_camera(N_t, 2 * Nc + 2); reff_spect_xx_camera(N_t, 2 * Nc + 2); - // reffYY(N_t, 2 * Nc);//in case of - //reffYY_prov(N_t, 2 * Nc); - //here we select the good spectral color inside the 113 values //call tempxy to calculate for 114 color references Temp and XYZ with cat02 @@ -6437,48 +4863,28 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double reff_spect_yy_camera[j][repref] = TY[j] / (TX[j] + TY[j] + TZ[j]); // y from xyY } - int deltarepref = settings->itcwb_delta; + const int deltarepref = settings->itcwb_delta; - for (int nn = 0; nn <= 2; nn++) { + StopWatch Stop1("Loop 1"); + for (int nn = 0, drep = -deltarepref; nn <= 2; ++nn, drep += deltarepref) { //three loop to refine color if temp camera is probably not very good - int drep = 0; - - if (nn == 0) { - drep = -deltarepref; - } - - if (nn == 2) { - drep = +deltarepref; - } - - int rep = repref + drep; - - if (rep > N_t) { - rep = N_t; - } - - if (rep < 0) { - rep = 0; - } + const int rep = rtengine::LIM(repref + drep, 0, N_t); + StopWatch Stop2("Loop 2"); //initialize calculation of xy current for tempref +#ifdef _OPENMP + #pragma omp parallel for +#endif for (int y = 0; y < bfh ; y += 10) { - for (int x = 0; x < bfw ; x += 10) { - int yy = y / 10; - int xx = x / 10 ; - float x_c = 0.f, y_c = 0.f, Y_c = 0.f; - float x_x = 0.f, y_y = 0.f, z_z = 0.f; - float RR = rmm[rep] * redloc[y][x]; - float GG = gmm[rep] * greenloc[y][x]; - float BB = bmm[rep] * blueloc[y][x]; - Color::rgbxyY(RR, GG, BB, x_c, y_c, Y_c, x_x, y_y, z_z, wp); - xc[yy][xx] = x_c; - yc[yy][xx] = y_c; - Yc[yy][xx] = Y_c; + int yy = y / 10; + for (int x = 0, xx = 0; x < bfw ; x += 10, ++xx) { + const float RR = rmm[rep] * redloc[y][x]; + const float GG = gmm[rep] * greenloc[y][x]; + const float BB = bmm[rep] * blueloc[y][x]; + Color::rgbxyY(RR, GG, BB, xc[yy][xx], yc[yy][xx], Yc[yy][xx], wp); } - } - + Stop2.stop(); //histogram xy depend of temp...but in most cases D45 ..D65.. //calculate for this image the mean values for each family of color, near histogram x y (number) //xy vary from x 0..0.77 y 0..0.82 @@ -6488,11 +4894,12 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double // step about 0.02 x 0.32 0.34 y= 0.34 0.36 skin -- sky x 0.24 0.30 y 0.28 0.32 //big step about 0.2 - histoxyY(bfhitc, bfwitc, xc, yc, Yc, xxx, yyy, YYY, histxy, area, inter); + histoxyY(bfhitc, bfwitc, xc, yc, Yc, xxx, yyy, YYY, histxy); } + Stop1.stop(); //calculate x y Y - int sizcurrref = siza;//choice of number of correlate colors in image + const int sizcurrref = siza;//choice of number of correlate colors in image histcurrref(N_t, sizcurrref); xx_curref(N_t, sizcurrref); yy_curref(N_t, sizcurrref); @@ -6506,48 +4913,36 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double hiss Wbhis [siza]; - int n1 = 0; - int n4 = 0; - int n15 = 0; - int n30 = 0; - int ntr = 0; for (int nh = 0; nh < siza; nh++) { Wbhis[nh].histnum = histxy[nh]; Wbhis[nh].index = nh; - Wbhis[nh].interest = inter[nh]; } //sort in ascending order std::sort(Wbhis, Wbhis + siza, Wbhis[0]); - for (int nh = 0; nh < siza; nh++) { -// printf("nh=%i", Wbhis[nh].index); - } - + int n1 = 0; + int n4 = 0; + int n15 = 0; + int n30 = 0; //part to improve for (int nh = 0; nh < siza; nh++) { - if (Wbhis[nh].histnum < 1) { - n1++; //keep only existing color but avoid to small - } - - if (Wbhis[nh].histnum < 4) { - n4++; //keep only existing color but avoid to small - } - - if (Wbhis[nh].histnum < 15) { - n15++; //keep only existing color but avoid to small - } - if (Wbhis[nh].histnum < 30) { n30++; //keep only existing color but avoid to small + if (Wbhis[nh].histnum < 15) { + n15++; //keep only existing color but avoid to small + if (Wbhis[nh].histnum < 4) { + n4++; //keep only existing color but avoid to small + if (Wbhis[nh].histnum < 1) { + n1++; //keep only existing color but avoid to small + } + } + } } - - } - - ntr = n30; + int ntr = n30; if (ntr > (siza - 25)) { ntr = n15; //if to less elements 25 elements mini @@ -6567,24 +4962,22 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double chrom wbchro[sizcu4]; - double swpr = (Txyz[repref].XX + Txyz[repref].ZZ + 1.); - double xwpr = Txyz[repref].XX / swpr;//white point for tt in xy coordiantes - double ywpr = 1. / swpr; + const double swpr = (Txyz[repref].XX + Txyz[repref].ZZ + 1.); + const double xwpr = Txyz[repref].XX / swpr;//white point for tt in xy coordiantes + const double ywpr = 1. / swpr; - for (int i = 0; i < sizcu4; i++) { //take the max values - int j = i; - histcurrref[j][repref] = (float) Wbhis[siza - (j + 1)].histnum; - xx_curref[j][repref] = xxx[Wbhis[siza - (j + 1)].index] / histcurrref[j][repref]; - yy_curref[j][repref] = yyy[Wbhis[siza - (j + 1)].index] / histcurrref[j][repref]; - YY_curref[j][repref] = YYY[Wbhis[siza - (j + 1)].index] / histcurrref[j][repref]; -// printf("xx=%f yy=%f\n", xx_curref[j][repref], yy_curref[j][repref]); + for (int i = 0; i < sizcu4; ++i) { //take the max values + histcurrref[i][repref] = (float) Wbhis[siza - (i + 1)].histnum; + xx_curref[i][repref] = xxx[Wbhis[siza - (i + 1)].index] / histcurrref[i][repref]; + yy_curref[i][repref] = yyy[Wbhis[siza - (i + 1)].index] / histcurrref[i][repref]; + YY_curref[i][repref] = YYY[Wbhis[siza - (i + 1)].index] / histcurrref[i][repref]; } - estimchrom = 0.f; + float estimchrom = 0.f; - for (int nh = 0; nh < sizcu4; nh++) { - float chxy = std::sqrt(SQR(xx_curref[nh][repref] - xwpr) + SQR(yy_curref[nh][repref] - ywpr)); + for (int nh = 0; nh < sizcu4; ++nh) { + const float chxy = std::sqrt(SQR(xx_curref[nh][repref] - xwpr) + SQR(yy_curref[nh][repref] - ywpr)); wbchro[nh].chroxy_number = chxy * std::sqrt(histcurrref[nh][repref]); wbchro[nh].chroxy = std::sqrt(chxy); wbchro[nh].chrox = xx_curref[nh][repref]; @@ -6595,68 +4988,40 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } estimchrom /= sizcu4; - //printf("estimchrom=%f \n", estimchrom); if (settings->itcwb_sort) { //sort in ascending with chroma values - std::sort(wbchro, wbchro + sizcu4, wbchro[0]); } - /* - for (int nh = 0; nh < sizcu4; nh++) { - printf("nh=%i chroma_xy=%f chrox=%f chroy=%f\n", nh, wbchro[nh].chroxy, wbchro[nh].chrox, wbchro[nh].chroy); - } - */ - int maxval = settings->itcwb_thres;//max values of color to find correllation + const int maxval = rtengine::LIM(settings->itcwb_thres, 10, 55);//max values of color to find correllation - if (maxval < 10) { - maxval = 10; - } + sizcurr2ref = rtengine::min(sizcurr2ref, maxval); //keep about the biggest values, - if (maxval > 55) { - maxval = 55; - } - - if (sizcurr2ref > maxval) { - sizcurr2ref = maxval; //keep about the biggest values, - } - - - for (int i = 0; i < sizcurr2ref; i++) { + for (int i = 0; i < sizcurr2ref; ++i) { //is condition chroxy necessary ? if (((wbchro[sizcu4 - (i + 1)].chrox > 0.1f) && (wbchro[sizcu4 - (i + 1)].chroy > 0.1f)) && wbchro[sizcu4 - (i + 1)].chroxy > 0.0f) { //suppress value too far from reference spectral w++; xx_curref_reduc[w][repref] = wbchro[sizcu4 - (i + 1)].chrox; yy_curref_reduc[w][repref] = wbchro[sizcu4 - (i + 1)].chroy; YY_curref_reduc[w][repref] = wbchro[sizcu4 - (i + 1)].Y; - // printf("xx_cu=%f yy_cu=%f Y=%f chro=%f\n", xx_curref_reduc[w][repref], yy_curref_reduc[w][repref], YY_curref_reduc[w][repref],std::sqrt(wbchro[sizcu4 - (i + 1)].chroxy)); } } //calculate deltaE xx to find best values of spectrals datas - int maxnb = settings->itcwb_sizereference; - - if (maxnb > 5) { - maxnb = 5; - } - - if (maxnb < 1) { - maxnb = 1; - } - + int maxnb = rtengine::LIM(settings->itcwb_sizereference, 1, 5); if (settings->itcwb_thres > 39) { maxnb = 200 / settings->itcwb_thres; } - for (int nb = 1; nb <= maxnb; nb ++) { //max 5 iterations for Itcwb_thres=33, after trial 3 is good in most cases but in some cases 5 - for (int i = 0; i < w; i++) { + for (int nb = 1; nb <= maxnb; ++nb) { //max 5 iterations for Itcwb_thres=33, after trial 3 is good in most cases but in some cases 5 + for (int i = 0; i < w; ++i) { float mindeltaE = 100000.f; int kN = 0; for (int j = 0; j < Nc ; j++) { - if (good_spectral[j] == 0) { - float deltaE = SQR(xx_curref_reduc[i][repref] - reff_spect_xx_camera[j][repref]) + SQR(yy_curref_reduc[i][repref] - reff_spect_yy_camera[j][repref]); + if (!good_spectral[j]) { + const float deltaE = SQR(xx_curref_reduc[i][repref] - reff_spect_xx_camera[j][repref]) + SQR(yy_curref_reduc[i][repref] - reff_spect_yy_camera[j][repref]); if (deltaE < mindeltaE) { mindeltaE = deltaE; @@ -6665,31 +5030,26 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } } - good_spectral[kN] = 1;//good spectral are spectral color that match color histogram xy - //printf("k=%i ", kN); + good_spectral[kN] = true;//good spectral are spectral color that match color histogram xy } } //reconvert to RGB for "reduction" for (int i = 0; i < w; i++) { - float X = 65535.f * xx_curref_reduc[i][repref] * YY_curref_reduc[i][repref] / yy_curref_reduc[i][repref]; - float Y = 65535.f * YY_curref_reduc[i][repref]; - float Z = 65535.f * (1.f - xx_curref_reduc[i][repref] - yy_curref_reduc[i][repref]) * YY_curref_reduc[i][repref] / yy_curref_reduc[i][repref]; + const float X = 65535.f * xx_curref_reduc[i][repref] * YY_curref_reduc[i][repref] / yy_curref_reduc[i][repref]; + const float Y = 65535.f * YY_curref_reduc[i][repref]; + const float Z = 65535.f * (1.f - xx_curref_reduc[i][repref] - yy_curref_reduc[i][repref]) * YY_curref_reduc[i][repref] / yy_curref_reduc[i][repref]; float r, g, b; Color::xyz2rgb(X, Y, Z, r, g, b, wip); - r /= rmm[repref]; - g /= gmm[repref]; - b /= bmm[repref]; - R_curref_reduc[i][repref] = r; - G_curref_reduc[i][repref] = g; - B_curref_reduc[i][repref] = b; + R_curref_reduc[i][repref] = r / rmm[repref]; + G_curref_reduc[i][repref] = g / gmm[repref]; + B_curref_reduc[i][repref] = b / bmm[repref]; } //end first part - //Now begin real calculations separated = false; ColorTemp::tempxy(separated, repref, Tx, Ty, Tz, Ta, Tb, TL, TX, TY, TZ, wbpar); //calculate chroma xy (xyY) for Z known colors on under 90 illuminants @@ -6707,57 +5067,37 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double //calculate x y z for each pixel with multiplier rmm gmm bmm - for (int tt = 0; tt < N_t; tt++) {//N_t - // double swp = (Txyz[tt].XX + Txyz[tt].ZZ + 1.); - // double xwp = Txyz[tt].XX / swp; - // double ywp = 1. / swp; - - - for (int i = 0; i < w; i++) { - float x_c = 0.f, y_c = 0.f, Y_c = 0.f; - float x_x = 0.f, y_y = 0.f, z_z = 0.f; - - float RR = rmm[tt] * R_curref_reduc[i][repref]; - float GG = gmm[tt] * G_curref_reduc[i][repref]; - float BB = bmm[tt] * B_curref_reduc[i][repref]; - Color::rgbxyY(RR, GG, BB, x_c, y_c, Y_c, x_x, y_y, z_z, wp); - // xxyycurr_reduc[2 * i][tt] = fabs(x_c - xwp); - // xxyycurr_reduc[2 * i + 1][tt] = fabs(y_c - ywp); - xxyycurr_reduc[2 * i][tt] = x_c; - xxyycurr_reduc[2 * i + 1][tt] = y_c; - // printf("w=%i tt=%i xx=%f yy=%f\n",i, tt, xxyycurr_reduc[2 * i][tt], xxyycurr_reduc[2 * i +1][tt]); + for (int tt = 0; tt < N_t; ++tt) {//N_t + for (int i = 0; i < w; ++i) { + float unused; + const float RR = rmm[tt] * R_curref_reduc[i][repref]; + const float GG = gmm[tt] * G_curref_reduc[i][repref]; + const float BB = bmm[tt] * B_curref_reduc[i][repref]; + Color::rgbxyY(RR, GG, BB, xxyycurr_reduc[2 * i][tt], xxyycurr_reduc[2 * i + 1][tt], unused, wp); } - for (int j = 0; j < Nc ; j++) { + for (int j = 0; j < Nc ; ++j) { reff_spect_xxyy_prov[2 * j][tt] = Tx[j][tt] / (Tx[j][tt] + Ty[j][tt] + Tz[j][tt]); // x from xyY reff_spect_xxyy_prov[2 * j + 1][tt] = Ty[j][tt] / (Tx[j][tt] + Ty[j][tt] + Tz[j][tt]); // y from xyY - //reffYY_prov[j][tt] = Ty[j][tt];//Y - // printf("w=%i tt=%i xx=%f yy=%f\n",j, tt,reffxxyy_prov[2 * kk][tt] ,reffxxyy_prov[2 * kk + 1][tt]); - } int kk = -1; - for (int i = 0; i < Nc ; i++) { - if (good_spectral[i] == 1) { + for (int i = 0; i < Nc ; ++i) { + if (good_spectral[i]) { kk++; //we calculate now absolute chroma for each spectral color - // reffxxyy[2 * kk][tt] = fabs(reffxxyy_prov[2 * i][tt] - xwp); - // reffxxyy[2 * kk + 1][tt] = fabs(reffxxyy_prov[2 * i + 1][tt] - ywp); - reff_spect_xxyy[2 * kk][tt] = reff_spect_xxyy_prov[2 * i][tt]; + reff_spect_xxyy[2 * kk][tt] = reff_spect_xxyy_prov[2 * i][tt]; reff_spect_xxyy[2 * kk + 1][tt] = reff_spect_xxyy_prov[2 * i + 1][tt]; - //printf("w=%i tt=%i xx=%f yy=%f\n",i, tt,reffxxyy[2 * kk][tt] ,reffxxyy[2 * kk + 1][tt]); - // reffYY[kk][tt] = reffYY_prov[i][tt]; } } float student = 0.f; - studentXY(xxyycurr_reduc, reff_spect_xxyy, 2 * w, 2 * kk, tt, student); //for xy - //printf("tt=%i st=%f\n", tt, student); - float abstud = fabs(student); + + const float abstud = std::fabs(student); if (abstud < minstud) { // find the minimum Student minstud = abstud; @@ -6778,49 +5118,34 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double }; Tempgreen Tgstud[N_g]; - for (int i = 0; i < N_g; i++) {//init variables with + for (int i = 0; i < N_g; ++i) {//init variables with Tgstud[i].student = 1000.f;//max value to initialize Tgstud[i].tempref = 57; Tgstud[i].greenref = 39; } - int dgoodref = settings->itcwb_greendeltatemp; + const int dgoodref = rtengine::min(settings->itcwb_greendeltatemp, 4); + const int scantempbeg = rtengine::max(goodref - (dgoodref + 1), 1); + const int scantempend = rtengine::min(goodref + dgoodref, N_t - 1); - if (dgoodref > 4) { - dgoodref = 4; - } - - int scantempbeg = goodref - (dgoodref + 1); - - if (scantempbeg < 1) { - scantempbeg = 1; - } - - int scantempend = goodref + dgoodref; - - if (scantempend > N_t - 1) { - scantempend = N_t - 1; - } - - for (int gr = Rangegreenused.begin; gr < Rangegreenused.end; gr++) { + const bool isMono = (ri->getSensorType() == ST_FUJI_XTRANS && raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::MONO)) + || (ri->getSensorType() == ST_BAYER && raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::MONO)); + for (int gr = Rangegreenused.begin; gr < Rangegreenused.end; ++gr) { float minstudgr = 100000.f; int goodrefgr = 1; - for (int tt = scantempbeg; tt < scantempend; tt++) { + for (int tt = scantempbeg; tt < scantempend; ++tt) { double r, g, b; - float rm, gm, bm; - ColorTemp WBiter = ColorTemp(Txyz[tt].Tem, gree[gr].green, 1.f, "Custom"); + ColorTemp WBiter(Txyz[tt].Tem, gree[gr].green, 1.f, "Custom"); WBiter.getMultipliers(r, g, b); - rm = imatrices.cam_rgb[0][0] * r + imatrices.cam_rgb[0][1] * g + imatrices.cam_rgb[0][2] * b; - gm = imatrices.cam_rgb[1][0] * r + imatrices.cam_rgb[1][1] * g + imatrices.cam_rgb[1][2] * b; - bm = imatrices.cam_rgb[2][0] * r + imatrices.cam_rgb[2][1] * g + imatrices.cam_rgb[2][2] * b; + float rm = imatrices.cam_rgb[0][0] * r + imatrices.cam_rgb[0][1] * g + imatrices.cam_rgb[0][2] * b; + float gm = imatrices.cam_rgb[1][0] * r + imatrices.cam_rgb[1][1] * g + imatrices.cam_rgb[1][2] * b; + float bm = imatrices.cam_rgb[2][0] * r + imatrices.cam_rgb[2][1] * g + imatrices.cam_rgb[2][2] * b; const float new_pre_mul[4] = { ri->get_pre_mul(0) / rm, ri->get_pre_mul(1) / gm, ri->get_pre_mul(2) / bm, ri->get_pre_mul(3) / gm }; float new_scale_mul[4]; - bool isMono = (ri->getSensorType() == ST_FUJI_XTRANS && raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::MONO)) - || (ri->getSensorType() == ST_BAYER && raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::MONO)); - float gain = calculate_scale_mul(new_scale_mul, new_pre_mul, c_white, cblacksom, isMono, ri->get_colors()); + const float gain = calculate_scale_mul(new_scale_mul, new_pre_mul, c_white, cblacksom, isMono, ri->get_colors()); rm = new_scale_mul[0] / scale_mul[0] * gain; gm = new_scale_mul[1] / scale_mul[1] * gain; @@ -6831,66 +5156,42 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } - for (int tt = scantempbeg; tt < scantempend; tt++) {//N_t - // double swp = (Txyz[tt].XX + Txyz[tt].ZZ + 1.); - // double xwp = Txyz[tt].XX / swp; - // double ywp = 1. / swp; - - - for (int i = 0; i < w; i++) { - float x_c = 0.f, y_c = 0.f, Y_c = 0.f; - float x_x = 0.f, y_y = 0.f, z_z = 0.f; - - float RR = rmm[tt] * R_curref_reduc[i][repref]; - float GG = gmm[tt] * G_curref_reduc[i][repref]; - float BB = bmm[tt] * B_curref_reduc[i][repref]; - Color::rgbxyY(RR, GG, BB, x_c, y_c, Y_c, x_x, y_y, z_z, wp); - xxyycurr_reduc[2 * i][tt] = x_c; - xxyycurr_reduc[2 * i + 1][tt] = y_c; - // printf("w=%i tt=%i xx=%f yy=%f\n",i, tt, xxyycurr_reduc[2 * i][tt], xxyycurr_reduc[2 * i +1][tt]); + for (int tt = scantempbeg; tt < scantempend; ++tt) {//N_t + for (int i = 0; i < w; ++i) { + float unused; + const float RR = rmm[tt] * R_curref_reduc[i][repref]; + const float GG = gmm[tt] * G_curref_reduc[i][repref]; + const float BB = bmm[tt] * B_curref_reduc[i][repref]; + Color::rgbxyY(RR, GG, BB, xxyycurr_reduc[2 * i][tt], xxyycurr_reduc[2 * i + 1][tt], unused, wp); } - for (int j = 0; j < Nc ; j++) { + for (int j = 0; j < Nc ; ++j) { reff_spect_xxyy_prov[2 * j][tt] = Tx[j][tt] / (Tx[j][tt] + Ty[j][tt] + Tz[j][tt]); // x from xyY reff_spect_xxyy_prov[2 * j + 1][tt] = Ty[j][tt] / (Tx[j][tt] + Ty[j][tt] + Tz[j][tt]); // y from xyY - // reffYY_prov[j][tt] = Ty[j][tt];//Y - // printf("w=%i tt=%i xx=%f yy=%f\n",j, tt,reffxxyy_prov[2 * kk][tt] ,reffxxyy_prov[2 * kk + 1][tt]); - } //degrade correllation with color high chroma, but not too much...seems not good, but keep in case of?? if (estimchrom < 0.025f) {//very smal value of chroma for image - good_spectral[0] = 1;//blue - //good_spectral[1] = 1;//blue - // good_spectral[97] = 1;//blue - // good_spectral[93] = 1;//purple - // good_spectral[7] = 1;//green - good_spectral[11] = 1;//green - //good_spectral[42] = 1;//green - // good_spectral[75] = 1;//green - // good_spectral[46] = 1;//red - good_spectral[62] = 1;//red - // good_spectral[63] = 1;//red - // good_spectral[91] = 1;//ora - + good_spectral[0] = true;//blue + good_spectral[11] = true;//green + good_spectral[62] = true;//red } int kkg = -1; - for (int i = 0; i < Nc ; i++) { - if (good_spectral[i] == 1) { + for (int i = 0; i < Nc ; ++i) { + if (good_spectral[i]) { kkg++; - reff_spect_xxyy[2 * kkg][tt] = reff_spect_xxyy_prov[2 * i][tt]; + reff_spect_xxyy[2 * kkg][tt] = reff_spect_xxyy_prov[2 * i][tt]; reff_spect_xxyy[2 * kkg + 1][tt] = reff_spect_xxyy_prov[2 * i + 1][tt]; - // reffYY[kkg][tt] = reffYY_prov[i][tt]; } } float studentgr = 0.f; studentXY(xxyycurr_reduc, reff_spect_xxyy, 2 * w, 2 * kkg, tt, studentgr); //for xy - float abstudgr = fabs(studentgr); + const float abstudgr = std::fabs(studentgr); if (abstudgr < minstudgr) { // find the minimum Student minstudgr = abstudgr; @@ -6902,15 +5203,10 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double Tgstud[gr].student = minstudgr; } - } std::sort(Tgstud, Tgstud + N_g, Tgstud[0]); - for (int j = 0; j < 20; j++) { - // printf("reftemp=%i refgreen=%i stud=%f \n", Tgstud[j].tempref, Tgstud[j].greenref, Tgstud[j].student); - } - //now search the value of green the nearest of 1 with a good student value // I take the 3 first values //I admit a symetrie in green coefiicient for rgb multiplier...probably not excatly true @@ -6919,17 +5215,17 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double int greengoodprov; int goodrefprov; float studprov; - int goodref0 = Tgstud[0].tempref; - int greengood0 = Tgstud[0].greenref - 39;//39 green = 1 - float stud0 = Tgstud[0].student; - int goodref1 = Tgstud[1].tempref; - float stud1 = Tgstud[1].student; - int greengood1 = Tgstud[1].greenref - 39; - int goodref2 = Tgstud[2].tempref; - int greengood2 = Tgstud[2].greenref - 39; - float stud2 = Tgstud[2].student; + const int goodref0 = Tgstud[0].tempref; + const int greengood0 = Tgstud[0].greenref - 39;//39 green = 1 + const float stud0 = Tgstud[0].student; + const int goodref1 = Tgstud[1].tempref; + const float stud1 = Tgstud[1].student; + const int greengood1 = Tgstud[1].greenref - 39; + const int goodref2 = Tgstud[2].tempref; + const int greengood2 = Tgstud[2].greenref - 39; + const float stud2 = Tgstud[2].student; - if (fabs(greengood2) < fabs(greengood1)) { + if (std::fabs(greengood2) < std::fabs(greengood1)) { greengoodprov = greengood2; goodrefprov = goodref2; studprov = stud2; @@ -6940,7 +5236,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } - if (fabs(greengoodprov) < fabs(greengood0)) { + if (std::fabs(greengoodprov) < std::fabs(greengood0)) { goodref = goodrefprov; greengood = greengoodprov + 39; studgood = studprov; @@ -6956,32 +5252,6 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } - histcurr(0, 0); - histcurrref(0, 0); - xxyycurr(0, 0); - xxyycurr_reduc(0, 0); - xx_curref(0, 0); - yy_curref(0, 0); - YY_curref(0, 0); - - reff_spect_xxyy(0, 0); - YYcurr(0, 0); - YYcurr_reduc(0, 0); - reff_spect_yy_camera(0, 0); - reff_spect_xx_camera(0, 0); - xx_curref_reduc(0, 0); - yy_curref_reduc(0, 0); - YY_curref_reduc(0, 0); - - R_curref_reduc(0, 0); - G_curref_reduc(0, 0); - B_curref_reduc(0, 0); - - reff_spect_xxyy_prov(0, 0); - -// reffYY(0, 0); -// reffYY_prov(0, 0); - avg_rm = 10000.f * rmm[goodref]; avg_gm = 10000.* gmm[goodref]; avg_bm = 10000.f * bmm[goodref]; @@ -6990,47 +5260,9 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double tempitc = Txyz[goodref].Tem; } - if (settings->verbose) { printf("ITCWB tempitc=%f gritc=%f stud=%f \n", tempitc, greenitc, studgood); } - - - xc(0, 0); - yc(0, 0); - Yc(0, 0); - - - - for (int i = 0; i < Nc; i++) { - delete [] Tx[i]; - delete [] Ty[i]; - delete [] Tz[i]; - delete [] Ta[i]; - delete [] Tb[i]; - delete [] TL[i]; - - } - - delete [] Tx; - delete [] Ty; - delete [] Tz; - delete [] Ta; - delete [] Tb; - delete [] TL; - delete [] TX; - delete [] TY; - delete [] TZ; - delete [] good_spectral; - - - delete [] rmm; - delete [] gmm; - delete [] bmm; - - - - } void RawImageSource::WBauto(double & tempref, double & greenref, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double & avg_rm, double & avg_gm, double & avg_bm, double & tempitc, double & greenitc, float & studgood, bool & twotimes, const WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const ColorManagementParams & cmp, const RAWParams & raw) @@ -7153,7 +5385,7 @@ void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, in double Yr = Y / 65535.; double Zr = Z / 65535.; - Ciecam02::xyz_to_cat02float ( redloc[i][j], greenloc[i][j], blueloc[i][j], Xr, Yr, Zr, 1); + Ciecam02::xyz_to_cat02float (redloc[i][j], greenloc[i][j], blueloc[i][j], Xr, Yr, Zr, 1); redloc[i][j] *= 65535.f; greenloc[i][j] *= 65535.f; blueloc[i][j] *= 65535.f; @@ -7189,7 +5421,7 @@ void RawImageSource::getAutoWBMultipliersitc(double & tempref, double & greenref for (int j = start; j < end; j++) { if (ri->getSensorType() != ST_BAYER) { - double dr = CLIP(initialGain * (rawData[i][3 * j] )); + double dr = CLIP(initialGain * (rawData[i][3 * j] )); double dg = CLIP(initialGain * (rawData[i][3 * j + 1])); double db = CLIP(initialGain * (rawData[i][3 * j + 2])); @@ -7202,7 +5434,7 @@ void RawImageSource::getAutoWBMultipliersitc(double & tempref, double & greenref avg_b += db; rn = gn = ++bn; } else { - int c = FC( i, j); + int c = FC(i, j); double d = CLIP(initialGain * (rawData[i][j])); if (d > clipHigh) { @@ -7225,7 +5457,7 @@ void RawImageSource::getAutoWBMultipliersitc(double & tempref, double & greenref } } else { if (ri->getSensorType() != ST_BAYER) { - if(ri->getSensorType() == ST_FUJI_XTRANS) { + if (ri->getSensorType() == ST_FUJI_XTRANS) { const double compval = clipHigh / initialGain; #ifdef _OPENMP #pragma omp parallel @@ -7272,7 +5504,7 @@ void RawImageSource::getAutoWBMultipliersitc(double & tempref, double & greenref for (int j = 32; j < W - 32; j++) { // each loop read 1 rgb triplet value - double dr = CLIP(initialGain * (rawData[i][3 * j] )); + double dr = CLIP(initialGain * (rawData[i][3 * j] )); double dg = CLIP(initialGain * (rawData[i][3 * j + 1])); double db = CLIP(initialGain * (rawData[i][3 * j + 2])); @@ -7369,16 +5601,16 @@ void RawImageSource::getAutoWBMultipliersitc(double & tempref, double & greenref if (wbpar.method == "autitcgreen") { //not used - redAWBMul = rm = avg_rm * refwb_red; + redAWBMul = rm = avg_rm * refwb_red; greenAWBMul = gm = avg_gm * refwb_green; - blueAWBMul = bm = avg_bm * refwb_blue; + blueAWBMul = bm = avg_bm * refwb_blue; } else { - const double reds = avg_r / std::max(1, rn) * refwb_red; + const double reds = avg_r / std::max(1, rn) * refwb_red; const double greens = avg_g / std::max(1, gn) * refwb_green; - const double blues = avg_b / std::max(1, bn) * refwb_blue; - redAWBMul = rm = imatrices.rgb_cam[0][0] * reds + imatrices.rgb_cam[0][1] * greens + imatrices.rgb_cam[0][2] * blues; + const double blues = avg_b / std::max(1, bn) * refwb_blue; + redAWBMul = rm = imatrices.rgb_cam[0][0] * reds + imatrices.rgb_cam[0][1] * greens + imatrices.rgb_cam[0][2] * blues; greenAWBMul = gm = imatrices.rgb_cam[1][0] * reds + imatrices.rgb_cam[1][1] * greens + imatrices.rgb_cam[1][2] * blues; - blueAWBMul = bm = imatrices.rgb_cam[2][0] * reds + imatrices.rgb_cam[2][1] * greens + imatrices.rgb_cam[2][2] * blues; + blueAWBMul = bm = imatrices.rgb_cam[2][0] * reds + imatrices.rgb_cam[2][1] * greens + imatrices.rgb_cam[2][2] * blues; } } @@ -7420,7 +5652,7 @@ void RawImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) for (int j = start; j < end; j++) { if (ri->getSensorType() != ST_BAYER) { - double dr = CLIP(initialGain * (rawData[i][3 * j] )); + double dr = CLIP(initialGain * (rawData[i][3 * j] )); double dg = CLIP(initialGain * (rawData[i][3 * j + 1])); double db = CLIP(initialGain * (rawData[i][3 * j + 2])); @@ -7433,7 +5665,7 @@ void RawImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) avg_b += db; rn = gn = ++bn; } else { - int c = FC( i, j); + int c = FC(i, j); double d = CLIP(initialGain * (rawData[i][j])); if (d > clipHigh) { @@ -7456,7 +5688,7 @@ void RawImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) } } else { if (ri->getSensorType() != ST_BAYER) { - if(ri->getSensorType() == ST_FUJI_XTRANS) { + if (ri->getSensorType() == ST_FUJI_XTRANS) { const double compval = clipHigh / initialGain; #ifdef _OPENMP #pragma omp parallel @@ -7503,7 +5735,7 @@ void RawImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) for (int j = 32; j < W - 32; j++) { // each loop read 1 rgb triplet value - double dr = CLIP(initialGain * (rawData[i][3 * j] )); + double dr = CLIP(initialGain * (rawData[i][3 * j] )); double dg = CLIP(initialGain * (rawData[i][3 * j + 1])); double db = CLIP(initialGain * (rawData[i][3 * j + 2])); @@ -7584,19 +5816,19 @@ void RawImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) } } - if( settings->verbose ) { + if (settings->verbose) { printf ("AVG: %g %g %g\n", avg_r / std::max(1, rn), avg_g / std::max(1, gn), avg_b / std::max(1, bn)); } // return ColorTemp (pow(avg_r/rn, 1.0/6.0)*img_r, pow(avg_g/gn, 1.0/6.0)*img_g, pow(avg_b/bn, 1.0/6.0)*img_b); - double reds = avg_r / std::max(1, rn) * refwb_red; + double reds = avg_r / std::max(1, rn) * refwb_red; double greens = avg_g / std::max(1, gn) * refwb_green; - double blues = avg_b / std::max(1, bn) * refwb_blue; + double blues = avg_b / std::max(1, bn) * refwb_blue; - redAWBMul = rm = imatrices.rgb_cam[0][0] * reds + imatrices.rgb_cam[0][1] * greens + imatrices.rgb_cam[0][2] * blues; + redAWBMul = rm = imatrices.rgb_cam[0][0] * reds + imatrices.rgb_cam[0][1] * greens + imatrices.rgb_cam[0][2] * blues; greenAWBMul = gm = imatrices.rgb_cam[1][0] * reds + imatrices.rgb_cam[1][1] * greens + imatrices.rgb_cam[1][2] * blues; - blueAWBMul = bm = imatrices.rgb_cam[2][0] * reds + imatrices.rgb_cam[2][1] * greens + imatrices.rgb_cam[2][2] * blues; + blueAWBMul = bm = imatrices.rgb_cam[2][0] * reds + imatrices.rgb_cam[2][1] * greens + imatrices.rgb_cam[2][2] * blues; } ColorTemp RawImageSource::getSpotWB (std::vector &red, std::vector &green, std::vector &blue, int tran, double equal) @@ -7608,7 +5840,7 @@ ColorTemp RawImageSource::getSpotWB (std::vector &red, std::vectorgetSensorType() != ST_BAYER) { - if(ri->getSensorType() == ST_FUJI_XTRANS) { + if (ri->getSensorType() == ST_FUJI_XTRANS) { int d[9][2] = {{0, 0}, { -1, -1}, { -1, 0}, { -1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}}; for (size_t i = 0; i < red.size(); i++) { @@ -7621,7 +5853,7 @@ ColorTemp RawImageSource::getSpotWB (std::vector &red, std::vector= 0 && yv >= 0 && xv < W && yv < H) { + if (xv >= 0 && yv >= 0 && xv < W && yv < H) { if (ri->ISXTRANSRED(yv, xv)) { //RED rloc += (rawData[yv][xv]); rnbrs++; @@ -7659,7 +5891,7 @@ ColorTemp RawImageSource::getSpotWB (std::vector &red, std::vector 52500 || + if (initialGain * (rawData[yr][3 * xr] ) > 52500 || initialGain * (rawData[yg][3 * xg + 1]) > 52500 || initialGain * (rawData[yb][3 * xb + 2]) > 52500) { continue; @@ -7671,7 +5903,7 @@ ColorTemp RawImageSource::getSpotWB (std::vector &red, std::vector= 0 && ymin >= 0 && xmax < W && ymax < H) { - reds += (rawData[yr][3 * xr] ); + reds += (rawData[yr][3 * xr] ); greens += (rawData[yg][3 * xg + 1]); blues += (rawData[yb][3 * xb + 2]); rn++; @@ -7694,7 +5926,7 @@ ColorTemp RawImageSource::getSpotWB (std::vector &red, std::vector= 0 && yv >= 0 && xv < W && yv < H) { + if (xv >= 0 && yv >= 0 && xv < W && yv < H) { if (c == 0) { //RED rloc += (rawData[yv][xv]); rnbrs++; @@ -7730,7 +5962,7 @@ ColorTemp RawImageSource::getSpotWB (std::vector &red, std::vector= 0 && yv >= 0 && xv < W && yv < H) { + if (xv >= 0 && yv >= 0 && xv < W && yv < H) { if (c == 0) { //RED rloc += (rawData[yv][xv]); rnbrs++; @@ -7766,7 +5998,7 @@ ColorTemp RawImageSource::getSpotWB (std::vector &red, std::vector= 0 && yv >= 0 && xv < W && yv < H) { + if (xv >= 0 && yv >= 0 && xv < W && yv < H) { if (c == 0) { //RED rloc += (rawData[yv][xv]); rnbrs++; @@ -7880,7 +6112,7 @@ void RawImageSource::inverse33 (const double (*rgb_cam)[3], double (*cam_rgb)[3] { double nom = (rgb_cam[0][2] * rgb_cam[1][1] * rgb_cam[2][0] - rgb_cam[0][1] * rgb_cam[1][2] * rgb_cam[2][0] - rgb_cam[0][2] * rgb_cam[1][0] * rgb_cam[2][1] + rgb_cam[0][0] * rgb_cam[1][2] * rgb_cam[2][1] + - rgb_cam[0][1] * rgb_cam[1][0] * rgb_cam[2][2] - rgb_cam[0][0] * rgb_cam[1][1] * rgb_cam[2][2] ); + rgb_cam[0][1] * rgb_cam[1][0] * rgb_cam[2][2] - rgb_cam[0][0] * rgb_cam[1][1] * rgb_cam[2][2]); cam_rgb[0][0] = (rgb_cam[1][2] * rgb_cam[2][1] - rgb_cam[1][1] * rgb_cam[2][2]) / nom; cam_rgb[0][1] = -(rgb_cam[0][2] * rgb_cam[2][1] - rgb_cam[0][1] * rgb_cam[2][2]) / nom; cam_rgb[0][2] = (rgb_cam[0][2] * rgb_cam[1][1] - rgb_cam[0][1] * rgb_cam[1][2]) / nom; @@ -7940,7 +6172,7 @@ void RawImageSource::init () void RawImageSource::getRawValues(int x, int y, int rotate, int &R, int &G, int &B) { - if(d1x) { // Nikon D1x has special sensor. We just skip it + if (d1x) { // Nikon D1x has special sensor. We just skip it R = G = B = 0; return; } @@ -7963,9 +6195,9 @@ void RawImageSource::getRawValues(int x, int y, int rotate, int &R, int &G, int ynew = LIM(ynew, 0, H - 1); int c = ri->getSensorType() == ST_FUJI_XTRANS ? ri->XTRANSFC(ynew,xnew) : ri->FC(ynew,xnew); int val = round(rawData[ynew][xnew] / scale_mul[c]); - if(c == 0) { + if (c == 0) { R = val; G = 0; B = 0; - } else if(c == 2) { + } else if (c == 2) { R = 0; G = 0; B = val; } else { R = 0; G = val; B = 0; From 96ab9863ddfcb85bdd3f44e977971694fe9309b4 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 29 Feb 2020 10:37:32 +0100 Subject: [PATCH 139/154] fix segfault in ItcWB. #5676 --- rtengine/rawimagesource.cc | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index fdc122569..daba0be2a 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -4753,12 +4753,12 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double }; const int N_t = sizeof(Txyz) / sizeof(Txyz[0]); //number of temperature White point constexpr int Nc = 200 + 1;//200 number of reference spectral colors, I think it is enough to retrieve good values - array2D Tx(Nc, N_t); - array2D Ty(Nc, N_t); - array2D Tz(Nc, N_t); - array2D Ta(Nc, N_t); - array2D Tb(Nc, N_t); - array2D TL(Nc, N_t); + array2D Tx(N_t, Nc); + array2D Ty(N_t, Nc); + array2D Tz(N_t, Nc); + array2D Ta(N_t, Nc); + array2D Tb(N_t, Nc); + array2D TL(N_t, Nc); double TX[Nc]; double TY[Nc]; double TZ[Nc]; @@ -4865,12 +4865,10 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double const int deltarepref = settings->itcwb_delta; - StopWatch Stop1("Loop 1"); for (int nn = 0, drep = -deltarepref; nn <= 2; ++nn, drep += deltarepref) { //three loop to refine color if temp camera is probably not very good const int rep = rtengine::LIM(repref + drep, 0, N_t); - StopWatch Stop2("Loop 2"); //initialize calculation of xy current for tempref #ifdef _OPENMP #pragma omp parallel for @@ -4884,7 +4882,6 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double Color::rgbxyY(RR, GG, BB, xc[yy][xx], yc[yy][xx], Yc[yy][xx], wp); } } - Stop2.stop(); //histogram xy depend of temp...but in most cases D45 ..D65.. //calculate for this image the mean values for each family of color, near histogram x y (number) //xy vary from x 0..0.77 y 0..0.82 @@ -4896,7 +4893,6 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double histoxyY(bfhitc, bfwitc, xc, yc, Yc, xxx, yyy, YYY, histxy); } - Stop1.stop(); //calculate x y Y const int sizcurrref = siza;//choice of number of correlate colors in image From aa389dbcae57d5245912cef11a5166c86e29c5fd Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 29 Feb 2020 12:51:17 +0100 Subject: [PATCH 140/154] Ciecam02 fixed bad temp and tint cat02preset --- rtengine/improccoordinator.cc | 5 +++++ rtengine/rtengine.h | 2 ++ rtgui/colorappearance.cc | 16 ++++++++++++++++ rtgui/colorappearance.h | 1 + 4 files changed, 24 insertions(+) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index fc3b29b9f..1f3c91922 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1159,6 +1159,11 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if (params->colorappearance.autoybscen && acListener && params->colorappearance.enabled && !params->colorappearance.presetcat02) { acListener->ybCamChanged((int) yb); //real value Yb scene } + + if (params->colorappearance.enabled && params->colorappearance.presetcat02) { + acListener->wbCamChanged(params->wb.temperature, params->wb.green); //real temp and tint + } + } else { // CIECAM is disabled, we free up its image buffer to save some space if (ncie) { diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index 2d98c4ac2..e6074d50b 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -355,6 +355,8 @@ public : virtual void autoCamChanged(double ccam, double ccamout) = 0; virtual void adapCamChanged(double cadap) = 0; virtual void ybCamChanged(int yb) = 0; + virtual void wbCamChanged(double tem, double tin) = 0; + }; class AutoChromaListener diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index eed1c074b..262045d12 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -1631,6 +1631,22 @@ void ColorAppearance::adapCamChanged (double cadap) ); } + +void ColorAppearance::wbCamChanged (double temp, double tin) +{ + + idle_register.add( + [this, temp, tin]() -> bool + { + disableListener(); + tempout->setValue(temp); + greenout->setValue(tin); + enableListener(); + return false; + } + ); +} + void ColorAppearance::ybCamChanged (int ybsc) { if(presetcat02->get_active()){ diff --git a/rtgui/colorappearance.h b/rtgui/colorappearance.h index 7379eb9b0..2f060edea 100644 --- a/rtgui/colorappearance.h +++ b/rtgui/colorappearance.h @@ -63,6 +63,7 @@ public: void autoCamChanged (double ccam, double ccamout) override; bool autoCamComputed_ (); void adapCamChanged (double cadap) override; + void wbCamChanged(double tem, double tin) override; bool adapCamComputed_ (); void ybCamChanged (int yb) override; bool ybCamComputed_ (); From be5e447f53b3b0614552d8d0e618d9bc7435845d Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 29 Feb 2020 13:16:42 +0100 Subject: [PATCH 141/154] Itcwb : cleanup and speedup, #5676 --- rtengine/colortemp.cc | 252 ++++--------------------------------- rtengine/rawimagesource.cc | 174 ++++++++----------------- rtgui/colorappearance.cc | 1 - 3 files changed, 79 insertions(+), 348 deletions(-) diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index 0edd7aeb2..75efa7979 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -3210,8 +3210,8 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul, //calculate spectral data for blackbody at temp! double ColorTemp::blackbody_spect(double wavelength, double temperature) { - double wlm = wavelength * 1e-9; /* Wavelength in meters */ - return (3.7417715247e-16 / pow(wlm, 5)) / //3.7417..= c1 = 2*Pi*h*c2 where h=Planck constant, c=velocity of light + const double wlm = wavelength * 1e-9; /* Wavelength in meters */ + return (3.7417715247e-16 / (wlm * rtengine::pow4(wlm))) / //3.7417..= c1 = 2*Pi*h*c2 where h=Planck constant, c=velocity of light (xexp(1.438786e-2 / (wlm * temperature)) - 1.0); //1.4387..= c2 = h*c/k where k=Boltzmann constant } @@ -3337,62 +3337,38 @@ void ColorTemp::spectrum_to_color_xyz_preset(const double* spec_color, const dou void ColorTemp::spectrum_to_color_xyz_daylight(const double* spec_color, double _m1, double _m2, double &xx, double &yy, double &zz) { int i; - double lambda, X = 0, Y = 0, Z = 0, Yo = 0; + double lambda, X = 0, Y = 0, Z = 0; for (i = 0, lambda = 350; lambda < 830.1; i++, lambda += 5) { - - double Me; - double Mc; - - Me = get_spectral_color(lambda, spec_color); - Mc = daylight_spect(lambda, _m1, _m2); + const double Me = spec_color[i]; + const double Mc = daylight_spect(lambda, _m1, _m2); X += Mc * cie_colour_match_jd[i][0] * Me; Y += Mc * cie_colour_match_jd[i][1] * Me; Z += Mc * cie_colour_match_jd[i][2] * Me; } - for (i = 0, lambda = 350; lambda < 830.1; i++, lambda += 5) { - - double Ms; - - Ms = daylight_spect(lambda, _m1, _m2); - Yo += cie_colour_match_jd[i][1] * Ms; - } - - xx = X / Yo; - yy = Y / Yo; - zz = Z / Yo; + xx = X / Y; + yy = 1.0; + zz = Z / Y; } //calculate XYZ from spectrum data (color) and illuminant : J.Desmis december 2011 void ColorTemp::spectrum_to_color_xyz_blackbody(const double* spec_color, double _temp, double &xx, double &yy, double &zz) { int i; - double lambda, X = 0, Y = 0, Z = 0, Yo = 0; + double lambda, X = 0, Y = 0, Z = 0; for (i = 0, lambda = 350; lambda < 830.1; i++, lambda += 5) { - - double Me; - double Mc; - - Me = get_spectral_color(lambda, spec_color); - Mc = blackbody_spect(lambda, _temp); + const double Me = spec_color[i]; + const double Mc = blackbody_spect(lambda, _temp); X += Mc * cie_colour_match_jd[i][0] * Me; Y += Mc * cie_colour_match_jd[i][1] * Me; Z += Mc * cie_colour_match_jd[i][2] * Me; } - for (i = 0, lambda = 350; lambda < 830.1; i++, lambda += 5) { - - double Ms; - - Ms = blackbody_spect(lambda, _temp); - Yo += cie_colour_match_jd[i][1] * Ms; - } - - xx = X / Yo; - yy = Y / Yo; - zz = Z / Yo; + xx = X / Y; + yy = 1.0; + zz = Z / Y; } double ColorTemp::daylight_spect(double wavelength, double m1, double m2) @@ -3483,7 +3459,7 @@ void ColorTemp::tempxy(bool separated, int &repref, float **Tx, float **Ty, floa double ZZ; } WbTxyz; //probbaly can be "passed" with rawimagesource.cc but I don't know how to do. - WbTxyz Txyz[118] = {//temperature Xwb Zwb 118 values x wb and y wb are calculated after + constexpr WbTxyz Txyz[118] = {//temperature Xwb Zwb 118 values x wb and y wb are calculated after {2001., 1.273842, 0.145295}, {2101., 1.244008, 0.167533}, {2201., 1.217338, 0.190697}, @@ -3612,68 +3588,22 @@ void ColorTemp::tempxy(bool separated, int &repref, float **Tx, float **Ty, floa double Zref; } XYZref; XYZref Refxyz[N_c + 1]; - typedef struct XYZrefcat02 { - double Xrefcat; - double Yrefcat; - double Zrefcat; - } XYZrefcat02; - XYZrefcat02 Refxyzcat02[N_c + 1]; for (int i = 0; i < N_c; i++) { Refxyz[i].Xref = 0.f; Refxyz[i].Yref = 0.f; Refxyz[i].Zref = 0.f; - Refxyzcat02[i].Xrefcat = 0.f; - Refxyzcat02[i].Yrefcat = 0.f; - Refxyzcat02[i].Zrefcat = 0.f; } - - struct chrom { - float chroab; - float chroa; - float chrob; - int nn; - float L; - bool operator()(const chrom& lchro, const chrom& rchro) - { - return lchro.chroab < rchro.chroab; - } - - } ; - - // chrom wbchro[N_c + 1]; - double tempw = 5000.; if (separated) { tempw = Txyz[repref].Tem; - // tempw = 5004.; if (tempw <= INITIALBLACKBODY) { - // float aa = 0.f; - // float bb = 0.f; - for (int i = 0; i < N_c; i++) { spectrum_to_color_xyz_blackbody(spec_colorforxcyc[i], tempw, TX[i], TY[i], TZ[i]); - /* float XX = TX[i] * 65535.f; - float YY = TY[i] * 65535.f; - float ZZ = TZ[i] * 65535.f; - float L, a, b; - Color::XYZ2Lab(XX, YY, ZZ, L, a, b);//only to see Lab values in console - printf("N=%i L=%f a=%f b=%f\n", i, L / 327.68f, a / 327.68f, b / 327.68f); - aa += (a / 327.68f); - bb += (b / 327.68f); - */ } - - /* - aa /= N_c; - bb /= N_c; - printf("aa=%f bb=%f\n", aa, bb); - */ - // } - } else { double m11, m22, x_DD, y_DD, interm2; @@ -3689,97 +3619,21 @@ void ColorTemp::tempxy(bool separated, int &repref, float **Tx, float **Ty, floa interm2 = (0.0241 + 0.2562 * x_DD - 0.734 * y_DD); m11 = (-1.3515 - 1.7703 * x_DD + 5.9114 * y_DD) / interm2; m22 = (0.03 - 31.4424 * x_DD + 30.0717 * y_DD) / interm2; - // float aa = 0.f; - // float bb = 0.f; for (int i = 0; i < N_c; i++) { spectrum_to_color_xyz_daylight(spec_colorforxcyc[i], m11, m22, TX[i], TY[i], TZ[i]); - -/* float XX = TX[i] * 65535.f; - float YY = TY[i] * 65535.f; - float ZZ = TZ[i] * 65535.f; - float L, a, b; - Color::XYZ2Lab(XX, YY, ZZ, L, a, b);//only to see Lab values in console - // printf("N=%i L=%f a=%f b=%f\n", i, L / 327.68f, a / 327.6 8f, b / 327.68f); - aa += (a / 327.68f); - bb += (b / 327.68f); - wbchro[i].chroab = (sqrt(SQR(a) + SQR(b))) / 327.68f; - wbchro[i].chroa = a / 327.68f; - wbchro[i].chrob = b / 327.68f; - wbchro[i].nn = i; -*/ - - } -/* - std::sort(wbchro, wbchro + N_c + 1, wbchro[0]); - float ab5 = 0.f; - int n5 = 0; - float ab15 = 0.f; - int n15 = 0; - float ab30 = 0.f; - int n30 = 0; - float ab50 = 0.f; - int n50 = 0; - float ab70 = 0.f; - int n70 = 0; - float ab120 = 0.f; - int n120 = 0; - - for (int i = 0; i < N_c; i++) { - if (wbchro[i].chroab < 5.f) { - ab5 += (wbchro[i].chroa + wbchro[i].chrob); - n5++; - } else if (wbchro[i].chroab < 15.f) { - ab15 += (wbchro[i].chroa + wbchro[i].chrob); - n15++; - } else if (wbchro[i].chroab < 30.f) { - ab30 += (wbchro[i].chroa + wbchro[i].chrob); - n30++; - } else if (wbchro[i].chroab < 50.f) { - ab50 += (wbchro[i].chroa + wbchro[i].chrob); - n50++; - } else if (wbchro[i].chroab < 70.f) { - ab70 += (wbchro[i].chroa + wbchro[i].chrob); - n70++; - } else if (wbchro[i].chroab < 120.f) { - ab120 += (wbchro[i].chroa + wbchro[i].chrob); - n120++; - } - - printf("N=%i nn=%i chr=%f cha=%f chb=%f\n", i, wbchro[i].nn, wbchro[i].chroab, wbchro[i].chroa, wbchro[i].chrob); - } - - printf("ab5=%f n5=%i\n", ab5 / n5, n5); - printf("ab15=%f n15=%i\n", ab15 / n15, n15); - printf("ab30=%f n30=%i\n", ab30 / n30, n30); - printf("ab50=%f n50=%i\n", ab50 / n50, n50); - printf("ab70=%f n70=%i\n", ab70 / n70, n70); - printf("ab120=%f n120=%i\n", ab120 / n120, n120); - aa /= N_c; - bb /= N_c; - printf("aa=%f bb=%f\n", aa, bb); - //very low 15 --, 16 -+, 17 + -, 18 +-, 20 ++, 22 -+, 73 ++, 98 ++, 99 -+, 101 -+, 129 ++, 130 -+, 131 --, - //low 8 +-, 9 --, 10 --, 12 --, 19 -+, 21 -+, 24 -+, 25 ++, 27 ++, 30 ++, 33++, 34 ++, 36 ++, 37++,38 +-, - */ } - } - - if (!separated) { - // std::string wbcat02Method = wbpar.wbcat02Method; - std::string wbcat02Method = "none"; - + } else { for (int tt = 0; tt < N_t; tt++) { tempw = Txyz[tt].Tem; if (tempw <= INITIALBLACKBODY) { - for (int i = 0; i < N_c; i++) { spectrum_to_color_xyz_blackbody(spec_colorforxcyc[i], tempw, Refxyz[i].Xref, Refxyz[i].Yref, Refxyz[i].Zref); } - } else { - double m11, m22, x_DD, y_DD, interm2; + double x_DD; if (tempw <= 7000) { x_DD = -4.6070e9 / (tempw * tempw * tempw) + 2.9678e6 / (tempw * tempw) + 0.09911e3 / tempw + 0.244063; @@ -3787,80 +3641,22 @@ void ColorTemp::tempxy(bool separated, int &repref, float **Tx, float **Ty, floa x_DD = -2.0064e9 / (tempw * tempw * tempw) + 1.9018e6 / (tempw * tempw) + 0.24748e3 / tempw + 0.237040; } - y_DD = -3.0 * x_DD * x_DD + 2.87 * x_DD - 0.275; + const double y_DD = -3.0 * x_DD * x_DD + 2.87 * x_DD - 0.275; //calculate D -daylight in function of s0, s1, s2 and temp ==> x_D y_D //S(lamda)=So(lambda)+m1*s1(lambda)+m2*s2(lambda) - interm2 = (0.0241 + 0.2562 * x_DD - 0.734 * y_DD); - m11 = (-1.3515 - 1.7703 * x_DD + 5.9114 * y_DD) / interm2; - m22 = (0.03 - 31.4424 * x_DD + 30.0717 * y_DD) / interm2; + const double interm2 = (0.0241 + 0.2562 * x_DD - 0.734 * y_DD); + const double m11 = (-1.3515 - 1.7703 * x_DD + 5.9114 * y_DD) / interm2; + const double m22 = (0.03 - 31.4424 * x_DD + 30.0717 * y_DD) / interm2; for (int i = 0; i < N_c; i++) { spectrum_to_color_xyz_daylight(spec_colorforxcyc[i], m11, m22, Refxyz[i].Xref, Refxyz[i].Yref, Refxyz[i].Zref); } } -//CAT02 - - float CAM02BB00 = 1.0, CAM02BB01 = 1.0, CAM02BB02 = 1.0, CAM02BB10 = 1.0, CAM02BB11 = 1.0, CAM02BB12 = 1.0, CAM02BB20 = 1.0, CAM02BB21 = 1.0, CAM02BB22 = 1.0; //for CIECAT02 - float Xwb = Txyz[tt].XX; - float Ywb = 1.; - float Zwb = Txyz[tt].ZZ; - - if (wbcat02Method == "icam") {//not used - icieCAT02float(Xwb, Ywb, Zwb, CAM02BB00, CAM02BB01, CAM02BB02, CAM02BB10, CAM02BB11, CAM02BB12, CAM02BB20, CAM02BB21, CAM02BB22, 1.0); - } - - if (wbcat02Method == "cam") { - - cieCAT02float(Xwb, Ywb, Zwb, CAM02BB00, CAM02BB01, CAM02BB02, CAM02BB10, CAM02BB11, CAM02BB12, CAM02BB20, CAM02BB21, CAM02BB22, 1.0); - } - - if (wbcat02Method == "none") { - - for (int i = 0; i < N_c; i++) { - Refxyzcat02[i].Xrefcat = CAM02BB00 * Refxyz[i].Xref + CAM02BB01 * Refxyz[i].Yref + CAM02BB02 * Refxyz[i].Zref ; - Refxyzcat02[i].Yrefcat = CAM02BB10 * Refxyz[i].Xref + CAM02BB11 * Refxyz[i].Yref + CAM02BB12 * Refxyz[i].Zref ; - Refxyzcat02[i].Zrefcat = CAM02BB20 * Refxyz[i].Xref + CAM02BB21 * Refxyz[i].Yref + CAM02BB22 * Refxyz[i].Zref; - } - } - -//end CAT02 - for (int i = 0; i < N_c; i++) { - /* float X = 65535.f * Refxyzcat02[i].Xrefcat; - float Y = 65535.f * Refxyzcat02[i].Yrefcat; - float Z = 65535.f * Refxyzcat02[i].Zrefcat; - float L, a, b; - Color::XYZ2Lab(X, Y, Z, L, a, b); - - double som = (Refxyzcat02[i].Xrefcat + Refxyzcat02[i].Yrefcat + Refxyzcat02[i].Zrefcat); - L /= 327.68f; - a /= 327.68f; - b /= 327.68f; - Ta[i][tt] = a; - Tb[i][tt] = b; - TL[i][tt] = L; - TX[i][tt] = X; - TY[i][tt] = Y; - TZ[i][tt] = Z; - */ - //som = 1.; -// Tx[i][tt] = (float) Refxyz[i].Xref; -// Ty[i][tt] = (float) Refxyz[i].Yref; -// Tz[i][tt] = (float) Refxyz[i].Zref; - -// if (wbpar.wbcat02Method == "none") { - if (wbcat02Method == "none") { - - Tx[i][tt] = (float) Refxyz[i].Xref; - Ty[i][tt] = (float) Refxyz[i].Yref; - Tz[i][tt] = (float) Refxyz[i].Zref; - } else { - Tx[i][tt] = (float) Refxyzcat02[i].Xrefcat; - Ty[i][tt] = (float) Refxyzcat02[i].Yrefcat; - Tz[i][tt] = (float) Refxyzcat02[i].Zrefcat; - } - + Tx[i][tt] = Refxyz[i].Xref; + Ty[i][tt] = Refxyz[i].Yref; + Tz[i][tt] = Refxyz[i].Zref; } } } diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index daba0be2a..9f7b9a850 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -4292,54 +4292,49 @@ static void histoxyY(int bfhitc, int bfwitc, const array2D & xc, const ar } } -void static studentXY(const array2D & YYcurr, const array2D & reffYY, int sizcurr, int Nc, int tt, float & student) +float static studentXY(const array2D & YYcurr, const array2D & reffYY, int sizcurr, int Nc, int tt) { //calculate Student coeff YY float somcurrY = 0.f; float somreffY = 0.f; float somcurr2Y = 0.f; float somreff2Y = 0.f; - float somsqueccurrY = 0.f; - float somsquecreffY = 0.f; - int sizestucurrY = sizcurr; - int sizestureffY = Nc; - for (int i = 0; i < sizestucurrY; i++) { - somcurrY += 100.f * YYcurr[i][tt]; + for (int i = 0; i < sizcurr; i++) { + somcurrY += YYcurr[i][tt]; //sum observations first group } + somcurrY *= 100.f; - for (int i = 0; i < sizestureffY; i++) { - somreffY += 100.f * reffYY[i][tt]; + for (int i = 0; i < Nc; i++) { + somreffY += reffYY[i][tt]; //sum observations second group - } + somreffY *= 100.f; - - for (int i = 0; i < sizestucurrY; i++) { - somcurr2Y += SQR(100.f * YYcurr[i][tt]); + for (int i = 0; i < sizcurr; i++) { + somcurr2Y += SQR(YYcurr[i][tt]); //sum sqr observations first group - } + somreffY *= SQR(100.f); - for (int i = 0; i < sizestureffY; i++) { - somreff2Y += SQR(100.f * reffYY[i][tt]); + for (int i = 0; i < Nc; i++) { + somreff2Y += SQR(reffYY[i][tt]); //sum sqr observations second group - } + somreff2Y *= SQR(100.f); - somsqueccurrY = somcurr2Y - (SQR(somcurrY)) / sizestucurrY; + const float somsqueccurrY = somcurr2Y - (SQR(somcurrY)) / sizcurr; //sum sqr differences first - somsquecreffY = somreff2Y - (SQR(somreffY)) / sizestureffY; + const float somsquecreffY = somreff2Y - (SQR(somreffY)) / Nc; //sum sqr differences second - float diviY = std::sqrt(((somsqueccurrY + somsquecreffY) * (1.f / (float)sizestucurrY + 1.f / (float)sizestureffY)) / (sizestucurrY + sizestureffY - 2)); + const float diviY = std::sqrt(((somsqueccurrY + somsquecreffY) * (1.f / sizcurr + 1.f / Nc)) / (sizcurr + Nc - 2)); //divisor student - float numerY = ((float)somcurrY / (float)sizestucurrY) - ((float)somreffY / (float)sizestureffY); + const float numerY = somcurrY / sizcurr - somreffY / Nc; //numerator student -// printf("num=%f divY=%f \n", numerY, diviY); - student = numerY / diviY ; + return numerY / diviY ; //student coeeficient } @@ -4404,9 +4399,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double Itcwb_sizereference : 3 by default, can be set to 5 ==> size of reference color compare to size of histogram real color itcwb_delta : 1 by default can be set between 0 to 5 ==> delta temp to build histogram xy - if camera temp is not probably good */ - // BENCHFUN BENCHFUN - TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix("sRGB"); const float wp[3][3] = { @@ -4423,49 +4416,19 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double {wiprof[2][0], wiprof[2][1], wiprof[2][2]} }; - array2D xc; - array2D yc; - array2D Yc; + const int bfwitc = bfw / 10 + 1 ;// 10 arbitrary value ; perhaps 4 or 5 or 20 + const int bfhitc = bfh / 10 + 1; - array2D histcurr; - array2D histcurrref; - - array2D xxyycurr; - array2D xxyycurr_reduc; - array2D xx_curref; - array2D yy_curref; - array2D YY_curref; - array2D xx_curref_reduc; - array2D yy_curref_reduc; - array2D R_curref_reduc; - array2D G_curref_reduc; - array2D B_curref_reduc; - - array2D reff_spect_xxyy; - array2D reff_spect_xxyy_prov; - array2D YYcurr; - array2D YY_curref_reduc; - array2D YYcurr_reduc; - // array2D reffYY; - // array2D reffYY_prov; - - array2D reff_spect_yy_camera; - array2D reff_spect_xx_camera; - - - int bfwitc = bfw / 10 + 1 ;// 10 arbitrary value ; perhaps 4 or 5 or 20 - int bfhitc = bfh / 10 + 1; - - xc(bfwitc, bfhitc); - yc(bfwitc, bfhitc); - Yc(bfwitc, bfhitc); + array2D xc(bfwitc, bfhitc); + array2D yc(bfwitc, bfhitc); + array2D Yc(bfwitc, bfhitc); typedef struct WbGreen { double green; float snedecor;//1. actually but put in case of confiance interval } WbGreen; - constexpr WbGreen gree[118] = {//symetric coefficient between 0.717 and 1.40 + constexpr WbGreen gree[118] = {//symmetric coefficient between 0.717 and 1.40 {0.400, 1.f}, {0.500, 1.f}, {0.550, 1.f}, @@ -4585,7 +4548,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double {3.800, 1.f}, {4.000, 1.f} }; - int N_g = sizeof(gree) / sizeof(gree[0]); //number of green + const int N_g = sizeof(gree) / sizeof(gree[0]); //number of green typedef struct RangeGreen { int begin; @@ -4593,37 +4556,20 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double int ng; } RangeGreen; - RangeGreen Rangestandard; - Rangestandard.begin = 8; - Rangestandard.end = 70; - Rangestandard.ng = 62; - - RangeGreen Rangeextand; - Rangeextand.begin = 4; - Rangeextand.end = 77; - Rangeextand.ng = 73; - - RangeGreen Rangemax; - Rangemax.begin = 0; - Rangemax.end = N_g; - Rangemax.ng = N_g; + constexpr RangeGreen Rangestandard = {8, 70, 62}; + constexpr RangeGreen Rangeextand = {4, 77, 73}; + const RangeGreen Rangemax = {0, N_g, N_g}; RangeGreen Rangegreenused; if (settings->itcwb_greenrange == 0) { Rangegreenused = Rangestandard; - } - - else if (settings->itcwb_greenrange == 1) { + } else if (settings->itcwb_greenrange == 1) { Rangegreenused = Rangeextand; } else { Rangegreenused = Rangemax; } - // printf("rangemin=%i rangmax=%i\n", Rangegreenused.begin, Rangegreenused.end); - - - typedef struct WbTxyz { double Tem; double XX; @@ -4785,8 +4731,8 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double //calculate R G B multiplier in function illuminant and temperature const bool isMono = (ri->getSensorType() == ST_FUJI_XTRANS && raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::MONO)) - || (ri->getSensorType() == ST_BAYER && raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::MONO)); - for (int tt = 0; tt < N_t; tt++) { + || (ri->getSensorType() == ST_BAYER && raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::MONO)); + for (int tt = 0; tt < N_t; ++tt) { double r, g, b; float rm, gm, bm; ColorTemp WBiter = ColorTemp(Txyz[tt].Tem, greenitc, 1.f, "Custom"); @@ -4845,11 +4791,11 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double bool separated = true; int w = -1; - //printf("greenrefraw=%f\n", greenref); - reff_spect_xxyy(N_t, 2 * Nc + 2); - reff_spect_xxyy_prov(N_t, 2 * Nc + 2); - reff_spect_yy_camera(N_t, 2 * Nc + 2); - reff_spect_xx_camera(N_t, 2 * Nc + 2); + + array2D reff_spect_xxyy(N_t, 2 * Nc + 2); + array2D reff_spect_xxyy_prov(N_t, 2 * Nc + 2); + array2D reff_spect_yy_camera(N_t, 2 * Nc + 2); + array2D reff_spect_xx_camera(N_t, 2 * Nc + 2); //here we select the good spectral color inside the 113 values //call tempxy to calculate for 114 color references Temp and XYZ with cat02 @@ -4896,19 +4842,18 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double //calculate x y Y const int sizcurrref = siza;//choice of number of correlate colors in image - histcurrref(N_t, sizcurrref); - xx_curref(N_t, sizcurrref); - yy_curref(N_t, sizcurrref); - YY_curref(N_t, sizcurrref); - xx_curref_reduc(N_t, sizcurrref); - yy_curref_reduc(N_t, sizcurrref); - YY_curref_reduc(N_t, sizcurrref); - R_curref_reduc(N_t, sizcurrref); - G_curref_reduc(N_t, sizcurrref); - B_curref_reduc(N_t, sizcurrref); + array2D histcurrref(N_t, sizcurrref); + array2D xx_curref(N_t, sizcurrref); + array2D yy_curref(N_t, sizcurrref); + array2D YY_curref(N_t, sizcurrref); + array2D xx_curref_reduc(N_t, sizcurrref); + array2D yy_curref_reduc(N_t, sizcurrref); + array2D YY_curref_reduc(N_t, sizcurrref); + array2D R_curref_reduc(N_t, sizcurrref); + array2D G_curref_reduc(N_t, sizcurrref); + array2D B_curref_reduc(N_t, sizcurrref); - - hiss Wbhis [siza]; + hiss Wbhis[siza]; for (int nh = 0; nh < siza; nh++) { Wbhis[nh].histnum = histxy[nh]; @@ -4995,7 +4940,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double for (int i = 0; i < sizcurr2ref; ++i) { //is condition chroxy necessary ? - if (((wbchro[sizcu4 - (i + 1)].chrox > 0.1f) && (wbchro[sizcu4 - (i + 1)].chroy > 0.1f)) && wbchro[sizcu4 - (i + 1)].chroxy > 0.0f) { //suppress value too far from reference spectral + if (((wbchro[sizcu4 - (i + 1)].chrox > 0.1f) && (wbchro[sizcu4 - (i + 1)].chroy > 0.1f)) && wbchro[sizcu4 - (i + 1)].chroxy > 0.0f) { //suppress value too far from reference spectral w++; xx_curref_reduc[w][repref] = wbchro[sizcu4 - (i + 1)].chrox; yy_curref_reduc[w][repref] = wbchro[sizcu4 - (i + 1)].chroy; @@ -5045,21 +4990,20 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double //end first part - //Now begin real calculations separated = false; ColorTemp::tempxy(separated, repref, Tx, Ty, Tz, Ta, Tb, TL, TX, TY, TZ, wbpar); //calculate chroma xy (xyY) for Z known colors on under 90 illuminants //calculate x y Y int sizcurr = siza;//choice of number of correlate colors in image - histcurr(N_t, sizcurr); - xxyycurr(N_t, 2 * sizcurr); - xxyycurr_reduc(N_t, 2 * sizcurr); + array2D histcurr(N_t, sizcurr); + array2D xxyycurr(N_t, 2 * sizcurr); + array2D xxyycurr_reduc(N_t, 2 * sizcurr); float minstud = 100000.f; int goodref = 1; - YYcurr(N_t, sizcurr); - YYcurr_reduc(N_t, sizcurr); + array2D YYcurr(N_t, sizcurr); + array2D YYcurr_reduc(N_t, sizcurr); //calculate x y z for each pixel with multiplier rmm gmm bmm @@ -5089,17 +5033,12 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } } - float student = 0.f; - - studentXY(xxyycurr_reduc, reff_spect_xxyy, 2 * w, 2 * kk, tt, student); //for xy - - const float abstud = std::fabs(student); + const float abstud = std::fabs(studentXY(xxyycurr_reduc, reff_spect_xxyy, 2 * w, 2 * kk, tt)); if (abstud < minstud) { // find the minimum Student minstud = abstud; goodref = tt; } - } if (extra) { @@ -5184,10 +5123,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } } - float studentgr = 0.f; - - studentXY(xxyycurr_reduc, reff_spect_xxyy, 2 * w, 2 * kkg, tt, studentgr); //for xy - const float abstudgr = std::fabs(studentgr); + const float abstudgr = std::fabs(studentXY(xxyycurr_reduc, reff_spect_xxyy, 2 * w, 2 * kkg, tt)); if (abstudgr < minstudgr) { // find the minimum Student minstudgr = abstudgr; diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index eed1c074b..1e7f76b44 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -823,7 +823,6 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) nexttemp = pp->wb.temperature; nextgreen = pp->wb.green; - printf("temp=%f green=%f\n", nexttemp, nextgreen); if (pedited) { degree->setEditedState (pedited->colorappearance.degree ? Edited : UnEdited); degreeout->setEditedState (pedited->colorappearance.degreeout ? Edited : UnEdited); From 8e1bb5ba90bcbdef43073cda8b691111da60a32d Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 29 Feb 2020 14:07:27 +0100 Subject: [PATCH 142/154] Fix broken cppcheck --- rtgui/options.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rtgui/options.h b/rtgui/options.h index 0bc421300..b8a71c9cb 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -20,12 +20,15 @@ #include #include +#if defined __has_include #if __has_include() #include #else #include #endif - +#else +#include +#endif #include "../rtengine/settings.h" #include From be765768ffe5a863d33a6ceaf989c3c0485d4114 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 29 Feb 2020 14:19:06 +0100 Subject: [PATCH 143/154] further cleanups --- rtengine/colortemp.cc | 10 ++++------ rtengine/colortemp.h | 2 +- rtengine/rawimagesource.cc | 35 ++++------------------------------- rtengine/rt_math.h | 6 ++++++ 4 files changed, 15 insertions(+), 38 deletions(-) diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index 75efa7979..ec8641fc0 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -3211,7 +3211,7 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul, double ColorTemp::blackbody_spect(double wavelength, double temperature) { const double wlm = wavelength * 1e-9; /* Wavelength in meters */ - return (3.7417715247e-16 / (wlm * rtengine::pow4(wlm))) / //3.7417..= c1 = 2*Pi*h*c2 where h=Planck constant, c=velocity of light + return (3.7417715247e-16 / rtengine::pow5(wlm)) / //3.7417..= c1 = 2*Pi*h*c2 where h=Planck constant, c=velocity of light (xexp(1.438786e-2 / (wlm * temperature)) - 1.0); //1.4387..= c2 = h*c/k where k=Boltzmann constant } @@ -3400,7 +3400,7 @@ double ColorTemp::daylight_spect(double wavelength, double m1, double m2) // we can change step for temperature and increase number for T > 7500K if necessary //these values Temp, x, y are references for all calculations and very precise. //copyright J.Desmis august 2017 and june 2018 -void ColorTemp::tempxy(bool separated, int &repref, float **Tx, float **Ty, float **Tz, float **Ta, float **Tb, float **TL, double *TX, double *TY, double *TZ, const procparams::WBParams & wbpar) +void ColorTemp::tempxy(bool separated, int repref, float **Tx, float **Ty, float **Tz, float **Ta, float **Tb, float **TL, double *TX, double *TY, double *TZ, const procparams::WBParams & wbpar) { const double* spec_colorforxcyc[] = {//color references JDC468_BluH10_spect, JDC468_BluD6_spect, ColorchechCyaF3_spect, JDC468_BluM5_spect, // 0 3 @@ -3595,10 +3595,8 @@ void ColorTemp::tempxy(bool separated, int &repref, float **Tx, float **Ty, floa Refxyz[i].Zref = 0.f; } - double tempw = 5000.; - if (separated) { - tempw = Txyz[repref].Tem; + const double tempw = Txyz[repref].Tem; if (tempw <= INITIALBLACKBODY) { for (int i = 0; i < N_c; i++) { @@ -3626,7 +3624,7 @@ void ColorTemp::tempxy(bool separated, int &repref, float **Tx, float **Ty, floa } } else { for (int tt = 0; tt < N_t; tt++) { - tempw = Txyz[tt].Tem; + const double tempw = Txyz[tt].Tem; if (tempw <= INITIALBLACKBODY) { for (int i = 0; i < N_c; i++) { diff --git a/rtengine/colortemp.h b/rtengine/colortemp.h index fd2796552..5feed9d26 100644 --- a/rtengine/colortemp.h +++ b/rtengine/colortemp.h @@ -54,7 +54,7 @@ public: explicit ColorTemp (double e) : temp(-1.), green(-1.), equal (e), method("Custom") {} ColorTemp (double t, double g, double e, const std::string &m); ColorTemp (double mulr, double mulg, double mulb, double e); - static void tempxy(bool separated, int &repref, float **Tx, float **Ty, float **Tz, float **Ta, float **Tb, float **TL, double *TX, double *TY, double *TZ, const procparams::WBParams & wbpar); + static void tempxy(bool separated, int repref, float **Tx, float **Ty, float **Tz, float **Ta, float **Tb, float **TL, double *TX, double *TY, double *TZ, const procparams::WBParams & wbpar); void update (const double rmul, const double gmul, const double bmul, const double equal, const double tempBias=0.0) { diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 9f7b9a850..1cbdf1140 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -4553,12 +4553,11 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double typedef struct RangeGreen { int begin; int end; - int ng; } RangeGreen; - constexpr RangeGreen Rangestandard = {8, 70, 62}; - constexpr RangeGreen Rangeextand = {4, 77, 73}; - const RangeGreen Rangemax = {0, N_g, N_g}; + constexpr RangeGreen Rangestandard = {8, 70}; + constexpr RangeGreen Rangeextand = {4, 77}; + const RangeGreen Rangemax = {0, N_g}; RangeGreen Rangegreenused; @@ -5064,8 +5063,6 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double const int scantempbeg = rtengine::max(goodref - (dgoodref + 1), 1); const int scantempend = rtengine::min(goodref + dgoodref, N_t - 1); - const bool isMono = (ri->getSensorType() == ST_FUJI_XTRANS && raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::MONO)) - || (ri->getSensorType() == ST_BAYER && raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::MONO)); for (int gr = Rangegreenused.begin; gr < Rangegreenused.end; ++gr) { float minstudgr = 100000.f; int goodrefgr = 1; @@ -5185,7 +5182,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } avg_rm = 10000.f * rmm[goodref]; - avg_gm = 10000.* gmm[goodref]; + avg_gm = 10000.f * gmm[goodref]; avg_bm = 10000.f * bmm[goodref]; if (!extra) { @@ -5206,7 +5203,6 @@ void RawImageSource::WBauto(double & tempref, double & greenref, array2D if (greenref > 0.77 && greenref < 1.3) { greenitc = greenref; - extra = false; if (settings->itcwb_forceextra) { extra = true; @@ -5222,7 +5218,6 @@ void RawImageSource::WBauto(double & tempref, double & greenref, array2D } } - void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w) { //used by auto WB local to calculate red, green, blue in local region @@ -5304,28 +5299,6 @@ void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, in blueloc[i][j] = Color::gammatab_srgb[blueloc[i][j]]; } } - - if (cat02) {//CAT02 - /* - //not good threatment, I must wait merge branch cat02wb - for (int i = 0; i < bfh; i++) - for (int j = 0; j < bfw; j++) { - float X = 0.f, Y = 0.f, Z = 0.f; - Color::rgbxyz(redloc[i][j], greenloc[i][j], blueloc[i][j], X, Y, Z, wp); - double temp; - double Xr = X / 65535.; - double Yr = Y / 65535.; - double Zr = Z / 65535.; - - Ciecam02::xyz_to_cat02float (redloc[i][j], greenloc[i][j], blueloc[i][j], Xr, Yr, Zr, 1); - redloc[i][j] *= 65535.f; - greenloc[i][j] *= 65535.f; - blueloc[i][j] *= 65535.f; - //to do ciecam adaptation - } - */ - } - } void RawImageSource::getAutoWBMultipliersitc(double & tempref, double & greenref, double & tempitc, double & greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double & rm, double & gm, double & bm, const WBParams & wbpar, const ColorManagementParams & cmp, const RAWParams & raw) diff --git a/rtengine/rt_math.h b/rtengine/rt_math.h index 9342f5430..6d4799254 100644 --- a/rtengine/rt_math.h +++ b/rtengine/rt_math.h @@ -44,6 +44,12 @@ constexpr T pow4(T x) return SQR(SQR(x)); } +template +constexpr T pow5(T x) +{ + return x * pow4(x); +} + template constexpr const T& min(const T& a) { From 6029b29d89ba7e4bafc2d2a7ed2ff0bbd39efbac Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 29 Feb 2020 14:59:26 +0100 Subject: [PATCH 144/154] fix copy/paste bug --- rtengine/rawimagesource.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 1cbdf1140..bf88b2955 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -4316,7 +4316,7 @@ float static studentXY(const array2D & YYcurr, const array2D & ref somcurr2Y += SQR(YYcurr[i][tt]); //sum sqr observations first group } - somreffY *= SQR(100.f); + somcurr2Y *= SQR(100.f); for (int i = 0; i < Nc; i++) { somreff2Y += SQR(reffYY[i][tt]); @@ -4324,9 +4324,9 @@ float static studentXY(const array2D & YYcurr, const array2D & ref } somreff2Y *= SQR(100.f); - const float somsqueccurrY = somcurr2Y - (SQR(somcurrY)) / sizcurr; + const float somsqueccurrY = somcurr2Y - SQR(somcurrY) / sizcurr; //sum sqr differences first - const float somsquecreffY = somreff2Y - (SQR(somreffY)) / Nc; + const float somsquecreffY = somreff2Y - SQR(somreffY) / Nc; //sum sqr differences second const float diviY = std::sqrt(((somsqueccurrY + somsquecreffY) * (1.f / sizcurr + 1.f / Nc)) / (sizcurr + Nc - 2)); From 0a23e85868e19db1e4cbb5a6db4a00416c5d07e9 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 29 Feb 2020 19:44:20 +0100 Subject: [PATCH 145/154] Further cleanups --- rtengine/rawimagesource.cc | 56 ++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index bf88b2955..55e31eeda 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -3896,7 +3896,6 @@ void RawImageSource::getRowStartEnd (int x, int &start, int &end) static void histoxyY(int bfhitc, int bfwitc, const array2D & xc, const array2D & yc, const array2D & Yc, LUTf &xxx, LUTf &yyy, LUTf &YYY, LUTu &histxy) - { #ifdef _OPENMP #pragma omp parallel @@ -4410,19 +4409,15 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix("sRGB"); //inverse matrix user select - double wip[3][3] = { - {wiprof[0][0], wiprof[0][1], wiprof[0][2]}, - {wiprof[1][0], wiprof[1][1], wiprof[1][2]}, - {wiprof[2][0], wiprof[2][1], wiprof[2][2]} + const float wip[3][3] = { + {static_cast(wiprof[0][0]), static_cast(wiprof[0][1]), static_cast(wiprof[0][2])}, + {static_cast(wiprof[1][0]), static_cast(wiprof[1][1]), static_cast(wiprof[1][2])}, + {static_cast(wiprof[2][0]), static_cast(wiprof[2][1]), static_cast(wiprof[2][2])} }; const int bfwitc = bfw / 10 + 1 ;// 10 arbitrary value ; perhaps 4 or 5 or 20 const int bfhitc = bfh / 10 + 1; - array2D xc(bfwitc, bfhitc); - array2D yc(bfwitc, bfhitc); - array2D Yc(bfwitc, bfhitc); - typedef struct WbGreen { double green; float snedecor;//1. actually but put in case of confiance interval @@ -4791,8 +4786,6 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double bool separated = true; int w = -1; - array2D reff_spect_xxyy(N_t, 2 * Nc + 2); - array2D reff_spect_xxyy_prov(N_t, 2 * Nc + 2); array2D reff_spect_yy_camera(N_t, 2 * Nc + 2); array2D reff_spect_xx_camera(N_t, 2 * Nc + 2); @@ -4808,6 +4801,10 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double reff_spect_yy_camera[j][repref] = TY[j] / (TX[j] + TY[j] + TZ[j]); // y from xyY } + array2D xc(bfwitc, bfhitc); + array2D yc(bfwitc, bfhitc); + array2D Yc(bfwitc, bfhitc); + const int deltarepref = settings->itcwb_delta; for (int nn = 0, drep = -deltarepref; nn <= 2; ++nn, drep += deltarepref) { @@ -4839,6 +4836,10 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double histoxyY(bfhitc, bfwitc, xc, yc, Yc, xxx, yyy, YYY, histxy); } + // free some memory + xc.free(); + yc.free(); + Yc.free(); //calculate x y Y const int sizcurrref = siza;//choice of number of correlate colors in image array2D histcurrref(N_t, sizcurrref); @@ -4848,9 +4849,6 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double array2D xx_curref_reduc(N_t, sizcurrref); array2D yy_curref_reduc(N_t, sizcurrref); array2D YY_curref_reduc(N_t, sizcurrref); - array2D R_curref_reduc(N_t, sizcurrref); - array2D G_curref_reduc(N_t, sizcurrref); - array2D B_curref_reduc(N_t, sizcurrref); hiss Wbhis[siza]; @@ -4900,15 +4898,13 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double const int sizcu30 = sizcurrref - n30; const int sizcu4 = rtengine::min(sizcu30, 55); - chrom wbchro[sizcu4]; - const double swpr = (Txyz[repref].XX + Txyz[repref].ZZ + 1.); - const double xwpr = Txyz[repref].XX / swpr;//white point for tt in xy coordiantes - const double ywpr = 1. / swpr; - + const float swpr = Txyz[repref].XX + Txyz[repref].ZZ + 1.f; + const float xwpr = Txyz[repref].XX / swpr;//white point for tt in xy coordiantes + const float ywpr = 1.f / swpr; for (int i = 0; i < sizcu4; ++i) { //take the max values - histcurrref[i][repref] = (float) Wbhis[siza - (i + 1)].histnum; + histcurrref[i][repref] = Wbhis[siza - (i + 1)].histnum; xx_curref[i][repref] = xxx[Wbhis[siza - (i + 1)].index] / histcurrref[i][repref]; yy_curref[i][repref] = yyy[Wbhis[siza - (i + 1)].index] / histcurrref[i][repref]; YY_curref[i][repref] = YYY[Wbhis[siza - (i + 1)].index] / histcurrref[i][repref]; @@ -4939,7 +4935,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double for (int i = 0; i < sizcurr2ref; ++i) { //is condition chroxy necessary ? - if (((wbchro[sizcu4 - (i + 1)].chrox > 0.1f) && (wbchro[sizcu4 - (i + 1)].chroy > 0.1f)) && wbchro[sizcu4 - (i + 1)].chroxy > 0.0f) { //suppress value too far from reference spectral + if (wbchro[sizcu4 - (i + 1)].chrox > 0.1f && wbchro[sizcu4 - (i + 1)].chroy > 0.1f && wbchro[sizcu4 - (i + 1)].chroxy > 0.0f) { //suppress value too far from reference spectral w++; xx_curref_reduc[w][repref] = wbchro[sizcu4 - (i + 1)].chrox; yy_curref_reduc[w][repref] = wbchro[sizcu4 - (i + 1)].chroy; @@ -4961,7 +4957,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double for (int j = 0; j < Nc ; j++) { if (!good_spectral[j]) { - const float deltaE = SQR(xx_curref_reduc[i][repref] - reff_spect_xx_camera[j][repref]) + SQR(yy_curref_reduc[i][repref] - reff_spect_yy_camera[j][repref]); + const float deltaE = SQR(xx_curref_reduc[i][repref] - reff_spect_xx_camera[j][repref]) + SQR(yy_curref_reduc[i][repref] - reff_spect_yy_camera[j][repref]); if (deltaE < mindeltaE) { mindeltaE = deltaE; @@ -4974,7 +4970,12 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } } -//reconvert to RGB for "reduction" + // reuse some buffers + array2D& R_curref_reduc = xx_curref_reduc; + array2D& G_curref_reduc = yy_curref_reduc; + array2D& B_curref_reduc = YY_curref_reduc; + + //reconvert to RGB for "reduction" for (int i = 0; i < w; i++) { const float X = 65535.f * xx_curref_reduc[i][repref] * YY_curref_reduc[i][repref] / yy_curref_reduc[i][repref]; const float Y = 65535.f * YY_curref_reduc[i][repref]; @@ -4992,18 +4993,15 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double //Now begin real calculations separated = false; ColorTemp::tempxy(separated, repref, Tx, Ty, Tz, Ta, Tb, TL, TX, TY, TZ, wbpar); //calculate chroma xy (xyY) for Z known colors on under 90 illuminants - //calculate x y Y int sizcurr = siza;//choice of number of correlate colors in image - array2D histcurr(N_t, sizcurr); - array2D xxyycurr(N_t, 2 * sizcurr); array2D xxyycurr_reduc(N_t, 2 * sizcurr); + array2D reff_spect_xxyy(N_t, 2 * Nc + 2); + array2D reff_spect_xxyy_prov(N_t, 2 * Nc + 2); + float minstud = 100000.f; int goodref = 1; - array2D YYcurr(N_t, sizcurr); - array2D YYcurr_reduc(N_t, sizcurr); - //calculate x y z for each pixel with multiplier rmm gmm bmm for (int tt = 0; tt < N_t; ++tt) {//N_t From cee41b97861923e1a2299b2d9a10ac90a0bd28a8 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 29 Feb 2020 21:04:09 +0100 Subject: [PATCH 146/154] restore speed when not using auto itc wb and improve speed when using it --- rtengine/improccoordinator.cc | 13 ++--- rtengine/rawimagesource.cc | 96 ++++++++++++++++++++++++++--------- 2 files changed, 77 insertions(+), 32 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index fc3b29b9f..e18c6177a 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -389,16 +389,11 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } } - // bool autowb0 = false; - // autowb0 = (params->wb.method == "autold" || params->wb.method == "aut" || params->wb.method == "autosdw" || params->wb.method == "autedgsdw" || params->wb.method == "autitcgreen" || params->wb.method == "autedgrob" || params->wb.method == "autedg" || params->wb.method == "autorobust"); - // autowb0 = (params->wb.method == "autold" || params->wb.method == "autitcgreen");//in some cases autowb0 does not work ....params->wb.method still at "camera" instead of auto !!! - // printf("autowb0=%s \n", params->wb.method.c_str()); - - - - // if (autowb0) { + if (todo & (M_INIT | M_LINDENOISE | M_HDR)) { + if (params->wb.method == "autitcgreen") { imgsrc->getrgbloc(false, false, false, 0, 0, fh, fw, 0, 0, fh, fw); - // } + } + } if ((todo & (M_RETINEX | M_INIT)) && params->retinex.enabled) { bool dehacontlutili = false; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 55e31eeda..c052b41f7 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -3664,8 +3664,8 @@ void RawImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr) if (ri->getSensorType() == ST_BAYER) { // precalculate factors to avoid expensive per pixel calculations - float refwb0 = refwb[ri->FC(i, start)]; - float refwb1 = refwb[ri->FC(i, start + 1)]; + float refwb0 = refwb[ri->FC(i, start)]; + float refwb1 = refwb[ri->FC(i, start + 1)]; int j; for (j = start; j < end - 1; j += 2) { @@ -3678,12 +3678,12 @@ void RawImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr) } } else if (ri->getSensorType() == ST_FUJI_XTRANS) { // precalculate factors to avoid expensive per pixel calculations - float refwb0 = refwb[ri->XTRANSFC(i, start)]; - float refwb1 = refwb[ri->XTRANSFC(i, start + 1)]; - float refwb2 = refwb[ri->XTRANSFC(i, start + 2)]; - float refwb3 = refwb[ri->XTRANSFC(i, start + 3)]; - float refwb4 = refwb[ri->XTRANSFC(i, start + 4)]; - float refwb5 = refwb[ri->XTRANSFC(i, start + 5)]; + float refwb0 = refwb[ri->XTRANSFC(i, start)]; + float refwb1 = refwb[ri->XTRANSFC(i, start + 1)]; + float refwb2 = refwb[ri->XTRANSFC(i, start + 2)]; + float refwb3 = refwb[ri->XTRANSFC(i, start + 3)]; + float refwb4 = refwb[ri->XTRANSFC(i, start + 4)]; + float refwb5 = refwb[ri->XTRANSFC(i, start + 5)]; int j; for (j = start; j < end - 5; j += 6) { @@ -4853,7 +4853,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double hiss Wbhis[siza]; for (int nh = 0; nh < siza; nh++) { - Wbhis[nh].histnum = histxy[nh]; + Wbhis[nh].histnum = histxy[nh]; Wbhis[nh].index = nh; } @@ -5016,7 +5016,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double for (int j = 0; j < Nc ; ++j) { reff_spect_xxyy_prov[2 * j][tt] = Tx[j][tt] / (Tx[j][tt] + Ty[j][tt] + Tz[j][tt]); // x from xyY - reff_spect_xxyy_prov[2 * j + 1][tt] = Ty[j][tt] / (Tx[j][tt] + Ty[j][tt] + Tz[j][tt]); // y from xyY + reff_spect_xxyy_prov[2 * j + 1][tt] = Ty[j][tt] / (Tx[j][tt] + Ty[j][tt] + Tz[j][tt]); // y from xyY } int kk = -1; @@ -5098,7 +5098,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double for (int j = 0; j < Nc ; ++j) { reff_spect_xxyy_prov[2 * j][tt] = Tx[j][tt] / (Tx[j][tt] + Ty[j][tt] + Tz[j][tt]); // x from xyY - reff_spect_xxyy_prov[2 * j + 1][tt] = Ty[j][tt] / (Tx[j][tt] + Ty[j][tt] + Tz[j][tt]); // y from xyY + reff_spect_xxyy_prov[2 * j + 1][tt] = Ty[j][tt] / (Tx[j][tt] + Ty[j][tt] + Tz[j][tt]); // y from xyY } //degrade correllation with color high chroma, but not too much...seems not good, but keep in case of?? @@ -5142,13 +5142,13 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double int greengoodprov; int goodrefprov; float studprov; - const int goodref0 = Tgstud[0].tempref; + const int goodref0 = Tgstud[0].tempref; const int greengood0 = Tgstud[0].greenref - 39;//39 green = 1 const float stud0 = Tgstud[0].student; - const int goodref1 = Tgstud[1].tempref; + const int goodref1 = Tgstud[1].tempref; const float stud1 = Tgstud[1].student; const int greengood1 = Tgstud[1].greenref - 39; - const int goodref2 = Tgstud[2].tempref; + const int goodref2 = Tgstud[2].tempref; const int greengood2 = Tgstud[2].greenref - 39; const float stud2 = Tgstud[2].student; @@ -5243,16 +5243,57 @@ void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, in //center data on normal values int nn = 0; - for (int i = 0; i < H; i ++) + if (!local) { +#ifdef _OPENMP + #pragma omp parallel sections +#endif + { +#ifdef _OPENMP + #pragma omp section +#endif + { + for (int i = 0; i < H; i ++) { + for (int j = 0; j < W; j++) { + redloc[i][j] = red[i][j]; + } + } + } +#ifdef _OPENMP + #pragma omp section +#endif + { + for (int i = 0; i < H; i ++) { + for (int j = 0; j < W; j++) { + greenloc[i][j] = green[i][j]; + } + } + } +#ifdef _OPENMP + #pragma omp section +#endif + { + for (int i = 0; i < H; i ++) { + for (int j = 0; j < W; j++) { + blueloc[i][j] = blue[i][j]; + } + } + } + } + } + +#ifdef _OPENMP + #pragma omp parallel for reduction(+:avgL, nn) +#endif + for (int i = 0; i < H; i ++) { for (int j = 0; j < W; j++) { int lox = cx + j; int loy = cy + i; if (!local) { - const float redmm = redloc[i][j] = red[i][j]; - const float greenmm = greenloc[i][j] = green[i][j]; - const float bluemm = blueloc[i][j] = blue[i][j]; - const float LL = (0.299f * redmm + 0.587f * greenmm + 0.114f * bluemm); + const float redmm = redloc[i][j]; + const float greenmm = greenloc[i][j]; + const float bluemm = blueloc[i][j]; + const float LL = 0.299f * redmm + 0.587f * greenmm + 0.114f * bluemm; avgL += static_cast(LL); nn++; } else { @@ -5260,21 +5301,24 @@ void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, in const float redmm = redloc[loy - begy][lox - begx] = red[i][j]; const float greenmm = greenloc[loy - begy][lox - begx] = green[i][j]; const float bluemm = blueloc[loy - begy][lox - begx] = blue[i][j]; - const float LL = (0.299f * redmm + 0.587f * greenmm + 0.114f * bluemm); + const float LL = 0.299f * redmm + 0.587f * greenmm + 0.114f * bluemm; avgL += static_cast(LL); nn++; } } } - + } avgL /= nn; - float vari = 0.f; + double vari = 0.f; int mm = 0; +#ifdef _OPENMP + #pragma omp parallel for reduction(+:vari, mm) +#endif for (int i = 0; i < bfh; i++) for (int j = 0; j < bfw; j++) { - float LL = (0.299f * redloc[i][j] + 0.587f * greenloc[i][j] + 0.114f * blueloc[i][j]); + float LL = 0.299f * redloc[i][j] + 0.587f * greenloc[i][j] + 0.114f * blueloc[i][j]; vari += SQR(LL - avgL); mm++; } @@ -5282,6 +5326,9 @@ void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, in const float sig = std::sqrt(vari / mm); const float multip = 60000.f / (avgL + 2.f * sig); +#ifdef _OPENMP + #pragma omp parallel for +#endif for (int i = 0; i < bfh; i++) for (int j = 0; j < bfw; j++) { redloc[i][j] *= multip; @@ -5290,6 +5337,9 @@ void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, in } if (gamma) { +#ifdef _OPENMP + #pragma omp parallel for +#endif for (int i = 0; i < bfh; i++) for (int j = 0; j < bfw; j++) { redloc[i][j] = Color::gammatab_srgb[redloc[i][j]]; From 95b238ca5d5dd16ff54838eb982c733e7cc054bb Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 1 Mar 2020 08:37:51 +0100 Subject: [PATCH 147/154] Added Ingo to copyright Itcwb --- rtengine/rawimagesource.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index c052b41f7..2779081d1 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -4340,7 +4340,8 @@ float static studentXY(const array2D & YYcurr, const array2D & ref void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, const ColorManagementParams &cmp, const RAWParams &raw, const WBParams & wbpar) { /* - copyright Jacques Desmis 6 - 2018 jdesmis@gmail.com + Copyright (c) Jacques Desmis 6 - 2018 jdesmis@gmail.com + Copyright (c) Ingo Weirich 3 - 2020 (heckflosse67@gmx.de) This algorithm try to find temperature correlation between 20 to 200 color between 200 spectral color and about 20 to 55 color found in the image, I just found the idea in the web "correlate with chroma" instead of RGB grey point,but I don't use any algo found on the web. From d0034c880be2b96aea5d17dc8af89b83c50c82dc Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 1 Mar 2020 11:50:58 +0100 Subject: [PATCH 148/154] further cleanups and speedups for ItcWB/getrgbloc --- rtengine/imagesource.h | 2 +- rtengine/improccoordinator.cc | 5 +- rtengine/rawimagesource.cc | 129 ++++++++-------------------------- rtengine/rawimagesource.h | 2 +- rtengine/stdimagesource.cc | 3 - rtengine/stdimagesource.h | 2 +- 6 files changed, 36 insertions(+), 107 deletions(-) diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 22b8cdc08..d1008837d 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -123,7 +123,7 @@ public: virtual ColorTemp getWB () const = 0; virtual ColorTemp getSpotWB (std::vector &red, std::vector &green, std::vector &blue, int tran, double equal) = 0; virtual void WBauto(double &tempref, double &greenref, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const procparams::WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw) = 0; - virtual void getrgbloc(bool local, bool gamma, bool cat02, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w) = 0; + virtual void getrgbloc(int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w) = 0; virtual double getDefGain () const { diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index e18c6177a..15a8607d3 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -391,7 +391,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if (todo & (M_INIT | M_LINDENOISE | M_HDR)) { if (params->wb.method == "autitcgreen") { - imgsrc->getrgbloc(false, false, false, 0, 0, fh, fw, 0, 0, fh, fw); + imgsrc->getrgbloc(0, 0, fh, fw, 0, 0, fh, fw); } } @@ -411,8 +411,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } } - bool autowb = false; - autowb = (params->wb.method == "autold" || params->wb.method == "aut" || params->wb.method == "autosdw" || params->wb.method == "autedgsdw" || params->wb.method == "autitcgreen" || params->wb.method == "autedgrob" || params->wb.method == "autedg" || params->wb.method == "autorobust"); + const bool autowb = (params->wb.method == "autold" || params->wb.method == "autitcgreen"); if (settings->verbose) { printf("automethod=%s \n", params->wb.method.c_str()); } diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 2779081d1..1fac47ab4 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -3407,7 +3407,7 @@ void RawImageSource::HLRecovery_blend(float* rin, float* gin, float* bin, int wi constexpr float trans[ColorCount][ColorCount] = { { 1, 1, 1 }, { 1.7320508, -1.7320508, 0 }, { -1, -1, 2 } }; constexpr float itrans[ColorCount][ColorCount] = { { 1, 0.8660254, -0.5 }, { 1, -0.8660254, -0.5 }, { 1, 0, 1 } }; - float minpt = min(hlmax[0], hlmax[1], hlmax[2]); //min of the raw clip points + float minpt = rtengine::min(hlmax[0], hlmax[1], hlmax[2]); //min of the raw clip points //float maxpt=max(hlmax[0],hlmax[1],hlmax[2]);//max of the raw clip points //float medpt=hlmax[0]+hlmax[1]+hlmax[2]-minpt-maxpt;//median of the raw clip points float maxave = (hlmax[0] + hlmax[1] + hlmax[2]) / 3; //ave of the raw clip points @@ -3418,7 +3418,7 @@ void RawImageSource::HLRecovery_blend(float* rin, float* gin, float* bin, int wi float clip[3]; for (int c = 0; c < ColorCount; ++c) { - clip[c] = min(maxave, hlmax[c]); + clip[c] = rtengine::min(maxave, hlmax[c]); } // Determine the maximum level (clip) of all channels @@ -3473,7 +3473,7 @@ void RawImageSource::HLRecovery_blend(float* rin, float* gin, float* bin, int wi } } - chratio = (std::sqrt(sum[1] / sum[0])); + chratio = std::sqrt(sum[1] / sum[0]); // Apply ratio to lightness in LCH space for (int c = 1; c < ColorCount; c++) { @@ -4341,7 +4341,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double { /* Copyright (c) Jacques Desmis 6 - 2018 jdesmis@gmail.com - Copyright (c) Ingo Weirich 3 - 2020 (heckflosse67@gmx.de) + Copyright (c) Ingo Weyrich 3 - 2020 (heckflosse67@gmx.de) This algorithm try to find temperature correlation between 20 to 200 color between 200 spectral color and about 20 to 55 color found in the image, I just found the idea in the web "correlate with chroma" instead of RGB grey point,but I don't use any algo found on the web. @@ -4416,8 +4416,8 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double {static_cast(wiprof[2][0]), static_cast(wiprof[2][1]), static_cast(wiprof[2][2])} }; - const int bfwitc = bfw / 10 + 1 ;// 10 arbitrary value ; perhaps 4 or 5 or 20 - const int bfhitc = bfh / 10 + 1; + const int bfwitc = bfw; + const int bfhitc = bfh; typedef struct WbGreen { double green; @@ -4552,7 +4552,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } RangeGreen; constexpr RangeGreen Rangestandard = {8, 70}; - constexpr RangeGreen Rangeextand = {4, 77}; + constexpr RangeGreen Rangeextended = {4, 77}; const RangeGreen Rangemax = {0, N_g}; RangeGreen Rangegreenused; @@ -4560,7 +4560,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double if (settings->itcwb_greenrange == 0) { Rangegreenused = Rangestandard; } else if (settings->itcwb_greenrange == 1) { - Rangegreenused = Rangeextand; + Rangegreenused = Rangeextended; } else { Rangegreenused = Rangemax; } @@ -4816,13 +4816,12 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double #ifdef _OPENMP #pragma omp parallel for #endif - for (int y = 0; y < bfh ; y += 10) { - int yy = y / 10; - for (int x = 0, xx = 0; x < bfw ; x += 10, ++xx) { + for (int y = 0; y < bfh ; ++y) { + for (int x = 0; x < bfw ; ++x) { const float RR = rmm[rep] * redloc[y][x]; const float GG = gmm[rep] * greenloc[y][x]; const float BB = bmm[rep] * blueloc[y][x]; - Color::rgbxyY(RR, GG, BB, xc[yy][xx], yc[yy][xx], Yc[yy][xx], wp); + Color::rgbxyY(RR, GG, BB, xc[y][x], yc[y][x], Yc[y][x], wp); } } //histogram xy depend of temp...but in most cases D45 ..D65.. @@ -5217,15 +5216,12 @@ void RawImageSource::WBauto(double & tempref, double & greenref, array2D } } -void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w) +void RawImageSource::getrgbloc(int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w) { + BENCHFUN //used by auto WB local to calculate red, green, blue in local region - int bfh = H, bfw = W; - - if (local) { - bfh = bf_h + 3; - bfw = bf_w + 3; - } + const int bfw = W / 10 + 1 ;// 10 arbitrary value ; perhaps 4 or 5 or 20 + const int bfh = H / 10 + 1; if (! greenloc) { greenloc(bfw, bfh); @@ -5240,73 +5236,17 @@ void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, in } double avgL = 0.0; - //center data on normal values int nn = 0; - if (!local) { -#ifdef _OPENMP - #pragma omp parallel sections -#endif - { -#ifdef _OPENMP - #pragma omp section -#endif - { - for (int i = 0; i < H; i ++) { - for (int j = 0; j < W; j++) { - redloc[i][j] = red[i][j]; - } - } - } -#ifdef _OPENMP - #pragma omp section -#endif - { - for (int i = 0; i < H; i ++) { - for (int j = 0; j < W; j++) { - greenloc[i][j] = green[i][j]; - } - } - } -#ifdef _OPENMP - #pragma omp section -#endif - { - for (int i = 0; i < H; i ++) { - for (int j = 0; j < W; j++) { - blueloc[i][j] = blue[i][j]; - } - } - } - } - } - #ifdef _OPENMP #pragma omp parallel for reduction(+:avgL, nn) #endif for (int i = 0; i < H; i ++) { for (int j = 0; j < W; j++) { - int lox = cx + j; - int loy = cy + i; - - if (!local) { - const float redmm = redloc[i][j]; - const float greenmm = greenloc[i][j]; - const float bluemm = blueloc[i][j]; - const float LL = 0.299f * redmm + 0.587f * greenmm + 0.114f * bluemm; - avgL += static_cast(LL); - nn++; - } else { - if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) { - const float redmm = redloc[loy - begy][lox - begx] = red[i][j]; - const float greenmm = greenloc[loy - begy][lox - begx] = green[i][j]; - const float bluemm = blueloc[loy - begy][lox - begx] = blue[i][j]; - const float LL = 0.299f * redmm + 0.587f * greenmm + 0.114f * bluemm; - avgL += static_cast(LL); - nn++; - } - } + const float LL = 0.299f * red[i][j] + 0.587f * green[i][j] + 0.114f * blue[i][j]; + avgL += static_cast(LL); + nn++; } } avgL /= nn; @@ -5317,9 +5257,9 @@ void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, in #ifdef _OPENMP #pragma omp parallel for reduction(+:vari, mm) #endif - for (int i = 0; i < bfh; i++) - for (int j = 0; j < bfw; j++) { - float LL = 0.299f * redloc[i][j] + 0.587f * greenloc[i][j] + 0.114f * blueloc[i][j]; + for (int i = 0; i < H; i++) + for (int j = 0; j < W; j++) { + const float LL = 0.299f * red[i][j] + 0.587f * green[i][j] + 0.114f * blue[i][j]; vari += SQR(LL - avgL); mm++; } @@ -5330,23 +5270,15 @@ void RawImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, in #ifdef _OPENMP #pragma omp parallel for #endif - for (int i = 0; i < bfh; i++) - for (int j = 0; j < bfw; j++) { - redloc[i][j] *= multip; - greenloc[i][j] *= multip; - blueloc[i][j] *= multip; - } - - if (gamma) { -#ifdef _OPENMP - #pragma omp parallel for -#endif - for (int i = 0; i < bfh; i++) - for (int j = 0; j < bfw; j++) { - redloc[i][j] = Color::gammatab_srgb[redloc[i][j]]; - greenloc[i][j] = Color::gammatab_srgb[greenloc[i][j]]; - blueloc[i][j] = Color::gammatab_srgb[blueloc[i][j]]; + for (int i = 0; i < bfh; ++i) { + const int ii = i * 10; + if (ii < H) { + for (int j = 0, jj = 0; jj < W; ++j, jj += 10) { + redloc[i][j] = red[ii][jj] * multip; + greenloc[i][j] = green[ii][jj] * multip; + blueloc[i][j] = blue[ii][jj] * multip; } + } } } @@ -5365,7 +5297,6 @@ void RawImageSource::getAutoWBMultipliersitc(double & tempref, double & greenref double avg_b = 0; int rn = 0, gn = 0, bn = 0; double avg_rm, avg_gm, avg_bm; - int bfh = H, bfw = W; if (wbpar.method == "autold") { if (fuji) { for (int i = 32; i < H - 32; i++) { @@ -5542,6 +5473,8 @@ void RawImageSource::getAutoWBMultipliersitc(double & tempref, double & greenref if (wbpar.method == "autitcgreen") { bool twotimes = false; + const int bfw = W / 10 + 1 ;// 10 arbitrary value ; perhaps 4 or 5 or 20 + const int bfh = H / 10 + 1; WBauto(tempref, greenref, redloc, greenloc, blueloc, bfw, bfh, avg_rm, avg_gm, avg_bm, tempitc, greenitc, studgood, twotimes, wbpar, begx, begy, yEn, xEn, cx, cy, cmp, raw); } diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index dd15a68e0..71478fbed 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -144,7 +144,7 @@ public: void scaleColors (int winx, int winy, int winw, int winh, const procparams::RAWParams &raw, array2D &rawData); // raw for cblack void WBauto(double &tempref, double &greenref, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const procparams::WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw) override; void getAutoWBMultipliersitc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const procparams::WBParams & wbpar, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw) override; - void getrgbloc(bool local, bool gamma, bool cat02, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w) override; + void getrgbloc(int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w) override; void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const procparams::ToneCurveParams &hrp, const procparams::RAWParams &raw) override; eSensorType getSensorType () const override; diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index 763621171..8cb8fa792 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -315,9 +315,6 @@ void StdImageSource::WBauto(double &tempref, double &greenref, array2D &r { } -void StdImageSource::getrgbloc(bool local, bool gamma, bool cat02, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w) -{} - void StdImageSource::getAutoWBMultipliersitc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const WBParams & wbpar, const ColorManagementParams &cmp, const RAWParams &raw) { if (redAWBMul != -1.) { diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h index 9f4fbdfbe..f937188b4 100644 --- a/rtengine/stdimagesource.h +++ b/rtengine/stdimagesource.h @@ -58,7 +58,7 @@ public: int load (const Glib::ustring &fname) override; void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const procparams::ToneCurveParams &hrp, const procparams::RAWParams &raw) override; - void getrgbloc(bool local, bool gamma, bool cat02, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w) override; + void getrgbloc (int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w) override {}; ColorTemp getWB () const override { return wb; From f85b2cc5bc7fa80fa1724e5d6cf5359c0894c223 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 1 Mar 2020 12:22:15 +0100 Subject: [PATCH 149/154] small correction --- rtengine/rawimagesource.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 1fac47ab4..9ed217624 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -5220,8 +5220,8 @@ void RawImageSource::getrgbloc(int begx, int begy, int yEn, int xEn, int cx, int { BENCHFUN //used by auto WB local to calculate red, green, blue in local region - const int bfw = W / 10 + 1 ;// 10 arbitrary value ; perhaps 4 or 5 or 20 - const int bfh = H / 10 + 1; + const int bfw = W / 10 + ((W % 10) > 0 ? 1 : 0);// 10 arbitrary value ; perhaps 4 or 5 or 20 + const int bfh = H / 10 + ((H % 10) > 0 ? 1 : 0); if (! greenloc) { greenloc(bfw, bfh); @@ -5473,8 +5473,8 @@ void RawImageSource::getAutoWBMultipliersitc(double & tempref, double & greenref if (wbpar.method == "autitcgreen") { bool twotimes = false; - const int bfw = W / 10 + 1 ;// 10 arbitrary value ; perhaps 4 or 5 or 20 - const int bfh = H / 10 + 1; + const int bfw = W / 10 + ((W % 10) > 0 ? 1 : 0);// 10 arbitrary value ; perhaps 4 or 5 or 20 + const int bfh = H / 10 + ((H % 10) > 0 ? 1 : 0); WBauto(tempref, greenref, redloc, greenloc, blueloc, bfw, bfh, avg_rm, avg_gm, avg_bm, tempitc, greenitc, studgood, twotimes, wbpar, begx, begy, yEn, xEn, cx, cy, cmp, raw); } From c92c0c0c8a7029c776bd58b174109de201cea866 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 1 Mar 2020 12:44:15 +0100 Subject: [PATCH 150/154] disabled BENCHFUN --- rtengine/rawimagesource.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 9ed217624..f5d31c435 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -4399,7 +4399,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double Itcwb_sizereference : 3 by default, can be set to 5 ==> size of reference color compare to size of histogram real color itcwb_delta : 1 by default can be set between 0 to 5 ==> delta temp to build histogram xy - if camera temp is not probably good */ - BENCHFUN +// BENCHFUN TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix("sRGB"); const float wp[3][3] = { @@ -5218,7 +5218,7 @@ void RawImageSource::WBauto(double & tempref, double & greenref, array2D void RawImageSource::getrgbloc(int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w) { - BENCHFUN +// BENCHFUN //used by auto WB local to calculate red, green, blue in local region const int bfw = W / 10 + ((W % 10) > 0 ? 1 : 0);// 10 arbitrary value ; perhaps 4 or 5 or 20 const int bfh = H / 10 + ((H % 10) > 0 ? 1 : 0); From 6d31fe48a7f0998fc6709db7f6fd564181b20072 Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 2 Mar 2020 08:51:11 +0100 Subject: [PATCH 151/154] Comment code Itcwb --- rtengine/rawimagesource.cc | 43 +++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index f5d31c435..49334d1dc 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -3897,6 +3897,9 @@ void RawImageSource::getRowStartEnd (int x, int &start, int &end) static void histoxyY(int bfhitc, int bfwitc, const array2D & xc, const array2D & yc, const array2D & Yc, LUTf &xxx, LUTf &yyy, LUTf &YYY, LUTu &histxy) { + //calculate histogram x y in a rane of 158 colors + //this "choice" are guided by generally colors who are in nature skin, sky, etc. in those cases "steps" are small + // of course we can chnage to be more precise #ifdef _OPENMP #pragma omp parallel #endif @@ -4423,7 +4426,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double double green; float snedecor;//1. actually but put in case of confiance interval } WbGreen; - + //green (tint) values between 0.4 to 4.0 constexpr WbGreen gree[118] = {//symmetric coefficient between 0.717 and 1.40 {0.400, 1.f}, {0.500, 1.f}, @@ -4572,6 +4575,8 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } WbTxyz; //we can change step to increase precision if need - also in Colortemp.cc with same changes //I don't know how to pass this structure to Colortemp ! + // X and Z values calculate for each temp between 2000K to 12000K, so no result after 12000K ! + //of course we can change the step between each temp if need constexpr WbTxyz Txyz[118] = {//temperature Xwb Zwb 118 values x wb and y wb are calculated after {2001., 1.273842, 0.145295}, {2101., 1.244008, 0.167533}, @@ -4746,6 +4751,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double rmm[tt] = rm / gm; gmm[tt] = 1.f; bmm[tt] = bm / gm; + //return rmm, gmm, bmm in function of temp } struct hiss { @@ -4791,9 +4797,9 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double array2D reff_spect_xx_camera(N_t, 2 * Nc + 2); //here we select the good spectral color inside the 113 values - //call tempxy to calculate for 114 color references Temp and XYZ with cat02 + //call tempxy to calculate for 200 color references Temp and XYZ with cat02 - ColorTemp::tempxy(separated, repref, Tx, Ty, Tz, Ta, Tb, TL, TX, TY, TZ, wbpar); //calculate chroma xy (xyY) for Z known colors on under 90 illuminants + ColorTemp::tempxy(separated, repref, Tx, Ty, Tz, Ta, Tb, TL, TX, TY, TZ, wbpar); //calculate chroma xy (xyY) for Z known colors on under 200 illuminants //find the good spectral values //calculate xy reference spectral for tempref @@ -4834,6 +4840,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double //big step about 0.2 histoxyY(bfhitc, bfwitc, xc, yc, Yc, xxx, yyy, YYY, histxy); + //return histogram x and y for each temp and in a range of 158 colors (siza) } // free some memory @@ -4865,6 +4872,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double int n15 = 0; int n30 = 0; //part to improve + //determined the number of colors who be used after for (int nh = 0; nh < siza; nh++) { if (Wbhis[nh].histnum < 30) { n30++; //keep only existing color but avoid to small @@ -4911,7 +4919,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } float estimchrom = 0.f; - + //estimate chromaticity for references for (int nh = 0; nh < sizcu4; ++nh) { const float chxy = std::sqrt(SQR(xx_curref[nh][repref] - xwpr) + SQR(yy_curref[nh][repref] - ywpr)); wbchro[nh].chroxy_number = chxy * std::sqrt(histcurrref[nh][repref]); @@ -4943,7 +4951,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } } - //calculate deltaE xx to find best values of spectrals datas + //calculate deltaE xx to find best values of spectrals datas - limited to chroma values int maxnb = rtengine::LIM(settings->itcwb_sizereference, 1, 5); if (settings->itcwb_thres > 39) { @@ -4992,6 +5000,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double //Now begin real calculations separated = false; + //recalculate histogram with good values and not estimated ColorTemp::tempxy(separated, repref, Tx, Ty, Tz, Ta, Tb, TL, TX, TY, TZ, wbpar); //calculate chroma xy (xyY) for Z known colors on under 90 illuminants //calculate x y Y int sizcurr = siza;//choice of number of correlate colors in image @@ -5038,7 +5047,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double } } - if (extra) { + if (extra) {//always used because I amde this choice, brings better results struct Tempgreen { float student; int tempref; @@ -5052,15 +5061,14 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double for (int i = 0; i < N_g; ++i) {//init variables with Tgstud[i].student = 1000.f;//max value to initialize - Tgstud[i].tempref = 57; - Tgstud[i].greenref = 39; + Tgstud[i].tempref = 57;//5002K + Tgstud[i].greenref = 39;// 1.f } const int dgoodref = rtengine::min(settings->itcwb_greendeltatemp, 4); const int scantempbeg = rtengine::max(goodref - (dgoodref + 1), 1); const int scantempend = rtengine::min(goodref + dgoodref, N_t - 1); - for (int gr = Rangegreenused.begin; gr < Rangegreenused.end; ++gr) { float minstudgr = 100000.f; int goodrefgr = 1; @@ -5072,6 +5080,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double float rm = imatrices.cam_rgb[0][0] * r + imatrices.cam_rgb[0][1] * g + imatrices.cam_rgb[0][2] * b; float gm = imatrices.cam_rgb[1][0] * r + imatrices.cam_rgb[1][1] * g + imatrices.cam_rgb[1][2] * b; float bm = imatrices.cam_rgb[2][0] * r + imatrices.cam_rgb[2][1] * g + imatrices.cam_rgb[2][2] * b; + //recalculate Multipliers now with good range of temp and green const float new_pre_mul[4] = { ri->get_pre_mul(0) / rm, ri->get_pre_mul(1) / gm, ri->get_pre_mul(2) / bm, ri->get_pre_mul(3) / gm }; float new_scale_mul[4]; @@ -5095,6 +5104,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double const float BB = bmm[tt] * B_curref_reduc[i][repref]; Color::rgbxyY(RR, GG, BB, xxyycurr_reduc[2 * i][tt], xxyycurr_reduc[2 * i + 1][tt], unused, wp); } + //recalculate xy spectral now with good range of temp and green for (int j = 0; j < Nc ; ++j) { reff_spect_xxyy_prov[2 * j][tt] = Tx[j][tt] / (Tx[j][tt] + Ty[j][tt] + Tz[j][tt]); // x from xyY @@ -5117,14 +5127,15 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double reff_spect_xxyy[2 * kkg + 1][tt] = reff_spect_xxyy_prov[2 * i + 1][tt]; } } - + //now we have good spectral datas + //claculate student correlation const float abstudgr = std::fabs(studentXY(xxyycurr_reduc, reff_spect_xxyy, 2 * w, 2 * kkg, tt)); if (abstudgr < minstudgr) { // find the minimum Student minstudgr = abstudgr; goodrefgr = tt; } - + //found the values Tgstud[gr].tempref = goodrefgr; Tgstud[gr].greenref = gr; Tgstud[gr].student = minstudgr; @@ -5136,7 +5147,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double //now search the value of green the nearest of 1 with a good student value // I take the 3 first values - //I admit a symetrie in green coefiicient for rgb multiplier...probably not excatly true + //I admit a symetrie in green coefiicient for rgb multiplier...probably not exactly true //perhaps we can used a Snedecor test ? but why...at least we have confidence interval > 90% int greengood; int greengoodprov; @@ -5186,7 +5197,7 @@ void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double if (!extra) { tempitc = Txyz[goodref].Tem; } - + //now we have temp green and student if (settings->verbose) { printf("ITCWB tempitc=%f gritc=%f stud=%f \n", tempitc, greenitc, studgood); } @@ -5196,10 +5207,12 @@ void RawImageSource::WBauto(double & tempref, double & greenref, array2D { // BENCHFUN //auto white balance + //put green (tint) in reasonable limits for an Daylight illuminant + // avoid too bi or too low values if (wbpar.method == "autitcgreen") { bool extra = false; - if (greenref > 0.77 && greenref < 1.3) { + if (greenref > 0.77 && greenref < 1.3) {// 0/77 and 1.3 arbitraties values greenitc = greenref; if (settings->itcwb_forceextra) { @@ -5266,7 +5279,7 @@ void RawImageSource::getrgbloc(int begx, int begy, int yEn, int xEn, int cx, int const float sig = std::sqrt(vari / mm); const float multip = 60000.f / (avgL + 2.f * sig); - + //multip to put red, blue, green in a good range #ifdef _OPENMP #pragma omp parallel for #endif From dbeccefd44e59656d1381c74d4efda197d0689a0 Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 2 Mar 2020 16:55:24 +0100 Subject: [PATCH 152/154] Display good values Temp green if autold selected --- rtengine/improccoordinator.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index e7bf2b5bc..29a41249e 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -488,6 +488,10 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) awbListener->WBChanged(params->wb.temperature, params->wb.green, studgood); } + if (autowb && awbListener && params->wb.method == "autold") { + awbListener->WBChanged(params->wb.temperature, params->wb.green, -1.f); + } + /* GammaValues g_a; double pwr = 1.0 / params->icm.gampos; From 32165f9f7d5c67cea7405a14a3bd6b39297b2dc6 Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 2 Mar 2020 18:07:41 +0100 Subject: [PATCH 153/154] Small improvment and format code improccoordinator wb --- rtengine/improccoordinator.cc | 45 +++++++++++++++++------------------ 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 29a41249e..f8a65bf8c 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -441,36 +441,36 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) currWBitc = imgsrc->getWB(); double tempref = currWBitc.getTemp() * (1. + params->wb.tempBias); double greenref = currWBitc.getGreen(); - if (settings->verbose) { + if (settings->verbose && params->wb.method == "autitcgreen") { printf("tempref=%f greref=%f\n", tempref, greenref); } imgsrc->getAutoWBMultipliersitc(tempref, greenref, tempitc, greenitc, studgood, 0, 0, fh, fw, 0, 0, fh, fw, rm, gm, bm, params->wb, params->icm, params->raw); - if (params->wb.method == "autitcgreen") { - params->wb.temperature = tempitc; - params->wb.green = greenitc; - currWB = ColorTemp(params->wb.temperature, params->wb.green, 1., params->wb.method); - currWB.getMultipliers(rm, gm, bm); - } - - if (rm != -1.) { - double bias = params->wb.tempBias; - if (params->wb.method == "autitcgreen") { - bias = 0.; + params->wb.temperature = tempitc; + params->wb.green = greenitc; + currWB = ColorTemp(params->wb.temperature, params->wb.green, 1., params->wb.method); + currWB.getMultipliers(rm, gm, bm); } - autoWB.update(rm, gm, bm, params->wb.equal, bias); - lastAwbEqual = params->wb.equal; - lastAwbTempBias = params->wb.tempBias; - lastAwbauto = params->wb.method; - } else { - lastAwbEqual = -1.; - lastAwbTempBias = 0.0; - lastAwbauto = ""; - autoWB.useDefaults(params->wb.equal); - } + if (rm != -1.) { + double bias = params->wb.tempBias; + + if (params->wb.method == "autitcgreen") { + bias = 0.; + } + + autoWB.update(rm, gm, bm, params->wb.equal, bias); + lastAwbEqual = params->wb.equal; + lastAwbTempBias = params->wb.tempBias; + lastAwbauto = params->wb.method; + } else { + lastAwbEqual = -1.; + lastAwbTempBias = 0.0; + lastAwbauto = ""; + autoWB.useDefaults(params->wb.equal); + } } @@ -483,7 +483,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) params->wb.green = currWB.getGreen(); } - // if (params->wb.method == "Auto" && awbListener && params->wb.enabled) { if (autowb && awbListener && params->wb.method == "autitcgreen") { awbListener->WBChanged(params->wb.temperature, params->wb.green, studgood); } From f4da001589e543f74efd961b27ba8855fc200a62 Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 2 Mar 2020 20:00:02 +0100 Subject: [PATCH 154/154] Ciecam02 autotempout button --- rtdata/languages/default | 2 ++ rtengine/improccoordinator.cc | 2 +- rtengine/procparams.cc | 4 ++++ rtengine/procparams.h | 1 + rtgui/colorappearance.cc | 30 ++++++++++++++++++++++++++++-- rtgui/colorappearance.h | 3 ++- rtgui/paramsedited.cc | 6 ++++++ rtgui/paramsedited.h | 1 + 8 files changed, 45 insertions(+), 4 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 607484d19..265266a7c 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -787,6 +787,7 @@ HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +HISTORY_MSG_TEMPOUT;CAM02 automatic temperature HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor HISTORY_MSG_TRANS_Method;Geometry - Method HISTORY_MSG_WAVCLARI;Clarity @@ -1467,6 +1468,7 @@ TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode TP_COLORAPP_TCMODE_LIGHTNESS;Lightness TP_COLORAPP_TCMODE_SATUR;Saturation TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +TP_COLORAPP_TEMPOUT_TOOLTIP;Disable to chnage temperature and tint TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index f8a65bf8c..15d477fdc 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1157,7 +1157,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) acListener->ybCamChanged((int) yb); //real value Yb scene } - if (params->colorappearance.enabled && params->colorappearance.presetcat02) { + if (params->colorappearance.enabled && params->colorappearance.presetcat02 && params->colorappearance.autotempout) { acListener->wbCamChanged(params->wb.temperature, params->wb.green); //real temp and tint } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 1dee8375b..a6707fb86 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1389,6 +1389,7 @@ ColorAppearanceParams::ColorAppearanceParams() : datacie(false), tonecie(false), tempout(5000), + autotempout(true), ybout(18), greenout(1.0), tempsc(5000), @@ -1435,6 +1436,7 @@ bool ColorAppearanceParams::operator ==(const ColorAppearanceParams& other) cons && datacie == other.datacie && tonecie == other.tonecie && tempout == other.tempout + && autotempout == other.autotempout && ybout == other.ybout && greenout == other.greenout && tempsc == other.tempsc @@ -3229,6 +3231,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->colorappearance.surrsource, "Color appearance", "SurrSource", colorappearance.surrsource, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.gamut, "Color appearance", "Gamut", colorappearance.gamut, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.tempout, "Color appearance", "Tempout", colorappearance.tempout, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.autotempout, "Color appearance", "Autotempout", colorappearance.autotempout, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.greenout, "Color appearance", "Greenout", colorappearance.greenout, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.tempsc, "Color appearance", "Tempsc", colorappearance.tempsc, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.greensc, "Color appearance", "Greensc", colorappearance.greensc, keyFile); @@ -4222,6 +4225,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Color appearance", "SurrSource", pedited, colorappearance.surrsource, pedited->colorappearance.surrsource); assignFromKeyfile(keyFile, "Color appearance", "Gamut", pedited, colorappearance.gamut, pedited->colorappearance.gamut); assignFromKeyfile(keyFile, "Color appearance", "Tempout", pedited, colorappearance.tempout, pedited->colorappearance.tempout); + assignFromKeyfile(keyFile, "Color appearance", "Autotempout", pedited, colorappearance.autotempout, pedited->colorappearance.autotempout); assignFromKeyfile(keyFile, "Color appearance", "Greenout", pedited, colorappearance.greenout, pedited->colorappearance.greenout); assignFromKeyfile(keyFile, "Color appearance", "Tempsc", pedited, colorappearance.tempsc, pedited->colorappearance.tempsc); assignFromKeyfile(keyFile, "Color appearance", "Greensc", pedited, colorappearance.greensc, pedited->colorappearance.greensc); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 034577cb6..17cf64a69 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -676,6 +676,7 @@ struct ColorAppearanceParams { bool datacie; bool tonecie; int tempout; + bool autotempout; int ybout; double greenout; int tempsc; diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index fff35a94c..ace7affd6 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -220,7 +220,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" auto m = ProcEventMapper::getInstance(); Evcatpreset = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_CAT02PRESET"); - + EvCATAutotempout = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_TEMPOUT"); //preset button cat02 presetcat02 = Gtk::manage (new Gtk::CheckButton (M ("TP_COLORAPP_PRESETCAT02"))); presetcat02->set_tooltip_markup (M("TP_COLORAPP_PRESETCAT02_TIP")); @@ -627,6 +627,8 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" greenout = Gtk::manage (new Adjuster (M ("TP_WBALANCE_GREEN"), MINGREEN0, MAXGREEN0, 0.001, 1.0, igreenR1, igreenL1)); ybout = Gtk::manage (new Adjuster (M ("TP_COLORAPP_MEANLUMINANCE"), 5, 90, 1, 18)); tempout->set_tooltip_markup (M ("TP_COLORAPP_TEMP_TOOLTIP")); + tempout->throwOnButtonRelease(); + tempout->addAutoButton (M ("TP_COLORAPP_TEMPOUT_TOOLTIP")); tempout->show(); greenout->show(); @@ -768,6 +770,7 @@ void ColorAppearance::neutral_pressed () qcontrast->resetValue (false); colorh->resetValue (false); tempout->resetValue (false); + tempout->setAutoValue (true); greenout->resetValue (false); ybout->resetValue (false); tempsc->resetValue (false); @@ -856,6 +859,7 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) adapscen->setAutoInconsistent (multiImage && !pedited->colorappearance.autoadapscen); ybscen->setAutoInconsistent (multiImage && !pedited->colorappearance.autoybscen); set_inconsistent (multiImage && !pedited->colorappearance.enabled); + tempout->setAutoInconsistent (multiImage && !pedited->colorappearance.autotempout); shape->setUnChanged (!pedited->colorappearance.curve); shape2->setUnChanged (!pedited->colorappearance.curve2); @@ -982,6 +986,7 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) lastAutoAdapscen = pp->colorappearance.autoadapscen; lastAutoDegreeout = pp->colorappearance.autodegreeout; lastAutoybscen = pp->colorappearance.autoybscen; + lastAutotempout = pp->colorappearance.autotempout; degree->setValue (pp->colorappearance.degree); degree->setAutoValue (pp->colorappearance.autodegree); @@ -1004,6 +1009,7 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) qcontrast->setValue (pp->colorappearance.qcontrast); colorh->setValue (pp->colorappearance.colorh); tempout->setValue (pp->colorappearance.tempout); + tempout->setAutoValue (pp->colorappearance.autotempout); greenout->setValue (pp->colorappearance.greenout); ybout->setValue (pp->colorappearance.ybout); tempsc->setValue (pp->colorappearance.tempsc); @@ -1060,6 +1066,7 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) pp->colorappearance.curve2 = shape2->getCurve (); pp->colorappearance.curve3 = shape3->getCurve (); pp->colorappearance.tempout = tempout->getValue (); + pp->colorappearance.autotempout = tempout->getAutoValue (); pp->colorappearance.greenout = greenout->getValue (); pp->colorappearance.ybout = ybout->getValue (); pp->colorappearance.tempsc = tempsc->getValue (); @@ -1135,6 +1142,7 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) pedited->colorappearance.tempsc = tempsc->getEditedState (); pedited->colorappearance.greensc = greensc->getEditedState (); pedited->colorappearance.presetcat02 = presetcat02->get_inconsistent (); + pedited->colorappearance.autotempout = !tempout->getAutoInconsistent(); } @@ -1771,7 +1779,16 @@ void ColorAppearance::adjusterAutoToggled(Adjuster* a) ybscen->setAutoInconsistent (true); } - lastAutoybscen = ybscen->getAutoValue(); + lastAutotempout = tempout->getAutoValue(); + + if (tempout->getAutoInconsistent()) { + tempout->setAutoInconsistent (false); + tempout->setAutoValue (false); + } else if (lastAutotempout) { + tempout->setAutoInconsistent (true); + } + + lastAutotempout = tempout->getAutoValue(); } @@ -1818,6 +1835,15 @@ void ColorAppearance::adjusterAutoToggled(Adjuster* a) } } + if (a == tempout) { + if (tempout->getAutoInconsistent()) { + listener->panelChanged (EvCATAutotempout, M ("GENERAL_UNCHANGED")); + } else if (tempout->getAutoValue()) { + listener->panelChanged (EvCATAutotempout, M ("GENERAL_ENABLED")); + } else { + listener->panelChanged (EvCATAutotempout, M ("GENERAL_DISABLED")); + } + } } } diff --git a/rtgui/colorappearance.h b/rtgui/colorappearance.h index 2f060edea..863787118 100644 --- a/rtgui/colorappearance.h +++ b/rtgui/colorappearance.h @@ -101,7 +101,7 @@ public: private: rtengine::ProcEvent Evcatpreset; - + rtengine::ProcEvent EvCATAutotempout; bool bgTTipQuery (int x, int y, bool keyboard_tooltip, const Glib::RefPtr& tooltip); bool srTTipQuery (int x, int y, bool keyboard_tooltip, const Glib::RefPtr& tooltip); void foldAllButMe (GdkEventButton* event, MyExpander *expander); @@ -174,6 +174,7 @@ private: bool lastAutoAdapscen; bool lastAutoDegreeout; bool lastAutoybscen; + bool lastAutotempout; bool lastsurr; bool lastgamut; bool lastdatacie; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 448b1316c..52eb7dbe6 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -243,6 +243,7 @@ void ParamsEdited::set(bool v) colorappearance.curveMode2 = v; colorappearance.curveMode3 = v; colorappearance.tempout = v; + colorappearance.autotempout = v; colorappearance.greenout = v; colorappearance.ybout = v; colorappearance.tempsc = v; @@ -834,6 +835,7 @@ void ParamsEdited::initFrom(const std::vector& colorappearance.curveMode2 = colorappearance.curveMode2 && p.colorappearance.curveMode2 == other.colorappearance.curveMode2; colorappearance.curveMode3 = colorappearance.curveMode3 && p.colorappearance.curveMode3 == other.colorappearance.curveMode3; colorappearance.tempout = colorappearance.tempout && p.colorappearance.tempout == other.colorappearance.tempout; + colorappearance.autotempout = colorappearance.autotempout && p.colorappearance.autotempout == other.colorappearance.autotempout; colorappearance.greenout = colorappearance.greenout && p.colorappearance.greenout == other.colorappearance.greenout; colorappearance.ybout = colorappearance.ybout && p.colorappearance.ybout == other.colorappearance.ybout; colorappearance.tempsc = colorappearance.tempsc && p.colorappearance.tempsc == other.colorappearance.tempsc; @@ -2016,6 +2018,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.colorappearance.tempout = mods.colorappearance.tempout; } + if (colorappearance.autotempout) { + toEdit.colorappearance.autotempout = mods.colorappearance.autotempout; + } + if (colorappearance.greenout) { toEdit.colorappearance.greenout = mods.colorappearance.greenout; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 47985400e..938f1bf97 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -290,6 +290,7 @@ struct ColorAppearanceParamsEdited { bool datacie; bool tonecie; bool tempout; + bool autotempout; bool greenout; bool ybout; bool tempsc;

jK#c%<}?7QpRr{ob%S61!21RR3X(itku@*NdYy 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%0A$j>lQ3Y=!HOhzQ)OtY=4N9`)Mjbpp2qU!- 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